|
64036
|
Simple Voice Chatbot Cli by @HarvyLiu | Stardance
|
HarvyLiu
|
0
|
1.4
|
0
|
[]
|
[{"post_id": 71279, "ts": "202 [{"post_id": 71279, "ts": "2026-09-20T15:52:35Z", "hours": 1.3967, "text": "Still working on basic setup, and understanding what I need to do (I used AI to help me map out my project, roadmap sort of thing. And help me plan which libraries I might use)"}]...
|
Title: Simple Voice Chatbot Cli by @HarvyLiu | Sta Title: Simple Voice Chatbot Cli by @HarvyLiu | Stardance
Devlogs:
Still working on basic setup, and understanding what I need to do (I used AI to help me map out my project, roadmap sort of thing. And help me plan which libraries I might use)...
|
1793058536.7358003
|
1793663336.7358003
|
|
62719
|
Tux-WebOS by @deadbeef404 | Stardance
|
deadbeef404
|
1
|
9.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T16:02:02Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a keyboard driven, scrollable tiling window manager inspired webOS. Only for devices which have keyboard access cuz it is mainly keyboard driven.", "repo": "https://github.com/Loml-1989/Tux-WebOS", "demo": "https://webos.tuxotaku.tech/"}]...
|
[{"post_id": 71281, "ts": "202 [{"post_id": 71281, "ts": "2026-09-20T15:57:05Z", "hours": 0.3033, "text": "Added a readme.md file"}, {"post_id": 71244, "ts": "2026-09-20T14:53:15Z", "hours": 0.6808, "text": "Added a welcome screen to welcome and explain how to use it."}, {"post_id": 71014, "ts": "2026-09-20T06:33:00Z", "hours": 1.9022, "text": "I have added a functioning system monitor so now it shows some information. NOT correct one but it DOES show SOMETHING so yeah :)"}, {"post_id": 70155, "ts": "2026-09-18T16:05:23Z", "hours": 1.1756, "text": "I made the file manager actually functioning with some files in it asw."}, {"post_id": 70119, "ts": "2026-09-18T14:36:14Z", "hours": 0.8461, "text": "I made terminal functional with few commands. I added help, clear, echo, date, whoami, and neofetch."}, {"post_id": 70081, "ts": "2026-09-18T12:45:44Z", "hours": 0.8794, "text": "Added ability to change wallpaper and add custom wallpaper in the settings application."}, {"post_id": 70065, "ts": "2026-09-18T11:45:57Z", "hours": 0.27, "text": "I added a wallpaper and made some theme changes for consistency."}, {"post_id": 70051, "ts": "2026-09-18T11:12:40Z", "hours": 0.3017, "text": "I added a full screen ability so u can full screen the active window by using shift + i. I also added the ability to change the active window by using shift + h to go left and shift + l to go right window. Additionally I added a highlight/backlight for the active window so that the user can know which window is active."}, {"post_id": 70039, "ts": "2026-09-18T10:50:35Z", "hours": 0.9075, "text": "I removed window decoration because I don’t like it. Added navigation in the launcher using the arrow keys/navigation keys and ability to open the app using enter. You can focus the window by clicking it and close it by shift + c."}, {"post_id": 70022, "ts": "2026-09-18T09:29:27Z", "hours": 0.8019, "text": "Got the launcher show up when pressing shift + space. The problems was that it was getting hidden behind the DOM so I fixed that and now the launcher actually does show up when the user presses shift + space."}, {"post_id": 69087, "ts": "2026-09-16T10:55:49Z", "hours": 0.4425, "text": "Setting up the basic structure, adding a dark theme, and creating a fixed bottom status bar (similar to waybar), implementing a horizontal scrolling layout for the main workspace, inspired by tiling window managers like Niri. Added a JavaScript function to spawn dummy windows so you can see the scrolling mechanics along with a functional clock for the bar"}]...
|
Title: Tux-WebOS by @deadbeef404 | Stardance
Devl Title: Tux-WebOS by @deadbeef404 | Stardance
Devlogs:
Setting up the basic structure, adding a dark theme, and creating a fixed bottom status bar (similar to waybar), implementing a horizontal scrolling layout for the main workspace, inspired by tiling window managers like Niri. Added a JavaScript function to spawn dummy windows so you can see the scrolling mechanics along with a functional clock for the bar
Got the launcher show up when pressing shift + space. The problems was that it was getting hidden behind the DOM so I fixed that and now the launcher actually does show up when the user presses shift + space.
I removed window decoration because I don’t like it. Added navigation in the launcher using the arrow keys/navigation keys and ability to open the app using enter. You can focus the window by clicking it and close it by shift + c.
I added a full screen ability so u can full screen the active window by using shift + i. I also added the ability to change the active window by using shift + h to go left and shift + l to go right window. Additionally I added a highlight/backlight for the active window so that the user can know which window is active.
I added a wallpaper and made some theme changes for consistency.
Added ability to change wallpaper and add custom wallpaper in the settings application.
I made terminal functional with few commands. I added help, clear, echo, date, whoami, and neofetch.
I made the file manager actually functioning with some files in it asw.
I have added a functioning system monitor so now it shows some information. NOT correct one but it DOES show SOMETHING so yeah :)
Added a welcome screen to welcome and explain how to use it.
Added a readme.md file
Ships:
This is a keyboard driven, scrollable tiling window manager inspired webOS. Only for devices which have keyboard access cuz it is mainly keyboard driven....
|
1793210082.8371253
|
1793296482.8371253
|
|
10129
|
reMDer by @Keyboard1000n17 | Stardance
|
Keyboard1000n17
|
0
|
197.03
|
0
|
[]
|
[{"post_id": 71282, "ts": "202 [{"post_id": 71282, "ts": "2026-09-20T16:00:28Z", "hours": 25.7911, "text": "last devlog this is my last devlog the project isn’t complete and i won’t be shipping it. you see, i was banned for 2 months for misconduct on slack (i will not provide details here but i deserved it, it was corny anyway), and as part of that ban, i can’t participate in any events, including stardance. in this time however, i’ve done a lot. there’s now spinners for images, proper tables, and so many more improvements. keep your eyes peeled for a release on the github ! 👀 also it doesn’t matter that this devlog is 15 hours over the limit, its not like i can do anything about it. also if one of you regulars in #stardance see this, can you please ask amber if i can have my sticky streak rewards? i really want the stickers and plushie Changelog ( 446103b ) Render details elements properly again ( f527e5d ) Better logs, align images in row when a paragraph contains only images ( 3df2f59 ) Make task list function use TextChunk over ANSI escapes ( 2367089 ) Add proper tables ( 47c2b42 ) Add aligning components ( 00785d7 ) Move from Chalk/ANSI escapes to OpenTUI StyledText for styles ( 429e4b6 ) Load images lazily with spinner while loading ( a993197 ) Use OpenTUI ImageRenderable for images in renderer ( aa96067 ) Improve types and error handling, work on image bug ( b54ad43 ) Revert “Add footnote plugin (usage WIP) (errors on run)”"}, {"post_id": 64726, "ts": "2026-09-09T11:11:17Z", "hours": 6.0719, "text": "scroll one line at a time, render div and details elements not very big news here, but now you can: scroll just one line at a time instead of a whole renderable/element at once render div and details properly! now you can click on a details element to open and close it! this didn’t even take too long more technical, but i switched to mostly using the opentui renderable api which uses classes like TextRenderable or BoxRenderable that return a Renderable instance instead of functions like Text and Box which return a ProxiedVNode<T> . this is mostly because there’s a bunch of things a Renderable has that a ProxiedVNode doesn’t anyways im currently working on adding footnotes, so see you in a few days Changelog ( 64f6ed8 ) Add footnote plugin (usage WIP) (errors on run) ( ddd5c46 ) Add indicators to details elements and opening on click/space/enter ( 344806a ) Add support for rendering div and details elements ( d3b4a1d ) Fix small layout issues ( 5eb11b9 ) Scroll only one line at a time and convert (mostly) to Renderable API"}, {"post_id": 62808, "ts": "2026-09-06T10:22:48Z", "hours": 10.2442, "text": "table of contents feature is done! took only 10 hours, but im done with the table of contents thing! you can press shift+j to go down to the next heading, and i forgot to add shift+k 😭 anyway this took a while since i couldn’t figure out how to position the box properly and how to style it. this was fucking ass icl. i usually have much more to talk about but this wasn’t the most fun so here’s the commits: Changelog ( 5ccec11 ) Remove unnecessary focusing ToC ( 927cae9 ) Add tab cycling ( ae72d3d ) Scroll ToC menu to selected index instead of blindly 1 down ( 249d61a ) Implement scrolling ToC on pressing J ( a2ae0f2 ) Get table of contents feature working ( a6c7744 ) Add scrolling to next heading on pressing J ( 49f8fec ) Add “? - Help” hint to end of bottom bar"}, {"post_id": 60445, "ts": "2026-09-02T19:38:19Z", "hours": 10.6467, "text": "figlet headings, small headings, bottom bar, help menu and keybinds we’ve got a lot of new stuff! firstly we’ve got a bottom bar! all it does for now is show reMDer with a green bg and the file name next to it, but i’ll add more later! next we’ve got figlet headings! at the start i was thinking about using figlet for headings but i gave up on that. but now, i’m back to using it! this took a good chunk of the overflowing hours here but they look really cool too! passing a --no-render-headings or -H flag will make the headings render as normal text with colors instead of figlet fonts now! there’s now a tiny help menu in the corner! it only shows two keybinds right now–oh and speaking of keybinds… keybindings are now in ! for now you can press q to quit, ? to toggle the help menu, and C (shift+c) to open the console in debug mode and that’s about it next steps? here’s what i’m gonna do next: add support for horizontal rules add a table of contents feature like that of the leaf markdown viewer add some stuff to the bottom bar add an option to put the bottom bar at the top instead add support for a config file using YAML Changelog ( 9557586 ) Add help menu ( a4149e2 ) Add keybinds: q to quit, C to toggle console ( 4b18153 ) Finish figlet fonts support ( d23466d ) Start trying figlet again for ASCII art ( 33d52ea ) Start working on ASCII art for h2 headings ( b0e1668 ) Add option to not print big headings ( c58369c ) Start with bottom bar"}, {"post_id": 56522, "ts": "2026-08-28T10:01:31Z", "hours": 7.42, "text": "code blocks, alerts, emojis and task lists! we’ve got loads of new cool stuff that get rendered now! first, github alerts/callouts now render nicely! they look like this: > [!TAG] > content where TAG can be NOTE , IMPORTANT , TIP , WARNING or CAUTION . they also have these cool icons next to them, but the catch is you need a nerd font for it. i’ll add an option to not need it and only use ascii characters next, we have highlighted code blocks! the renderer can highlight hundreds of languages using shiki ! you might not even have heard of some of the languages that it can highlight! imo its really nice looking and i love it! the bulk of this time came from adding support for task list items because i couldn’t figure out how to do it. eventually after some tinkering i’ve got it to work! it looks kinda cool too tbh i also got emoji support using an extension. it automatically converts :emoji: to the corresponding emoji if its in the unicode specification. finally, i added a simple height option that just sets the height of the renderer. it allows you to set the height of the renderer manually and that’s about it lmao Changelog ( b4f69ad ) Add height option ( beea3a6 ) Add task list items support ( 4c42c84 ) Add emoji support ( 564a761 ) Upgrade markdown-it, fix breaking changes ( 963d910 ) Add alerts support ( 5e266e8 ) Add icons in code blocks ( 0bf0af7 ) Add code block support"}, {"post_id": 54062, "ts": "2026-08-24T20:36:45Z", "hours": 4.4367, "text": "holy fuck, you can pipe into stdin and tables render properly! while this is quite out of schedule (i usually post every 2-3 days), today brings some peak stuff! the peakest part is at the end firstly, i have in fact fixed tables! the issue was i was pushing the accumulated cells array to the rows array in the wrong loop. i was doing this in the loop that iterates over the cells in a row, so it was causing it to repeatedly push the same strings over and over. the fix was putting it in the loop just outside, that is, the loop that iterates over the rows in the table token! i’ve also improved the image handling! now Image classes have the buffer property renamed to content , and has a new property called properties , which is always {} . with this, it has all the properties of ProcessedToken , so my lsp won’t complain that some property doesn’t exist on Image speaking of ProcessedToken , its now an interface instead of a type. there’s also a new TableToken interface that extends ProcessedToken , with an alignment property. this makes it a bit easier to handle tables since the content property is narrowed. also, it seems like opentui’s tables don’t support alignment, so i might have to make a custom table function. i also upgraded opentui from 0.5.7 to 0.5.8! i have no idea what changed, but whatever i’ve also stopped using chalk to color my errors since the opentui console doesn’t support ansi now the peakest part is you can pipe markdown into the program . this is pretty peak and you must agree since there’s a lot of stuff you can do with this. for example, you could render arbitrary markdown without having to create a file first! it has a limitation though: if you’re on windows, you can’t use the interactive mode, and the rendered content is forced to print to stdout. this is because of a bug with bun. if you’re piping into the program, it’ll get the input by calling await Bun.stdin.text() , but this stops sending keypresses to opentui because of a bug in the bun runtime, so you can’t scroll down. i solved this issue (or rather, chatgpt solved this issue) by opening a read stream on /dev/tty . the issue with this is that /dev/tty doesn’t exist on windows since its not unix-like. my idea was to just, not let you do interactive mode on windows if you’re piping content to it. again, this is a bug with bun, and i’ll remove this limitation once one of the two is merged. that’s right, there’s two! here’s one for reference: https://github.com/oven-sh/bun/pull/32153 shit that was long Changelog ( dd07e14 ) Upgrade packages ( 77e6d34 ) Add support for piping into renderer.ts from stdin ( 1995f45 ) Improve image and ANSI handling, stop using chalk in errors ( 22cfacd ) Improve table handling, switch some types to interfaces pls like"}, {"post_id": 53181, "ts": "2026-08-23T16:52:59Z", "hours": 9.7842, "text": "better types. debug mode and stdout! from my last devlog: next up: code blocks (~2-4 hours) fixes to table rendering (<30 mins) fix image handling (it doesn’t handle relative paths correctly) (<1hr?) of these, i’ve done none! what i have done though is add flags and types! i spent a while dealing with type errors because i decided to specify types instead of just putting any on ProcessedToken.content . i also added a debug flag, but literally all it does is show the console i also fixed the width thing, so the content is only as wide as the space you give it so cooll!! the main part of this is that i added a --print-to-stdout flag that just prints the formatted markdown to stdout! you can just scroll in your terminal instead of having a whole ass tui its kinda borked and incomplete though, so i’ll fix it up! it does print some garbage at the beginning so that’s not great anyways, i’d better do what i said i’ll do last devlog! i went off track for this lmao Changelog ( b1c0489 ) Implement half-baked print to stdout option ( aa3c029 ) Add debug flag, fix logic errors ( aa33e84 ) Specify types for ProcessedToken.content instead of any"}, {"post_id": 51600, "ts": "2026-08-21T11:25:29Z", "hours": 8.0094, "text": "(back to) opentui! if you’ve read my last devlog, you might remember that i was considering the jsvision library. however, i came back to opentui because its still much simpler. also, i found that there are libs to adapt ansi! or at least chatgpt did at first i was doing ghostty-opentui , but i realized after some time that it was literally a whole terminal. then i got chatgpt to find me this package called ansi-sequence-parser ( https://www.npmjs.com/package/ansi-sequence-parser ) and its perfect! so now im using that to render the bold and italics! tbh i could just eliminate the middle stage ( stylize.ts ), but i put a lot of work into it and i’m extremely vulnerable to the sunken cost fallacy, so i’m doing this bloat lmao. also, i got ordered lists, bullet lists, and blockquotes working! they look so cool! as for the menu, its not doing very fine, but that’s because i’ve not worked on it! i’ll get to it, don’t worry! next up: code blocks (~2-4 hours) fixes to table rendering (<30 mins) fix image handling (it doesn’t handle relative paths correctly) (<1hr?) Changelog ( 8b44667 ) Add blockquotes and 1 row bottom margin to second-level renderables ( 3e5182f ) Add oredered list handling ( d997aff ) Switch back to OpenTUI, get things working"}, {"post_id": 49847, "ts": "2026-08-18T19:57:55Z", "hours": 8.505, "text": "generational fuck up well i’ve messed up big time, sunken cost fallacy is real and it got me you see, i was using opentui earlier, but i decided to change because i realized that it doesn’t support ansi escape sequences. i landed on neo-neo-blessed , and it seemed cool, until i realized the list selection thing got fucked up because it didn’t handle scrolling list options with heights greater than 1 row properly which is a deal breaker. i also spent a lot of time patching its types, in fact that’s what most of this time went to i think i’ll use jsvision. it seems interesting and i’ve got nothing to lose. the only issue is it has one maintainer and 9 stars, but gpt found it, and it seems cool. also they have demos of the unmodified lib running in the browser which i wanted to do, so this will be fun Changelog ( 33e1c91 ) Start using neo-neo-blessed and do a generational fuck up"}, {"post_id": 47449, "ts": "2026-08-15T11:47:19Z", "hours": 9.8211, "text": "TUI! i’ve got news: the TUI renders! for this tui, im using opentui! right now, the tui only shows an interactive list of files, and its supposed to render the file content if you select one, but that’s not happening right now. i’ve been working on the function to make opentui render the markdown. while opentui does have its own thing for markdown rendering ( ), i’m gonna render my own markdown. im currently trying to get tables working! Changelog ( c8ab716 ) Work further on rendering, start with rendering tables ( dc8b0be ) Start using OpenTUI for rendering TUI ( 86347cf ) Render unknown HTML correctly (without showing tags)"}, {"post_id": 44744, "ts": "2026-08-10T18:22:19Z", "hours": 2.7394, "text": "it works holy shit it works, the problem was that i was running a function but i wasn’t putting it in a console.log . the test function for reference returned a string. also, unknown tags are handled somewhat properly. i need to actually fix that, but once i do, im gonna start on the tui!! its been 96+ hours now what a crazy thing, i expected this to take 10-20 hours and now look at this… anyways, i’ll go fix the unknown tag thing! after that i’ll start working on the tui Changelog ( c1461c3 ) Get unknown HTML tags rendering"}, {"post_id": 43978, "ts": "2026-08-09T13:44:03Z", "hours": 10.3797, "text": "headings! unknown tag handling (that doesn’t work)! well we’ve got some nice stuff now! here’s a list of everything, including problems!: just whitespace? no more! : tokens that are just whitespace get omitted typescript lsp doesn’t complain : oh my god finally that was so annoying what’s this tag? : if it doesn’t have a handler, it falls back to the default, that is, it turns into a string! this doesn’t work properly though, i have to fix this ching chong ruby tags : now ruby tags are supported! is that a highlighter? : mark elements are now supported, which just put a yellow bg on some text is this a block element or not? : now the renderer can tell by looking at a token’s block property proper heading rendering?!?!? : chatgpt wrote the entirety of this part because you cannot bother me to make an efficient function that wraps giant text art letters based on width where’s the inline code? : that’s right, it doesn’t work and gets completely omitted! Changelog ( 456161f ) Trim content, add boolean property ( 07da8a6 ) Add handlers type to make the LSP shut up, trim strings in test file ( b4d251c ) Add handling for unknown tags ( d903b48 ) Add support for dfn , samp , ruby tags ( 813d934 ) Fix code to stop TypeScript ( vtsls lsp) warnings"}, {"post_id": 40582, "ts": "2026-08-04T07:04:35Z", "hours": 9.9967, "text": "typescript! i’ve moved to typescript, cleaned up some code, finished that image function from last devlog, and upgraded packages! finished the image function : now it works perfectly! upgraded packages : shiki was upgraded! its the code coloring package btw added a test : i can’t keep pressing the arrow keys in bun repl i have to do this moved to typescript : this is the main thing. devs on discord kept telling me to use and i said i’d do it soon. i wasn’t planning on it at this time, but i did because i got fed up with a stupid bug where i was accidentally setting token types to a boolean instead of a string. that prompted me to just do it™ and now i’m fixing a bunch of bugs! still not sure why the language server is just complaining about cases that can’t happen, but that’s what typescript is for i guess Changelog ( 688afd8 ) Start moving to TypeScript ( ac99373 ) Switch to map for aliases, add test, clean up code ( c62c57b ) Upgrade packages, clean up code ( f98e65c ) Finish revamping image function"}, {"post_id": 38811, "ts": "2026-08-01T11:37:47Z", "hours": 10.2436, "text": "WIP WORK // INCOMPLETE // this was a lot of work, and i’m still not done with html in the stylizer! here’s a list of changes with explanations: add more aliases to the aliases array in the html parsing section: this makes it so that html tokens and markdown tokens have the same types convert the array of allowed html tags into a set : sets have a .has() function that lets us find an element in O(1) time complexity which is much faster compared to Array.prototype.includes() which has an O(n) time complexity properly implement disallowed tags: these tags show as plain text because they are disallowed and shouldn’t be processed in markdown put non-block tokens as children of an inline token: non-block tokens only got parsed in the part where inline tokens were processed set attributes: the objects returned by the stylize function now have a properties key better error handling: now, where it used to just throw an error about being undefined or whatever, it will catch it, and throw a more useful error with better debug info [BUGFIX] make sure that arrays don’t get nested: this was a bug where arrays would get nested for some reason [BUGFIX] set token.level and token.nesting properly when processing html: this is necessary because the while loop depends on the nesting to know when to stop accumulating tokens and process them [WIP] html handling: any tokens having the substring _open in their .type property are handled all together, with a handlers object made up of functions. this handling is recursive token with types that don’t match the substring _open get handled through other branches of the if statement ( else if(...) {..} ) [WIP] bullet list handling: i did not realize that there were more markdown-it tokens that i had not added handling for in the stylize function. i also need to do this for some more token types too [WIP] revamp image handling: instead of just a complicated function, i added a class called Image that has a function to render the image. its nearly complete but it has some errors that i committed because i need to commit often lmao chatpgt usage now here i used chatgpt a lot for debugging. here’s exactly what i used it for: why tokens weren’t being processed: this is the problem the array nesting bugfix fixed fixing infinite recursion: i accidentally did that lmfao replacing top-level non-block tokens with an inline token that contains those top-level non-block tokens as children figuring how to set the level property of the tokens questions about syntax and mutation of global vars Changelog ( 5e931f7 ) Revamp image function (WIP) ( 0ce066f ) Improve error handling and fix token.level assignment ( 0f28b75 ) Process details element in stylizer ( 0e154f3 ) Start improving stylizer (WIP) why such long devlogs? you may have noticed i’ve been going more and more time without devlogging. that’s because i like devlogging when there’s a big new thing, not for every small little thing. my plan for this devlog was to announce that i was done with processing html in the stylize function, but that hasn’t happened yet because well, there were a latta bugs here and there, and i had to fix those too. as for the length of the devlog text, i like writing about my progress here because its the only place where it makes sense to talk about it in-depth"}, {"post_id": 35679, "ts": "2026-07-27T08:45:19Z", "hours": 7.8072, "text": "HTML parsing is now complete its been nearly 2 weeks and i have great news: html parsing is complete what this means is that html blocks get processed into token streams like the one’s markdown-it makes. now, i must clarify that these html blocks were already in a token stream but they were distinctly html, having the type html_block , and if i didn’t convert those html blocks into markdown-it’s _open / _close tokens, i’d have to parse it in the file that styles the tokens, and many html tags do the exact same thing as their markdown counterparts so i could reuse some functions. i must also clarify that i have NOT done anything for stylizing html in the stylize.js file, which deals with processing text formatting and image processing next up: stylizing html! Changelog ( c5a5ce0 ) Finish HTML parsing ( 841ba42 ) Start work on HTML parsing"}, {"post_id": 29515, "ts": "2026-07-16T14:30:25Z", "hours": 1.24, "text": "improvements and fixes to inline rendering this is way earlier than my normal schedule, but that’s because i’ve got something to show . basically, inline rendering was bugged , and not only did i fix it , i also made it so that it works better ! that’s all you need to know, do NOT read the rest of this if you don’t want to be bored to death, its a really lengthy explanation of this the initial bug was that inline rendering wouldn’t work at all. i figured out the problem was that i wasn’t pushing \"inline\" to the state array somewhere. i realized that it wasn’t working when called in the table rendering function, and that was because i wasn’t pushing \"inline\" to the state array. the reason for this is because the renderInline function slices the state array at the index after the \"inline\" string, so if its something like [\"paragraph\", \"inline\", \"bold\", \"italic\"] , the function slices at index 2 because \"inline\" is at index 1, and we get [\"bold\", \"italic\"] . the problem is, if \"inline\" doesn’t exist, running indexOf(\"inline\") returns -1, so it slices at -1 + 1 , which is 0, so its just the whole array. but anything before “inline” isn’t a valid style, and since the function for that is undefined, it goes kaboom and throws an error saying that it’s not a function. also gpt found 5 other bugs but they’re kinda irrelevant the fix was making it so that the renderInline function itself pushed \"inline' to the state array instead of depending on it being already there. this also removed the need for making sure that the inline string was already there. i might do this with the rest of the functions too actually :goonology: also removed unnecessary state.pop() occurrences since the pop method is destructive and can mess up everything as for the improvement, you might see in the first screenshot that there’s a bunch of text tokens together. yk, they could be squished together into one token… oh right, that’s what i did! i changed the renderInline function to make a variable where the text accumulates until there’s no more text or if there’s an image, on which it gets pushed to the contents array now the most important thing is that there’s only one more thing left to do: html rendering . this is the last thing before i get to actually rendering stuff on the screen! this is exciting! Changelog ( 9de477d ) Fix, improve inline rendering please like this took more than an hour to write"}, {"post_id": 29168, "ts": "2026-07-15T21:42:41Z", "hours": 4.2522, "text": "THAT WAS SO LONG WHAT ON EARTH in short, tables now work and the inline rendering function is fixed! this took a while because i genuinely had no idea what i was doing. now the long stuff: tables go brr i got distracted while writing this and realized everything’s actually borked, but tables do somewhat work! its still borked tho– also i realized that my whole code is borked, but… inline rendering includes links now! still have no idea how i missed that other i just changed image function so that it returns an object with a prototype function instead of unnecessarily repeating the function as a property of all the image objects, so if there’s 10 pictures in a file, there will only be one function to render each as opposed to 10 instances of that function Changelog ( d8feb46 ) Add table support, fix inline rendering oh fuck, my code is COMPLETELY borked"}, {"post_id": 27805, "ts": "2026-07-13T17:59:20Z", "hours": 2.5478, "text": "PEAK CODE gng TS IS PEAK!!!! i added a function that renders code AND ITS PEAK JUST SEE THE SS now some of this time came from trying to figure out why my code was joining the contents of a function, and it was because i forgot to add the argument that gave the coloring function (chalk library) the text to color. hey, at least i found a way to read the contents of functions time to go steal code from closed-source packages leaving that aside, my next step is thematic breaks. this shouldn’t be too hard, in fact, i’ll do it rn since it’s that easy. rn its 8:49 PM GMT+0300, i’ll tell in the next paragraph when i finish it. [8:54 PM] just did it, it only took like 2 mins, the other 3 were because i found a bug that never removed codeBlock from the stack after it was added. that’s about it, and this devlog was quite short. well, comparatively, to my other devlogs, after all there’s people posting 4 word devlogs. you should follow this project tho Changelog ( a17bd2b ) Add thematic break support ( e28f1b1 ) Add code block styling"}, {"post_id": 26701, "ts": "2026-07-11T17:20:33Z", "hours": 4.4769, "text": "when the FUCK did this become 4 hours so uhh i spent like all of this time debugging and improving my code. first thing is, i replaced these “microfunctions”, as i call them, with an object that had keys whose values were arrow functions. these arrow functions did the exact same thing and took up less space and was even more readable! second, i spent some time on a stupid bug where the main function in stylize.js would hang. i thought it was an issue with the image function, but after half an hour or so, when i added console.log(done) right before the return, i realized it had to do with the main function that was calling the image function, and sure enough, the second i looked at it, i realized the problem: it was a while loop and i forgot to add a line that incremented the index, so it just kept doing the same thing forever until i killed the process oh well, more hours for me third, i improved (or rather cleaned) my image function. it returns promises and doesn’t use terminal-image directly. instead, i made it so that it would return an object with a bunch of keys, one of which is a function that takes the whole object as an input. this function actually renders the image, since i plan to write the function to display it in a way that deals with image rendering after rendering text, and while the images get rendered, a spinner takes their place temporarily, but the images replace those spinners once they are processed fourth thing is, i made it so that the main function calls the renderInline function instead of the paragraph function. in fact, this paragraph function is completely useless, so i went ahead and removed it too. lastly, i upgraded a bunch of packages: upgraded typescript from version 5 to 5.9.3 upgraded got from version 15.0.7 to 15.1.0 upgraded markdown-it from version 14.2.0 to 14.3.0 upgraded shiki from version 4.3.0 to 4.3.1 if you wonder what these packages are typescript is, well, the typescript language, not sure why i have it, might be a dependency for another package. got is some package that does pretty much the same thing as the default fetch() but it can give me a buffer, which i need for images markdown-it is the markdown parser shiki is for coloring code. fancy, right? Changelog ( 9118913 ) Improve code ( 5b9c953 ) Remove test file ( ab3af08 ) Test image URL parsing on GitHub aight this took me 2 hours to write and i started coding again in the middle of writing this"}, {"post_id": 21475, "ts": "2026-07-03T13:24:58Z", "hours": 5.595, "text": "oof! that was a lot of work, but now we’re REALLY getting somewhere!!! first thing, headings actually work now, and if there’s a link in the heading, it gets displayed right below the heading! tbf i did rip the heading thing straight out of the original index.js file when i was trying to make a markdown parser using regex secondly, and the more important thing, image rendering now works . pretty big milestone. i achieved this through the terminal-image npm package. however, this took a while because i couldn’t figure out why it wouldn’t render. the problem was tmux–it was stripping the codes it didn’t recognise so i implemented another system to detect if the terminal had color and/or image support to decide whether to use ansi blocks or actual images. now, it works! ts so peak fr tl;dr headings work (i ripped them out of my original implementation in index.js ) images work (took me a while because it didn’t work properly in tmux we getting somewhere with this one 🔥 Changelog ( 9941b1b ) Finish image rendering ( 007b3f4 ) Work on image rendering ( 609be18 ) Make heading work"}, {"post_id": 18690, "ts": "2026-06-29T21:31:37Z", "hours": 6.2242, "text": "holy this shit is so long heyo! this is a long one, so i’ll go over this commit by commit ( 0ad2cb2 ) Start paragraph parsing here, i did these: i made a global string state to maintain the nesting while styling. managing this was quite tedious and useless i added a helper function to get the style of a token called getStyle() . i’ll explain the use for it below. i continued working on the heading() and paragraph() functions as well as the stylize() function ( eb218d2 ) Add markdown extensions as for this one, i added a bunch of packages, mostly extensions for markdown-it . these are: markdown-it-footnote markdown-it-github-alerts markdown-it-sanitizer markdown-it-table markdown-it-task-lists shiki (for code highlighting) terminal-image i removed a few of these later because they were either not really working properly or just weren’t necessary. besides these, i also configured the plugin to use the plugins, enable the autolink extension and also replace all HTML line breaks ( <br> ) with double newlines ( \\n\\n ) ( 5ecef2c ) Start working on image rendering and colors/styles now here is where i found a gem in my dependency tree. you see, i was searching for a package to handle color rendering since i sure as hell wasn’t gonna deal with the hex codes shiki , the code-highlighting plugin, was giving me for the colors of the tokens. so i saw a package called chalk and it sounded familiar. turns out, shiki had chalk as a dependency, so it was already installed! for that reason, i added a chalk import in this commit. i also started working on an image function to render images, and named it renderImage() . also added a great error message if two requirements weren’t met: throw new Error ( \" WRONG TOKEN IDIOT DEV \" ); but that was all i really did in that function ( 0dc393d ) Remove unnecessary object processing and dependencies this is where i removed markdown-it-footnote and markdown-it-table because i realized there just wasn’t a point in those since they weren’t letting me test my function, they were erroring out for some reason and i found out markdown-it-table already had support for markdown tables. i also removed the mapping function in the parser stage that i made to give myself only a few fields. it was pretty useless since i kept randomly finding that i’d need some new property. ( 8a5200c ) Continue work on inline parsing, add terminal-link latest commit, this is where i did a lot of work: i removed terminal-image as a dependency since i found that bun already provided a class for it ( Bun.Image ) and it also had webp support unlike terminal-image , so no point in another package when a built-in one works better i made the getStyles() function better i added a bunch of micro-functions like bold() , italic() , etc. i also renamed renderImage() to image() i combined two if statements into one in this image() function because why 2 if statements when 1 i did a lot of work in the renderInline() function. now it uses computed function names that call those micro-functions. i also changed that global string state to a global array, made things much easier. i worked on the heading() and paragraph() functions further that’s about it gng, also its 12:28 am for me rn this is why we devlog more often gng ✌️"}, {"post_id": 17162, "ts": "2026-06-27T21:04:18Z", "hours": 2.7842, "text": "toiling away… toiling away at this code… today was a bunch of stuff i added a renderInline() function to render stuff inline. i still need to add images and links, but i’d need a lib for links, and maybe for the images too i worked more on the main function. right now, im trying to get paragraphs actually rendered, which will take a while. i also added a heading() function that will render headings, emphasis on will because its not being called yet it took me a lot of thinking to get here so that part wasn’t too fun (a person who thinks all the time, has nothing to think about 🔥) changelog ( e24a192 ) Work more on the stylizer ( 1a02163 ) Start actual work on stylizer"}, {"post_id": 16483, "ts": "2026-06-26T20:35:10Z", "hours": 1.5342, "text": "revamp! i revamped the parse-input.js file! now, it has two functions: giveFields(obj) this is a function called by the second function. since markdown-it (the parser im using now!) has a lot of fields that i don’t need. so this function returns a mapped array with the fields type , tag , nesting , content , and children . as for this children field, the children field is an array of objects, where the objects are just like the parent object, with lots of unnecessary fields. for those, i used recursion! (it’s my first time using recursion ) parse(input) : this is the function that i’ll be using to get the tokens i need to style! what it does is pretty simple: initialize a new instance of the MarkdownIt constructor (? i’m not too sure if it’s a constructor) get markdown-it ’s tokens using their parsing function make a constant whose content is an array of objects returned by the first function ( giveFields() if your memory is that terrible). again its a mapped array that gives only select fields from the markdown-it tokens return that constant in other news, i wrote 2 more test markdown files. one tests the behaviour of headings and the other tests the behaviour of inline stuff like bold and italic text! Changelog ( 88bad121 ) Revamp parse-input.js ( 3eda61e5 ) Add more stuff to inlines.md"}, {"post_id": 15772, "ts": "2026-06-25T17:18:25Z", "hours": 2.5692, "text": "FUCK fuck this rewrite, i’m abandoning this shithole of a parser i’m trying to make, i’ll just go use an already existing parser, its just not worth it it’s too much hassle to make an in-house parser, so here’s my plan: i install a markdown parser that returns a tree of text, not html, and as a dependency in the styling part, i’ll go ahead and read the tree of text that the parser returns it gets passed to the renderer hopefully this will move much faster now!"}, {"post_id": 11542, "ts": "2026-06-18T20:48:29Z", "hours": 2.0211, "text": "rewrite i started a rewrite! what i was doing earlier was honestly too messy to actually use. my earlier way was making a bunch of regexes and using those to match the remaining text. my new method is still using regexes, but i split the whole thing into two parts: block parser and inline parser. block parser the block parser splits the markdown doc on newlines and checks what it starts with or ends with. when it finds that some line is not a paragraph, it pushes a token to the tokens array indicating that it is the start of a block. when it detects that the block has ended, it pushes a token to the tokens array indicating the end of the block. this is currently only implemented for headings, more are coming. it took this long because me dumb inline parser the inline parser loops through the existing tokens array made by the block parser and looks for characters that indicate the start of an inline token like bold, italic and so on. like the block parser, it will push start and end tokens to the tokens array the implementation of the inline parser has not started yet new character i added a backslash to the giant block letters i made for headings! Changelog (bac8c5a) Start parser rewrite (664713e) Add backslash in heading"}, {"post_id": 10859, "ts": "2026-06-17T20:14:25Z", "hours": 7.0403, "text": "help me what on god’s green earth is this so after dealing with a shit ton of regex and doing pretty much nothing with it besides some stuff that would improve performance, i have decided that regex is not the way. instead, i’ll just set a bunch of flags with empty content and make a separate function that processes everything. i think the styling function will handle tokens because that’s its job, to style the tokens. at least i have something to follow now. (i did not implement any of this yet) Changelog fc8de72 : Fix some regexes fe6eeef : Change some regexes f67c3b5 : Change matching system in parser 8a80409 : Add some HTML support in lexical parser 0727d82 : Finish lexical parser (almost) b7bc45b : Make lexical parser work"}, {"post_id": 7594, "ts": "2026-06-12T18:16:30Z", "hours": 6.0661, "text": "i got bombed by my own regex anyways, so i started making a lexical parser and uhh its not going all sunshine and rainbows. the blockquote regex doesn’t really work right and also i checked the gfm spec since i want to adhere to it and uhh fuck i might be cooked. i thought ts was going to be a 20h project help meeeeeee also yes it took me 6 hours for 74 lines of code sob this is just great"}, {"post_id": 6452, "ts": "2026-06-10T21:06:48Z", "hours": 1.475, "text": "HEADINGS NOW RENDER! headings now render! as you can see in the screenshot, it now renders the headings as big boys also, me very happy. this took a while because i lowk didn’t know what to really do. i didn’t think about how i would do it, i was only thinking about doing it anyways gn gng"}, {"post_id": 5881, "ts": "2026-06-09T20:48:17Z", "hours": 6.8622, "text": "took only this long to make a bunch of letters you see, i had to make a bunch of custom glyphs to render headings in the terminal. making that for pretty much all the characters on your keyboard isn’t quite easy but hey its done now. the thing is, this is only for level one headings. once i finish the actual parser, i’ll add glyphs for the rest of the headings. in the meantime, i’ll have to do the rest. i did not expect to have spent this long on the project already yk"}, {"post_id": 4481, "ts": "2026-06-07T20:14:04Z", "hours": 0.4414, "text": "a terminal markdown reader that has actual headings? never could have thought of it huh well this is what i’m doing. literally a markdown reader that prints text the way you might have written it. anyways so this is gonna use bun since bun is ultra fast. also this might be a 10-20h proj, shouldn’t be too hard. well i like more hours, so i might also add stuff like: browsing all the markdown files in a directory (and subdirectories) editing (very unlikely!) well i don’t really know what else to put so ig that’s it? anyways i have actually done some work, that is, my file currently ouputs some text. literally the raw original text. what’d you expect from 24m of coding"}]...
|
Title: reMDer by @Keyboard1000n17 | Stardance
Dev Title: reMDer by @Keyboard1000n17 | Stardance
Devlogs:
a terminal markdown reader that has actual headings? never could have thought of it huh well this is what i’m doing. literally a markdown reader that prints text the way you might have written it. anyways so this is gonna use bun since bun is ultra fast. also this might be a 10-20h proj, shouldn’t be too hard. well i like more hours, so i might also add stuff like: browsing all the markdown files in a directory (and subdirectories) editing (very unlikely!) well i don’t really know what else to put so ig that’s it? anyways i have actually done some work, that is, my file currently ouputs some text. literally the raw original text. what’d you expect from 24m of coding
took only this long to make a bunch of letters you see, i had to make a bunch of custom glyphs to render headings in the terminal. making that for pretty much all the characters on your keyboard isn’t quite easy but hey its done now. the thing is, this is only for level one headings. once i finish the actual parser, i’ll add glyphs for the rest of the headings. in the meantime, i’ll have to do the rest. i did not expect to have spent this long on the project already yk
HEADINGS NOW RENDER! headings now render! as you can see in the screenshot, it now renders the headings as big boys also, me very happy. this took a while because i lowk didn’t know what to really do. i didn’t think about how i would do it, i was only thinking about doing it anyways gn gng
i got bombed by my own regex anyways, so i started making a lexical parser and uhh its not going all sunshine and rainbows. the blockquote regex doesn’t really work right and also i checked the gfm spec since i want to adhere to it and uhh fuck i might be cooked. i thought ts was going to be a 20h project help meeeeeee also yes it took me 6 hours for 74 lines of code sob this is just great
help me what on god’s green earth is this so after dealing with a shit ton of regex and doing pretty much nothing with it besides some stuff that would improve performance, i have decided that regex is not the way. instead, i’ll just set a bunch of flags with empty content and make a separate function that processes everything. i think the styling function will handle tokens because that’s its job, to style the tokens. at least i have something to follow now. (i did not implement any of this yet) Changelog fc8de72 : Fix some regexes fe6eeef : Change some regexes f67c3b5 : Change matching system in parser 8a80409 : Add some HTML support in lexical parser 0727d82 : Finish lexical parser (almost) b7bc45b : Make lexical parser work
rewrite i started a rewrite! what i was doing earlier was honestly too messy to actually use. my earlier way was making a bunch of regexes and using those to match the remaining text. my new method is still using regexes, but i split the whole thing into two parts: block parser and inline parser. block parser the block parser splits the markdown doc on newlines and checks what it starts with or ends with. when it finds that some line is not a paragraph, it pushes a token to the tokens array indicating that it is the start of a block. when it detects that the block has ended, it pushes a token to the tokens array indicating the end of the block. this is currently only implemented for headings, more are coming. it took this long because me dumb inline parser the inline parser loops through the existing tokens array made by the block parser and looks for characters that indicate the start of an inline token like bold, italic and so on. like the block parser, it will push start and end tokens to the tokens array the implementation of the inline parser has not started yet new character i added a backslash to the giant block letters i made for headings! Changelog (bac8c5a) Start parser rewrite (664713e) Add backslash in heading
FUCK fuck this rewrite, i’m abandoning this shithole of a parser i’m trying to make, i’ll just go use an already existing parser, its just not worth it it’s too much hassle to make an in-house parser, so here’s my plan: i install a markdown parser that returns a tree of text, not html, and as a dependency in the styling part, i’ll go ahead and read the tree of text that the parser returns it gets passed to the renderer hopefully this will move much faster now!
revamp! i revamped the parse-input.js file! now, it has two functions: giveFields(obj) this is a function called by the second function. since markdown-it (the parser im using now!) has a lot of fields that i don’t need. so this function returns a mapped array with the fields type , tag , nesting , content , and children . as for this children field, the children field is an array of objects, where the objects are just like the parent object, with lots of unnecessary fields. for those, i used recursion! (it’s my first time using recursion ) parse(input) : this is the function that i’ll be using to get the tokens i need to style! what it does is pretty simple: initialize a new instance of the MarkdownIt constructor (? i’m not too sure if it’s a constructor) get markdown-it ’s tokens using their parsing function make a constant whose content is an array of objects returned by the first function ( giveFields() if your memory is that terrible). again its a mapped array that gives only select fields from the markdown-it tokens return that constant in other news, i wrote 2 more test markdown files. one tests the behaviour of headings and the other tests the behaviour of inline stuff like bold and italic text! Changelog ( 88bad121 ) Revamp parse-input.js ( 3eda61e5 ) Add more stuff to inlines.md
toiling away… toiling away at this code… today was a bunch of stuff i added a renderInline() function to render stuff inline. i still need to add images and links, but i’d need a lib for links, and maybe for the images too i worked more on the main function. right now, im trying to get paragraphs actually rendered, which will take a while. i also added a heading() function that will render headings, emphasis on will because its not being called yet it took me a lot of thinking to get here so that part wasn’t too fun (a person who thinks all the time, has nothing to think about 🔥) changelog ( e24a192 ) Work more on the stylizer ( 1a02163 ) Start actual work on stylizer
holy this shit is so long heyo! this is a long one, so i’ll go over this commit by commit ( 0ad2cb2 ) Start paragraph parsing here, i did these: i made a global string state to maintain the nesting while styling. managing this was quite tedious and useless i added a helper function to get the style of a token called getStyle() . i’ll explain the use for it below. i continued working on the heading() and paragraph() functions as well as the stylize() function ( eb218d2 ) Add markdown extensions as for this one, i added a bunch of packages, mostly extensions for markdown-it . these are: markdown-it-footnote markdown-it-github-alerts markdown-it-sanitizer markdown-it-table markdown-it-task-lists shiki (for code highlighting) terminal-image i removed a few of these later because they were either not really working properly or just weren’t necessary. besides these, i also configured the plugin to use the plugins, enable the autolink extension and also replace all HTML line breaks ( <br> ) with double newlines ( \n\n ) ( 5ecef2c ) Start working on image rendering and colors/styles now here is where i found a gem in my dependency tree. you see, i was searching for a package to handle color rendering since i sure as hell wasn’t gonna deal with the hex codes shiki , the code-highlighting plugin, was giving me for the colors of the tokens. so i saw a package called chalk and it sounded familiar. turns out, shiki had chalk as a dependency, so it was already installed! for that reason, i added a chalk import in this commit. i also started working on an image function to render images, and named it renderImage() . also added a great error message if two requirements weren’t met: throw new Error ( " WRONG TOKEN IDIOT DEV " ); but that was all i really did in that function ( 0dc393d ) Remove unnecessary object processing and dependencies this is where i removed markdown-it-footnote and markdown-it-table because i realized there just wasn’t a point in those since they weren’t letting me test my function, they were erroring out for some reason and i found out markdown-it-table already had support for markdown tables. i also removed the mapping function in the parser stage that i made to give myself only a few fields. it was pretty useless since i kept randomly finding that i’d need some new property. ( 8a5200c ) Continue work on inline parsing, add terminal-link latest commit, this is where i did a lot of work: i removed terminal-image as a dependency since i found that bun already provided a class for it ( Bun.Image ) and it also had webp support unlike terminal-image , so no point in another package when a built-in one works better i made the getStyles() function better i added a bunch of micro-functions like bold() , italic() , etc. i also renamed renderImage() to image() i combined two if statements into one in this image() function because why 2 if statements when 1 i did a lot of work in the renderInline() function. now it uses computed function names that call those micro-functions. i also changed that global string state to a global array, made things much easier. i worked on the heading() and paragraph() functions further that’s about it gng, also its 12:28 am for me rn this is why we devlog more often gng ✌️
oof! that was a lot of work, but now we’re REALLY getting somewhere!!! first thing, headings actually work now, and if there’s a link in the heading, it gets displayed right below the heading! tbf i did rip the heading thing straight out of the original index.js file when i was trying to make a markdown parser using regex secondly, and the more important thing, image rendering now works . pretty big milestone. i achieved this through the terminal-image npm package. however, this took a while because i couldn’t figure out why it wouldn’t render. the problem was tmux–it was stripping the codes it didn’t recognise so i implemented another system to detect if the terminal had color and/or image support to decide whether to use ansi blocks or actual images. now, it works! ts so peak fr tl;dr headings work (i ripped them out of my original implementation in index.js ) images work (took me a while because it didn’t work properly in tmux we getting somewhere with this one 🔥 Changelog ( 9941b1b ) Finish image rendering ( 007b3f4 ) Work on image rendering ( 609be18 ) Make heading work
when the FUCK did this become 4 hours so uhh i spent like all of this time debugging and improving my code. first thing is, i replaced these “microfunctions”, as i call them, with an object that had keys whose values were arrow functions. these arrow functions did the exact same thing and took up less space and was even more readable! second, i spent some time on a stupid bug where the main function in stylize.js would hang. i thought it was an issue with the image function, but after half an hour or so, when i added console.log(done) right before the return, i realized it had to do with the main function that was calling the image function, and sure enough, the second i looked at it, i realized the problem: it was a while loop and i forgot to add a line that incremented the index, so it just kept doing the same thing forever until i killed the process oh well, more hours for me third, i improved (or rather cleaned) my image function. it returns promises and doesn’t use terminal-image directly. instead, i made it so that it would return an object with a bunch of keys, one of which is a function that takes the whole object as an input. this function actually renders the image, since i plan to write the function to display it in a way that deals with image rendering after rendering text, and while the images get rendered, a spinner takes their place temporarily, but the images replace those spinners once they are processed fourth thing is, i made it so that the main function calls the renderInline function instead of the paragraph function. in fact, this paragraph function is completely useless, so i went ahead and removed it too. lastly, i upgraded a bunch of packages: upgraded typescript from version 5 to 5.9.3 upgraded got from version 15.0.7 to 15.1.0 upgraded markdown-it from version 14.2.0 to 14.3.0 upgraded shiki from version 4.3.0 to 4.3.1 if you wonder what these packages are typescript is, well, the typescript language, not sure why i have it, might be a dependency for another package. got is some package that does pretty much the same thing as the default fetch() but it can give me a buffer, which i need for images markdown-it is the markdown parser shiki is for coloring code. fancy, right? Changelog ( 9118913 ) Improve code ( 5b9c953 ) Remove test file ( ab3af08 ) Test image URL parsing on GitHub aight this took me 2 hours to write and i started coding again in the middle of writing this
PEAK CODE gng TS IS PEAK!!!! i added a function that renders code AND ITS PEAK JUST SEE THE SS now some of this time came from trying to figure out why my code was joining the contents of a function, and it was because i forgot to add the argument that gave the coloring function (chalk library) the text to color. hey, at least i found a way to read the contents of functions time to go steal code from closed-source packages leaving that aside, my next step is thematic breaks. this shouldn’t be too hard, in fact, i’ll do it rn since it’s that easy. rn its 8:49 PM GMT+0300, i’ll tell in the next paragraph when i finish it. [8:54 PM] just did it, it only took like 2 mins, the other 3 were because i found a bug that never removed codeBlock from the stack after it was added. that’s about it, and this devlog was quite short. well, comparatively, to my other devlogs, after all there’s people posting 4 word devlogs. you should follow this project tho Changelog ( a17bd2b ) Add thematic break support ( e28f1b1 ) Add code block styling
THAT WAS SO LONG WHAT ON EARTH in short, tables now work and the inline rendering function is fixed! this took a while because i genuinely had no idea what i was doing. now the long stuff: tables go brr i got distracted while writing this and realized everything’s actually borked, but tables do somewhat work! its still borked tho– also i realized that my whole code is borked, but… inline rendering includes links now! still have no idea how i missed that other i just changed image function so that it returns an object with a prototype function instead of unnecessarily repeating the function as a property of all the image objects, so if there’s 10 pictures in a file, there will only be one function to render each as opposed to 10 instances of that function Changelog ( d8feb46 ) Add table support, fix inline rendering oh fuck, my code is COMPLETELY borked
improvements and fixes to inline rendering this is way earlier than my normal schedule, but that’s because i’ve got something to show . basically, inline rendering was bugged , and not only did i fix it , i also made it so that it works better ! that’s all you need to know, do NOT read the rest of this if you don’t want to be bored to death, its a really lengthy explanation of this the initial bug was that inline rendering wouldn’t work at all. i figured out the problem was that i wasn’t pushing "inline" to the state array somewhere. i realized that it wasn’t working when called in the table rendering function, and that was because i wasn’t pushing "inline" to the state array. the reason for this is because the renderInline function slices the state array at the index after the "inline" string, so if its something like ["paragraph", "inline", "bold", "italic"] , the function slices at index 2 because "inline" is at index 1, and we get ["bold", "italic"] . the problem is, if "inline" doesn’t exist, running indexOf("inline") returns -1, so it slices at -1 + 1 , which is 0, so its just the whole array. but anything before “inline” isn’t a valid style, and since the function for that is undefined, it goes kaboom and throws an error saying that it’s not a function. also gpt found 5 other bugs but they’re kinda irrelevant the fix was making it so that the renderInline function itself pushed "inline' to the state array instead of depending on it being already there. this also removed the need for making sure that the inline string was already there. i might do this with the rest of the functions too actually :goonology: also removed unnecessary state.pop() occurrences since the pop method is destructive and can mess up everything as for the improvement, you might see in the first screenshot that there’s a bunch of text tokens together. yk, they could be squished together into one token… oh right, that’s what i did! i changed the renderInline function to make a variable where the text accumulates until there’s no more text or if there’s an image, on which it gets pushed to the contents array now the most important thing is that there’s only one more thing left to do: html rendering . this is the last thing before i get to actually rendering stuff on the screen! this is exciting! Changelog ( 9de477d ) Fix, improve inline rendering please like this took more than an hour to write
HTML parsing is now complete its been nearly 2 weeks and i have great news: html parsing is complete what this means is that html blocks get processed into token streams like the one’s markdown-it makes. now, i must clarify that these html blocks were already in a token stream but they were distinctly html, having the type html_block , and if i didn’t convert those html blocks into markdown-it’s _open / _close tokens, i’d have to parse it in the file that styles the tokens, and many html tags do the exact same thing as their markdown counterparts so i could reuse some functions. i must also clarify that i have NOT done anything for stylizing html in the stylize.js file, which deals with processing text formatting and image processing next up: stylizing html! Changelog ( c5a5ce0 ) Finish HTML parsing ( 841ba42 ) Start work on HTML parsing
WIP WORK // INCOMPLETE // this was a lot of work, and i’m still not done with html in the stylizer! here’s a list of changes with explanations: add more aliases to the aliases array in the html parsing section: this makes it so that html tokens and markdown tokens have the same types convert the array of allowed html tags into a set : sets have a .has() function that lets us find an element in O(1) time complexity which is much faster compared to Array.prototype.includes() which has an O(n) time complexity properly implement disallowed tags: these tags show as plain text because they are disallowed and shouldn’t be processed in markdown put non-block tokens as children of an inline token: non-block tokens only got parsed in the part where inline tokens were processed set attributes: the objects returned by the stylize function now have a properties key better error handling: now, where it used to just throw an error about being undefined or whatever, it will catch it, and throw a more useful error with better debug info [BUGFIX] make sure that arrays don’t get nested: this was a bug where arrays would get nested for some reason [BUGFIX] set token.level and token.nesting properly when processing html: this is necessary because the while loop depends on the nesting to know when to stop accumulating tokens and process them [WIP] html handling: any tokens having the substring _open in their .type property are handled all together, with a handlers object made up of functions. this handling is recursive token with types that don’t match the substring _open get handled through other branches of the if statement ( else if(...) {..} ) [WIP] bullet list handling: i did not realize that there were more markdown-it tokens that i had not added handling for in the stylize function. i also need to do this for some more token types too [WIP] revamp image handling: instead of just a complicated function, i added a class called Image that has a function to render the image. its nearly complete but it has some errors that i committed because i need to commit often lmao chatpgt usage now here i used chatgpt a lot for debugging. here’s exactly what i used it for: why tokens weren’t being processed: this is the problem the array nesting bugfix fixed fixing infinite recursion: i accidentally did that lmfao replacing top-level non-block tokens with an inline token that contains those top-level non-block tokens as children figuring how to set the level property of the tokens questions about syntax and mutation of global vars Changelog ( 5e931f7 ) Revamp image function (WIP) ( 0ce066f ) Improve error handling and fix token.level assignment ( 0f28b75 ) Process details element in stylizer ( 0e154f3 ) Start improving stylizer (WIP) why such long devlogs? you may have noticed i’ve been going more and more time without devlogging. that’s because i like devlogging when there’s a big new thing, not for every small little thing. my plan for this devlog was to announce that i was done with processing html in the stylize function, but that hasn’t happened yet because well, there were a latta bugs here and there, and i had to fix those too. as for the length of the devlog text, i like writing about my progress here because its the only place where it makes sense to talk about it in-depth
typescript! i’ve moved to typescript, cleaned up some code, finished that image function from last devlog, and upgraded packages! finished the image function : now it works perfectly! upgraded packages : shiki was upgraded! its the code coloring package btw added a test : i can’t keep pressing the arrow keys in bun repl i have to do this moved to typescript : this is the main thing. devs on discord kept telling me to use and i said i’d do it soon. i wasn’t planning on it at this time, but i did because i got fed up with a stupid bug where i was accidentally setting token types to a boolean instead of a string. that prompted me to just do it™ and now i’m fixing a bunch of bugs! still not sure why the language server is just complaining about cases that can’t happen, but that’s what typescript is for i guess Changelog ( 688afd8 ) Start moving to TypeScript ( ac99373 ) Switch to map for aliases, add test, clean up code ( c62c57b ) Upgrade packages, clean up code ( f98e65c ) Finish revamping image function
headings! unknown tag handling (that doesn’t work)! well we’ve got some nice stuff now! here’s a list of everything, including problems!: just whitespace? no more! : tokens that are just whitespace get omitted typescript lsp doesn’t complain : oh my god finally that was so annoying what’s this tag? : if it doesn’t have a handler, it falls back to the default, that is, it turns into a string! this doesn’t work properly though, i have to fix this ching chong ruby tags : now ruby tags are supported! is that a highlighter? : mark elements are now supported, which just put a yellow bg on some text is this a block element or not? : now the renderer can tell by looking at a token’s block property proper heading rendering?!?!? : chatgpt wrote the entirety of this part because you cannot bother me to make an efficient function that wraps giant text art letters based on width where’s the inline code? : that’s right, it doesn’t work and gets completely omitted! Changelog ( 456161f ) Trim content, add boolean property ( 07da8a6 ) Add handlers type to make the LSP shut up, trim strings in test file ( b4d251c ) Add handling for unknown tags ( d903b48 ) Add support for dfn , samp , ruby tags ( 813d934 ) Fix code to stop TypeScript ( vtsls lsp) warnings
it works holy shit it works, the problem was that i was running a function but i wasn’t putting it in a console.log . the test function for reference returned a string. also, unknown tags are handled somewhat properly. i need to actually fix that, but once i do, im gonna start on the tui!! its been 96+ hours now what a crazy thing, i expected this to take 10-20 hours and now look at this… anyways, i’ll go fix the unknown tag thing! after that i’ll start working on the tui Changelog ( c1461c3 ) Get unknown HTML tags rendering
TUI! i’ve got news: the TUI renders! for this tui, im using opentui! right now, the tui only shows an interactive list of files, and its supposed to render the file content if you select one, but that’s not happening right now. i’ve been working on the function to make opentui render the markdown. while opentui does have its own thing for markdown rendering ( ), i’m gonna render my own markdown. im currently trying to get tables working! Changelog ( c8ab716 ) Work further on rendering, start with rendering tables ( dc8b0be ) Start using OpenTUI for rendering TUI ( 86347cf ) Render unknown HTML correctly (without showing tags)
generational fuck up well i’ve messed up big time, sunken cost fallacy is real and it got me you see, i was using opentui earlier, but i decided to change because i realized that it doesn’t support ansi escape sequences. i landed on neo-neo-blessed , and it seemed cool, until i realized the list selection thing got fucked up because it didn’t handle scrolling list options with heights greater than 1 row properly which is a deal breaker. i also spent a lot of time patching its types, in fact that’s what most of this time went to i think i’ll use jsvision. it seems interesting and i’ve got nothing to lose. the only issue is it has one maintainer and 9 stars, but gpt found it, and it seems cool. also they have demos of the unmodified lib running in the browser which i wanted to do, so this will be fun Changelog ( 33e1c91 ) Start using neo-neo-blessed and do a generational fuck up
(back to) opentui! if you’ve read my last devlog, you might remember that i was considering the jsvision library. however, i came back to opentui because its still much simpler. also, i found that there are libs to adapt ansi! or at least chatgpt did at first i was doing ghostty-opentui , but i realized after some time that it was literally a whole terminal. then i got chatgpt to find me this package called ansi-sequence-parser ( https://www.npmjs.com/package/ansi-sequence-parser ) and its perfect! so now im using that to render the bold and italics! tbh i could just eliminate the middle stage ( stylize.ts ), but i put a lot of work into it and i’m extremely vulnerable to the sunken cost fallacy, so i’m doing this bloat lmao. also, i got ordered lists, bullet lists, and blockquotes working! they look so cool! as for the menu, its not doing very fine, but that’s because i’ve not worked on it! i’ll get to it, don’t worry! next up: code blocks (~2-4 hours) fixes to table rendering (<30 mins) fix image handling (it doesn’t handle relative paths correctly) (<1hr?) Changelog ( 8b44667 ) Add blockquotes and 1 row bottom margin to second-level renderables ( 3e5182f ) Add oredered list handling ( d997aff ) Switch back to OpenTUI, get things working
better types. debug mode and stdout! from my last devlog: next up: code blocks (~2-4 hours) fixes to table rendering (<30 mins) fix image handling (it doesn’t handle relative paths correctly) (<1hr?) of these, i’ve done none! what i have done though is add flags and types! i spent a while dealing with type errors because i decided to specify types instead of just putting any on ProcessedToken.content . i also added a debug flag, but literally all it does is show the console i also fixed the width thing, so the content is only as wide as the space you give it so cooll!! the main part of this is that i added a --print-to-stdout flag that just prints the formatted markdown to stdout! you can just scroll in your terminal instead of having a whole ass tui its kinda borked and incomplete though, so i’ll fix it up! it does print some garbage at the beginning so that’s not great anyways, i’d better do what i said i’ll do last devlog! i went off track for this lmao Changelog ( b1c0489 ) Implement half-baked print to stdout option ( aa3c029 ) Add debug flag, fix logic errors ( aa33e84 ) Specify types for ProcessedToken.content instead of any
holy fuck, you can pipe into stdin and tables render properly! while this is quite out of schedule (i usually post every 2-3 days), today brings some peak stuff! the peakest part is at the end firstly, i have in fact fixed tables! the issue was i was pushing the accumulated cells array to the rows array in the wrong loop. i was doing this in the loop that iterates over the cells in a row, so it was causing it to repeatedly push the same strings over and over. the fix was putting it in the loop just outside, that is, the loop that iterates over the rows in the table token! i’ve also improved the image handling! now Image classes have the buffer property renamed to content , and has a new property called properties , which is always {} . with this, it has all the properties of ProcessedToken , so my lsp won’t complain that some property doesn’t exist on Image speaking of ProcessedToken , its now an interface instead of a type. there’s also a new TableToken interface that extends ProcessedToken , with an alignment property. this makes it a bit easier to handle tables since the content property is narrowed. also, it seems like opentui’s tables don’t support alignment, so i might have to make a custom table function. i also upgraded opentui from 0.5.7 to 0.5.8! i have no idea what changed, but whatever i’ve also stopped using chalk to color my errors since the opentui console doesn’t support ansi now the peakest part is you can pipe markdown into the program . this is pretty peak and you must agree since there’s a lot of stuff you can do with this. for example, you could render arbitrary markdown without having to create a file first! it has a limitation though: if you’re on windows, you can’t use the interactive mode, and the rendered content is forced to print to stdout. this is because of a bug with bun. if you’re piping into the program, it’ll get the input by calling await Bun.stdin.text() , but this stops sending keypresses to opentui because of a bug in the bun runtime, so you can’t scroll down. i solved this issue (or rather, chatgpt solved this issue) by opening a read stream on /dev/tty . the issue with this is that /dev/tty doesn’t exist on windows since its not unix-like. my idea was to just, not let you do interactive mode on windows if you’re piping content to it. again, this is a bug with bun, and i’ll remove this limitation once one of the two is merged. that’s right, there’s two! here’s one for reference: https://github.com/oven-sh/bun/pull/32153 shit that was long Changelog ( dd07e14 ) Upgrade packages ( 77e6d34 ) Add support for piping into renderer.ts from stdin ( 1995f45 ) Improve image and ANSI handling, stop using chalk in errors ( 22cfacd ) Improve table handling, switch some types to interfaces pls like
code blocks, alerts, emojis and task lists! we’ve got loads of new cool stuff that get rendered now! first, github alerts/callouts now render nicely! they look like this: > [!TAG] > content where TAG can be NOTE , IMPORTANT , TIP , WARNING or CAUTION . they also have these cool icons next to them, but the catch is you need a nerd font for it. i’ll add an option to not need it and only use ascii characters next, we have highlighted code blocks! the renderer can highlight hundreds of languages using shiki ! you might not even have heard of some of the languages that it can highlight! imo its really nice looking and i love it! the bulk of this time came from adding support for task list items because i couldn’t figure out how to do it. eventually after some tinkering i’ve got it to work! it looks kinda cool too tbh i also got emoji support using an extension. it automatically converts :emoji: to the corresponding emoji if its in the unicode specification. finally, i added a simple height option that just sets the height of the renderer. it allows you to set the height of the renderer manually and that’s about it lmao Changelog ( b4f69ad ) Add height option ( beea3a6 ) Add task list items support ( 4c42c84 ) Add emoji support ( 564a761 ) Upgrade markdown-it, fix breaking changes ( 963d910 ) Add alerts support ( 5e266e8 ) Add icons in code blocks ( 0bf0af7 ) Add code block support
figlet headings, small headings, bottom bar, help menu and keybinds we’ve got a lot of new stuff! firstly we’ve got a bottom bar! all it does for now is show reMDer with a green bg and the file name next to it, but i’ll add more later! next we’ve got figlet headings! at the start i was thinking about using figlet for headings but i gave up on that. but now, i’m back to using it! this took a good chunk of the overflowing hours here but they look really cool too! passing a --no-render-headings or -H flag will make the headings render as normal text with colors instead of figlet fonts now! there’s now a tiny help menu in the corner! it only shows two keybinds right now–oh and speaking of keybinds… keybindings are now in ! for now you can press q to quit, ? to toggle the help menu, and C (shift+c) to open the console in debug mode and that’s about it next steps? here’s what i’m gonna do next: add support for horizontal rules add a table of contents feature like that of the leaf markdown viewer add some stuff to the bottom bar add an option to put the bottom bar at the top instead add support for a config file using YAML Changelog ( 9557586 ) Add help menu ( a4149e2 ) Add keybinds: q to quit, C to toggle console ( 4b18153 ) Finish figlet fonts support ( d23466d ) Start trying figlet again for ASCII art ( 33d52ea ) Start working on ASCII art for h2 headings ( b0e1668 ) Add option to not print big headings ( c58369c ) Start with bottom bar
table of contents feature is done! took only 10 hours, but im done with the table of contents thing! you can press shift+j to go down to the next heading, and i forgot to add shift+k 😭 anyway this took a while since i couldn’t figure out how to position the box properly and how to style it. this was fucking ass icl. i usually have much more to talk about but this wasn’t the most fun so here’s the commits: Changelog ( 5ccec11 ) Remove unnecessary focusing ToC ( 927cae9 ) Add tab cycling ( ae72d3d ) Scroll ToC menu to selected index instead of blindly 1 down ( 249d61a ) Implement scrolling ToC on pressing J ( a2ae0f2 ) Get table of contents feature working ( a6c7744 ) Add scrolling to next heading on pressing J ( 49f8fec ) Add “? - Help” hint to end of bottom bar
scroll one line at a time, render div and details elements not very big news here, but now you can: scroll just one line at a time instead of a whole renderable/element at once render div and details properly! now you can click on a details element to open and close it! this didn’t even take too long more technical, but i switched to mostly using the opentui renderable api which uses classes like TextRenderable or BoxRenderable that return a Renderable instance instead of functions like Text and Box which return a ProxiedVNode<T> . this is mostly because there’s a bunch of things a Renderable has that a ProxiedVNode doesn’t anyways im currently working on adding footnotes, so see you in a few days Changelog ( 64f6ed8 ) Add footnote plugin (usage WIP) (errors on run) ( ddd5c46 ) Add indicators to details elements and opening on click/space/enter ( 344806a ) Add support for rendering div and details elements ( d3b4a1d ) Fix small layout issues ( 5eb11b9 ) Scroll only one line at a time and convert (mostly) to Renderable API
last devlog this is my last devlog the project isn’t complete and i won’t be shipping it. you see, i was banned for 2 months for misconduct on slack (i will not provide details here but i deserved it, it was corny anyway), and as part of that ban, i can’t participate in any events, including stardance. in this time however, i’ve done a lot. there’s now spinners for images, proper tables, and so many more improvements. keep your eyes peeled for a release on the github ! 👀 also it doesn’t matter that this devlog is 15 hours over the limit, its not like i can do anything about it. also if one of you regulars in #stardance see this, can you please ask amber if i can have my sticky streak rewards? i really want the stickers and plushie Changelog ( 446103b ) Render details elements properly again ( f527e5d ) Better logs, align images in row when a paragraph contains only images ( 3df2f59 ) Make task list function use TextChunk over ANSI escapes ( 2367089 ) Add proper tables ( 47c2b42 ) Add aligning components ( 00785d7 ) Move from Chalk/ANSI escapes to OpenTUI StyledText for styles ( 429e4b6 ) Load images lazily with spinner while loading ( a993197 ) Use OpenTUI ImageRenderable for images in renderer ( aa96067 ) Improve types and error handling, work on image bug ( b54ad43 ) Revert “Add footnote plugin (usage WIP) (errors on run)”...
|
1792803099.7726493
|
1793407899.7726493
|
|
62668
|
Val Pad by @Oxu | Stardance
|
Oxu
|
0
|
11.43
|
0
|
[]
|
[{"post_id": 71283, "ts": "202 [{"post_id": 71283, "ts": "2026-09-20T16:00:31Z", "hours": 1.1342, "text": "Worked on the Github page"}, {"post_id": 70884, "ts": "2026-09-19T23:08:41Z", "hours": 3.7933, "text": "Re-designed the layout, and made a new case for it"}, {"post_id": 70403, "ts": "2026-09-19T03:34:47Z", "hours": 1.9317, "text": "Reworked the pcb, moved switches around, changed to seeed xiao, redid traces. Gonna have to redo the case and plate tho😭"}, {"post_id": 69976, "ts": "2026-09-18T05:16:27Z", "hours": 1.6997, "text": "Working on a case right now, don’t know how to add the top half yet since i dont have keycaps to line things up with…"}, {"post_id": 69924, "ts": "2026-09-18T02:24:56Z", "hours": 1.0747, "text": "Just finished making a custom plate for my keyboard"}, {"post_id": 69531, "ts": "2026-09-17T07:30:57Z", "hours": 1.8003, "text": "Just designed my first ever PCB after 2+ hours of work. Still need to figure out how to add stabilizers"}]...
|
Title: Val Pad by @Oxu | Stardance
Devlogs:
Just Title: Val Pad by @Oxu | Stardance
Devlogs:
Just designed my first ever PCB after 2+ hours of work. Still need to figure out how to add stabilizers
Just finished making a custom plate for my keyboard
Working on a case right now, don’t know how to add the top half yet since i dont have keycaps to line things up with…
Reworked the pcb, moved switches around, changed to seeed xiao, redid traces. Gonna have to redo the case and plate tho😭
Re-designed the layout, and made a new case for it
Worked on the Github page...
|
1793047713.9564326
|
1793652513.9564326
|
|
63122
|
School & Creator Hackpad by @dillonyegudkin | School & Creator Hackpad by @dillonyegudkin | Stardance...
|
dillonyegudkin
|
0
|
3.59
|
0
|
[]
|
[{"post_id": 71288, "ts": "202 [{"post_id": 71288, "ts": "2026-09-20T16:07:11Z", "hours": 3.5892, "text": "Correction to the original wording: the owner chose the features and layout and reviewed the design; ChatGPT/Codex generated and revised the schematic and PCB, routed the board, ran the CAD checks, and prepared the files. The original first-person wording incorrectly implied that the owner personally performed those steps. This correction was also entered by Codex. The current design has six MX switches in a 3-by-2 grid, a clickable EC11 encoder at the upper left, a 0.91-inch OLED immediately to its right, and a XIAO RP2040 with USB-C accessible at the top edge. The board is 86.5 by 88.5 mm with two copper layers. The public repository includes KiCad source, connection-check reports, a pin map, BOM and Gerbers. This remains a design prototype: it has not been assembled or electrically tested, and the supplied parts still need footprint and case-fit confirmation. The displayed tracked time is not a claim of 40 hours of recorded human work; its eligibility, including any AI execution time, needs organizer review."}]...
|
Title: School & Creator Hackpad by @dillonyegu Title: School & Creator Hackpad by @dillonyegudkin | Stardance
Devlogs:
Correction to the original wording: the owner chose the features and layout and reviewed the design; ChatGPT/Codex generated and revised the schematic and PCB, routed the board, ran the CAD checks, and prepared the files. The original first-person wording incorrectly implied that the owner personally performed those steps. This correction was also entered by Codex. The current design has six MX switches in a 3-by-2 grid, a clickable EC11 encoder at the upper left, a 0.91-inch OLED immediately to its right, and a XIAO RP2040 with USB-C accessible at the top edge. The board is 86.5 by 88.5 mm with two copper layers. The public repository includes KiCad source, connection-check reports, a pin map, BOM and Gerbers. This remains a design prototype: it has not been assembled or electrically tested, and the supplied parts still need footprint and case-fit confirmation. The displayed tracked time is not a claim of 40 hours of recorded human work; its eligibility, including any AI execution time, needs organizer review....
|
1793048065.6374335
|
1793652865.6374335
|
|
61363
|
Terminal Clock by @TheMainGame | Stardance
|
TheMainGame
|
0
|
4.09
|
0
|
[]
|
[{"post_id": 71291, "ts": "202 [{"post_id": 71291, "ts": "2026-09-20T16:10:39Z", "hours": 1.1411, "text": "Started writing the script for the clock. Still needs improvement though. I have used AI to help me, as I am just not functionally capable of learning that much python especially given that I’m still in school and GCSEs are fast approaching. I have still got some polishing to do, and I need to go over my BOM to smear everything out and read the manuals for the items. A lot to do tbh, and I still have to redesign the clock case so that it fits all of my components… See you in the next devlog!!"}, {"post_id": 70262, "ts": "2026-09-18T20:36:07Z", "hours": 1.1367, "text": "Did some testing of code, I mainly just messed around for 10 minutes each day slowly adding QoL updates to the python gui script. I am planning on designing a new UI in Figma and using TkinterDesiginer to turn the UI into code, and then adding all of the functionality such as buttons and stuff after, once I have combed over the BOM once more. Thanks for following along and I hope to create a timelapse of me designing the website tomorrow or on Sunday!"}, {"post_id": 67411, "ts": "2026-09-13T14:43:03Z", "hours": 0.3436, "text": "Finished writing the BOM (Bill Of Materials) csv file. All in all It took 2 hours, but Hackatime only counted 18 minutes since I spent the rest of the time doing research into the items and getting everything ready. I am next going to either redesign the Clock design to fit these items, or I am going to (do that later) and learn the code that I will need to either create an OS for the alarm clock or have a script that will always run on boot, that gives the alarm clock its functionality. Looking forwards to it!"}, {"post_id": 66722, "ts": "2026-09-12T16:45:01Z", "hours": 1.4725, "text": "Designed a Clock shell. It is supposed to look like a CRT TV screen, but instead looks like an old colour TV, which I think is what I am going to go for now. I have 4 feet for the TV box, with a hole for a display and a cube to put the antenna in. Designed in FreeCAD and sliced in the Bambu Studio slicer. I will recolour it later, but my 0.2mm nozzle has a bit of filament stuck in it and a cold pull didn’t work. (I ordered a new one so it’s fine). Now I need to pick a Pi board (either Pico or Zero 2WH)."}]...
|
Title: Terminal Clock by @TheMainGame | Stardance
Title: Terminal Clock by @TheMainGame | Stardance
Devlogs:
Designed a Clock shell. It is supposed to look like a CRT TV screen, but instead looks like an old colour TV, which I think is what I am going to go for now. I have 4 feet for the TV box, with a hole for a display and a cube to put the antenna in. Designed in FreeCAD and sliced in the Bambu Studio slicer. I will recolour it later, but my 0.2mm nozzle has a bit of filament stuck in it and a cold pull didn’t work. (I ordered a new one so it’s fine). Now I need to pick a Pi board (either Pico or Zero 2WH).
Finished writing the BOM (Bill Of Materials) csv file. All in all It took 2 hours, but Hackatime only counted 18 minutes since I spent the rest of the time doing research into the items and getting everything ready. I am next going to either redesign the Clock design to fit these items, or I am going to (do that later) and learn the code that I will need to either create an OS for the alarm clock or have a script that will always run on boot, that gives the alarm clock its functionality. Looking forwards to it!
Did some testing of code, I mainly just messed around for 10 minutes each day slowly adding QoL updates to the python gui script. I am planning on designing a new UI in Figma and using TkinterDesiginer to turn the UI into code, and then adding all of the functionality such as buttons and stuff after, once I have combed over the BOM once more. Thanks for following along and I hope to create a timelapse of me designing the website tomorrow or on Sunday!
Started writing the script for the clock. Still needs improvement though. I have used AI to help me, as I am just not functionally capable of learning that much python especially given that I’m still in school and GCSEs are fast approaching. I have still got some polishing to do, and I need to go over my BOM to smear everything out and read the manuals for the items. A lot to do tbh, and I still have to redesign the clock case so that it fits all of my components… See you in the next devlog!!...
|
1793040566.3950837
|
1793645366.3950837
|
|
62818
|
Personal Portfolio by @Ridith | Stardance
|
Ridith
|
1
|
0.28
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-19T05:40:50Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built a personal portfolio website with custom styling designed to look like it’s straight out of the future. What was challenging? Designing a futuristic aesthetic while keeping the layout clean and structured using HTML and CSS and prompting ai to get it right. What are you proud of? The unique visual theme and getting the site fully deployed and structured with multiple sections. What should people know so they can test your project? You can check out the source code and view the live deployment to explore all the sections and custom CSS features!", "repo": "https://github.com/RockingRidz/RidithShetty", "demo": "https://rockingridz.github.io/RidithShetty/"}]...
|
[{"post_id": 71294, "ts": "202 [{"post_id": 71294, "ts": "2026-09-20T16:11:29Z", "hours": 0.2836, "text": "The website is officially taking its place with edits and SEO ensuring minimal AI usage!!"}, {"post_id": 69581, "ts": "2026-09-17T10:55:37Z", "hours": 0.3386, "text": "I am working on making it so that it looks like its straight out of the future"}]...
|
Title: Personal Portfolio by @Ridith | Stardance
Title: Personal Portfolio by @Ridith | Stardance
Devlogs:
I am working on making it so that it looks like its straight out of the future
The website is officially taking its place with edits and SEO ensuring minimal AI usage!!
Ships:
I built a personal portfolio website with custom styling designed to look like it’s straight out of the future. What was challenging? Designing a futuristic aesthetic while keeping the layout clean and structured using HTML and CSS and prompting ai to get it right. What are you proud of? The unique visual theme and getting the site fully deployed and structured with multiple sections. What should people know so they can test your project? You can check out the source code and view the live deployment to explore all the sections and custom CSS features!...
|
1793210116.1204522
|
1793296516.1204522
|
|
64143
|
BlueberryLinux by @zsigisti | Stardance
|
zsigisti
|
1
|
45.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T16:40:36Z", "hours": 45.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Blueberry Linux is a source-built rolling x86-64 server distro I’ve been working on since May. It isn’t a respin of anything. It has its own package manager (bpm, written in Rust with streaming installs and SHA-256 verification), its own package format, and its own signed repository using an Ed25519 signature over the index. There are 225 package recipes so far, from glibc and binutils upward. It’s also self-hosted in the real sense. The base system is built from Blueberry packages using the Blueberry toolchain, and if a build falls back to a foreign bootstrap, that’s considered a build failure rather than a successful build. I came back to the project after about a month away and spent some time auditing the live infrastructure before getting back to development. I fixed the repository issues I found, published nine package updates, and built something new: you can now try Blueberry directly in your browser at https://try.blueberrylinux.org . The hardest part of this round was actually a near miss. There’s an old copy of bpmrepo.sh sitting on the repository host that predates serial support. It doesn’t emit the |serial| line. It was sitting there looking perfectly usable, and it would have worked. The problem is that using it would have silently removed rollback protection from the signed repository index. Nothing would have obviously failed. The index would still have been signed and the repository would still have worked. I only caught it because I went back and checked what my own client actually expects instead of assuming the existing tool was the right one. The browser shell also had two bugs that took a bit of debugging. First, pty.fork() already calls setsid(), so I was calling it a second time. That resulted in EPERM and killed every session immediately after launch. Then the xterm CDN URLs started returning 404s. The frontend failed before it could even display the actual error, so from the user’s perspective it just sat there saying “connecting…”. I vendored the assets locally and changed the frontend to report asset loading failures properly. The part I’m happiest with is how the browser environment is built. The thing you’re running in the browser is actually assembled from the same packages the distro itself uses. The isolation is also verified rather than assumed. From inside a live session, the router, the hypervisor, and 1.1.1.1 are all unreachable, and only three PIDs are visible. If you want to try it, open https://try.blueberrylinux.org . It’s a real shell on a real Blueberry rootfs. There’s no network access, nothing persists between sessions, and each session is limited to ten minutes. The source is available here: https://github.com/zsigisti/blueberry", "repo": "https://github.com/zsigisti/blueberry", "demo": "https://try.blueberrylinux.org/"}]...
|
[{"post_id": 71299, "ts": "202 [{"post_id": 71299, "ts": "2026-09-20T16:21:40Z", "hours": 45.3069, "text": "Came back to Blueberry after a month and audited the live infrastructure before writing any code.State of the system: the distro is healthy. 225 recipes, valid index signature, and the main mirror is serving real packages.There were two actual issues.The published bpm.index was dated 31 July, so it was seven weeks stale. The other was blueberry-build.timer on the repo host, which had failed every hour since 29 June — 2,217 consecutive failures — because it was still trying to run blueberry-build-server.sh. I deleted that script during the .bpm migration and never disabled the unit.I also initially thought repo1 was broken. It isn’t. Its index is 0 bytes because it’s the BUR community mirror and nothing has been approved there yet. Nginx correctly returns 404 at the origin. That one was just me reading the state incorrectly.Both actual issues are now fixed.I disabled the timer rather than bringing the old script back. I also republished the index with a fresh serial using tools/release/repo-publish.sh. It re-indexes remotely using the hardened bpmrepo.sh, including a count-floor check, timestamped backup, and atomic index + signature swap.I almost used the wrong script. /opt/blueberry/tools/bpmrepo.sh is an orphaned copy from before serial support was added and doesn’t emit the |serial| line. Publishing with that one would have silently removed rollback protection from the signed index.I also did an upstream sweep. 110 of the 225 packages are currently outdated. The first scan hit 11 GitHub HTTP errors because of unauthenticated API rate limiting. Passing a token brought that down to one.I bumped and built nine packages from the current sources and published them:tzdata 2026b -> 2026dcurl 8.21 -> 8.22libcap 2.73 -> 2.78libxml2wireless-regdbless 668 -> 710jq 1.8.2htop 3.5.3nano 8.7.1All nine were built using the Blueberry toolchain with no bootstrap fallback. The changes are on branch pkg-bump-2026-09-20.Three automatic bumps produced incorrect source URLs. ca-certificates tried to fetch a 2026-08 PEM from the 2026-05 path, and expat tried to fetch 2.8.4 from the R_2_8_2 tag. Those were left unpublished rather than shipping the wrong tarball.sqlite needs a manual bump. openssl 3.4.6 -> 4.0.2, perl 5.40 -> 5.44, and gettext 0.26 -> 1.0 are ABI-level changes, so those will get separate passes.There’s also something new: you can try Blueberry directly in your browser. https://try.blueberrylinux.orgNo install and no signup. It’s a real shell running on a real Blueberry rootfs. The rootfs is about 480 MB, assembled by walking the dependency closure from bpm.index and pulling the packages directly from the live mirror. It contains 41 packages, including bpm 1.11.6.The frontend is xterm.js, with an aiohttp WebSocket connected to a PTY, served through Cloudflare.Each session gets an overlay over a read-only rootfs, its own network, PID, mount, and UTS namespaces, a 32 MB tmpfs, and a hard 10-minute limit. There are 12 concurrent sessions allowed, and sessions are torn down when the client disconnects.I also verified the isolation from inside a live session. The router, hypervisor, and 1.1.1.1 are unreachable, and only three PIDs are visible.There were two bugs while building the browser shell.First, pty.fork() already calls setsid(), so my additional setsid() call failed with EPERM and killed every session during startup. The server reported “operation not permitted” and closed the WebSocket before the shell even started.Second, the xterm CDN URLs were returning 404s. The page failed before it could report the error and just sat on “connecting…”. I vendored the assets locally and changed the frontend to report asset load failures explicitly.So the current state is: the repository is publishing again, the dead build timer is gone, the first batch of package updates is built and published, and Blueberry now has a browser-accessible shell for trying out the system without installing anything."}]...
|
Title: BlueberryLinux by @zsigisti | Stardance
De Title: BlueberryLinux by @zsigisti | Stardance
Devlogs:
Came back to Blueberry after a month and audited the live infrastructure before writing any code.State of the system: the distro is healthy. 225 recipes, valid index signature, and the main mirror is serving real packages.There were two actual issues.The published bpm.index was dated 31 July, so it was seven weeks stale. The other was blueberry-build.timer on the repo host, which had failed every hour since 29 June — 2,217 consecutive failures — because it was still trying to run blueberry-build-server.sh. I deleted that script during the .bpm migration and never disabled the unit.I also initially thought repo1 was broken. It isn’t. Its index is 0 bytes because it’s the BUR community mirror and nothing has been approved there yet. Nginx correctly returns 404 at the origin. That one was just me reading the state incorrectly.Both actual issues are now fixed.I disabled the timer rather than bringing the old script back. I also republished the index with a fresh serial using tools/release/repo-publish.sh. It re-indexes remotely using the hardened bpmrepo.sh, including a count-floor check, timestamped backup, and atomic index + signature swap.I almost used the wrong script. /opt/blueberry/tools/bpmrepo.sh is an orphaned copy from before serial support was added and doesn’t emit the |serial| line. Publishing with that one would have silently removed rollback protection from the signed index.I also did an upstream sweep. 110 of the 225 packages are currently outdated. The first scan hit 11 GitHub HTTP errors because of unauthenticated API rate limiting. Passing a token brought that down to one.I bumped and built nine packages from the current sources and published them:tzdata 2026b -> 2026dcurl 8.21 -> 8.22libcap 2.73 -> 2.78libxml2wireless-regdbless 668 -> 710jq 1.8.2htop 3.5.3nano 8.7.1All nine were built using the Blueberry toolchain with no bootstrap fallback. The changes are on branch pkg-bump-2026-09-20.Three automatic bumps produced incorrect source URLs. ca-certificates tried to fetch a 2026-08 PEM from the 2026-05 path, and expat tried to fetch 2.8.4 from the R_2_8_2 tag. Those were left unpublished rather than shipping the wrong tarball.sqlite needs a manual bump. openssl 3.4.6 -> 4.0.2, perl 5.40 -> 5.44, and gettext 0.26 -> 1.0 are ABI-level changes, so those will get separate passes.There’s also something new: you can try Blueberry directly in your browser. https://try.blueberrylinux.orgNo install and no signup. It’s a real shell running on a real Blueberry rootfs. The rootfs is about 480 MB, assembled by walking the dependency closure from bpm.index and pulling the packages directly from the live mirror. It contains 41 packages, including bpm 1.11.6.The frontend is xterm.js, with an aiohttp WebSocket connected to a PTY, served through Cloudflare.Each session gets an overlay over a read-only rootfs, its own network, PID, mount, and UTS namespaces, a 32 MB tmpfs, and a hard 10-minute limit. There are 12 concurrent sessions allowed, and sessions are torn down when the client disconnects.I also verified the isolation from inside a live session. The router, hypervisor, and 1.1.1.1 are unreachable, and only three PIDs are visible.There were two bugs while building the browser shell.First, pty.fork() already calls setsid(), so my additional setsid() call failed with EPERM and killed every session during startup. The server reported “operation not permitted” and closed the WebSocket before the shell even started.Second, the xterm CDN URLs were returning 404s. The page failed before it could report the error and just sat on “connecting…”. I vendored the assets locally and changed the frontend to report asset load failures explicitly.So the current state is: the repository is publishing again, the dead build timer is gone, the first batch of package updates is built and published, and Blueberry now has a browser-accessible shell for trying out the system without installing anything.
Ships:
Blueberry Linux is a source-built rolling x86-64 server distro I’ve been working on since May. It isn’t a respin of anything. It has its own package manager (bpm, written in Rust with streaming installs and SHA-256 verification), its own package format, and its own signed repository using an Ed25519 signature over the index. There are 225 package recipes so far, from glibc and binutils upward. It’s also self-hosted in the real sense. The base system is built from Blueberry packages using the Blueberry toolchain, and if a build falls back to a foreign bootstrap, that’s considered a build failure rather than a successful build. I came back to the project after about a month away and spent some time auditing the live infrastructure before getting back to development. I fixed the repository issues I found, published nine package updates, and built something new: you can now try Blueberry directly in your browser at https://try.blueberrylinux.org . The hardest part of this round was actually a near miss. There’s an old copy of bpmrepo.sh sitting on the repository host that predates serial support. It doesn’t emit the |serial| line. It was sitting there looking perfectly usable, and it would have worked. The problem is that using it would have silently removed rollback protection from the signed repository index. Nothing would have obviously failed. The index would still have been signed and the repository would still have worked. I only caught it because I went back and checked what my own client actually expects instead of assuming the existing tool was the right one. The browser shell also had two bugs that took a bit of debugging. First, pty.fork() already calls setsid(), so I was calling it a second time. That resulted in EPERM and killed every session immediately after launch. Then the xterm CDN URLs started returning 404s. The frontend failed before it could even display the actual error, so from the user’s perspective it just sat there saying “connecting…”. I vendored the assets locally and changed the frontend to report asset loading failures properly. The part I’m happiest with is how the browser environment is built. The thing you’re running in the browser is actually assembled from the same packages the distro itself uses. The isolation is also verified rather than assumed. From inside a live session, the router, the hypervisor, and 1.1.1.1 are all unreachable, and only three PIDs are visible. If you want to try it, open https://try.blueberrylinux.org . It’s a real shell on a real Blueberry rootfs. There’s no network access, nothing persists between sessions, and each session is limited to ten minutes. The source is available here: https://github.com/zsigisti/blueberry...
|
1793213507.7538493
|
1793299907.7538493
|
|
15806
|
Minecraft by @Allen | Stardance
|
Allen
|
0
|
5.0
|
0
|
[]
|
[{"post_id": 7130, "ts": "2026 [{"post_id": 7130, "ts": "2026-06-11T22:15:43Z", "hours": 5.0, "text": "I tried to make the game as much like the Minecraft-like browser survival game: added chunk saving/loading, smoother chunk performance, pointer-lock mouse controls, respawn/coords/HUD, health/hunger/armor, mobs with damage/health, food/eating, mining/placing, crafting recipes, chests, furnaces, beds/spawn, water/lava, more blocks/items/tools/armor, better textures and inventory icons, improved terrain generation with biomes, rivers, beaches, cliffs, mountains, caves, ores, trees, cactus/desert features, and fixed bugs like full starting inventory, chunks deloading, laggy loading, bad deployment config, and underwater terrain being hidden."}]...
|
Title: Minecraft by @Allen | Stardance
Devlogs:
I Title: Minecraft by @Allen | Stardance
Devlogs:
I tried to make the game as much like the Minecraft-like browser survival game: added chunk saving/loading, smoother chunk performance, pointer-lock mouse controls, respawn/coords/HUD, health/hunger/armor, mobs with damage/health, food/eating, mining/placing, crafting recipes, chests, furnaces, beds/spawn, water/lava, more blocks/items/tools/armor, better textures and inventory icons, improved terrain generation with biomes, rivers, beaches, cliffs, mountains, caves, ores, trees, cactus/desert features, and fixed bugs like full starting inventory, chunks deloading, laggy loading, bad deployment config, and underwater terrain being hidden....
|
1792914797.928518
|
1793778797.928518
|
|
53821
|
Lamp by @Skyler | Stardance
|
Skyler
|
0
|
11.38
|
0
|
[]
|
[{"post_id": 71300, "ts": "202 [{"post_id": 71300, "ts": "2026-09-20T16:22:21Z", "hours": 5.4014, "text": "Devlog 2: The shield is almost finished. I made some grooves for some green neon wire and a few holes for screws. I also separated some parts that have to be printed separately. The 3d model is almost finished. I only have to check a few things and import it into the slicer : )"}, {"post_id": 59147, "ts": "2026-08-31T19:31:10Z", "hours": 5.9822, "text": "Devlog 1: For the past few days I have been working on some decoration for the lamp in my room. It is actually meant to be a outside lamp, but because I didn’t read the description I installed it in my bedroom 😓… So I decided to make some decoration for it😄! Because it has a cylinder shape I want to make it a handle of a sci fi style shield😎. It will be grabbed by a hand, that comes out of the wall😮!!! I have almost finished the hand. But because it has been some time since I used Blender, it took a lot of time😭"}]...
|
Title: Lamp by @Skyler | Stardance
Devlogs:
Devlo Title: Lamp by @Skyler | Stardance
Devlogs:
Devlog 1: For the past few days I have been working on some decoration for the lamp in my room. It is actually meant to be a outside lamp, but because I didn’t read the description I installed it in my bedroom 😓… So I decided to make some decoration for it😄! Because it has a cylinder shape I want to make it a handle of a sci fi style shield😎. It will be grabbed by a hand, that comes out of the wall😮!!! I have almost finished the hand. But because it has been some time since I used Blender, it took a lot of time😭
Devlog 2: The shield is almost finished. I made some grooves for some green neon wire and a few holes for screws. I also separated some parts that have to be printed separately. The 3d model is almost finished. I only have to check a few things and import it into the slicer : )...
|
1792766856.0665565
|
1793371656.0665565
|
|
59717
|
NASA Space Explorer by @vedasm | Stardance
|
vedasm
|
1
|
9.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T16:49:44Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I developed NASA Space Explorer, a comprehensive web dashboard that consolidates a series of NASA Open APIs into a single, user-interactive interface. The application offers a zoomable, high-res view of the APOD or NASA Astronomy Picture of the Day, and live NeoWS or Near-Earth Object Web Service tracking of perihelion distance, velocity, and hazard classification. It also supplies deep-space imagery of the Earth from DSCOVR ‘Earth Polychromatic Imaging Camera’ or EPIC, on a user-defined date, fusing a NASA Image Search over six decades of mission photography anda performance caching back-end to avoid rate limits and speed load time. The biggest issues encountered were normalization of different JSON payload structures for the many different NASA endpoints, dynamically building date based image URL paths for the EPIC camera feed, and fine tuning rate limits and cache TTLs to ensure a fast responsive application.", "repo": "https://github.com/vedasm/NASA-Space-Explorer", "demo": "https://nasaspaceexplorervsm.vercel.app/"}]...
|
[{"post_id": 71308, "ts": "202 [{"post_id": 71308, "ts": "2026-09-20T16:37:31Z", "hours": 1.2825, "text": "NASA Image Library Search and Deployment Implemented keyword-based querying via the /api/search endpoint to fetch 6 decades of mission photography. Built a search bar component allowing the user to query for images dynamically by keyword. Rendered search results in a responsive grid featuring high-resolution thumbnails, mission titles, centers, and dates. Configured build scripts and deployed the full-stack web app live to Vercel at https://nasaspaceexplorervsm.vercel.app/ Click here to see"}, {"post_id": 71177, "ts": "2026-09-20T12:07:42Z", "hours": 1.4531, "text": "NASA EPIC Earth Imagery Integration Created @app.route(\"/api/epic\") an endpoint that parses the date parameter and validates input against the YYYY-MM-DD format. Built _fetch_epic_images() to query the EPIC API from NASA and parse the full PNG, including year, month, and day path components. Wrapped raw API calls inside a _cached() helper function with a 24-hour cache TTL to lower redundant external API requests. Added a date selection input with a Show Images button and responsive grid to display all earth images."}, {"post_id": 70934, "ts": "2026-09-20T02:22:20Z", "hours": 1.7364, "text": "Added Near-Earth Object Asteroid Tracking NASA NeoWs API Integration: Querying NeoWs (Near Earth Object Web Service) REST API to fetch real-time close-approach asteroid telemetry for that day. Real-Time Metrics Parsing: Extracting important astronomical data attributes, including estimated maximum width, velocity, and miss distance. Sorting & Filtering: Manipulating API payloads to dynamically determine hazardous status badges and sort incoming asteroids by nearest distance. Metric UI Components: Created a CSS-styled list view with hazard badges and a starry background overlay"}, {"post_id": 70470, "ts": "2026-09-19T08:02:39Z", "hours": 1.1364, "text": "NASA APOD to Web APOD API Integration: Fetched NASA’s Astronomy Picture of the Day data dynamically to display the latest space image, date, etc. Parallax Scrolling Effect: Implemented multi-layered star parallax scrolling where stars in the background move slowly and smoothly. Shooting Star Animation: Designed a dynamic shooting star animation. This was when I took a little help from AI. Full Image Model: Added a “Full Image” button that opens a full-resolution image."}, {"post_id": 70426, "ts": "2026-09-19T05:18:35Z", "hours": 3.1561, "text": "NASA Space Explorer Architecture Setup Frontend Structure User Interface: index.html serves as the entry point for the user in the browser, styled via style.css . Core Logic: main.js handles user interactions, renders NASA data onto the browser, and routes API requests to the backend. Backend Integration Flask Server: Flask app.py acts as the core app router, exposing endpoints for /api/apod , /api/asteroids , /api/epic and /api/search . nasa_api.py manages external API communication."}]...
|
Title: NASA Space Explorer by @vedasm | Stardance
Title: NASA Space Explorer by @vedasm | Stardance
Devlogs:
NASA Space Explorer Architecture Setup Frontend Structure User Interface: index.html serves as the entry point for the user in the browser, styled via style.css . Core Logic: main.js handles user interactions, renders NASA data onto the browser, and routes API requests to the backend. Backend Integration Flask Server: Flask app.py acts as the core app router, exposing endpoints for /api/apod , /api/asteroids , /api/epic and /api/search . nasa_api.py manages external API communication.
NASA APOD to Web APOD API Integration: Fetched NASA’s Astronomy Picture of the Day data dynamically to display the latest space image, date, etc. Parallax Scrolling Effect: Implemented multi-layered star parallax scrolling where stars in the background move slowly and smoothly. Shooting Star Animation: Designed a dynamic shooting star animation. This was when I took a little help from AI. Full Image Model: Added a “Full Image” button that opens a full-resolution image.
Added Near-Earth Object Asteroid Tracking NASA NeoWs API Integration: Querying NeoWs (Near Earth Object Web Service) REST API to fetch real-time close-approach asteroid telemetry for that day. Real-Time Metrics Parsing: Extracting important astronomical data attributes, including estimated maximum width, velocity, and miss distance. Sorting & Filtering: Manipulating API payloads to dynamically determine hazardous status badges and sort incoming asteroids by nearest distance. Metric UI Components: Created a CSS-styled list view with hazard badges and a starry background overlay
NASA EPIC Earth Imagery Integration Created @app.route("/api/epic") an endpoint that parses the date parameter and validates input against the YYYY-MM-DD format. Built _fetch_epic_images() to query the EPIC API from NASA and parse the full PNG, including year, month, and day path components. Wrapped raw API calls inside a _cached() helper function with a 24-hour cache TTL to lower redundant external API requests. Added a date selection input with a Show Images button and responsive grid to display all earth images.
NASA Image Library Search and Deployment Implemented keyword-based querying via the /api/search endpoint to fetch 6 decades of mission photography. Built a search bar component allowing the user to query for images dynamically by keyword. Rendered search results in a responsive grid featuring high-resolution thumbnails, mission titles, centers, and dates. Configured build scripts and deployed the full-stack web app live to Vercel at https://nasaspaceexplorervsm.vercel.app/ Click here to see
Ships:
I developed NASA Space Explorer, a comprehensive web dashboard that consolidates a series of NASA Open APIs into a single, user-interactive interface. The application offers a zoomable, high-res view of the APOD or NASA Astronomy Picture of the Day, and live NeoWS or Near-Earth Object Web Service tracking of perihelion distance, velocity, and hazard classification. It also supplies deep-space imagery of the Earth from DSCOVR ‘Earth Polychromatic Imaging Camera’ or EPIC, on a user-defined date, fusing a NASA Image Search over six decades of mission photography anda performance caching back-end to avoid rate limits and speed load time. The biggest issues encountered were normalization of different JSON payload structures for the many different NASA endpoints, dynamically building date based image URL paths for the EPIC camera feed, and fine tuning rate limits and cache TTLs to ensure a fast responsive application....
|
1793206209.3873155
|
1793292609.3873155
|
|
64163
|
cup shuffle eye training game by @hoshi | Stardanc cup shuffle eye training game by @hoshi | Stardance...
|
hoshi
|
1
|
2.0
|
12
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T16:48:56Z", "hours": 2.0, "multiplier": 7.46, "payout": 12, "blessing": "neutral", "text": "a really really small game I made, a cup shuffling game with various levels! It’s basically an eye training game. There are ten total levels! Levels 1-5 have three cups and levels 6-9 has five cups. Level 10 is impossible, no one can beat it haha. Basically, the ball starts inside the middle cup. And you have to use your eyes to remember the ball’s position while the cups are getting shuffled. It might be a bit hard and confusing to see, sorry", "repo": "https://github.com/uuukye/cup-shuffle-eye-training-game", "demo": "https://uuukye.github.io/cup-shuffle-eye-training-game/"}]...
|
[{"post_id": 71310, "ts": "202 [{"post_id": 71310, "ts": "2026-09-20T16:37:53Z", "hours": 0.5758, "text": "I added the difficulty levels! this did not really take that much time, because I just had to alter the speed and the amount of cups. What was challenging though was the buttons, it was pretty stressful to create buttons. Also I forgot to write this in my previous devlog but it was challenging switching the cups with a smooth transition, while running “draw” but I somehow solved that"}, {"post_id": 71274, "ts": "2026-09-20T15:42:48Z", "hours": 0.9717, "text": "I just wanted to create a small project so I made this basic eye trainer. I’m thinking of adding difficulty levels, and from level 4 or smth I will make it five cups instead of three cups. I’m not expecting to make this project huge"}]...
|
Title: cup shuffle eye training game by @hoshi | S Title: cup shuffle eye training game by @hoshi | Stardance
Devlogs:
I just wanted to create a small project so I made this basic eye trainer. I’m thinking of adding difficulty levels, and from level 4 or smth I will make it five cups instead of three cups. I’m not expecting to make this project huge
I added the difficulty levels! this did not really take that much time, because I just had to alter the speed and the amount of cups. What was challenging though was the buttons, it was pretty stressful to create buttons. Also I forgot to write this in my previous devlog but it was challenging switching the cups with a smooth transition, while running “draw” but I somehow solved that
Ships:
a really really small game I made, a cup shuffling game with various levels! It’s basically an eye training game. There are ten total levels! Levels 1-5 have three cups and levels 6-9 has five cups. Level 10 is impossible, no one can beat it haha. Basically, the ball starts inside the middle cup. And you have to use your eyes to remember the ball’s position while the cups are getting shuffled. It might be a bit hard and confusing to see, sorry...
|
1793213517.782987
|
1793299917.782987
|
|
58539
|
ViteOS by @UmarFarooq | Stardance
|
UmarFarooq
|
2
|
33.31
|
117
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T11:05:28Z", "hours": 31.0, "multiplier": 7.46, "payout": 117, "blessing": "neutral", "text": "I’ve updated webOS 1 and added several more apps and new feautres. Features & Apps: Multiple draggable and resizable windows. Windows like interface. Two UI modes: “vite” and “windows98”. Clock app: Analog clock Digital clock Notes app: Create multiple notes. Full CRUD functionality available. Photos app ViteOS Relay: A real-time global chatting platform built using supabase. Node Explorer: Browse, search, and explore npm packages and get insights. Ambience: Play multiple sounds and enjoy the voice. Compiler Browser: Visit different websites. Storage Lab: Visualize, add, edit, delete browser storage (localstorage, session storage, indexedDB)", "repo": "https://github.com/umar-farooq-5757/viteos", "demo": "https://myviteos.vercel.app/"}, {"ship_num": 2, "ts": "2026-09-05T17:08:30Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A WebOS that runs in the browser. Features: Multiple draggable windows. Windows like interface. Notes, Clock and Photos apps available.", "repo": "https://github.com/umar-farooq-5757/viteos", "demo": "https://myviteos.vercel.app/"}]...
|
[{"post_id": 71316, "ts": "202 [{"post_id": 71316, "ts": "2026-09-20T16:48:19Z", "hours": 0.3103, "text": "I have removed two apps that were fully generated by AI, because a stardance project reviewer said that my project mostly looks like AI built it. So, i removed the browser and “storage lab” apps."}, {"post_id": 71149, "ts": "2026-09-20T11:01:15Z", "hours": 4.9067, "text": "Final devlog before shipping. I thought I would complete the project after the previous devlog, but then I got idea of two more apps. And I thought they will be really useful and good. But, as I made my mind to ship after the previous devlog, I didn’t had any motivation to develop these apps (“Browser” and “Storage Lab”) myself, so I developed them using AI. Plus, I have also made all the windows resizable. Hope you will like them."}, {"post_id": 69003, "ts": "2026-09-16T06:26:15Z", "hours": 8.3817, "text": "Introducing “Windows 98” mode. I have made changes in every window, and every element to look exactly like the old UI of windows. You can easily switch between the two modes. It took a lot of time!"}, {"post_id": 66469, "ts": "2026-09-12T09:47:58Z", "hours": 2.4478, "text": "Welcome to another devlog of ViteOS. I’ve added a compiler app supporting python and javascript. It uses browser’s built-in WASM (Web Assembly) to run the code and display output."}, {"post_id": 65889, "ts": "2026-09-11T10:20:33Z", "hours": 6.7325, "text": "Welcome to new devlog of ViteOS.I have created “Npm Explorer” app where you can search any npm package and view its details. It uses official npm registry for fetching data. Features included in Npm explorer: Package name and description shown at the top left corner. A button for viewing package on npm. Copy the command for installing package. Keywords, dependencies and maintainers displayed. Formatted readme displayed."}, {"post_id": 64323, "ts": "2026-09-08T16:43:50Z", "hours": 5.2483, "text": "In this devlog, I want to announce a major update to ViteOS: a new global chat app where anyone can connect and talk in real time! I built this application using Supabase. During its development, I learned how Supabase Row Level Security (RLS) works to protect data. Even though Supabase client keys are public, RLS ensures that users can only perform actions explicitly allowed by your policies, keeping the database safe from unauthorized writes or deletions. And I have also integrated a unique clock that I created as a side project in November 2025. Hope you will like it."}, {"post_id": 63658, "ts": "2026-09-07T16:13:20Z", "hours": 1.4478, "text": "Welcome to new devlog of ViteOS, in this update, I’ve added an ambient sound mixer app. There are many sound options available, you can play them all at once or any combination you like. And I’ve also added window maximize/minimize feature."}, {"post_id": 63475, "ts": "2026-09-07T11:01:22Z", "hours": 1.1869, "text": "In this devlog, I want to tell that I’ve updated how the notes app works. Now, you can create multiple notes seamlessly and switch between them using a tab-like interface. Full CRUD functionality is available. Plus, images in the Photos app are cached now, so they load instantly when you scroll through them"}, {"post_id": 63099, "ts": "2026-09-06T18:21:10Z", "hours": 1.0839, "text": "Welcome to new devlog of ViteOS. I’ve added analog clock in the clock app. Plus, the photos app is improved also. Now, photos are cycled (when user is on last image, the next button takes to the first image and vice versa)"}, {"post_id": 62324, "ts": "2026-09-05T17:06:17Z", "hours": 0.5008, "text": "Added the photos app where you can view multiple images."}, {"post_id": 62293, "ts": "2026-09-05T16:23:59Z", "hours": 0.3381, "text": "Created clock app and some other UI improvements."}, {"post_id": 62183, "ts": "2026-09-05T13:26:58Z", "hours": 0.9772, "text": "Setup vite project and added a notes app. It is a draggable window with title and a textarea to write notes."}]...
|
Title: ViteOS by @UmarFarooq | Stardance
Devlogs: Title: ViteOS by @UmarFarooq | Stardance
Devlogs:
Setup vite project and added a notes app. It is a draggable window with title and a textarea to write notes.
Created clock app and some other UI improvements.
Added the photos app where you can view multiple images.
Welcome to new devlog of ViteOS. I’ve added analog clock in the clock app. Plus, the photos app is improved also. Now, photos are cycled (when user is on last image, the next button takes to the first image and vice versa)
In this devlog, I want to tell that I’ve updated how the notes app works. Now, you can create multiple notes seamlessly and switch between them using a tab-like interface. Full CRUD functionality is available. Plus, images in the Photos app are cached now, so they load instantly when you scroll through them
Welcome to new devlog of ViteOS, in this update, I’ve added an ambient sound mixer app. There are many sound options available, you can play them all at once or any combination you like. And I’ve also added window maximize/minimize feature.
In this devlog, I want to announce a major update to ViteOS: a new global chat app where anyone can connect and talk in real time! I built this application using Supabase. During its development, I learned how Supabase Row Level Security (RLS) works to protect data. Even though Supabase client keys are public, RLS ensures that users can only perform actions explicitly allowed by your policies, keeping the database safe from unauthorized writes or deletions. And I have also integrated a unique clock that I created as a side project in November 2025. Hope you will like it.
Welcome to new devlog of ViteOS.I have created “Npm Explorer” app where you can search any npm package and view its details. It uses official npm registry for fetching data. Features included in Npm explorer: Package name and description shown at the top left corner. A button for viewing package on npm. Copy the command for installing package. Keywords, dependencies and maintainers displayed. Formatted readme displayed.
Welcome to another devlog of ViteOS. I’ve added a compiler app supporting python and javascript. It uses browser’s built-in WASM (Web Assembly) to run the code and display output.
Introducing “Windows 98” mode. I have made changes in every window, and every element to look exactly like the old UI of windows. You can easily switch between the two modes. It took a lot of time!
Final devlog before shipping. I thought I would complete the project after the previous devlog, but then I got idea of two more apps. And I thought they will be really useful and good. But, as I made my mind to ship after the previous devlog, I didn’t had any motivation to develop these apps (“Browser” and “Storage Lab”) myself, so I developed them using AI. Plus, I have also made all the windows resizable. Hope you will like them.
I have removed two apps that were fully generated by AI, because a stardance project reviewer said that my project mostly looks like AI built it. So, i removed the browser and “storage lab” apps.
Ships:
A WebOS that runs in the browser. Features: Multiple draggable windows. Windows like interface. Notes, Clock and Photos apps available.
I’ve updated webOS 1 and added several more apps and new feautres. Features & Apps: Multiple draggable and resizable windows. Windows like interface. Two UI modes: “vite” and “windows98”. Clock app: Analog clock Digital clock Notes app: Create multiple notes. Full CRUD functionality available. Photos app ViteOS Relay: A real-time global chatting platform built using supabase. Node Explorer: Browse, search, and explore npm packages and get insights. Ambience: Play multiple sounds and enjoy the voice. Compiler Browser: Visit different websites. Storage Lab: Visualize, add, edit, delete browser storage (localstorage, session storage, indexedDB)...
|
1793252932.816195
|
1793339332.816195
|
|
50917
|
GAMAWORLD by @MuhammadAarez | Stardance
|
MuhammadAarez
|
0
|
0.75
|
0
|
[]
|
[{"post_id": 71319, "ts": "202 [{"post_id": 71319, "ts": "2026-09-20T16:52:36Z", "hours": 0.7517, "text": "I am making a game using a Godot engine. It’s completely new and so much fun. I am slow at it but I am learning a lot. So excited to work on it more."}]...
|
Title: GAMAWORLD by @MuhammadAarez | Stardance
De Title: GAMAWORLD by @MuhammadAarez | Stardance
Devlogs:
I am making a game using a Godot engine. It’s completely new and so much fun. I am slow at it but I am learning a lot. So excited to work on it more....
|
1793368179.0526142
|
1793972979.0526142
|
|
63642
|
ARIA by @darbens | Stardance
|
darbens
|
0
|
0.47
|
0
|
[]
|
[{"post_id": 71324, "ts": "202 [{"post_id": 71324, "ts": "2026-09-20T17:05:16Z", "hours": 0.4667, "text": "Today I continued working on my project and focused on getting everything organized and working together. I worked on the project structure, tested different parts of the app, and started preparing it to be something I can actually demo and use in a web browser. I’m still working through bugs and improving the UI, but the project is coming together. My next goal is to finish the main features, clean up anything that isn’t working properly, and get a working browser version ready to show."}]...
|
Title: ARIA by @darbens | Stardance
Devlogs:
Toda Title: ARIA by @darbens | Stardance
Devlogs:
Today I continued working on my project and focused on getting everything organized and working together. I worked on the project structure, tested different parts of the app, and started preparing it to be something I can actually demo and use in a web browser. I’m still working through bugs and improving the UI, but the project is coming together. My next goal is to finish the main features, clean up anything that isn’t working properly, and get a working browser version ready to show....
|
1793051726.2872252
|
1793915726.2872252
|
|
51505
|
Simon_pocket by @joris | Stardance
|
joris
|
1
|
15.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-25T10:19:34Z", "hours": 15.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made Simon_pocket - a pocket version of the classic simon says game. I designed a PCB, wrote bare metal code for the microcontroller and designed an enclosure. I am very happy with the PCB and code, but it think that I need to improve my 3D modeling skills and make better models in the future. I am really happy that i was able to learn so much about the programming of STM32 microcontrollers even if it took a long time. In the future i hope to make projects with more interesting electronic circuits.", "repo": "https://github.com/JorisBar/Simon_pocket", "demo": ""}]...
|
[{"post_id": 71325, "ts": "202 [{"post_id": 71325, "ts": "2026-09-20T17:06:37Z", "hours": 0.7, "text": "I just prepared a few 3D printed housings and PCBs. My 3D printed parts have bridges that don’t turn out very well, so i need to use some tools to grind them down. I think that my filament is wet, so I’m experiencing this problem."}, {"post_id": 62788, "ts": "2026-09-06T09:38:25Z", "hours": 3.2003, "text": "I just updated the Simon_pocket housing 3D model. It now has a tighter locking mechanism and a thinner loop for connecting to key rings. I am also finishing up my README document. I have created all of the diagrams and pictures i need. I attached a picture of the old and the new versions of the housing."}, {"post_id": 56440, "ts": "2026-08-28T06:33:06Z", "hours": 5.6667, "text": "I just soldered 2 PCBs by hand and 5 PCBs using a solder paste stencil. I was very suprised that the solder paste and stencil were easy to use. Using the stencil, i soldered 5 PCBs in about the same time it would have taken me to solder 1 PCB by hand. The stencil also improved the solder quality. It looks way better than doing it by hand. Even though i used a cheap solder paste, I still got great results."}, {"post_id": 51524, "ts": "2026-08-21T09:05:24Z", "hours": 2.0833, "text": "Today I finished 2 diagrams for the code logic and took a screenshot of my Fusion workspace to put in my README file. I also took 2 images of the real soldered PCBs. The README is starting to look really good"}, {"post_id": 50940, "ts": "2026-08-20T12:31:58Z", "hours": 1.1833, "text": "I started 2 diagrams for my project’s code/game logic. I will put them in my README file on my github. At first i had a hard time figuring out how to display the code logic, but after talking to Gemini i decided to do 2 different diagrams: one for system state transitions and the other for how the code is structured. I attached images of both unfinnished diagrams."}, {"post_id": 50846, "ts": "2026-08-20T09:10:28Z", "hours": 2.2167, "text": "I created a block diagram to explain the gameplay of my project. I did it in diagrams.net. I really like how it looks and it makes my README.md way better. I also fixed file formats of some images, because github doesnt suppord PDFs in the README and i had a hard time exporting .svg files. I later realised that i can put a black rectangle behind my PCB svg and now the constrast is really good and i can see everything clearly."}]...
|
Title: Simon_pocket by @joris | Stardance
Devlogs Title: Simon_pocket by @joris | Stardance
Devlogs:
I created a block diagram to explain the gameplay of my project. I did it in diagrams.net. I really like how it looks and it makes my README.md way better. I also fixed file formats of some images, because github doesnt suppord PDFs in the README and i had a hard time exporting .svg files. I later realised that i can put a black rectangle behind my PCB svg and now the constrast is really good and i can see everything clearly.
I started 2 diagrams for my project’s code/game logic. I will put them in my README file on my github. At first i had a hard time figuring out how to display the code logic, but after talking to Gemini i decided to do 2 different diagrams: one for system state transitions and the other for how the code is structured. I attached images of both unfinnished diagrams.
Today I finished 2 diagrams for the code logic and took a screenshot of my Fusion workspace to put in my README file. I also took 2 images of the real soldered PCBs. The README is starting to look really good
I just soldered 2 PCBs by hand and 5 PCBs using a solder paste stencil. I was very suprised that the solder paste and stencil were easy to use. Using the stencil, i soldered 5 PCBs in about the same time it would have taken me to solder 1 PCB by hand. The stencil also improved the solder quality. It looks way better than doing it by hand. Even though i used a cheap solder paste, I still got great results.
I just updated the Simon_pocket housing 3D model. It now has a tighter locking mechanism and a thinner loop for connecting to key rings. I am also finishing up my README document. I have created all of the diagrams and pictures i need. I attached a picture of the old and the new versions of the housing.
I just prepared a few 3D printed housings and PCBs. My 3D printed parts have bridges that don’t turn out very well, so i need to use some tools to grind them down. I think that my filament is wet, so I’m experiencing this problem.
Ships:
I made Simon_pocket - a pocket version of the classic simon says game. I designed a PCB, wrote bare metal code for the microcontroller and designed an enclosure. I am very happy with the PCB and code, but it think that I need to improve my 3D modeling skills and make better models in the future. I am really happy that i was able to learn so much about the programming of STM32 microcontrollers even if it took a long time. In the future i hope to make projects with more interesting electronic circuits....
|
1793346901.9794877
|
1793433301.9794877
|
|
51806
|
rc car by @chrif | Stardance
|
chrif
|
0
|
22.69
|
0
|
[]
|
[{"post_id": 71330, "ts": "202 [{"post_id": 71330, "ts": "2026-09-20T17:11:35Z", "hours": 5.9003, "text": "i finished the schematics in kicad, then made the case/shell and made it link with the chassis using magnets then i made the github for the project and set everything up including the readme and exporting the bodies for 3d printing then i made the zine and with that the project is pretty much done (note: i might come back to it or reuse it for other projects and add stuff like cameras or path finding or ai detection or a bionic hand or something)"}, {"post_id": 69309, "ts": "2026-09-16T19:34:44Z", "hours": 2.1169, "text": "i finished the cad and steering and now we need to do the schematics, the programming, and the case"}, {"post_id": 66121, "ts": "2026-09-11T18:48:44Z", "hours": 7.065, "text": "dude omg i made an error on the last devlog by putting the motor next to the two wheel gears without a differential so i thought “ oh easy i just need to add a differential and that’s it” it was not that easy. you can tell by the amount of time that i spent a lot of time trying to figure this out but i finally got it to work after endless mistakes and fusion 360 hickups and glitches and inconvenieces but im pretty sure it should work this time i just need to add the steering and we’re pretty much done with cad"}, {"post_id": 59257, "ts": "2026-08-31T23:02:10Z", "hours": 1.2, "text": "today i fixed the problems with the axles not aligning and then i finished designing the gearboxes and honestly it was easer than i though, before starting the project i thought it was going to be a way bigger prolem than it actually was now i only have the steering left and that will be all the cad work done for now i hope to tackle a more challenging project in the future"}, {"post_id": 58330, "ts": "2026-08-30T18:28:13Z", "hours": 2.2022, "text": "i added the ball bearings that let the wheels turn and then i started working on the gearbox while fixing some design mistakes along the way, looking for how to get a 3d model of a bevel gear was a problem but that got solved quickly although putting them in place on the assembly was tough but when i went to add the axles that connect to the back wheels i noticed a fatal mistake i made is that i forgot that the wheels have to be on the same height yet i put the front wheels too high up or the back wheels too low down either way its going to be a hassle fixing it i wish i noticed it earlier"}, {"post_id": 55253, "ts": "2026-08-26T22:21:37Z", "hours": 2.5922, "text": "i added the spinning axles on the front and made space for the ball bearings since i couldnt find a model for them anywhere and shaped the axle to fing the standart rc car wheels (the yellow ones that are in every beginers kit) and made mounting holes for all the components now all thats left cad-wise is to make the gearbox and the rear axles and then i have to make the schematics and then the programming"}, {"post_id": 51757, "ts": "2026-08-21T16:18:35Z", "hours": 1.6169, "text": "today i planned out the whole project and what i want the final product to look like and then a 3d model to place the components and see how the dimensions will fit together as well as picking the components needed for the bare minimum prototype"}]...
|
Title: rc car by @chrif | Stardance
Devlogs:
toda Title: rc car by @chrif | Stardance
Devlogs:
today i planned out the whole project and what i want the final product to look like and then a 3d model to place the components and see how the dimensions will fit together as well as picking the components needed for the bare minimum prototype
i added the spinning axles on the front and made space for the ball bearings since i couldnt find a model for them anywhere and shaped the axle to fing the standart rc car wheels (the yellow ones that are in every beginers kit) and made mounting holes for all the components now all thats left cad-wise is to make the gearbox and the rear axles and then i have to make the schematics and then the programming
i added the ball bearings that let the wheels turn and then i started working on the gearbox while fixing some design mistakes along the way, looking for how to get a 3d model of a bevel gear was a problem but that got solved quickly although putting them in place on the assembly was tough but when i went to add the axles that connect to the back wheels i noticed a fatal mistake i made is that i forgot that the wheels have to be on the same height yet i put the front wheels too high up or the back wheels too low down either way its going to be a hassle fixing it i wish i noticed it earlier
today i fixed the problems with the axles not aligning and then i finished designing the gearboxes and honestly it was easer than i though, before starting the project i thought it was going to be a way bigger prolem than it actually was now i only have the steering left and that will be all the cad work done for now i hope to tackle a more challenging project in the future
dude omg i made an error on the last devlog by putting the motor next to the two wheel gears without a differential so i thought “ oh easy i just need to add a differential and that’s it” it was not that easy. you can tell by the amount of time that i spent a lot of time trying to figure this out but i finally got it to work after endless mistakes and fusion 360 hickups and glitches and inconvenieces but im pretty sure it should work this time i just need to add the steering and we’re pretty much done with cad
i finished the cad and steering and now we need to do the schematics, the programming, and the case
i finished the schematics in kicad, then made the case/shell and made it link with the chassis using magnets then i made the github for the project and set everything up including the readme and exporting the bodies for 3d printing then i made the zine and with that the project is pretty much done (note: i might come back to it or reuse it for other projects and add stuff like cameras or path finding or ai detection or a bionic hand or something)...
|
1792687745.7716203
|
1793292545.7716203
|
|
51197
|
Portfolio Website by @Aasrith | Stardance
|
Aasrith
|
0
|
6.94
|
0
|
[]
|
[{"post_id": 71333, "ts": "202 [{"post_id": 71333, "ts": "2026-09-20T17:18:15Z", "hours": 2.1142, "text": "Completed the portfolio website!"}, {"post_id": 53106, "ts": "2026-08-23T15:18:48Z", "hours": 2.9089, "text": "Finished the projects section"}, {"post_id": 51418, "ts": "2026-08-21T03:33:12Z", "hours": 1.0817, "text": "Done!"}, {"post_id": 51097, "ts": "2026-08-20T16:21:05Z", "hours": 0.5533, "text": "Working on the third section."}, {"post_id": 50572, "ts": "2026-08-19T19:33:09Z", "hours": 0.2811, "text": "Fully constructed the hero section of my portfolio website."}]...
|
Title: Portfolio Website by @Aasrith | Stardance
Title: Portfolio Website by @Aasrith | Stardance
Devlogs:
Fully constructed the hero section of my portfolio website.
Working on the third section.
Done!
Finished the projects section
Completed the portfolio website!...
|
1793379275.048363
|
1793984075.048363
|
|
46876
|
MiniPod by @anael | Stardance
|
anael
|
0
|
20.88
|
0
|
[]
|
[{"post_id": 71336, "ts": "202 [{"post_id": 71336, "ts": "2026-09-20T17:27:34Z", "hours": 3.4906, "text": "DEVLOG I re assembled the whole pcb but it still won’t work. I think there is an issue in the pcb design around the arduino nano due to which code doesn’t upload to it. I spent a lot of time trying to resolve it but it didn’t work. I will probably have to re assemble the project another time."}, {"post_id": 62369, "ts": "2026-09-05T18:15:57Z", "hours": 4.7228, "text": "DEVLOG 4 I assembled the whole pcb. This was my first time soldering a PCB, and it was kinda fun. Everything was going okayish, but in the end I messed up by soldering the Ardunio nano chip’s pins together. I tried to fix it, but I wasn’t able to. I think I am gonna go to a hardware shop tomorrow, and ask them to fix it."}, {"post_id": 47080, "ts": "2026-08-14T18:28:12Z", "hours": 4.4647, "text": "DEVLOG 3 Today I wrote all the firmware of the player. I basically wrote 2 scripts. A python script which renames all the songs into indexes (000-999) cuz the DFplayer plays in indexes. The second script was the actual firmware which I wrote in C. The first part (all the helper functions) was not that difficult, but the ardunio part was really time consuming and confusing. I will definitely watch some more videos on how ardunio code is written. Check out my Github Repo, and please give me your technical feedback! Most of this project has been using AI to guess the correct thing. That’s why I would love some feeback."}, {"post_id": 45790, "ts": "2026-08-12T14:37:59Z", "hours": 3.2836, "text": "DEVLOG 2 I finally made the body. Check it out! It is a little basic and simple, but I am going to accept it as it does all the functions. I imported pre built models of buttons first, but they couldn’t be edited, so I had to make them myself. I also decided to use some kind of stickers or markers to mark the buttons rather than inside fusion."}, {"post_id": 45426, "ts": "2026-08-11T21:16:06Z", "hours": 4.9167, "text": "DEVLOG 1 YOO! I started a new hardware project. The initial plan was something like an Ipod (looks and features), but it was too complicated for me. I then dumb downed the idea and started working on it. Researching about parts is really confusing but Gemini helpled a lot. I worked on the pcb and have ended the day by completing the pcb. This is my first personal hardware project ever, so I would love feedback/constructive criticism from an expert. Check out the planning, the schematics, and the pcb design."}]...
|
Title: MiniPod by @anael | Stardance
Devlogs:
DEV Title: MiniPod by @anael | Stardance
Devlogs:
DEVLOG 1 YOO! I started a new hardware project. The initial plan was something like an Ipod (looks and features), but it was too complicated for me. I then dumb downed the idea and started working on it. Researching about parts is really confusing but Gemini helpled a lot. I worked on the pcb and have ended the day by completing the pcb. This is my first personal hardware project ever, so I would love feedback/constructive criticism from an expert. Check out the planning, the schematics, and the pcb design.
DEVLOG 2 I finally made the body. Check it out! It is a little basic and simple, but I am going to accept it as it does all the functions. I imported pre built models of buttons first, but they couldn’t be edited, so I had to make them myself. I also decided to use some kind of stickers or markers to mark the buttons rather than inside fusion.
DEVLOG 3 Today I wrote all the firmware of the player. I basically wrote 2 scripts. A python script which renames all the songs into indexes (000-999) cuz the DFplayer plays in indexes. The second script was the actual firmware which I wrote in C. The first part (all the helper functions) was not that difficult, but the ardunio part was really time consuming and confusing. I will definitely watch some more videos on how ardunio code is written. Check out my Github Repo, and please give me your technical feedback! Most of this project has been using AI to guess the correct thing. That’s why I would love some feeback.
DEVLOG 4 I assembled the whole pcb. This was my first time soldering a PCB, and it was kinda fun. Everything was going okayish, but in the end I messed up by soldering the Ardunio nano chip’s pins together. I tried to fix it, but I wasn’t able to. I think I am gonna go to a hardware shop tomorrow, and ask them to fix it.
DEVLOG I re assembled the whole pcb but it still won’t work. I think there is an issue in the pcb design around the arduino nano due to which code doesn’t upload to it. I spent a lot of time trying to resolve it but it didn’t work. I will probably have to re assemble the project another time....
|
1793159350.3954258
|
1793764150.3954258
|
|
44815
|
Differential Swerve by @precon | Stardance
|
precon
|
1
|
47.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T17:53:54Z", "hours": 47.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a differential swerve that is FTC legal, mainly out of 3D printed parts. The most challenging part was getting tolerances right, getting all the math correct, and getting the pod to fit in the build limit. I’m proud that it actually works. I have a working product right now and you should know that although the tuning can be a bit hard, the build is actually very easy. You can just download the files, print it out, get the parts, and build it in around a day or two", "repo": "https://github.com/Vixator/Phoenix-Force-10100-Differential-Swerve", "demo": ""}]...
|
[{"post_id": 71347, "ts": "202 [{"post_id": 71347, "ts": "2026-09-20T17:51:30Z", "hours": 4.35, "text": "Final design and print, need a bit more money for stronger filament/manufacturing, so will ship and then finish the project."}, {"post_id": 70478, "ts": "2026-09-19T08:16:24Z", "hours": 8.1925, "text": "Finished the full build and got everything assembled. It was very rough but it worked. Found a lot of problems and then started and almost finished redesigning it. I hope to print this out in a stronger material and try again to maybe have a more successful design."}, {"post_id": 70303, "ts": "2026-09-18T22:02:48Z", "hours": 14.9586, "text": "OMGGGG got first build done"}, {"post_id": 64029, "ts": "2026-09-08T04:39:06Z", "hours": 7.7411, "text": "It has been a long time working to fix all the previous issues. I think I have one of the most final versions of the model. I’ve only made very tiny tolerance revisions after the final version rebuild so I think I’m mostly stable for the CAD. I’ve been printing out everything to finally build both pods at once. I’ve compiled changes that I’ve done only on one pod or changes that should have plenty of clearance to work. Right now the final shell is printing. I’ll probably work on getting both pods disassembled tomorrow and reassembling them with brand new parts and it should all be coming together quickly. I also worked a lot on the code. I made the robot field-centric and also started using odometry to help out with the accuracy. I haven’t done anything with auto yet but I hope to do something with Pedro pathing to have an auto pathing system for my swerve. I’m pretty excited, to build the final version of my project and have a final product so this can come to a close."}, {"post_id": 63288, "ts": "2026-09-07T01:07:01Z", "hours": 12.1331, "text": "I finished doing the remodel with new parts. A lot of it was updating existing parts to fix what I noticed went wrong in the test build, which made V3. A lot of it was improving the clearances and tolerances between parts to reduce friction and increase efficiency. I also made a lot of changes to the software, which is currently uploaded to GitHub. My plans for the future are:Finish making the wheel grippier and make sure the tread doesn’t fall off.Make auto pathing software.Get a full drivetrain ready."}, {"post_id": 44981, "ts": "2026-08-11T03:18:09Z", "hours": 8.9275, "text": "After finding out about the previous issues in the last version, I finally finished version 2. This one uses different gears that avoid clipping and I changed a lot of the other tolerances. I also found a major thing that I got wrong in my design. Apparently somewhere along the line I dragged a component, which was messing up all the spacings and everything was out of line. I had to go back and fix all of that. I added a lot of convenience features for me to build this easier and made the pod shorter by a good 3 mm so I could actually add some aluminum protection on the ends to avoid the pod being damaged while driving. Overall I think there are a lot of improvements. Once I ship the mod and get the parts, I can finish building this pod and another pod to create a drive base. Hopefully I can finish programming it and hook it up soon so it works."}, {"post_id": 43735, "ts": "2026-08-09T04:35:17Z", "hours": 2.95, "text": "Just posted a devlog but forgot to publish my most recent timelapse and just wanted to give a couple updates. A lot of the tolerances for parts are highly dependent. When I’m inserting a bearing into a 3D printed part, I usually do 13.9 for a 14 mm bearing and 14.9 for the flange. Because some parts print really weirdly in a weird configuration or print vertically where the layers will collapse on each other, I had to make the outer race 15.2 mm and the inner race 14.2 mm, so 0.2 mm oversize instead of undersized. This gives proper tolerance.I also had a lot of weird print issues. I’ve been having a lot of stringing and I accidentally added supports on one of the parts so I’ve been losing a lot of material but it’s honestly taught me a lot as well.I attached a couple of pictures just to show you a difference from my last post. It’s been five minutes but it’s a slight difference. It’s just to show:- what I’ve gotten done- what I’ve assembled so far- what I’ve thrown away- what I’ve missed- okay this is an update after the 2-hour time lapse of me building an entire pod. There’s a lot of things but the biggest thing I noticed was that one of the bevel gears actually clips with the main drive ring gear, which ruins the entire model. This is the biggest issue I have to fix. Other issues I noticed were that assembling was very hard because a lot of the holes were too big and things would fall out when they were flipped over. I also didn’t have the right size screws often, which led me to have weird spacings. Mostly issues can be ironed out through CAD and now that I’ve built it once I can remember what went wrong. For the second version after I fix all these major and minor issues, I hope it’ll go much better and I can get a working pod that’s in size pretty soon for version two."}, {"post_id": 43078, "ts": "2026-08-08T04:46:01Z", "hours": 7.8169, "text": "I started recording and documenting this project halfway through the first revision. The first time lapse was me implementing the final preliminary designs, getting the encoder mounted, getting all the fittings correct, getting the bearing stacks right, and mounting everything in a way that it would technically fit in CAD. The second and third time lapses are mostly printing, getting tolerances right, and getting fits right. My first 3D build will be complete as soon as possible and I can get started on making revisions and iterations to improve the design. I think I focused a lot on trying to incorporate everything I saw. I looked at some designs online and reviewed everything that we needed to implement before hand. I think I’ve done a pretty good job of finding space for everything and putting everything in a nice compact fashion. I think after I get all the tolerances correct and finish assembling, this will be a great first iteration to improve upon. I hope this project can continue and I will get funding for my future prospects, which are getting this machined and getting higher quality parts."}]...
|
Title: Differential Swerve by @precon | Stardance
Title: Differential Swerve by @precon | Stardance
Devlogs:
I started recording and documenting this project halfway through the first revision. The first time lapse was me implementing the final preliminary designs, getting the encoder mounted, getting all the fittings correct, getting the bearing stacks right, and mounting everything in a way that it would technically fit in CAD. The second and third time lapses are mostly printing, getting tolerances right, and getting fits right. My first 3D build will be complete as soon as possible and I can get started on making revisions and iterations to improve the design. I think I focused a lot on trying to incorporate everything I saw. I looked at some designs online and reviewed everything that we needed to implement before hand. I think I’ve done a pretty good job of finding space for everything and putting everything in a nice compact fashion. I think after I get all the tolerances correct and finish assembling, this will be a great first iteration to improve upon. I hope this project can continue and I will get funding for my future prospects, which are getting this machined and getting higher quality parts.
Just posted a devlog but forgot to publish my most recent timelapse and just wanted to give a couple updates. A lot of the tolerances for parts are highly dependent. When I’m inserting a bearing into a 3D printed part, I usually do 13.9 for a 14 mm bearing and 14.9 for the flange. Because some parts print really weirdly in a weird configuration or print vertically where the layers will collapse on each other, I had to make the outer race 15.2 mm and the inner race 14.2 mm, so 0.2 mm oversize instead of undersized. This gives proper tolerance.I also had a lot of weird print issues. I’ve been having a lot of stringing and I accidentally added supports on one of the parts so I’ve been losing a lot of material but it’s honestly taught me a lot as well.I attached a couple of pictures just to show you a difference from my last post. It’s been five minutes but it’s a slight difference. It’s just to show:- what I’ve gotten done- what I’ve assembled so far- what I’ve thrown away- what I’ve missed- okay this is an update after the 2-hour time lapse of me building an entire pod. There’s a lot of things but the biggest thing I noticed was that one of the bevel gears actually clips with the main drive ring gear, which ruins the entire model. This is the biggest issue I have to fix. Other issues I noticed were that assembling was very hard because a lot of the holes were too big and things would fall out when they were flipped over. I also didn’t have the right size screws often, which led me to have weird spacings. Mostly issues can be ironed out through CAD and now that I’ve built it once I can remember what went wrong. For the second version after I fix all these major and minor issues, I hope it’ll go much better and I can get a working pod that’s in size pretty soon for version two.
After finding out about the previous issues in the last version, I finally finished version 2. This one uses different gears that avoid clipping and I changed a lot of the other tolerances. I also found a major thing that I got wrong in my design. Apparently somewhere along the line I dragged a component, which was messing up all the spacings and everything was out of line. I had to go back and fix all of that. I added a lot of convenience features for me to build this easier and made the pod shorter by a good 3 mm so I could actually add some aluminum protection on the ends to avoid the pod being damaged while driving. Overall I think there are a lot of improvements. Once I ship the mod and get the parts, I can finish building this pod and another pod to create a drive base. Hopefully I can finish programming it and hook it up soon so it works.
I finished doing the remodel with new parts. A lot of it was updating existing parts to fix what I noticed went wrong in the test build, which made V3. A lot of it was improving the clearances and tolerances between parts to reduce friction and increase efficiency. I also made a lot of changes to the software, which is currently uploaded to GitHub. My plans for the future are:Finish making the wheel grippier and make sure the tread doesn’t fall off.Make auto pathing software.Get a full drivetrain ready.
It has been a long time working to fix all the previous issues. I think I have one of the most final versions of the model. I’ve only made very tiny tolerance revisions after the final version rebuild so I think I’m mostly stable for the CAD. I’ve been printing out everything to finally build both pods at once. I’ve compiled changes that I’ve done only on one pod or changes that should have plenty of clearance to work. Right now the final shell is printing. I’ll probably work on getting both pods disassembled tomorrow and reassembling them with brand new parts and it should all be coming together quickly. I also worked a lot on the code. I made the robot field-centric and also started using odometry to help out with the accuracy. I haven’t done anything with auto yet but I hope to do something with Pedro pathing to have an auto pathing system for my swerve. I’m pretty excited, to build the final version of my project and have a final product so this can come to a close.
OMGGGG got first build done
Finished the full build and got everything assembled. It was very rough but it worked. Found a lot of problems and then started and almost finished redesigning it. I hope to print this out in a stronger material and try again to maybe have a more successful design.
Final design and print, need a bit more money for stronger filament/manufacturing, so will ship and then finish the project.
Ships:
I made a differential swerve that is FTC legal, mainly out of 3D printed parts. The most challenging part was getting tolerances right, getting all the math correct, and getting the pod to fit in the build limit. I’m proud that it actually works. I have a working product right now and you should know that although the tuning can be a bit hard, the build is actually very easy. You can just download the files, print it out, get the parts, and build it in around a day or two...
|
1793342859.466365
|
1793429259.466365
|
|
706
|
Clash Royale Lookup by @Mice | Stardance
|
Mice
|
1
|
6.31
|
58
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-08T01:50:52Z", "hours": 5.0, "multiplier": 12.02, "payout": 58, "blessing": "neutral", "text": "I made a Clash Royale search tool because I found that there wasn’t many other there that didn’t have ads and were open source. I decided to chose C# as the language I was going to use because I wanted to branch out and try a new language. While it was challenging at first, I managed to write a functional program in a new language that might just be one of my favorite languages to write in. I enjoyed using Bootstrap and making the css for this as it was pretty easy since everything just worked.", "repo": "https://github.com/miceoroni/ClashRoyaleLookup", "demo": "https://clashlookup.miceoroni.xyz/"}]...
|
[{"post_id": 71349, "ts": "202 [{"post_id": 71349, "ts": "2026-09-20T17:53:39Z", "hours": 1.3072, "text": "Devlog #4 - The Revisit of the Century Hello everyone, I decided to finally tidy up this project after not doing so since likeeee August. In doing so, I got around to finally crushing some bugs. One of the most tedious bugs was the loading circle of doom. This one was a pretty difficult bug to squash, but I managed to fix it by going into PlayerController and adding messages to things. Another thing I did was implement a Win Rate. Following the suggestion of someone who reviewed my ship, I decided to go ahead and add this to see how good someone is at Clash (my win rate is HORRID, i have a 78 lol) Lastly, I added a error icon to the error message, so that it doesn’t look as bland. Things to tackle next: Possible clan leaderboard? Award showcase Time account was created Banner display that matches the players custom display That’s all for now, see you in the (hopefully) next part!"}, {"post_id": 4626, "ts": "2026-06-08T00:28:48Z", "hours": 1.1544, "text": "Nearing completion, need to tidy up some of the code and write a actually good README and we should be ready to ship!"}, {"post_id": 2824, "ts": "2026-06-05T17:30:19Z", "hours": 2.705, "text": "touched up on the html and added a new clan api endpoint! i also made the css look way better and more polished. i will throw up a demo site soon for you guys to play around with"}, {"post_id": 162, "ts": "2026-06-01T01:10:33Z", "hours": 0.9356, "text": "getting around to adding bootstrap and working on the web panel a bit. the end result will look way better, i promise. things i enjoyed so far: looking at bootstrap and seeing how it Just Works ™️ seeing how easy controllers are for Asp.Net things i want to do next: make the css look better add more features (cards, deck last used, etc) make a logo"}]...
|
Title: Clash Royale Lookup by @Mice | Stardance
D Title: Clash Royale Lookup by @Mice | Stardance
Devlogs:
getting around to adding bootstrap and working on the web panel a bit. the end result will look way better, i promise. things i enjoyed so far: looking at bootstrap and seeing how it Just Works ™️ seeing how easy controllers are for Asp.Net things i want to do next: make the css look better add more features (cards, deck last used, etc) make a logo
touched up on the html and added a new clan api endpoint! i also made the css look way better and more polished. i will throw up a demo site soon for you guys to play around with
Nearing completion, need to tidy up some of the code and write a actually good README and we should be ready to ship!
Devlog #4 - The Revisit of the Century Hello everyone, I decided to finally tidy up this project after not doing so since likeeee August. In doing so, I got around to finally crushing some bugs. One of the most tedious bugs was the loading circle of doom. This one was a pretty difficult bug to squash, but I managed to fix it by going into PlayerController and adding messages to things. Another thing I did was implement a Win Rate. Following the suggestion of someone who reviewed my ship, I decided to go ahead and add this to see how good someone is at Clash (my win rate is HORRID, i have a 78 lol) Lastly, I added a error icon to the error message, so that it doesn’t look as bland. Things to tackle next: Possible clan leaderboard? Award showcase Time account was created Banner display that matches the players custom display That’s all for now, see you in the (hopefully) next part!
Ships:
I made a Clash Royale search tool because I found that there wasn’t many other there that didn’t have ads and were open source. I decided to chose C# as the language I was going to use because I wanted to branch out and try a new language. While it was challenging at first, I managed to write a functional program in a new language that might just be one of my favorite languages to write in. I enjoyed using Bootstrap and making the css for this as it was pretty easy since everything just worked....
|
1793224455.922952
|
1793310855.922952
|
|
63737
|
Reaper clock by @Abis-Aman | Stardance
|
Abis-Aman
|
0
|
0.62
|
0
|
[]
|
[{"post_id": 71354, "ts": "202 [{"post_id": 71354, "ts": "2026-09-20T17:56:57Z", "hours": 0.6172, "text": "Dev log 1 so i astarted doing the pcb i though the server automatically taked the time but found out that it dosnt so 8 hours wasted and the sydtem or clod has amnny faliers so just in the process"}]...
|
Title: Reaper clock by @Abis-Aman | Stardance
Dev Title: Reaper clock by @Abis-Aman | Stardance
Devlogs:
Dev log 1 so i astarted doing the pcb i though the server automatically taked the time but found out that it dosnt so 8 hours wasted and the sydtem or clod has amnny faliers so just in the process...
|
1793054932.0188131
|
1793659732.0188131
|
|
55311
|
Mission Control by @Aamina | Stardance
|
Aamina
|
1
|
10.75
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-28T18:26:53Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built Mission Control, a browser game where you steer a spaceship using your webcam and it tracks motion by comparing video frames. I’m most proud of the motion tracking itself, since something that simple ends up feeling responsive, and the pause button, which matters more than it seems in a webcam game where you might need to stop mid-session! also also it can also track hands!! yayy The trickiest part wasn’t turning the camera on, but everything around it ! keeping the mirrored movement intuitive, tuning the motion-sensitivity threshold so it’s neither jittery nor unresponsive, and making sure the ship holds its position instead of snapping to a corner when you’re not moving.", "repo": "https://github.com/Aaminanad/Mission-Control", "demo": "https://aaminanad.github.io/Mission-Control/"}]...
|
[{"post_id": 71357, "ts": "202 [{"post_id": 71357, "ts": "2026-09-20T17:57:30Z", "hours": 1.8617, "text": "DEVLOG ?? Shipped but got rejected(again) im gonna be changing everything about this it wont be a hand controlled ship anymore(i hope i dont regret this)"}, {"post_id": 69800, "ts": "2026-09-17T20:13:12Z", "hours": 1.2, "text": "DEVLOG #5: (hopefully) last devlog, worked mostly on the html code, the score wasnt showing up properly when game ended so fixed that, debugged the code for tracking sensitivty,didnt do any styling work so i dont have anything to show you guys anyways heres a pic of my code instead :>"}, {"post_id": 69681, "ts": "2026-09-17T15:57:52Z", "hours": 1.6853, "text": "DEVLOG # 4: Changed the project UI from blue to neon greenish color it looks wayyyy better…at first i had a simple triangular shaped spaceship BUT NOW IT LOOKS LIKE A VERYY REAL SPACESHIP it looked a bit big before, reduced the size now it looks a bit small lmao anyways here is how it looks: I LOVE THE NEW FONT!!"}, {"post_id": 56786, "ts": "2026-08-28T18:15:44Z", "hours": 2.2356, "text": "DEVLOG # 3: FINAL DEVLOG yaayyayyayyyayyyyy sooo MISSION CONTROL is a browser game you play by moving your head in front of your webcam In case you dont have webcam, dont worry, you can use keyboard! Sooo I wrotw the JS and CSS code and it all finaallyy works. In JavaScript I set the camera setup, motion tracking, game state, physics/collision, rendering, main loop.For asteroids,spawnInterval inside update() controls how fast asteroids start appearing.The 0.35 smoothing factor in sampleMotion() and the dt*8 easing in update() control how snappy or floaty the ship feels.Defined all colors once as CSS variables at the top of css file. The canvas size is determined by width/height attributes on canvas (both the HTML attribute and the W/H constants near the top of the script). This runs entirely client-side, at low resolution, so it’s cheap enough to do every frame without a GPU or external API. There’s no face/head-detection model involved."}, {"post_id": 56456, "ts": "2026-08-28T07:05:37Z", "hours": 0.9406, "text": "DEVLOG # 2: Guyss everything is going southh evrything that coud go wrong went wrong! i cant see the google font i imported, the enable camera button is not working maybe once i write the complete script it will start to function properly..defined te resettgame, startcamera and sampleMotion , the start camera is NOT working idk i should look into it however this is how it looks till now: (same as before ik lol)"}, {"post_id": 56418, "ts": "2026-08-28T05:47:04Z", "hours": 2.4583, "text": "Heyy guys im gonna be making a simple game in HTML,CS and JS where you have a spaceship and have to avoid asteroids(the obstacles) and try to catch the orbs(that increase your score), the twist however is that you dont move with keyboard keys but rather with your head! Wanted to post a devlog on my progress earlier but power got cut and internet was gonee anyways here is my DEVLOG: DEVLOG # 1: In my HTML file, I determined the structure of the project,to stream the wbecam used the video tag and canvas tag for where the game is to be played and then used 3 overlays for start,game over and camera denied screen, also added track sensitivity just in case its no picking up your motion The CSS fIle gave the look of my game, I first determined the colors,made the background a gradient,then positioned 4 L-shaped boders at each corner. idk why my google fonts is not working tho Still need to work on the JS file to determine the logic and functionality should i change the font size?"}]...
|
Title: Mission Control by @Aamina | Stardance
Dev Title: Mission Control by @Aamina | Stardance
Devlogs:
Heyy guys im gonna be making a simple game in HTML,CS and JS where you have a spaceship and have to avoid asteroids(the obstacles) and try to catch the orbs(that increase your score), the twist however is that you dont move with keyboard keys but rather with your head! Wanted to post a devlog on my progress earlier but power got cut and internet was gonee anyways here is my DEVLOG: DEVLOG # 1: In my HTML file, I determined the structure of the project,to stream the wbecam used the video tag and canvas tag for where the game is to be played and then used 3 overlays for start,game over and camera denied screen, also added track sensitivity just in case its no picking up your motion The CSS fIle gave the look of my game, I first determined the colors,made the background a gradient,then positioned 4 L-shaped boders at each corner. idk why my google fonts is not working tho Still need to work on the JS file to determine the logic and functionality should i change the font size?
DEVLOG # 2: Guyss everything is going southh evrything that coud go wrong went wrong! i cant see the google font i imported, the enable camera button is not working maybe once i write the complete script it will start to function properly..defined te resettgame, startcamera and sampleMotion , the start camera is NOT working idk i should look into it however this is how it looks till now: (same as before ik lol)
DEVLOG # 3: FINAL DEVLOG yaayyayyayyyayyyyy sooo MISSION CONTROL is a browser game you play by moving your head in front of your webcam In case you dont have webcam, dont worry, you can use keyboard! Sooo I wrotw the JS and CSS code and it all finaallyy works. In JavaScript I set the camera setup, motion tracking, game state, physics/collision, rendering, main loop.For asteroids,spawnInterval inside update() controls how fast asteroids start appearing.The 0.35 smoothing factor in sampleMotion() and the dt*8 easing in update() control how snappy or floaty the ship feels.Defined all colors once as CSS variables at the top of css file. The canvas size is determined by width/height attributes on canvas (both the HTML attribute and the W/H constants near the top of the script). This runs entirely client-side, at low resolution, so it’s cheap enough to do every frame without a GPU or external API. There’s no face/head-detection model involved.
DEVLOG # 4: Changed the project UI from blue to neon greenish color it looks wayyyy better…at first i had a simple triangular shaped spaceship BUT NOW IT LOOKS LIKE A VERYY REAL SPACESHIP it looked a bit big before, reduced the size now it looks a bit small lmao anyways here is how it looks: I LOVE THE NEW FONT!!
DEVLOG #5: (hopefully) last devlog, worked mostly on the html code, the score wasnt showing up properly when game ended so fixed that, debugged the code for tracking sensitivty,didnt do any styling work so i dont have anything to show you guys anyways heres a pic of my code instead :>
DEVLOG ?? Shipped but got rejected(again) im gonna be changing everything about this it wont be a hand controlled ship anymore(i hope i dont regret this)
Ships:
I built Mission Control, a browser game where you steer a spaceship using your webcam and it tracks motion by comparing video frames. I’m most proud of the motion tracking itself, since something that simple ends up feeling responsive, and the pause button, which matters more than it seems in a webcam game where you might need to stop mid-session! also also it can also track hands!! yayy The trickiest part wasn’t turning the camera on, but everything around it ! keeping the mirrored movement intuitive, tuning the motion-sensitivity threshold so it’s neither jittery nor unresponsive, and making sure the ship holds its position instead of snapping to a corner when you’re not moving....
|
1793299879.858145
|
1793386279.858145
|
|
60708
|
RUNAWAY BUTTON by @kbboy | Stardance
|
kbboy
|
1
|
13.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-01T20:01:33Z", "hours": 13.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "🚀THE RUNAWAY PANIC BUTTON (shy button arcade) —————————————————– ⚠WARING: this button does NOT want to be clicked. -what is it: it is a game where you try to click a button that will go of you or dodge you when you are near it. 🎮 PLAY NOW & LEAVE A VOTE: Try to hit the red button as many times as you can while it teleports from your mouse.beat 20 clicks if you can! ✨FEATURES YOU MUST TEST: decoy clones: at 20+ dodges, fake decoy button spawn.click on, and your score resets to 0! -4 rank levels: they are total 4 level . -live vocie taunts: -real-time audio feedback powered by web speech API. WHAT i learn -this was my first project me coding i used Html and some java script and css i it was pain full i did not expeat to be this hard and full of bugs like one time it crashed because i used y=>Y an one time because because i did not added “’ the it crashed full.but i fun debugging it and learning i wish you good time trying to click it. kbboy, thanks for every thin", "repo": "https://github.com/kbboy12/runaway-button", "demo": "https://kbboy12.github.io/runaway-button/"}]...
|
[{"post_id": 71358, "ts": "202 [{"post_id": 71358, "ts": "2026-09-20T17:59:43Z", "hours": 6.1881, "text": "I worked on building and finishing “The Runaway Panic Button”, an interactive arcade web game using HTML, CSS, and JavaScript. What I built and updated: • Runaway Mechanics: Programmed the target button to calculate screen boundaries and dodge away whenever hovered or touched. • UI & Layout: Compacted the top dashboard arena box and positioned the “Challenge a Friend” button in the bottom-right corner. • Rank Progression: Tied player ranks strictly to successful Clicks (Snail Reflexes -> Coffee Jitters -> Lightning Fingers -> Touch Grass Please ). • Spacebar Freeze Power: Added a hidden cheat counter that reveals when pressing Spacebar, freezing the button for 4 seconds so players can spam-click it. • Decoy Clone Hazards: Spawned fake red decoy buttons after 20+ dodges that reset player Clicks to 0 if misclicked. • Speech & Audio: Added Web Speech API synthesis for real-time voice taunts and victory announcements."}, {"post_id": 68826, "ts": "2026-09-15T20:19:38Z", "hours": 0.5747, "text": "finished fixing UI bug and added a live click counter! Now the game tracks every time a player actually manages to land a hit on the runaway button.On the first click, the display updates to “clicks: 1” in real time and triggers the “YOU WON!” screen. tested it using keyboard controls to make sure the event listener fires smoothly!"}, {"post_id": 68232, "ts": "2026-09-14T18:58:09Z", "hours": 1.5247, "text": "I was working on my runaway panic button today! Added a multi-level boss mode where players can choose from 4 difficulty levels(shy,panicked,hyperactive, and impossible). Ran into few JavaScript bugs while setting up the movement logic and button Scaling, so i will be finishing up debugging tomorrow!🛠️"}, {"post_id": 66877, "ts": "2026-09-12T20:29:08Z", "hours": 2.0861, "text": "so i am making a button that escapes from your cursor when trying to click it i added things like i made the button change color every time someone hovers over it trying to click the button and i added dodge counter to count how many times it have dodged you and one more thing i have letter changing i mean when you try to click it and dodges you it says like too slow,nice try…etc."}, {"post_id": 66137, "ts": "2026-09-11T19:15:57Z", "hours": 1.6969, "text": "this is an interactive web app built with html,css and javascript the moment you attempt to click it the button,javascript tracks your cursor location and glides it smoothly to the opposite side of your screen,making it impossible to catch."}, {"post_id": 65571, "ts": "2026-09-10T19:54:47Z", "hours": 1.3194, "text": "so it is my first project it about making a button that escapes for the person cursor when trying to click it and i will add things like changing color and more and it uses things like html,javascript,css mostly it uses html. i am buliding it now."}]...
|
Title: RUNAWAY BUTTON by @kbboy | Stardance
Devlo Title: RUNAWAY BUTTON by @kbboy | Stardance
Devlogs:
so it is my first project it about making a button that escapes for the person cursor when trying to click it and i will add things like changing color and more and it uses things like html,javascript,css mostly it uses html. i am buliding it now.
this is an interactive web app built with html,css and javascript the moment you attempt to click it the button,javascript tracks your cursor location and glides it smoothly to the opposite side of your screen,making it impossible to catch.
so i am making a button that escapes from your cursor when trying to click it i added things like i made the button change color every time someone hovers over it trying to click the button and i added dodge counter to count how many times it have dodged you and one more thing i have letter changing i mean when you try to click it and dodges you it says like too slow,nice try…etc.
I was working on my runaway panic button today! Added a multi-level boss mode where players can choose from 4 difficulty levels(shy,panicked,hyperactive, and impossible). Ran into few JavaScript bugs while setting up the movement logic and button Scaling, so i will be finishing up debugging tomorrow!🛠️
finished fixing UI bug and added a live click counter! Now the game tracks every time a player actually manages to land a hit on the runaway button.On the first click, the display updates to “clicks: 1” in real time and triggers the “YOU WON!” screen. tested it using keyboard controls to make sure the event listener fires smoothly!
I worked on building and finishing “The Runaway Panic Button”, an interactive arcade web game using HTML, CSS, and JavaScript. What I built and updated: • Runaway Mechanics: Programmed the target button to calculate screen boundaries and dodge away whenever hovered or touched. • UI & Layout: Compacted the top dashboard arena box and positioned the “Challenge a Friend” button in the bottom-right corner. • Rank Progression: Tied player ranks strictly to successful Clicks (Snail Reflexes -> Coffee Jitters -> Lightning Fingers -> Touch Grass Please ). • Spacebar Freeze Power: Added a hidden cheat counter that reveals when pressing Spacebar, freezing the button for 4 seconds so players can spam-click it. • Decoy Clone Hazards: Spawned fake red decoy buttons after 20+ dodges that reset player Clicks to 0 if misclicked. • Speech & Audio: Added Web Speech API synthesis for real-time voice taunts and victory announcements.
Ships:
🚀THE RUNAWAY PANIC BUTTON (shy button arcade) —————————————————– ⚠WARING: this button does NOT want to be clicked. -what is it: it is a game where you try to click a button that will go of you or dodge you when you are near it. 🎮 PLAY NOW & LEAVE A VOTE: Try to hit the red button as many times as you can while it teleports from your mouse.beat 20 clicks if you can! ✨FEATURES YOU MUST TEST: decoy clones: at 20+ dodges, fake decoy button spawn.click on, and your score resets to 0! -4 rank levels: they are total 4 level . -live vocie taunts: -real-time audio feedback powered by web speech API. WHAT i learn -this was my first project me coding i used Html and some java script and css i it was pain full i did not expeat to be this hard and full of bugs like one time it crashed because i used y=>Y an one time because because i did not added “’ the it crashed full.but i fun debugging it and learning i wish you good time trying to click it. kbboy, thanks for every thin...
|
1793206518.0029662
|
1793292918.0029662
|
|
15657
|
Telemetry LMU by @Karlito | Stardance
|
Karlito
|
1
|
178.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T18:45:37Z", "hours": 178.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Telemetry LMU An application for both Windows and Linux to visualize the telemetry data from Le Mans Ultimate What it does: This application collects, stores, and visualizes data from a racing simulator called Le Mans Ultimate. The main goal: Allow users to analyze their driving and learn from their data through an easy-to-use interface. The requirements: Performance, nice and simple UI, expandability, minimal setup. Results: Main goal: Achieved. (I wouldn’t be shipping this app otherwise) Performance: On average the app uses 4% of CPU and 250Mb of RAM under full load. That is less RAM usage than running Spotify in the background. Nice and simple UI: This is personal preference, however in my opinion I think i succeeded. Expandability: The architecture of the app is very modular so this also isn’t a problem. Setup: On windows there is none (except installing the app), on linux there is one dependency (this is sadly unavoidable.) Some stats: 200+ hours of development time (including the time before Stardance) 250+ commits 6 000+ lines of Rust", "repo": "https://github.com/Karlito05/TelemetryLMU", "demo": "https://github.com/Karlito05/TelemetryLMU/releases/tag/v1.0.1"}]...
|
[{"post_id": 71364, "ts": "202 [{"post_id": 71364, "ts": "2026-09-20T18:08:56Z", "hours": 1.2894, "text": "Devlog 29 - The end So this is the last one, huh. Here is the full write up on this project as I promised. Chapter 1 - The beginnings This project started about 3 months ago. I started experimenting with just getting the data and plotting it. Just for fun as an exercise to learn rust. Then I realized that there actually isn’t a proper working telemetry tool that works on linux. So I did some research… and I decided that I am going to make the app in Dioxus. Chapter 2 - The Dioxus era This leads us to the shortest of eras. The Dioxus era. Nothing really happened here and quite frankly I don’t even remember it that much. There aren’t really any git commits because I didn’t have that setup yet. One thing i remember tho is that I couldn’t figure out how to draw the garphs, because Dioxus is based on web technologies but weirdly becuase you are writing HTLM like syntax but in rust. And that was the main reason I decided to switch to Tauri. Chapter 3 - The Tauri era At first Tauri was the best framework ever made for me. That is because I already kinda knew react, it was simple to understand and I could really lean into the split frontend and backend architecture. This sadly proved very inefficient for the graph view which needs to render thousands of points each frame. Since it was too much for the basic HTML canvas I have switched to using WebGL with numerous downsampling techniques. This was just a bandaid fix though. I have also ran into bunch of architectural issues with the whole split frontend and backend thing. Accessing the telemetry data proved to be very difficult and inefficient. I remember that I ran each of the graphs on a separate thread. This was so stupid. I don’t even remember how I could’ve come up with such a stupid idea :D. It just led to memory leaks and threads uncontrollably spinning up and not stopping. I am sure that all of that could’ve been easily avoided with simpler architecture but at that point I was at my lowest point of this project, so I didn’t even have the energy to do it. I also had the state of the frontend so fragmented which didn’t help. And the whole retained mode GUI thing just wasn’t well suited for this kind of app. And that is when I decided to do a complete rewrite in pure rust! Chapter 4 - The sweet EGUI I didn’t know it at the time, but this was the best idea on what to do with the project. I remember that I was very split between just shipping it half done and finishing it just because of how bad the development experience with Tauri was (sorry Tauri devs, it’s not a you thing, it’s a me thing). It took about 30h to fully rewrite the app with EGUI, which looking back at it isn’t too bad. It felt like ages though. It didn’t help that almost none of the work in this “chapter” did AI. Which at the end of the day is better! Although my style of writing EGUI code was let’s say original… I have just put everything into one file and that grew very fast :D. I had like 5 files that were about 800 lines each. That has since luckily changed. (I have adopted more of a React style file structure.) Anyway at the end of the rewrite I kinda started loving EGUI and that hasn’t stopped since. I continued to develop the Map page in EASY which was pretty easy. But then I needed the track limits data for the map page. This was a bit of a roadblock… First I have tried to extract the data directly from the game, however this was inaccurate and the track width was missing entirely. So then I tried to download an up to date image of the top down view of the track and extract the inside and outside line from it and match it to the in game data. This partially worked better, still not great tho. So there was only one option left. And that was to painfully drive each layout of each track by hand. This took almost 7h of just driving in circles. After that it was smooth and buggy sailing until the ship. Everyone who read this, have a beautiful day."}, {"post_id": 71172, "ts": "2026-09-20T12:02:04Z", "hours": 7.2817, "text": "Devlog 28 Today is gonna be a big day, because I will ship the project. There is a few things left to do tho. Mainly the readme and the demo video! In my last and next devlog I will also make a write up on the story of the whole project so far. Besides that I have yesterday refactored the whole codebase so now there aren’t just 5 monolithic files. I went for a more react like approach with the structure being divided into pages and components. Sadly there isn’t enough time until the ship to touch up on some old UI and UX problems in the edit view of the graphs, neither is there time to add more fields. This will be done in the near future! Overall I am very happy how the app turned out. But this is not the end of the development this is just the end of the stardance journey!"}, {"post_id": 70125, "ts": "2026-09-18T14:50:07Z", "hours": 4.7625, "text": "Devlog 27 For the past few hours I have been polishing the app up. The main you’ll probably see are the onboarding dialogs. A global one pops up when you first launch the app and then one for each page when you first enter them. Another change I have done is that I made the ghosts on the map page be based on time and not data point index."}, {"post_id": 68694, "ts": "2026-09-15T15:37:09Z", "hours": 9.5181, "text": "Devlog 26 Hiiiii For the past few hours I have been working on polishing the app and get it to a shippable state overall. There is still work left to do, but I am getting there. I have set up a simple packager, and a simple script to use it. It automatically compiles the release version of the app and packages it into a windows installer a Debian .deb package and a pacman package. I have also (after like 2 hours of struggeling with it) added an Icon for the app. So now it looks nice!There has been a lot of new bugfixes as well and the app has been tested by my friend so it should be somwhat usable, tho the setup UX should be improved upon. If you wish you can download the app from here: https://github.com/Karlito05/TelemetryLMU/releases/tag/v0.2.3 Well that is all I have for you all today, so have a nice one :)"}, {"post_id": 66482, "ts": "2026-09-12T10:09:34Z", "hours": 5.3067, "text": "Devlog 25 I know I have just made a devlog like yesterday but holy s*** the track references work so well. They are practically perfect . Besides the references I have also implemented the delta time between the 2 cars! That has really tied the page together. If I can say so myself, we are getting pretty close to the final ship . There is not much needed to implement. The obvious are bugfixes, and some simple onboarding. But really, that’s it! Everyone who is following or caring about this project can expect a ship in the next week or so. In my final devlog I will also do a writeup on this project as a whole, from the coarse beginnings in Dyoxys, trough Tauri, to the sweet home of EGUI. There will also be a trailer video and a demo for all the raters :D Anyway for now you can have this preview of the map page! Stay tuned!"}, {"post_id": 65936, "ts": "2026-09-11T12:33:33Z", "hours": 6.7664, "text": "Devlog 24 HI! All of the time on this devlog was basically just driving in circles. And I mean that. I have recorded all of the outsides and insides of all tracks in the game to get the data for the map page. It was very teidius and very boring. Like very very boring. There are 31 tracks in LMU (including each layout) and on every one of them I had to do an out lap, the ouside, another out lap and the inside. So 4laps for each. That is about 15min per layout. Yeah it was a long one. And the recordings aren’t perfect either! I will now have to somehow process them all to get them ready for the ship. You can watch the timelapses of this process here if you wish. https://lapse.hackclub.com/timelapse/OQcismBwxbBB https://lapse.hackclub.com/timelapse/le3Lta0RxcUA https://lapse.hackclub.com/timelapse/XRf98OimmUk9 Anyway. Have a nice day!"}, {"post_id": 63016, "ts": "2026-09-06T16:07:27Z", "hours": 7.12, "text": "Devlog 23 - More Refactoring Hi! In the past few days I have been making some core architectural changes to the project and I would like to explain them now. Telemetry Provider I have finally decided on how I am gonna handle telemetry in the long term. It’s a pretty simple concept but the implementation is pretty hard. I have one object (the TelemetryProvider struct) that is in charge of getting and managing the telemetry. Right now it logs data from all cars and stores the best, last and current laps. If you wish it can save only your laps or laps of everybody. Each lap is a json file about 500kB - 1MB in size and holds all the data that can be displayed in the app. Notably the position ( so you can load that lap directly into the map page ) and the data displayed by the graphs (so you can load it as a reference there as well.) Pointer to this struct is distributed to pages that need it so they can access it! The provider has a core logging loop that is running on another thread so the whole UI doesn’t have to redraw each time you log new data. (About 60 times a second.) State and Settings Providers Next, I have implemented a StateProvider and an SettingsProvider . These two are basically a drop in replacement of what was stored in the Sidebar and SettingsPage respectively. Difference between the two is that the StateProvider isn’t stored between app restarts. Similarly to how the TelemetryProvider works, each of the pages that need these values get a shared pointer (or an Arc in rust) and can access the values. What’s next Going further I will keep my focus on the map page. Finish it, and then start polishing the app for the final ship! Wish me luck and have a nice day!"}, {"post_id": 61727, "ts": "2026-09-04T19:26:10Z", "hours": 9.5394, "text": "Devlog 22 Hiiiiiiiiiiiii I have some huge news to tell you. I have just made the MOST complex addition yet. And I love it! I have completely overhauled the accessing and managing the telemetry! I have designed a thread safe way to have it run on a separate thread and be accessible from *every place in the app. One unified API for everything! I now store the current lap and the last lap for each of the cars. Tho this takes up a massive 140mb of just floats (in the worst case scenario) I believe its worth the RAM! (Let’s be real, we have saved over 400mb from the tauri implementation so we can now use some of that!) Next I will continue on further implementing these features around the tool. Anyway have a nice day people and bye bye. Some context to that meme: I have a type in my app that is literally Arc<Mutex<[([f64; TelemetryValueType::Max as usize], Option); 104]»"}, {"post_id": 60204, "ts": "2026-09-02T13:06:23Z", "hours": 9.4931, "text": "Devlog 21 For the past few days I have been working on a new feature. The map page. It is turning out great, however it has a lot of bugs. These will get fix over the next few days. I promise :) There have also been changes made to the lap logging system and some other systems as well. As you can see on the image you select 2 saved laps and can crosscompare the lines you drove. Obviously this is completly useless if you loaded 2 different track like I did here. This will get checked for and prohibited in the future. Next I will add the underlying lap overlay which I will somehow extract from the game or from somewhere else. I don’t really know yet. Well that is it for today. Have a great day and bye bye!"}, {"post_id": 57444, "ts": "2026-08-29T16:23:51Z", "hours": 8.955, "text": "Devlog 20 So I have been polishing up the current features a bit and they are far from done. I am starting to question if i will make it to shipping this app one day :D. Anyway I have fixed numerous bugs, added an settings page and implemnted although very crudly a lap logger. But there is still a lot work that needs to be done. I have also added persistancy so the app remembers your choices. I am almost ready to replace the main branch with the fully rusted version, but like I said more work has to be done to go trough with that! I have probably never shown how the Car info page turned out and IMO it did really well. (The empty space is for inputs. That will be implemented soon!)"}, {"post_id": 55542, "ts": "2026-08-27T13:46:52Z", "hours": 8.0039, "text": "Devlog 19 Hello hello! Today I have some exciting news. The rewrite is complete That’s right, after about 30 hours of porting this code from tauri into EGUI it is finally finished! So let’s take a look at some stats, shall we ? | | Tauri | EGUI | |----------------------|-------------|--------------- | | Dev time | 80h | 30h | | Lines of code written | 6k | 3k | | Enjoyability | suboptimal | above average | And some perofrmance stuff as well: | | Tauri | EGUI | |----------------------|-------------|--------------- | | Ram idle | ~700Mb | ~150Mb | | CPU % idle | ~5% | ~5% | | FPS under load | ~29fps | stable 60 | Some other perks also include that EGUI doesn’t need a browser installed on the system to work. Overall I think this was a very successful rewrite! I wouldn’t do it again tho Next I will refactor the code a bit, do a bit off the good ’ol cleanup and then get to work on the map feature."}, {"post_id": 54543, "ts": "2026-08-25T15:54:21Z", "hours": 4.4164, "text": "Devlog 18 - 100h on the project So it’s been a hundred hours huh ? I also can’t believe it! I have also just now finished* the graph view which will be newly called Telemetry (page) Now I will move onto making the car info page previously known as the championship view. I expect this to be very easy!"}, {"post_id": 53875, "ts": "2026-08-24T16:07:03Z", "hours": 6.4811, "text": "Devlog 17 Hello guys. Its me again :D I am continuing to rewrite the UI into egui. I have completed the Graph view’s UI and now I am moving onto implementing it. One thing I have noticed is just how much more “code efficient” egui is. I understand that I didn’t make the logic behind the code yet but even with that I made the same thing with 3k less lines of code. Here is how the layout edit mode is looking for now."}, {"post_id": 51324, "ts": "2026-08-20T22:11:51Z", "hours": 5.83, "text": "Devlog 16 Another 6 hours, another devlog… Hi people. For the last 2 days I took a bit of a break from the project. I have played Approximately up with the boys and it was so fun. Y’all should try the game. It has a free demo 😉 But we are not here to talk about games, are we… I am continuing the implementation of the frontend and its coming along nicely. I’ve just noticed one thing, making the UI itself in egui is kinda slow however the state is very easy. Whilst this not being completely ideal i can push trough that. Since the last devlog, I have finished the implementation of the sidebar, and started working on the telemetry page. I have the graphs sorted and now I am working on the top bar. It’s having a couple of issues at the moment but nothing hard to fix really. I am hopefully gonna continue tomorrow and have the page finished by the end of the week. Welp, I guess that’s it for today. Everybody have a beautiful day, and bye bye!"}, {"post_id": 48473, "ts": "2026-08-16T20:40:29Z", "hours": 6.3456, "text": "Devlog 15 For the last few days, I have been remaking the UI in EGUI and I am enjoying it so far. I’ve been working on the graphs in the graph view and also the sidebar. The sidebar is turning out very well and I am also pretty pleased with the graphs. I have only this for now, so enjoy :D"}, {"post_id": 46562, "ts": "2026-08-13T21:40:19Z", "hours": 2.9933, "text": "Devlog 14 I have done some research and decided that moving forward the app will use eGPU as the main GUI library. I have chosen this over the competitors due to a few reasons. The main being that its rendered natively and that its a intermediate mode library. This will make it very easy to work with the graphs and hopefully other stuff too. I am enjoying working with it so far. There are some concepts that I really like, like that everything that has state is just a simple struct that is initialized somewhere and you do most of the implementation. The widget system is also pretty cool. I was at first worried that I would hate it due to my experiences from TKInter that was forced on me in school :D but its pretty intuitive how they did it. Going further I will need to think about the architecture of the app a bit to not have it fall apart. Right now I am thinking that one thread will be the main “logger thread” which will gather data from the telemetry and then there will be the UI thread. I think that is what pretty much everyone is doing so it might work . With this approach i am worried that its gonna be a pain, but what isn’t these days… I don’t really have that much more to say so at least enjoy this screenshot of a pretty much not working app Fun fact: due to how the lib works there is a bug now that you have to move your cursor on the app for it to log data :DDD"}, {"post_id": 46009, "ts": "2026-08-12T21:29:42Z", "hours": 2.5956, "text": "Devlog 13 Okay so I might have found a solution for me not liking react and web technologies but still wanting to finish this project. And I don’t like it…. but it has to be done. But before I tell you what it is you have to understand my problems. The good React in combination with typescript is a very easy thing to understand. They are everywhere, the skill of knowing these is very valuable. They have a huge ecosystem because they are everywhere. And I am sure that I have forgotten many other cool and interesting features and perks but I picked them for mainly these 3. The Bad They are slow (in comparison to something like rust) They rely too heavily on browsers (I mean it’s basically their runtime) You have to be “hacky” to do some things. They are not suitable to develop desktop apps I mean in hindsight those are so obvious but until you are balls deep into some specific project you don’t really think about those. The main problem is that the performance is, for the lack of a better word, sh*t. And normally that isn’t a problem however when you are processing a memory object of about 300kb 60 times per second it adds up fast. Even on my pretty beefy PC (r7 9800x3d and n5070ti) it hardly gets 30 fps. I know this could probably be fixed with “more hacky workarounds” but I am tired of those. The solution I am going to REWRITE The project I have spent 70h on already in some rust native GUI framework such as ICED. I have not yet decided which one to chose and I will do that research tomorrow and report back Literally me RN ⬇️"}, {"post_id": 45715, "ts": "2026-08-12T11:49:22Z", "hours": 2.1014, "text": "Devlog 12 This will be more of like a quick update on the championships feature. So what has happened is that I have implemented the feature, and assumed that the data will be there for all players… which there isn’t. The other players show up and everything but the details like tire data, damage data and fuel data just isn’t there. So I am kinda stuck if I should just scrap the feature or recreate it into a personal data panel which would just not be fun I think. Also the damages data is very very limited, so I just don’t know what to do."}, {"post_id": 45217, "ts": "2026-08-11T15:31:51Z", "hours": 9.4839, "text": "Devlog 11 Hello guys. I have some good news and some bad news… Let’s start with the not so good news. After thinking about it, I have decided, that I don’t really enjoy working on this project. It’s not that the project it self is bad, it’s more about the tech stack I chose… Don’t get me wrong typescript and react are both phenomenal choices and great tools but, I guess the web is just not for me. I realized that I like the lower end of the spectrum better. So I have decided to cut this project short. The map view will not be included in the final ship for the time being and the profile stats also will not be there. On the bright side, I have started working on the championships page with that nearing its completion. Next I will start to work on the onboarding and settings pages."}, {"post_id": 23759, "ts": "2026-07-06T21:48:28Z", "hours": 10.0158, "text": "Devlog 10 - We are in the double digits 🎊 UI Redesign Progress I am slowly redesigning the app to look like the design I made. I started with the sidebar and then the top control panel. All that went well. The Graphs… 😅 But then I got to the Graphs . *Oh, the graphs… *I wanted to redo the backend for them because the multiple-thread approach was just straight up stupid. It was a pain to develop and would be a pain to maintain. So, in my infinite wisdom , I have gone for just a simple async function. That means that right now the frontend is requesting each data point instead of subscribing to a stream. After that, I needed to revise the frontend graph component itself. At first I just wanted to make a non-messy implementation of the old version. However, it turned out that the HTML <canvas> element is really slow. And I mean realllllllllly slow. So after I wasted like 2 hours trying to optimize the design with no success, I rage quit and went to watch a movie. WebGL to the Rescue But I don’t give up that easily. After the movie, I reimplemented the graph view with WebGL through Pixi.js , which wasn’t even that hard like I expected and overall had much better performance. Well… at least after I fixed one very stupid bug . The Bug That Ate 10 GB of RAM I had forgotten everything from the first GraphView.tsx implementation, so I was just mindlessly copying over the code and renaming the variables to what I thought they meant when I first made it. Then I got to the part which draws the lap (aka the big loop over all the points-up to 10,000 points at a time). There was an error on one of the variables. It was the length of some array. I just renamed it to the main array length because… *what other thing would it be, right? *Well…It was the length of the values array , which was always 1 or 2 .So I accidentally turned 1 × 10,000 iterations into 10,000^2 iterations . Somehow the app still wasn’t lagging that much. It just took like 10 GB of RAM . The Result Thankfully, the new WebGL + Pixi.js approach is way more efficient , so after fixing that bug the graph rendering performs much better. It still isn’t perfect on the UI side of things but I am getting there!"}, {"post_id": 22818, "ts": "2026-07-05T12:34:46Z", "hours": 6.9447, "text": "Devlog 9 - THE REDESIGN For the past few days I’ve been working on a new design for the app. I am not the best designer and to be real I didn’t enjoy it :D. Designing is just too illogical for me. There’s not really much more to say about this. Enjoy the design:"}, {"post_id": 20110, "ts": "2026-07-01T17:12:04Z", "hours": 9.2647, "text": "Devlog 8 Do you guys remember how I said that I will take a break ? Yeah… That didn’t happen. Instead I have made a plan for myself on how I am gonna continue in the tool’s development. Da plan The plan Is pretty simple: Design the app in Figma, then build it! I have also made a list of features that will be added. You can find the plan on Github. You can also suggest features if you’re interested! …oh and before making the plan I have implemented a pretty cool logging feature. Basically it records the currently selected driver and saves all his data to a file along with the lap time and date. It does this only for laps that the game considers valid (aka gives a lap time to.)"}, {"post_id": 17764, "ts": "2026-06-28T18:11:51Z", "hours": 6.7406, "text": "DevLog 7 This will be just a quick update on how things are looking right now, what’s happening, and the overall state of the project. Good news The rewrite is complete The sole UI library is now ShadCN. There have also been some minor bugfixes and ux improvements. The main being that the app is now working on lower resolutions. We’ve got a readme. It’s basic, but its there. Also I have added installation instructions and released the 1st alpha version. You can find it in the releases! Both windows and linux packages are there! Bad news I will take a break for the next few days. I will be working on a smaller project for android and I hope that by the time I return I will be full of energy and ideas! What’s next I will continue working on the graph view. Mainly saving and loading reference laps, and overall better UI and UX."}, {"post_id": 12606, "ts": "2026-06-20T16:24:29Z", "hours": 9.7894, "text": "DevLog 6 - Windows support and the first rewrite! Windows support There’s not really much to say about this. You just get a handle on the game’s memory. This was vibecoded but it’s below 100 lines of windows specific code, so I’m gonna allow it. (It was just the 2 function that handle updating the telemetry and the rest is the same.) Rewrite After adding windows support, and sending it to a friend to test, I have discovered a massive problem. The app just didn’t work on a lower resolution. Since I have a QHD monitor, I didn’t notice it. Also when I started writing the app, I did it in pure React without any UI libraries, then I started to use Antd and then MUI and it became a mess. So I have done some research and decided to rewrite the app using ShadcnUI. I did this because Shadcn has one massive advantage - the code that you use is in your codebase. This means that you can modify the components however you want. It is also one of the more popular ones out there. For icons, I will be using Tabular, because they have a lot of them, and I like their look."}, {"post_id": 10767, "ts": "2026-06-17T17:54:53Z", "hours": 4.4767, "text": "DevLog 5 - Introducing the Layouts feature! So for the past few days I was implementing a layouts feature for the Graphs view in my app. Features: Adding layouts Removing layouts Managing layouts change what graphs they display change the properties of those graphs aka their number of gridlines, color and type How many graphs there are and what sizes they have You can do all of that in the Edit Mode . This mode is accessible via the layout selection dropdown. In edit mode you have options to change the graphs as said, remove the layout you’re editing, to save it as a new one or to save it (basically override the last one). All of this is persistent between sessions. Note that the UI in the screenshots is probably gonna be changed in the future and is just a development placeholder :)"}, {"post_id": 8829, "ts": "2026-06-14T18:01:40Z", "hours": 5.2161, "text": "DevLog 4 Today I have started implementing the layouts feature. There’s not much to really say. The graphs can be vertically adjusted in size, their color and type can be changed and there is a whole new edit mode for that. And that’s what I did for 5h today… (I really hate frontend :D) The design of the whole thing is unfinished but hey, it works. Even though some features (mainly saving and loading layouts) are missing its turning out great. I will continue developing this feature for the time being."}, {"post_id": 8235, "ts": "2026-06-13T18:14:25Z", "hours": 4.1997, "text": "DevLog 3 This one will be more about the organization of the project. New folder structure I have split up the src directory into a few different subdirectories mainly pages directory which is further split up into directories for each page and a components directory for reusable components like the sidebar. Logging Furthermore I have implemented logging on the backend. (It’s also callable from the frontend but that’s not that convenient at least in case of debugging so I won’t be using it as much.) The top bar Next I have started implementing a top bar for the telemetry view . On there will be some important controls and information regarding that view. Just note that in the screenshot the game is not open therefore the driver dropdown isn’t populated with any text. This will probably change in the future. And the layout dropdown is there just for the looks for now ;)"}, {"post_id": 6907, "ts": "2026-06-11T16:08:05Z", "hours": 2.7908, "text": "DevLog 2 Today i have fixed a bug where threads would spawn infinitely. I’ve been at it for 3h… Yeah it was kinda pain. So I basically have this architecture, where my backend spawns a new thread for each graph ( to provide information more responsibly. ) However whenever the graph element unloaded, it didn’t unsubscribe from that thread. A simple fix, just unsubscribe it, right ? Yup basically. However my lack of expertise in this kind of stuff led me on a wild goose chase. After I realized that what I am doing is stupid, it was just a simple hook that the spawn function returned, when spawning the new thread. Well we all make mistakes :D"}, {"post_id": 6797, "ts": "2026-06-11T12:14:18Z", "hours": 0.4275, "text": "DevLog 1 — An Introduction to My Project Hi! I’m Karlito, and this is my first devlog. I’d like to use this devlog to introduce my project, explain its current state, and share my plans for the future. So, what actually is LMU Telemetry? The TL;DR is that it’s a telemetry tool for Le Mans Ultimate. However, many people don’t know what that means, so I’ll explain it here. What is Le Mans Ultimate? In short, Le Mans Ultimate is a racing simulator. Unlike traditional racing games, it doesn’t simply say “the car accelerates when you press W.” Instead, it simulates the engine, tires, driveshafts, brakes, track grip, and many other factors to provide a realistic driving experience. What is telemetry? Telemetry is a way for simulators to output simulation data, such as speed, position, engine temperature, and much more. At a lower level, it’s essentially a chunk of memory containing numbers that are constantly updated with current information. What LMU Telemetry actually does LMU Telemetry aims to visualize these data points in a way that’s easy to understand and can help users improve their driving. It does this in several ways. For example, one feature draws real-time graphs of various metrics such as speed or delta time compared to your best lap. The current state of development The app is currently little more than a glorified demo. It has some rough UI elements and only plots graphs for a hardcoded car (index 0). While this works in private lobbies, where you’re always the first car, the system fails in most other situations. In short, the app isn’t very useful yet, but it’s a start. Main goals Live telemetry view Real-time graphs Map view A view showing the track layout and the line you drove Sharing features Exporting laps and comparing them with laps driven by other users Requirements The app must be performant Running LMU can already be demanding on some systems, so the app shouldn’t use more resources than necessary Linux support A reactive and polished UI Future plans Windows support Depending on how difficult this turns out to be, it may be implemented sooner Strategy mode Useful for endurance and team events, allowing you to monitor the tire and fuel status of other drivers So, what now? Right now, I’ll focus on getting the app to its MVP state. This means refining the UI, fixing bugs, and, most importantly, making the app genuinely useful. Well, that was quite a long one, wasn’t it? Thank you for reading all the way to the end, and have a wonderful rest of your day!"}]...
|
Title: Telemetry LMU by @Karlito | Stardance
Devl Title: Telemetry LMU by @Karlito | Stardance
Devlogs:
DevLog 1 — An Introduction to My Project Hi! I’m Karlito, and this is my first devlog. I’d like to use this devlog to introduce my project, explain its current state, and share my plans for the future. So, what actually is LMU Telemetry? The TL;DR is that it’s a telemetry tool for Le Mans Ultimate. However, many people don’t know what that means, so I’ll explain it here. What is Le Mans Ultimate? In short, Le Mans Ultimate is a racing simulator. Unlike traditional racing games, it doesn’t simply say “the car accelerates when you press W.” Instead, it simulates the engine, tires, driveshafts, brakes, track grip, and many other factors to provide a realistic driving experience. What is telemetry? Telemetry is a way for simulators to output simulation data, such as speed, position, engine temperature, and much more. At a lower level, it’s essentially a chunk of memory containing numbers that are constantly updated with current information. What LMU Telemetry actually does LMU Telemetry aims to visualize these data points in a way that’s easy to understand and can help users improve their driving. It does this in several ways. For example, one feature draws real-time graphs of various metrics such as speed or delta time compared to your best lap. The current state of development The app is currently little more than a glorified demo. It has some rough UI elements and only plots graphs for a hardcoded car (index 0). While this works in private lobbies, where you’re always the first car, the system fails in most other situations. In short, the app isn’t very useful yet, but it’s a start. Main goals Live telemetry view Real-time graphs Map view A view showing the track layout and the line you drove Sharing features Exporting laps and comparing them with laps driven by other users Requirements The app must be performant Running LMU can already be demanding on some systems, so the app shouldn’t use more resources than necessary Linux support A reactive and polished UI Future plans Windows support Depending on how difficult this turns out to be, it may be implemented sooner Strategy mode Useful for endurance and team events, allowing you to monitor the tire and fuel status of other drivers So, what now? Right now, I’ll focus on getting the app to its MVP state. This means refining the UI, fixing bugs, and, most importantly, making the app genuinely useful. Well, that was quite a long one, wasn’t it? Thank you for reading all the way to the end, and have a wonderful rest of your day!
DevLog 2 Today i have fixed a bug where threads would spawn infinitely. I’ve been at it for 3h… Yeah it was kinda pain. So I basically have this architecture, where my backend spawns a new thread for each graph ( to provide information more responsibly. ) However whenever the graph element unloaded, it didn’t unsubscribe from that thread. A simple fix, just unsubscribe it, right ? Yup basically. However my lack of expertise in this kind of stuff led me on a wild goose chase. After I realized that what I am doing is stupid, it was just a simple hook that the spawn function returned, when spawning the new thread. Well we all make mistakes :D
DevLog 3 This one will be more about the organization of the project. New folder structure I have split up the src directory into a few different subdirectories mainly pages directory which is further split up into directories for each page and a components directory for reusable components like the sidebar. Logging Furthermore I have implemented logging on the backend. (It’s also callable from the frontend but that’s not that convenient at least in case of debugging so I won’t be using it as much.) The top bar Next I have started implementing a top bar for the telemetry view . On there will be some important controls and information regarding that view. Just note that in the screenshot the game is not open therefore the driver dropdown isn’t populated with any text. This will probably change in the future. And the layout dropdown is there just for the looks for now ;)
DevLog 4 Today I have started implementing the layouts feature. There’s not much to really say. The graphs can be vertically adjusted in size, their color and type can be changed and there is a whole new edit mode for that. And that’s what I did for 5h today… (I really hate frontend :D) The design of the whole thing is unfinished but hey, it works. Even though some features (mainly saving and loading layouts) are missing its turning out great. I will continue developing this feature for the time being.
DevLog 5 - Introducing the Layouts feature! So for the past few days I was implementing a layouts feature for the Graphs view in my app. Features: Adding layouts Removing layouts Managing layouts change what graphs they display change the properties of those graphs aka their number of gridlines, color and type How many graphs there are and what sizes they have You can do all of that in the Edit Mode . This mode is accessible via the layout selection dropdown. In edit mode you have options to change the graphs as said, remove the layout you’re editing, to save it as a new one or to save it (basically override the last one). All of this is persistent between sessions. Note that the UI in the screenshots is probably gonna be changed in the future and is just a development placeholder :)
DevLog 6 - Windows support and the first rewrite! Windows support There’s not really much to say about this. You just get a handle on the game’s memory. This was vibecoded but it’s below 100 lines of windows specific code, so I’m gonna allow it. (It was just the 2 function that handle updating the telemetry and the rest is the same.) Rewrite After adding windows support, and sending it to a friend to test, I have discovered a massive problem. The app just didn’t work on a lower resolution. Since I have a QHD monitor, I didn’t notice it. Also when I started writing the app, I did it in pure React without any UI libraries, then I started to use Antd and then MUI and it became a mess. So I have done some research and decided to rewrite the app using ShadcnUI. I did this because Shadcn has one massive advantage - the code that you use is in your codebase. This means that you can modify the components however you want. It is also one of the more popular ones out there. For icons, I will be using Tabular, because they have a lot of them, and I like their look.
DevLog 7 This will be just a quick update on how things are looking right now, what’s happening, and the overall state of the project. Good news The rewrite is complete The sole UI library is now ShadCN. There have also been some minor bugfixes and ux improvements. The main being that the app is now working on lower resolutions. We’ve got a readme. It’s basic, but its there. Also I have added installation instructions and released the 1st alpha version. You can find it in the releases! Both windows and linux packages are there! Bad news I will take a break for the next few days. I will be working on a smaller project for android and I hope that by the time I return I will be full of energy and ideas! What’s next I will continue working on the graph view. Mainly saving and loading reference laps, and overall better UI and UX.
Devlog 8 Do you guys remember how I said that I will take a break ? Yeah… That didn’t happen. Instead I have made a plan for myself on how I am gonna continue in the tool’s development. Da plan The plan Is pretty simple: Design the app in Figma, then build it! I have also made a list of features that will be added. You can find the plan on Github. You can also suggest features if you’re interested! …oh and before making the plan I have implemented a pretty cool logging feature. Basically it records the currently selected driver and saves all his data to a file along with the lap time and date. It does this only for laps that the game considers valid (aka gives a lap time to.)
Devlog 9 - THE REDESIGN For the past few days I’ve been working on a new design for the app. I am not the best designer and to be real I didn’t enjoy it :D. Designing is just too illogical for me. There’s not really much more to say about this. Enjoy the design:
Devlog 10 - We are in the double digits 🎊 UI Redesign Progress I am slowly redesigning the app to look like the design I made. I started with the sidebar and then the top control panel. All that went well. The Graphs… 😅 But then I got to the Graphs . *Oh, the graphs… *I wanted to redo the backend for them because the multiple-thread approach was just straight up stupid. It was a pain to develop and would be a pain to maintain. So, in my infinite wisdom , I have gone for just a simple async function. That means that right now the frontend is requesting each data point instead of subscribing to a stream. After that, I needed to revise the frontend graph component itself. At first I just wanted to make a non-messy implementation of the old version. However, it turned out that the HTML <canvas> element is really slow. And I mean realllllllllly slow. So after I wasted like 2 hours trying to optimize the design with no success, I rage quit and went to watch a movie. WebGL to the Rescue But I don’t give up that easily. After the movie, I reimplemented the graph view with WebGL through Pixi.js , which wasn’t even that hard like I expected and overall had much better performance. Well… at least after I fixed one very stupid bug . The Bug That Ate 10 GB of RAM I had forgotten everything from the first GraphView.tsx implementation, so I was just mindlessly copying over the code and renaming the variables to what I thought they meant when I first made it. Then I got to the part which draws the lap (aka the big loop over all the points-up to 10,000 points at a time). There was an error on one of the variables. It was the length of some array. I just renamed it to the main array length because… *what other thing would it be, right? *Well…It was the length of the values array , which was always 1 or 2 .So I accidentally turned 1 × 10,000 iterations into 10,000^2 iterations . Somehow the app still wasn’t lagging that much. It just took like 10 GB of RAM . The Result Thankfully, the new WebGL + Pixi.js approach is way more efficient , so after fixing that bug the graph rendering performs much better. It still isn’t perfect on the UI side of things but I am getting there!
Devlog 11 Hello guys. I have some good news and some bad news… Let’s start with the not so good news. After thinking about it, I have decided, that I don’t really enjoy working on this project. It’s not that the project it self is bad, it’s more about the tech stack I chose… Don’t get me wrong typescript and react are both phenomenal choices and great tools but, I guess the web is just not for me. I realized that I like the lower end of the spectrum better. So I have decided to cut this project short. The map view will not be included in the final ship for the time being and the profile stats also will not be there. On the bright side, I have started working on the championships page with that nearing its completion. Next I will start to work on the onboarding and settings pages.
Devlog 12 This will be more of like a quick update on the championships feature. So what has happened is that I have implemented the feature, and assumed that the data will be there for all players… which there isn’t. The other players show up and everything but the details like tire data, damage data and fuel data just isn’t there. So I am kinda stuck if I should just scrap the feature or recreate it into a personal data panel which would just not be fun I think. Also the damages data is very very limited, so I just don’t know what to do.
Devlog 13 Okay so I might have found a solution for me not liking react and web technologies but still wanting to finish this project. And I don’t like it…. but it has to be done. But before I tell you what it is you have to understand my problems. The good React in combination with typescript is a very easy thing to understand. They are everywhere, the skill of knowing these is very valuable. They have a huge ecosystem because they are everywhere. And I am sure that I have forgotten many other cool and interesting features and perks but I picked them for mainly these 3. The Bad They are slow (in comparison to something like rust) They rely too heavily on browsers (I mean it’s basically their runtime) You have to be “hacky” to do some things. They are not suitable to develop desktop apps I mean in hindsight those are so obvious but until you are balls deep into some specific project you don’t really think about those. The main problem is that the performance is, for the lack of a better word, sh*t. And normally that isn’t a problem however when you are processing a memory object of about 300kb 60 times per second it adds up fast. Even on my pretty beefy PC (r7 9800x3d and n5070ti) it hardly gets 30 fps. I know this could probably be fixed with “more hacky workarounds” but I am tired of those. The solution I am going to REWRITE The project I have spent 70h on already in some rust native GUI framework such as ICED. I have not yet decided which one to chose and I will do that research tomorrow and report back Literally me RN ⬇️
Devlog 14 I have done some research and decided that moving forward the app will use eGPU as the main GUI library. I have chosen this over the competitors due to a few reasons. The main being that its rendered natively and that its a intermediate mode library. This will make it very easy to work with the graphs and hopefully other stuff too. I am enjoying working with it so far. There are some concepts that I really like, like that everything that has state is just a simple struct that is initialized somewhere and you do most of the implementation. The widget system is also pretty cool. I was at first worried that I would hate it due to my experiences from TKInter that was forced on me in school :D but its pretty intuitive how they did it. Going further I will need to think about the architecture of the app a bit to not have it fall apart. Right now I am thinking that one thread will be the main “logger thread” which will gather data from the telemetry and then there will be the UI thread. I think that is what pretty much everyone is doing so it might work . With this approach i am worried that its gonna be a pain, but what isn’t these days… I don’t really have that much more to say so at least enjoy this screenshot of a pretty much not working app Fun fact: due to how the lib works there is a bug now that you have to move your cursor on the app for it to log data :DDD
Devlog 15 For the last few days, I have been remaking the UI in EGUI and I am enjoying it so far. I’ve been working on the graphs in the graph view and also the sidebar. The sidebar is turning out very well and I am also pretty pleased with the graphs. I have only this for now, so enjoy :D
Devlog 16 Another 6 hours, another devlog… Hi people. For the last 2 days I took a bit of a break from the project. I have played Approximately up with the boys and it was so fun. Y’all should try the game. It has a free demo 😉 But we are not here to talk about games, are we… I am continuing the implementation of the frontend and its coming along nicely. I’ve just noticed one thing, making the UI itself in egui is kinda slow however the state is very easy. Whilst this not being completely ideal i can push trough that. Since the last devlog, I have finished the implementation of the sidebar, and started working on the telemetry page. I have the graphs sorted and now I am working on the top bar. It’s having a couple of issues at the moment but nothing hard to fix really. I am hopefully gonna continue tomorrow and have the page finished by the end of the week. Welp, I guess that’s it for today. Everybody have a beautiful day, and bye bye!
Devlog 17 Hello guys. Its me again :D I am continuing to rewrite the UI into egui. I have completed the Graph view’s UI and now I am moving onto implementing it. One thing I have noticed is just how much more “code efficient” egui is. I understand that I didn’t make the logic behind the code yet but even with that I made the same thing with 3k less lines of code. Here is how the layout edit mode is looking for now.
Devlog 18 - 100h on the project So it’s been a hundred hours huh ? I also can’t believe it! I have also just now finished* the graph view which will be newly called Telemetry (page) Now I will move onto making the car info page previously known as the championship view. I expect this to be very easy!
Devlog 19 Hello hello! Today I have some exciting news. The rewrite is complete That’s right, after about 30 hours of porting this code from tauri into EGUI it is finally finished! So let’s take a look at some stats, shall we ? | | Tauri | EGUI | |----------------------|-------------|--------------- | | Dev time | 80h | 30h | | Lines of code written | 6k | 3k | | Enjoyability | suboptimal | above average | And some perofrmance stuff as well: | | Tauri | EGUI | |----------------------|-------------|--------------- | | Ram idle | ~700Mb | ~150Mb | | CPU % idle | ~5% | ~5% | | FPS under load | ~29fps | stable 60 | Some other perks also include that EGUI doesn’t need a browser installed on the system to work. Overall I think this was a very successful rewrite! I wouldn’t do it again tho Next I will refactor the code a bit, do a bit off the good ’ol cleanup and then get to work on the map feature.
Devlog 20 So I have been polishing up the current features a bit and they are far from done. I am starting to question if i will make it to shipping this app one day :D. Anyway I have fixed numerous bugs, added an settings page and implemnted although very crudly a lap logger. But there is still a lot work that needs to be done. I have also added persistancy so the app remembers your choices. I am almost ready to replace the main branch with the fully rusted version, but like I said more work has to be done to go trough with that! I have probably never shown how the Car info page turned out and IMO it did really well. (The empty space is for inputs. That will be implemented soon!)
Devlog 21 For the past few days I have been working on a new feature. The map page. It is turning out great, however it has a lot of bugs. These will get fix over the next few days. I promise :) There have also been changes made to the lap logging system and some other systems as well. As you can see on the image you select 2 saved laps and can crosscompare the lines you drove. Obviously this is completly useless if you loaded 2 different track like I did here. This will get checked for and prohibited in the future. Next I will add the underlying lap overlay which I will somehow extract from the game or from somewhere else. I don’t really know yet. Well that is it for today. Have a great day and bye bye!
Devlog 22 Hiiiiiiiiiiiii I have some huge news to tell you. I have just made the MOST complex addition yet. And I love it! I have completely overhauled the accessing and managing the telemetry! I have designed a thread safe way to have it run on a separate thread and be accessible from *every place in the app. One unified API for everything! I now store the current lap and the last lap for each of the cars. Tho this takes up a massive 140mb of just floats (in the worst case scenario) I believe its worth the RAM! (Let’s be real, we have saved over 400mb from the tauri implementation so we can now use some of that!) Next I will continue on further implementing these features around the tool. Anyway have a nice day people and bye bye. Some context to that meme: I have a type in my app that is literally Arc<Mutex<[([f64; TelemetryValueType::Max as usize], Option); 104]»
Devlog 23 - More Refactoring Hi! In the past few days I have been making some core architectural changes to the project and I would like to explain them now. Telemetry Provider I have finally decided on how I am gonna handle telemetry in the long term. It’s a pretty simple concept but the implementation is pretty hard. I have one object (the TelemetryProvider struct) that is in charge of getting and managing the telemetry. Right now it logs data from all cars and stores the best, last and current laps. If you wish it can save only your laps or laps of everybody. Each lap is a json file about 500kB - 1MB in size and holds all the data that can be displayed in the app. Notably the position ( so you can load that lap directly into the map page ) and the data displayed by the graphs (so you can load it as a reference there as well.) Pointer to this struct is distributed to pages that need it so they can access it! The provider has a core logging loop that is running on another thread so the whole UI doesn’t have to redraw each time you log new data. (About 60 times a second.) State and Settings Providers Next, I have implemented a StateProvider and an SettingsProvider . These two are basically a drop in replacement of what was stored in the Sidebar and SettingsPage respectively. Difference between the two is that the StateProvider isn’t stored between app restarts. Similarly to how the TelemetryProvider works, each of the pages that need these values get a shared pointer (or an Arc in rust) and can access the values. What’s next Going further I will keep my focus on the map page. Finish it, and then start polishing the app for the final ship! Wish me luck and have a nice day!
Devlog 24 HI! All of the time on this devlog was basically just driving in circles. And I mean that. I have recorded all of the outsides and insides of all tracks in the game to get the data for the map page. It was very teidius and very boring. Like very very boring. There are 31 tracks in LMU (including each layout) and on every one of them I had to do an out lap, the ouside, another out lap and the inside. So 4laps for each. That is about 15min per layout. Yeah it was a long one. And the recordings aren’t perfect either! I will now have to somehow process them all to get them ready for the ship. You can watch the timelapses of this process here if you wish. https://lapse.hackclub.com/timelapse/OQcismBwxbBB https://lapse.hackclub.com/timelapse/le3Lta0RxcUA https://lapse.hackclub.com/timelapse/XRf98OimmUk9 Anyway. Have a nice day!
Devlog 25 I know I have just made a devlog like yesterday but holy s*** the track references work so well. They are practically perfect . Besides the references I have also implemented the delta time between the 2 cars! That has really tied the page together. If I can say so myself, we are getting pretty close to the final ship . There is not much needed to implement. The obvious are bugfixes, and some simple onboarding. But really, that’s it! Everyone who is following or caring about this project can expect a ship in the next week or so. In my final devlog I will also do a writeup on this project as a whole, from the coarse beginnings in Dyoxys, trough Tauri, to the sweet home of EGUI. There will also be a trailer video and a demo for all the raters :D Anyway for now you can have this preview of the map page! Stay tuned!
Devlog 26 Hiiiii For the past few hours I have been working on polishing the app and get it to a shippable state overall. There is still work left to do, but I am getting there. I have set up a simple packager, and a simple script to use it. It automatically compiles the release version of the app and packages it into a windows installer a Debian .deb package and a pacman package. I have also (after like 2 hours of struggeling with it) added an Icon for the app. So now it looks nice!There has been a lot of new bugfixes as well and the app has been tested by my friend so it should be somwhat usable, tho the setup UX should be improved upon. If you wish you can download the app from here: https://github.com/Karlito05/TelemetryLMU/releases/tag/v0.2.3 Well that is all I have for you all today, so have a nice one :)
Devlog 27 For the past few hours I have been polishing the app up. The main you’ll probably see are the onboarding dialogs. A global one pops up when you first launch the app and then one for each page when you first enter them. Another change I have done is that I made the ghosts on the map page be based on time and not data point index.
Devlog 28 Today is gonna be a big day, because I will ship the project. There is a few things left to do tho. Mainly the readme and the demo video! In my last and next devlog I will also make a write up on the story of the whole project so far. Besides that I have yesterday refactored the whole codebase so now there aren’t just 5 monolithic files. I went for a more react like approach with the structure being divided into pages and components. Sadly there isn’t enough time until the ship to touch up on some old UI and UX problems in the edit view of the graphs, neither is there time to add more fields. This will be done in the near future! Overall I am very happy how the app turned out. But this is not the end of the development this is just the end of the stardance journey!
Devlog 29 - The end So this is the last one, huh. Here is the full write up on this project as I promised. Chapter 1 - The beginnings This project started about 3 months ago. I started experimenting with just getting the data and plotting it. Just for fun as an exercise to learn rust. Then I realized that there actually isn’t a proper working telemetry tool that works on linux. So I did some research… and I decided that I am going to make the app in Dioxus. Chapter 2 - The Dioxus era This leads us to the shortest of eras. The Dioxus era. Nothing really happened here and quite frankly I don’t even remember it that much. There aren’t really any git commits because I didn’t have that setup yet. One thing i remember tho is that I couldn’t figure out how to draw the garphs, because Dioxus is based on web technologies but weirdly becuase you are writing HTLM like syntax but in rust. And that was the main reason I decided to switch to Tauri. Chapter 3 - The Tauri era At first Tauri was the best framework ever made for me. That is because I already kinda knew react, it was simple to understand and I could really lean into the split frontend and backend architecture. This sadly proved very inefficient for the graph view which needs to render thousands of points each frame. Since it was too much for the basic HTML canvas I have switched to using WebGL with numerous downsampling techniques. This was just a bandaid fix though. I have also ran into bunch of architectural issues with the whole split frontend and backend thing. Accessing the telemetry data proved to be very difficult and inefficient. I remember that I ran each of the graphs on a separate thread. This was so stupid. I don’t even remember how I could’ve come up with such a stupid idea :D. It just led to memory leaks and threads uncontrollably spinning up and not stopping. I am sure that all of that could’ve been easily avoided with simpler architecture but at that point I was at my lowest point of this project, so I didn’t even have the energy to do it. I also had the state of the frontend so fragmented which didn’t help. And the whole retained mode GUI thing just wasn’t well suited for this kind of app. And that is when I decided to do a complete rewrite in pure rust! Chapter 4 - The sweet EGUI I didn’t know it at the time, but this was the best idea on what to do with the project. I remember that I was very split between just shipping it half done and finishing it just because of how bad the development experience with Tauri was (sorry Tauri devs, it’s not a you thing, it’s a me thing). It took about 30h to fully rewrite the app with EGUI, which looking back at it isn’t too bad. It felt like ages though. It didn’t help that almost none of the work in this “chapter” did AI. Which at the end of the day is better! Although my style of writing EGUI code was let’s say original… I have just put everything into one file and that grew very fast :D. I had like 5 files that were about 800 lines each. That has since luckily changed. (I have adopted more of a React style file structure.) Anyway at the end of the rewrite I kinda started loving EGUI and that hasn’t stopped since. I continued to develop the Map page in EASY which was pretty easy. But then I needed the track limits data for the map page. This was a bit of a roadblock… First I have tried to extract the data directly from the game, however this was inaccurate and the track width was missing entirely. So then I tried to download an up to date image of the top down view of the track and extract the inside and outside line from it and match it to the in game data. This partially worked better, still not great tho. So there was only one option left. And that was to painfully drive each layout of each track by hand. This took almost 7h of just driving in circles. After that it was smooth and buggy sailing until the ship. Everyone who read this, have a beautiful day.
Ships:
Telemetry LMU An application for both Windows and Linux to visualize the telemetry data from Le Mans Ultimate What it does: This application collects, stores, and visualizes data from a racing simulator called Le Mans Ultimate. The main goal: Allow users to analyze their driving and learn from their data through an easy-to-use interface. The requirements: Performance, nice and simple UI, expandability, minimal setup. Results: Main goal: Achieved. (I wouldn’t be shipping this app otherwise) Performance: On average the app uses 4% of CPU and 250Mb of RAM under full load. That is less RAM usage than running Spotify in the background. Nice and simple UI: This is personal preference, however in my opinion I think i succeeded. Expandability: The architecture of the app is very modular so this also isn’t a problem. Setup: On windows there is none (except installing the app), on linux there is one dependency (this is sadly unavoidable.) Some stats: 200+ hours of development time (including the time before Stardance) 250+ commits 6 000+ lines of Rust...
|
1793350706.4334092
|
1793437106.4334092
|
|
60657
|
onFocus by @starvulkan | Stardance
|
starvulkan
|
1
|
17.61
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-15T20:27:20Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "onFocus !", "repo": "https://github.com/starvulkan/onFocus", "demo": "https://starvulkan.github.io/onFocus/"}]...
|
[{"post_id": 71366, "ts": "202 [{"post_id": 71366, "ts": "2026-09-20T18:17:05Z", "hours": 3.1311, "text": "Devlog 7: are you blind? they are clearly different! its a UI refresh! like chrome in 2023, the onFocus UI has been updated! i rewrote the whole css stylesheet and brought some changes along the way! buttons are now minty! the weather icon is now also filled with minty color, not just an outline as before. rounded corners in bars have also been amplified. the onFocus logo has been moved to the top of all the center elements. most importantly, i realized that previously, onFocus used to be quite resource wasteful with some visuals (like the moving aurora blobs). all these unnecessary stuff have been removed, and now onFocus doesnt consume as much system resources as before."}, {"post_id": 70890, "ts": "2026-09-19T23:22:47Z", "hours": 0.3197, "text": "quick devlog 6.5! the features and changes mentioned in devlog 6 are now available! since the ship review came back needing a few changes, i figured i should just bundle them in the re-ship."}, {"post_id": 69457, "ts": "2026-09-17T02:54:25Z", "hours": 3.1639, "text": "The onFocusing Sessions, Devlog 6: Updates While-U-Wait although my first ship is still under review, this doesn’t stop me to continue working on features for the next ship! these aren’t available in the repo just yet, but they will be as soon as the ship gets reviewed! i’ve added two new features and fixed a bug. before, if you refreshed the page, whatever you wrote into the focus intent didnt get saved and cached if you didnt start the focus session. now, it gets saved, no matter if the focus session has been started or nah. as for features, you can now delete focus sessions from history, in case they got accidentally started or the intent wasn’t written correctly. if you accidentally delete one, you can undo your delete as long as you dont leave the history menu. if you delete and leave the menu, its gone forever. also, weather has been added (uses Open-Meteo)! you may now search for your location or use the “use my location” button to find it automatically, and get weather info (will appear in the top left corner once set)! soo cool! this will be the last update until the first ship gets reviewed. once it comes back from that, this update will be available in the repo, and i’ll start working on a few more for the second ship!"}, {"post_id": 68814, "ts": "2026-09-15T19:59:40Z", "hours": 3.0603, "text": "The onFocusing Sessions, Devlog 5: Houston, we have focused! You can now set NASA’s Astronomy Picture of the Day as your new tab wallpaper! With this update, a new settings menu has also been added, where you can change between the NASA APOD or onFocus’s default wallpaper; Aurora Blobs. due to the randomized nature of the NASA APOD, this can create problems with the visibility of on-screen texts and images, cuz some pictures may be brighter or darker than others. thats why, when in NASA APOD wallpaper mode, a dimming config will appear in settings, allowing you to get the image to look just right in relation to the other on-screen elements. I have also added into the settings menu the config to set a different search engine other than duckyduckygooo. you can choose between a set of engines in a dropdown, or add a link to a custom search engine. you may call this the first actual release of onFocus! this version is going to get shipped. but, a second ship will start development immediately afterwards, with new features to enhance your experience!"}, {"post_id": 68470, "ts": "2026-09-15T05:10:29Z", "hours": 2.9053, "text": "The onFocusing Sessions, Devlog 4: ITS ALIVEEE sooo slight detour… I delayed the NASA APOD thingy to prioritize getting onFocus’s main features up and running. because why if no focus features, why focus shaped? so yea! now it’s an actually useable new tab replacement for your current one! the focus features have been added. this includes your task/focus creator, pomodoro timer, and focus history. your very important and essential search bar has also been added, with duckygo as the default search engine. expect a custom search engine selector in a future update! isnt it so fun when you are falling asleep while programming and you make a typo and dont realize you did until oh wow why is my code not working?? yea i find that EXTREMELY funn… next up for tomorrow’s me to deal with: i’m finally getting the NASA APOD wallpaper setting up and running. once that’s done, imma ship this thing’s first release. but that wont be the end, imma ship again afterwards with more features!!"}, {"post_id": 68297, "ts": "2026-09-14T21:36:18Z", "hours": 2.9986, "text": "The onFocusing Sessions, Devlog 3: onFocus invades your browser, muehehe guysss, finally, tangible progress has been made! with the addition of the Manifest V3, alongside other configs, onFocus can now be installed as an extension on Chromium-based browsers in extension developer mode and take over your (allegedly) very bloated and time-consuming new tab! For our fellow non-Chromium browser users, you may set the live demo link as your homepage, cuz custom extension installs are just temporary (one browser restart and they be gone) and for the possibility of permanent installs i would have to get it signed, and that would take too long… the codebase is still one for both the extension and website, with a small storage layer that quietly uses chrome.storage inside the extension and localStorage on the web. with this update, a semi-functional UI has also been added to onFocus. It features a time-triggered greeter and a clock, as well as a background with three CSS-animated blobs. soo cool!! for them to move and breathe around, you need to enable animation effects in your OS, otherwise they gonna stay still the whole time. next, I will start working on getting NASA’s APOD as a background option, so you can choose between that and the onFocus blobs!"}, {"post_id": 67847, "ts": "2026-09-14T03:40:23Z", "hours": 0.3303, "text": "The onFocusing Sessions, Devlog 2: Graphicssss most of the work on onFocus today went to creating its graphical identity: logos, wordmarks, etcc! Took time to settle on colors and designs, but ended with something I feel very happy with! Its logo icon features a crescent moon with a star, to represent focus and late-night work sessions. The color palette chosen gives it a “minty clean” feeling, just like our (planned) UI! main issue today involved the fact that I used live text on the wordmark when designing it in Affinity, so when exported to SVG, if the host device didn’t have the custom font, it would look horrible in a fallback sans-serif, and thats putting it lightly. So I just ended up using PNGs for all designs to avoid a big headache… also dealt with few canvas dimension issues and embedded bitmaps with no actual paths in supposed “vector” icons, but nothing beyond that. Once all the graphics were ready, they were added to the GitHub README, the placeholder in the live demo, and wherever necessary! now, it doesn’t look stale and boring! and thats funn! next up, we return to work on the actual new tab itself! we’ll prepare the Manifest V3 extension wrapper, so onFocus can actually take over a new tab page and finally give you that much needed focus!"}, {"post_id": 67087, "ts": "2026-09-13T04:25:02Z", "hours": 1.6325, "text": "The onFocusing Sessions, Devlog 1: Humble Beginnings welcome to the development of onFocus, a new tab page that helps you keep your mind where your work is, instead of on the distractions killing our chances of becoming responsible human beings. you’ll be able to set a focus session, run a timer against it, and get weekly reports on where your time actually went. Time runs and waits for nobody, yk! as with any project, work today involved getting the whole structure and basics up and running, so a lot of scaffolding, cleaning, configuring, ETCCC. as we all know, that’s E V E R Y B O D Y ’ S favorite part, so funnnnn… few issues here and there, biggest one being when I had to install node through VS Code terminal and then it refused to accept it existed, so every new terminal window was getting a “snapshot” from before the install, until VS Code got its little restart. as for important decisions, today was decided that onFocus should exist and run as both a website and as a browser extension for mass access, and those live at completely different URLs, so every asset path in the build has to be relative rather than absolute. what this mostly involved was one new line in the vite config, to get both targets with one build. kill two birds with one stone right there! live demo up and running, but it’s just fun placeholder stuff. real progress on design and structure next!"}]...
|
Title: onFocus by @starvulkan | Stardance
Devlogs Title: onFocus by @starvulkan | Stardance
Devlogs:
The onFocusing Sessions, Devlog 1: Humble Beginnings welcome to the development of onFocus, a new tab page that helps you keep your mind where your work is, instead of on the distractions killing our chances of becoming responsible human beings. you’ll be able to set a focus session, run a timer against it, and get weekly reports on where your time actually went. Time runs and waits for nobody, yk! as with any project, work today involved getting the whole structure and basics up and running, so a lot of scaffolding, cleaning, configuring, ETCCC. as we all know, that’s E V E R Y B O D Y ’ S favorite part, so funnnnn… few issues here and there, biggest one being when I had to install node through VS Code terminal and then it refused to accept it existed, so every new terminal window was getting a “snapshot” from before the install, until VS Code got its little restart. as for important decisions, today was decided that onFocus should exist and run as both a website and as a browser extension for mass access, and those live at completely different URLs, so every asset path in the build has to be relative rather than absolute. what this mostly involved was one new line in the vite config, to get both targets with one build. kill two birds with one stone right there! live demo up and running, but it’s just fun placeholder stuff. real progress on design and structure next!
The onFocusing Sessions, Devlog 2: Graphicssss most of the work on onFocus today went to creating its graphical identity: logos, wordmarks, etcc! Took time to settle on colors and designs, but ended with something I feel very happy with! Its logo icon features a crescent moon with a star, to represent focus and late-night work sessions. The color palette chosen gives it a “minty clean” feeling, just like our (planned) UI! main issue today involved the fact that I used live text on the wordmark when designing it in Affinity, so when exported to SVG, if the host device didn’t have the custom font, it would look horrible in a fallback sans-serif, and thats putting it lightly. So I just ended up using PNGs for all designs to avoid a big headache… also dealt with few canvas dimension issues and embedded bitmaps with no actual paths in supposed “vector” icons, but nothing beyond that. Once all the graphics were ready, they were added to the GitHub README, the placeholder in the live demo, and wherever necessary! now, it doesn’t look stale and boring! and thats funn! next up, we return to work on the actual new tab itself! we’ll prepare the Manifest V3 extension wrapper, so onFocus can actually take over a new tab page and finally give you that much needed focus!
The onFocusing Sessions, Devlog 3: onFocus invades your browser, muehehe guysss, finally, tangible progress has been made! with the addition of the Manifest V3, alongside other configs, onFocus can now be installed as an extension on Chromium-based browsers in extension developer mode and take over your (allegedly) very bloated and time-consuming new tab! For our fellow non-Chromium browser users, you may set the live demo link as your homepage, cuz custom extension installs are just temporary (one browser restart and they be gone) and for the possibility of permanent installs i would have to get it signed, and that would take too long… the codebase is still one for both the extension and website, with a small storage layer that quietly uses chrome.storage inside the extension and localStorage on the web. with this update, a semi-functional UI has also been added to onFocus. It features a time-triggered greeter and a clock, as well as a background with three CSS-animated blobs. soo cool!! for them to move and breathe around, you need to enable animation effects in your OS, otherwise they gonna stay still the whole time. next, I will start working on getting NASA’s APOD as a background option, so you can choose between that and the onFocus blobs!
The onFocusing Sessions, Devlog 4: ITS ALIVEEE sooo slight detour… I delayed the NASA APOD thingy to prioritize getting onFocus’s main features up and running. because why if no focus features, why focus shaped? so yea! now it’s an actually useable new tab replacement for your current one! the focus features have been added. this includes your task/focus creator, pomodoro timer, and focus history. your very important and essential search bar has also been added, with duckygo as the default search engine. expect a custom search engine selector in a future update! isnt it so fun when you are falling asleep while programming and you make a typo and dont realize you did until oh wow why is my code not working?? yea i find that EXTREMELY funn… next up for tomorrow’s me to deal with: i’m finally getting the NASA APOD wallpaper setting up and running. once that’s done, imma ship this thing’s first release. but that wont be the end, imma ship again afterwards with more features!!
The onFocusing Sessions, Devlog 5: Houston, we have focused! You can now set NASA’s Astronomy Picture of the Day as your new tab wallpaper! With this update, a new settings menu has also been added, where you can change between the NASA APOD or onFocus’s default wallpaper; Aurora Blobs. due to the randomized nature of the NASA APOD, this can create problems with the visibility of on-screen texts and images, cuz some pictures may be brighter or darker than others. thats why, when in NASA APOD wallpaper mode, a dimming config will appear in settings, allowing you to get the image to look just right in relation to the other on-screen elements. I have also added into the settings menu the config to set a different search engine other than duckyduckygooo. you can choose between a set of engines in a dropdown, or add a link to a custom search engine. you may call this the first actual release of onFocus! this version is going to get shipped. but, a second ship will start development immediately afterwards, with new features to enhance your experience!
The onFocusing Sessions, Devlog 6: Updates While-U-Wait although my first ship is still under review, this doesn’t stop me to continue working on features for the next ship! these aren’t available in the repo just yet, but they will be as soon as the ship gets reviewed! i’ve added two new features and fixed a bug. before, if you refreshed the page, whatever you wrote into the focus intent didnt get saved and cached if you didnt start the focus session. now, it gets saved, no matter if the focus session has been started or nah. as for features, you can now delete focus sessions from history, in case they got accidentally started or the intent wasn’t written correctly. if you accidentally delete one, you can undo your delete as long as you dont leave the history menu. if you delete and leave the menu, its gone forever. also, weather has been added (uses Open-Meteo)! you may now search for your location or use the “use my location” button to find it automatically, and get weather info (will appear in the top left corner once set)! soo cool! this will be the last update until the first ship gets reviewed. once it comes back from that, this update will be available in the repo, and i’ll start working on a few more for the second ship!
quick devlog 6.5! the features and changes mentioned in devlog 6 are now available! since the ship review came back needing a few changes, i figured i should just bundle them in the re-ship.
Devlog 7: are you blind? they are clearly different! its a UI refresh! like chrome in 2023, the onFocus UI has been updated! i rewrote the whole css stylesheet and brought some changes along the way! buttons are now minty! the weather icon is now also filled with minty color, not just an outline as before. rounded corners in bars have also been amplified. the onFocus logo has been moved to the top of all the center elements. most importantly, i realized that previously, onFocus used to be quite resource wasteful with some visuals (like the moving aurora blobs). all these unnecessary stuff have been removed, and now onFocus doesnt consume as much system resources as before.
Ships:
onFocus !...
|
1793206496.3378677
|
1793292896.3378677
|
|
63848
|
Bench Power Supply by @HexFud | Stardance
|
HexFud
|
0
|
3.44
|
0
|
[]
|
[{"post_id": 71367, "ts": "202 [{"post_id": 71367, "ts": "2026-09-20T18:17:38Z", "hours": 0.9667, "text": "Yippie ! Now the PCB looks more “filled”, I implemented new security measures and checked every connection to be sure it will work after fabbricating it"}, {"post_id": 71119, "ts": "2026-09-20T10:09:20Z", "hours": 0.7917, "text": "Big update! I thought about the project and I dind’t really like it that much so I did an upgrade: now the bench power supply is smart ! I added an esp32, removed standard potentiometers and replaced them with rotary encoders. I sitll need to complete the shcematic and organize it but this is a big step ahead!"}, {"post_id": 70796, "ts": "2026-09-19T19:40:38Z", "hours": 0.4167, "text": "Checked the final schematic and PCB and made some modifications. I also designed the case for it (entirely 3d printable."}, {"post_id": 70778, "ts": "2026-09-19T19:03:14Z", "hours": 1.2667, "text": "I am working on a simple and low cost bench power supply that can be affordable and safe to use. I started to make the schematic and the pcb."}]...
|
Title: Bench Power Supply by @HexFud | Stardance
Title: Bench Power Supply by @HexFud | Stardance
Devlogs:
I am working on a simple and low cost bench power supply that can be affordable and safe to use. I started to make the schematic and the pcb.
Checked the final schematic and PCB and made some modifications. I also designed the case for it (entirely 3d printable.
Big update! I thought about the project and I dind’t really like it that much so I did an upgrade: now the bench power supply is smart ! I added an esp32, removed standard potentiometers and replaced them with rotary encoders. I sitll need to complete the shcematic and organize it but this is a big step ahead!
Yippie ! Now the PCB looks more “filled”, I implemented new security measures and checked every connection to be sure it will work after fabbricating it...
|
1793055078.7902358
|
1793659878.7902358
|
|
33555
|
Rural Coders Society by @-Sophie- | Stardance
|
-Sophie-
|
1
|
12.0
|
252
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T18:58:04Z", "hours": 12.0, "multiplier": 17.99, "payout": 252, "blessing": "neutral", "text": "I made a revamped webpage for Rural Coders Society, a fiscally sponsored project under Hack Club! This was my first time using full blown React for an actual project, so there was a huge learning curve. But I’m really proud with how it turned out! Challenges: Using external libraries like NumberFlow and SplideJS for the first time (lots of documentation to read D:) Gauging what I should make a component and what I should just put on the page Making the card system modular (esp for different amounts of content and such) and streamlining the process of adding cards to the website Using useState for the first (practical) time to make a navbar :0 What I’m proud of: I’m proud that I overcame these challenges despite it being discouraging at times How I was able successfully integrate external libraries and troubleshoot through card issues and being stubborn to not use AI to debug (it was tempting but I know I wouldn’t learn) Using TailwindCSS for the first time and it’s actually so good I don’t think I can return to regular CSS anymore I’m glad I was able to reference other sites on the web and somewhat replicate it with react and tailwind with my own creativity on my own page Using and understanding how to use react routes and Link elements You can check the page out at www.ruralcoderssociety.org ! Thanks for reading :))))", "repo": "https://github.com/gwak-amole/ruralcoderssociety", "demo": "https://www.ruralcoderssociety.org/"}]...
|
[{"post_id": 71368, "ts": "202 [{"post_id": 71368, "ts": "2026-09-20T18:18:33Z", "hours": 1.7058, "text": "FINISHED THE SITE!! I added mobile compatibility The site was looking really good until someone looked on it on their phone or something other than a desktop, so this was the final element to ship it! No more fixed widths The fixed widths, I found, were the culprit for all the breaking when the website was viewed in other dimensions, so I made use of sm:some property and md:some property and lg:some property in tailwind and also w-full and max-w-some number to make the cards flexible depending on the dimensions it’s viewed from NAVBAR I’m really proud of this because I used useState for the first time on an actual website to create the hamburger navigation thing. It opens like a set of links if you click it and the text changes from a three-line hamburger thing to an x. useState is actually amazing so many use cases Challenges The main challenge was just tweaking what text/font sizes should go with sm/md/lg displays–just a lot of trial and error Another challenge was making the hamburger opening look good because the background was only coloring to the height of the navbar,, I realized that I needed to move the appearing navigation outside of the navbar and it worked wonders Future additions Just if the nonprofit gets more metrics or after outreach initiatives it’s apparent we’re missing some important content. but it’s done and I’m going to ship this!!"}, {"post_id": 66091, "ts": "2026-09-11T17:49:29Z", "hours": 1.1672, "text": "Finished About Me Page + program page struggles Finished the about me! It’ s a simple about me page; I got inspiration from other NPO about me pages online! Program Page work in progress I’m trying to use the same components across two pages for information cards on the programs we do, but the cards need to be two different heights. I’ve been hacking at this for a while but I’m going to rest before I try resolving this problem again :’))))) (as you can see the images go off the cards for this second component. I want each card to be a standardized height but differ across pages. gl to me in the future lol) Future additions After I finish adjusting these card heights, my website will be finished! I just need to hook it to our website domain and replace our outdated website!! yayyy"}, {"post_id": 59083, "ts": "2026-08-31T18:09:12Z", "hours": 2.5033, "text": "Added project carousel! React component I used React to make a reusable image carousel thing where you can pass an array of photos as an argument and it will put it into the the SplideJS slides Used SplideJS again Added a featured projects carousel that has some cool projects that our Code Without Borders Bootcamp participants made!! Added arrows to the carousel too Tailwind Added a gradient background for aesthetic purposes :) Challenges I generally had a hard time figuring out how to style the features component–it was really looking rough to start with but we landed on something 😭 I think the gradient helped a lot Additional information I also tweaked styling for the rest of the webpage I added some join buttons and linked the donation page Updated the impact numbers Future additions About to add the proper join form and also get started on the about us page :D"}, {"post_id": 29809, "ts": "2026-07-16T23:01:41Z", "hours": 1.1256, "text": "Added footer + more I added a footer to the home page to make it feel more complete Number animations now the number statistics animate when you scroll upon them. so i attached a video to show u what that looks like. I used the NumberFlow React library–it was pretty intuitive itself but then i had to use useState, useEffect, and useRef hooks and understand how to use those and how to defer the useEffect until the window detects it 😭 😭 u can do it with the native .getBoundingClientRect tho and u have to do it to an element you want to be the trigger, in my case i made the card the trigger, so if it shows then the animation will happen. and then make sure it’s less than window.innerHeight and element’s position.bottom must be greater than 0, which means that the element is below the top edge of ur screen holy yap but this is how i teach myself bc that was something new for me 😭"}, {"post_id": 28588, "ts": "2026-07-14T22:37:09Z", "hours": 0.6417, "text": "Added card types and prop types to specify the kind of card design you want I added different card types, and so now you can switch between them. So CardGrid is extra reusable LOL This is through capitalized variables that I just learned! I could work logic between choosing components using a capitalized variable (yk the one that uses PascalCase)"}, {"post_id": 28564, "ts": "2026-07-14T21:53:38Z", "hours": 0.3922, "text": "Reworked some card grid component logic I heard it’s better to create an array of the props rather than an array of the cards, so after struggling a bit I got to do it the conventional way with array mapping! Not entirely sure what the individual mapping keys are for but I will look more deeply into that. It says online that you have to keep keys stable so that React knows which item you’re referencing but don’t totally understand why it would need to know that lol"}, {"post_id": 28551, "ts": "2026-07-14T21:28:11Z", "hours": 0.8739, "text": "Card Component + Card Grid Both are reusable! Card Component I create InfoCard.jsx component which makes these light blue cards. I used props for the first time, so you can pass in an argument making these components completely reusable across the platform! Card Grid I created an array of cards and then passed them through the Card Grid. I made it so that the cols prop you pass in leads to the amount of columns created with Tailwind CSS by assigning 1 to “grid-col-1” etc etc in an object and then using that for part of the Tailwind CSS for the Card Grid. super simple logic but im still proud nevertheless LOL"}, {"post_id": 26415, "ts": "2026-07-11T06:05:56Z", "hours": 1.3447, "text": "I implemented Splide JS into the website so it could create this photo gallery carousel!! i’m so proud of it! and the syntax for Splide was surprisingly easy and intuitive–I followed a tutorial on Medium to understand how to use it. The home page is already looking more polished."}, {"post_id": 26386, "ts": "2026-07-11T04:30:11Z", "hours": 1.0606, "text": "Added a hero to the website. It’s currently a placeholder, I’m working on a swiping photo gallery as the hero. I also styled everything with tailwind-css because I’m trying to get used to it."}, {"post_id": 26290, "ts": "2026-07-11T00:20:44Z", "hours": 0.8678, "text": "Why is react so painful? anyhow I made a router without styling yet with react-router-dom and so yeah that’s progress :’). I’m getting used to the react-router-dom way of things and having to configure main.jsx and stuff it’s so painful LOL"}]...
|
Title: Rural Coders Society by @-Sophie- | Stardan Title: Rural Coders Society by @-Sophie- | Stardance
Devlogs:
Why is react so painful? anyhow I made a router without styling yet with react-router-dom and so yeah that’s progress :’). I’m getting used to the react-router-dom way of things and having to configure main.jsx and stuff it’s so painful LOL
Added a hero to the website. It’s currently a placeholder, I’m working on a swiping photo gallery as the hero. I also styled everything with tailwind-css because I’m trying to get used to it.
I implemented Splide JS into the website so it could create this photo gallery carousel!! i’m so proud of it! and the syntax for Splide was surprisingly easy and intuitive–I followed a tutorial on Medium to understand how to use it. The home page is already looking more polished.
Card Component + Card Grid Both are reusable! Card Component I create InfoCard.jsx component which makes these light blue cards. I used props for the first time, so you can pass in an argument making these components completely reusable across the platform! Card Grid I created an array of cards and then passed them through the Card Grid. I made it so that the cols prop you pass in leads to the amount of columns created with Tailwind CSS by assigning 1 to “grid-col-1” etc etc in an object and then using that for part of the Tailwind CSS for the Card Grid. super simple logic but im still proud nevertheless LOL
Reworked some card grid component logic I heard it’s better to create an array of the props rather than an array of the cards, so after struggling a bit I got to do it the conventional way with array mapping! Not entirely sure what the individual mapping keys are for but I will look more deeply into that. It says online that you have to keep keys stable so that React knows which item you’re referencing but don’t totally understand why it would need to know that lol
Added card types and prop types to specify the kind of card design you want I added different card types, and so now you can switch between them. So CardGrid is extra reusable LOL This is through capitalized variables that I just learned! I could work logic between choosing components using a capitalized variable (yk the one that uses PascalCase)
Added footer + more I added a footer to the home page to make it feel more complete Number animations now the number statistics animate when you scroll upon them. so i attached a video to show u what that looks like. I used the NumberFlow React library–it was pretty intuitive itself but then i had to use useState, useEffect, and useRef hooks and understand how to use those and how to defer the useEffect until the window detects it 😭 😭 u can do it with the native .getBoundingClientRect tho and u have to do it to an element you want to be the trigger, in my case i made the card the trigger, so if it shows then the animation will happen. and then make sure it’s less than window.innerHeight and element’s position.bottom must be greater than 0, which means that the element is below the top edge of ur screen holy yap but this is how i teach myself bc that was something new for me 😭
Added project carousel! React component I used React to make a reusable image carousel thing where you can pass an array of photos as an argument and it will put it into the the SplideJS slides Used SplideJS again Added a featured projects carousel that has some cool projects that our Code Without Borders Bootcamp participants made!! Added arrows to the carousel too Tailwind Added a gradient background for aesthetic purposes :) Challenges I generally had a hard time figuring out how to style the features component–it was really looking rough to start with but we landed on something 😭 I think the gradient helped a lot Additional information I also tweaked styling for the rest of the webpage I added some join buttons and linked the donation page Updated the impact numbers Future additions About to add the proper join form and also get started on the about us page :D
Finished About Me Page + program page struggles Finished the about me! It’ s a simple about me page; I got inspiration from other NPO about me pages online! Program Page work in progress I’m trying to use the same components across two pages for information cards on the programs we do, but the cards need to be two different heights. I’ve been hacking at this for a while but I’m going to rest before I try resolving this problem again :’))))) (as you can see the images go off the cards for this second component. I want each card to be a standardized height but differ across pages. gl to me in the future lol) Future additions After I finish adjusting these card heights, my website will be finished! I just need to hook it to our website domain and replace our outdated website!! yayyy
FINISHED THE SITE!! I added mobile compatibility The site was looking really good until someone looked on it on their phone or something other than a desktop, so this was the final element to ship it! No more fixed widths The fixed widths, I found, were the culprit for all the breaking when the website was viewed in other dimensions, so I made use of sm:some property and md:some property and lg:some property in tailwind and also w-full and max-w-some number to make the cards flexible depending on the dimensions it’s viewed from NAVBAR I’m really proud of this because I used useState for the first time on an actual website to create the hamburger navigation thing. It opens like a set of links if you click it and the text changes from a three-line hamburger thing to an x. useState is actually amazing so many use cases Challenges The main challenge was just tweaking what text/font sizes should go with sm/md/lg displays–just a lot of trial and error Another challenge was making the hamburger opening look good because the background was only coloring to the height of the navbar,, I realized that I needed to move the appearing navigation outside of the navbar and it worked wonders Future additions Just if the nonprofit gets more metrics or after outreach initiatives it’s apparent we’re missing some important content. but it’s done and I’m going to ship this!!
Ships:
I made a revamped webpage for Rural Coders Society, a fiscally sponsored project under Hack Club! This was my first time using full blown React for an actual project, so there was a huge learning curve. But I’m really proud with how it turned out! Challenges: Using external libraries like NumberFlow and SplideJS for the first time (lots of documentation to read D:) Gauging what I should make a component and what I should just put on the page Making the card system modular (esp for different amounts of content and such) and streamlining the process of adding cards to the website Using useState for the first (practical) time to make a navbar :0 What I’m proud of: I’m proud that I overcame these challenges despite it being discouraging at times How I was able successfully integrate external libraries and troubleshoot through card issues and being stubborn to not use AI to debug (it was tempting but I know I wouldn’t learn) Using TailwindCSS for the first time and it’s actually so good I don’t think I can return to regular CSS anymore I’m glad I was able to reference other sites on the web and somewhat replicate it with react and tailwind with my own creativity on my own page Using and understanding how to use react routes and Link elements You can check the page out at www.ruralcoderssociety.org ! Thanks for reading :))))...
|
1793346510.2138083
|
1793432910.2138083
|
|
49819
|
My very own WebOS by @Alyssa889 | Stardance
|
Alyssa889
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T18:29:40Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my very Own WebOs! It was so fun following the guide and I enjoyed it so much! It was hard to follow the Javascript steps because I’m new to coding but I was able to follow. Hopefully there are no bugs or problems with it!", "repo": "https://github.com/alyssaelias/WebOS", "demo": "https://friendly-telegram-vpg4g6rp9ww9cxq47.github.dev/"}]...
|
[{"post_id": 71372, "ts": "202 [{"post_id": 71372, "ts": "2026-09-20T18:26:39Z", "hours": 0.3492, "text": "Added a ending message to my WebOs and changed the colors of the text. I think it’s ready to ship!"}, {"post_id": 71352, "ts": "2026-09-20T17:55:09Z", "hours": 0.5172, "text": "Styling my WebOS to make it unique"}, {"post_id": 71323, "ts": "2026-09-20T17:02:21Z", "hours": 0.3956, "text": "Editing the draggable window through JS"}, {"post_id": 70738, "ts": "2026-09-19T17:52:26Z", "hours": 1.1453, "text": "Finishing my WebOS and finally got Hackatime to work"}]...
|
Title: My very own WebOS by @Alyssa889 | Stardance Title: My very own WebOS by @Alyssa889 | Stardance
Devlogs:
Finishing my WebOS and finally got Hackatime to work
Editing the draggable window through JS
Styling my WebOS to make it unique
Added a ending message to my WebOs and changed the colors of the text. I think it’s ready to ship!
Ships:
I made my very Own WebOs! It was so fun following the guide and I enjoyed it so much! It was hard to follow the Javascript steps because I’m new to coding but I was able to follow. Hopefully there are no bugs or problems with it!...
|
1793342930.5588439
|
1793429330.5588439
|
|
50047
|
ESP32 MusicPlayer by @gabriel_ferreira | Stardance
|
gabriel_ferreira
|
0
|
11.82
|
0
|
[]
|
[{"post_id": 71379, "ts": "202 [{"post_id": 71379, "ts": "2026-09-20T18:32:46Z", "hours": 1.9367, "text": "Fixing a runtime error The ESP32 memory is limited and is reaching an end, the system is rebooting because it is running out of memory. Im trying to fix this without losing the music quality. Also i made the 3d models for the project, i just need add it on the github (In the meantime i forgot how to use freecad…)."}, {"post_id": 48630, "ts": "2026-08-17T03:13:21Z", "hours": 9.8831, "text": "Hi everyone, basically what is that project: It is a offline music player. The Stack is: A esp32 stream via bluetooth classic A2DP audio MP3 from a SD card to a bluetooth device.Ik there is a lot of devices that do the same, but isnt more funny build it instead of just buying?Why i made It? Because i wanted to listen music while i was at school, but i had a problem: my school doesnt allow smartphones / eletronics, so i couldnt just bring a MP3 player and listen. I remember exactly How i was in that moment, i was in a art class very very bored, so i thought: Why not just create one player all by myself? So i made It.I do not know much about C/C++ to build one all by myself, so i used codex and claude code to develop the Code while i was analising outputs and thinking things that If i tried send to a AI my credits would be gone.I had a Lot of problems while developing, even using AI, maybe because i a free tier at them. Some of the problems:For some reason the music was Very Very Very laggy, and none AI could help me with that, i was trying different methods to solve it (without AI for a period bc i ran out of credits) until i realised that it wasnt working, so i stopped and thinked: What make the music being laggy? I noticed that there was 2 problems going: the music was with some delays at each stream and it was cutting.Afther a while i asked AI about it and realised that the cutting was about RAM, so i asked AI to add a Idea: Create read zones, where each zone reads a different amount of data from the sdcard, and when it is near the max it stops for a while. It solved the cutting problem (that was Just some data from the music being lost bc it was reading more than it could store in memory) (i was thinking that the music was corrupted bc it was distorced, i checked the way that the Code was converting the MP3 into bytes for like 3 hours).But i still was having the delay problem: At first i thought it was bc of some delay, but wasnt… So i thought “what makes a chip slow?”, then I reached at clock speed. I changed from 40MHZ to 240MHZ, that solved the problem. I also had a problem with the bluetooth connection, it Just wasnt connecting and i nearly quit the project. The problem was Just the way it was connecting and responding the data sent from the bt device. That project taught me a Lot about computers, even with me just thinking and not programming. It taught me about RAM, clock speed, different kinds of connection, optimization, various ways of storing a music, how to make a good prompt, what is the difference between analogic and digital signals, and something that i even used in a essay: how to belance consume, limit, speed and production rate. That can be used in various cases, in the project was about How many the bt device consumes, how fast the ESP should decode the data, How fast it should reais from the sdcard and How many resources (ram) i should allocate based on the others."}]...
|
Title: ESP32 MusicPlayer by @gabriel_ferreira | St Title: ESP32 MusicPlayer by @gabriel_ferreira | Stardance
Devlogs:
Hi everyone, basically what is that project: It is a offline music player. The Stack is: A esp32 stream via bluetooth classic A2DP audio MP3 from a SD card to a bluetooth device.Ik there is a lot of devices that do the same, but isnt more funny build it instead of just buying?Why i made It? Because i wanted to listen music while i was at school, but i had a problem: my school doesnt allow smartphones / eletronics, so i couldnt just bring a MP3 player and listen. I remember exactly How i was in that moment, i was in a art class very very bored, so i thought: Why not just create one player all by myself? So i made It.I do not know much about C/C++ to build one all by myself, so i used codex and claude code to develop the Code while i was analising outputs and thinking things that If i tried send to a AI my credits would be gone.I had a Lot of problems while developing, even using AI, maybe because i a free tier at them. Some of the problems:For some reason the music was Very Very Very laggy, and none AI could help me with that, i was trying different methods to solve it (without AI for a period bc i ran out of credits) until i realised that it wasnt working, so i stopped and thinked: What make the music being laggy? I noticed that there was 2 problems going: the music was with some delays at each stream and it was cutting.Afther a while i asked AI about it and realised that the cutting was about RAM, so i asked AI to add a Idea: Create read zones, where each zone reads a different amount of data from the sdcard, and when it is near the max it stops for a while. It solved the cutting problem (that was Just some data from the music being lost bc it was reading more than it could store in memory) (i was thinking that the music was corrupted bc it was distorced, i checked the way that the Code was converting the MP3 into bytes for like 3 hours).But i still was having the delay problem: At first i thought it was bc of some delay, but wasnt… So i thought “what makes a chip slow?”, then I reached at clock speed. I changed from 40MHZ to 240MHZ, that solved the problem. I also had a problem with the bluetooth connection, it Just wasnt connecting and i nearly quit the project. The problem was Just the way it was connecting and responding the data sent from the bt device. That project taught me a Lot about computers, even with me just thinking and not programming. It taught me about RAM, clock speed, different kinds of connection, optimization, various ways of storing a music, how to make a good prompt, what is the difference between analogic and digital signals, and something that i even used in a essay: how to belance consume, limit, speed and production rate. That can be used in various cases, in the project was about How many the bt device consumes, how fast the ESP should decode the data, How fast it should reais from the sdcard and How many resources (ram) i should allocate based on the others.
Fixing a runtime error The ESP32 memory is limited and is reaching an end, the system is rebooting because it is running out of memory. Im trying to fix this without losing the music quality. Also i made the 3d models for the project, i just need add it on the github (In the meantime i forgot how to use freecad…)....
|
1793318154.657895
|
1793922954.657895
|
|
16932
|
Untitled by @oMeatball | Stardance
|
oMeatball
|
0
|
0.52
|
0
|
[]
|
[{"post_id": 7138, "ts": "2026 [{"post_id": 7138, "ts": "2026-06-11T22:29:07Z", "hours": 0.5158, "text": "HabitApp"}]...
|
Title: Untitled by @oMeatball | Stardance
Devlogs Title: Untitled by @oMeatball | Stardance
Devlogs:
HabitApp...
|
1792716756.0072944
|
1793321556.0072944
|
|
64188
|
My Personal Site by @UmarFarooq | Stardance
|
UmarFarooq
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T07:10:37Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Its my personal site that I have created for Hackclub Stardance Challenge. Sections: Header: Name and social links About Skills: Frontend, Backend, Database Projects: Live Demo and source code links for each project Tech Stack: React (Vite) TailwindCSS for styling react-icons for icons", "repo": "https://codeberg.org/umarfarooq/my-personal-site", "demo": "https://my-personal-site-57.netlify.app/"}]...
|
[{"post_id": 71382, "ts": "202 [{"post_id": 71382, "ts": "2026-09-20T18:36:06Z", "hours": 0.395, "text": "Completed my personal site. I’ve added two more sections that are “About” and “Skills” section."}, {"post_id": 71360, "ts": "2026-09-20T18:05:44Z", "hours": 0.7536, "text": "Welcome to the first devlog of my personal site. I have first setup a vite project, then created a header and provided links of my social profiles in header. Plus, I’ve created a projects section to showcase my projects."}]...
|
Title: My Personal Site by @UmarFarooq | Stardance Title: My Personal Site by @UmarFarooq | Stardance
Devlogs:
Welcome to the first devlog of my personal site. I have first setup a vite project, then created a header and provided links of my social profiles in header. Plus, I’ve created a projects section to showcase my projects.
Completed my personal site. I’ve added two more sections that are “About” and “Skills” section.
Ships:
Its my personal site that I have created for Hackclub Stardance Challenge. Sections: Header: Name and social links About Skills: Frontend, Backend, Database Projects: Live Demo and source code links for each project Tech Stack: React (Vite) TailwindCSS for styling react-icons for icons...
|
1793213521.583188
|
1793299921.583188
|
|
63957
|
SLI(Sign Language Interpreter) by @krishkr372 | St SLI(Sign Language Interpreter) by @krishkr372 | Stardance...
|
krishkr372
|
0
|
3.59
|
0
|
[]
|
[{"post_id": 71399, "ts": "202 [{"post_id": 71399, "ts": "2026-09-20T19:10:29Z", "hours": 1.4433, "text": "learning javaScript for UAC project"}, {"post_id": 71094, "ts": "2026-09-20T09:05:36Z", "hours": 2.1425, "text": "deployed my first app in streamlit to learn how to deploy things online"}]...
|
Title: SLI(Sign Language Interpreter) by @krishkr3 Title: SLI(Sign Language Interpreter) by @krishkr372 | Stardance
Devlogs:
deployed my first app in streamlit to learn how to deploy things online
learning javaScript for UAC project...
|
1793055247.2624598
|
1793660047.2624598
|
|
30742
|
XacOS by @xacobema | Stardance
|
xacobema
|
2
|
19.96
|
11
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T14:18:45Z", "hours": 6.0, "multiplier": 1.98, "payout": 11, "blessing": "neutral", "text": "XacOS v1.0 [You will probably have to zoom out to see everything properly, I didn´t find a reliable and simple way to make everything fit every screen, altough there is probably a way] What’s new in 1.0 Fixed bugs, like the windows changing shape when dragged to the right corner of the screen Revamped settings: you can now add your own wallpaper, change the font of the whole OS and see some information about your PC Added very simple notes app Start menu: access it by clicking the XacOS logo in the corner of the taskbar, see and open all of your apps There was A LOT of debugging Honestly, since almost 2 months have passed since I made v0.1, and that being my first real experience with HTML, CSS and JavaScript, and also forgetting how I coded the project, this update was a little challenging. Obviously, a lot of googling and W3schools helped me. I still think that maybe in the future I will make a 1.1 or 2.0 with more interesting features, but as a first experience with web development, I think it was great. I would love to mke 1.1 now, but I start school tomorrow, so it’s going to be difficult… Also, thank you very much HackClub and all it’s volunteers for making these awesome projects, I hope summer next year I will be able to participate again, because it’s the last year before I turn 18 😭", "repo": "https://github.com/xacb33/XacOS", "demo": "https://xacb33.github.io/XacOS/"}, {"ship_num": 2, "ts": "2026-07-06T22:42:40Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I think I finally finished the first version of XacOS! It was quite challenging to fix up bugs, as I had never coded in HTML nor JavaScript", "repo": "https://github.com/xacb33/XacOS", "demo": "https://xacb33.github.io/XacOS/"}]...
|
[{"post_id": 71402, "ts": "202 [{"post_id": 71402, "ts": "2026-09-20T19:12:24Z", "hours": 3.0508, "text": "Let’s see if I remember everything: 1. Changed the default system font to one that I think fits better 2. Added paint.js as an app 3. Added user profile customization, with profile picture and username (for now it doesn’t do much, just show it in the start menu) 4. Now there’s a little indicator in the taskbar on what app is currently on top 5. Changed the buttons of the notes apps to icons 6. Setup now tells you to choose your favourite font 7. A little calendar will appear when hovering over the date and time on the taskbar 8. Made most settings persist between page refresh with localStorage and some minor bug-fixes, like the aboutMe screen not going to the top when it’s taskbar icon was clicked. I thinks that’s everything, I also plan on adding at least one or two more apps coded by me and maybe something like a launcher or app store for iframe/embeded stuff by other people"}, {"post_id": 70565, "ts": "2026-09-19T11:31:46Z", "hours": 2.4183, "text": "I added quite some new features, including: 1. Most setup/OOBE is done, but I will probably add the cusomization options in there. 2. Added a low graphics mode, as some reviewers pointed out that XacOS ran badly on their PC, wich disables animations and disables blur. 3.Compressed all images, wich will also help with performane. 4.Added a new wallpaper by NASA, to resemble StarDance. 5. Added a Security section in settings, wich checks for the URL to make sure it is “genuine XacOS” (It is just a gimmick, XacOS is still completly open source) 6. Added a factory reset option in settings, wich deletes all settings and files saved in localStorage. 7. Added a start-up sound. Still have some things that I want to add but I’m happy on how this is turning out, altough I lost my streak because of school…"}, {"post_id": 65495, "ts": "2026-09-10T17:53:35Z", "hours": 1.4144, "text": "Started adding quite some things, but more work is required. (I plan on adding more features, this is v2.0, not v1.1 ;) ) 1. Changed the old welcome window for a placeholder OOBE/Setup, 2. Started working on locally saving the notes to be persistant even when you close the browser, 3. Moved my personal projects to a separate folder inside of file explorer, 4. Added an outline to program names in the desktop, so it can work with both dark and light wallpapers, 5. Fixed the problem of when selecting an icon it would move slightly. Wish me luck, I have no idea why the local saving is working (Why does it need a random cryptographic ID?)"}, {"post_id": 64887, "ts": "2026-09-09T16:23:43Z", "hours": 0.5356, "text": "Sticky Notes now has more functions and windows are animated! I still have to code all the saving to localstorage when you click save and displaying them as openeable files, but for now you can export your note to a txt file to view whenever. Also, looking at the screenshot, looks like I made Settings not be a square anymore, probably when making the text centered with the icon… I will fix that too"}, {"post_id": 64864, "ts": "2026-09-09T15:38:39Z", "hours": 0.5381, "text": "I know I said that I was starting school, but the first days we aren’t having a lot of work, and I was dissapointed on only getting a x1.98 multiplier in v1, so I’ve decided to fix everything the reviewers have pointed out, starting by making everything smaller, and using relative percentages, instead of fixed px values both in HTML and in CSS. Secondly, I have added a little animation on the opening and closing of the Start Menu, turns out it was way easier than I thought, I thought that you had to code the animation by hand. I will also add animations to the other windows (probably easier since they all have a common css class). Lastly, I renamed the welcome screen to About Me, as I plan to do an onboarding foor the OS, and some reviewers pointed out that XacOS v1 seemed more like a personal website instead of a WebOS. As you can read, I am also giving more details in the devlog, and doing them more often."}, {"post_id": 64225, "ts": "2026-09-08T14:06:15Z", "hours": 0.2781, "text": "Updated GitHub and touched up some minor things before shipping!"}, {"post_id": 64215, "ts": "2026-09-08T13:37:40Z", "hours": 1.9003, "text": "I figured out how to make windows not do weird things when they are dragged to the right (It was a very simple solution), gave Settings more functions, like changing the font and uploading your own wallpaper, fixed a couple of bugs and made a very simple Sticky Notes app. I think I will update the repo, do some slight changes, and ship XacOS v1.0! (Previous was beta)"}, {"post_id": 63486, "ts": "2026-09-07T11:25:59Z", "hours": 0.7506, "text": "Found a way to preview the page without having to redownload the files every single time, wich was much needed. Added a working start menuthat opens when you click XacOS and closes by clicking it again, opening an app with it or clicking a window. I still have to fix the problem of windows deforming when they get to the right side of the screen…"}, {"post_id": 31831, "ts": "2026-07-20T15:00:58Z", "hours": 1.7636, "text": "Of course it didn’t work after reorganizing the code. After fixing it up I started implementing the Start Menu (still needs a lot of work) , and only had opened Welome Screen, so I din’t realise that every other window closed with the start Menu, so I started re-cheking the code and found nothing, changed a couple of things that I thought hat was causing that, nothing. I gave up and asked Github AI what was going on but it DIDN’T KNOW (and tried rewriting my code)… I ended up checking again the html….. there was a missing div ending declaration. AAAAAAAAA"}, {"post_id": 27254, "ts": "2026-07-12T17:27:11Z", "hours": 0.9331, "text": "Tidied up a lot the JavaScript code. Much needed! Now to try if it still works… fingers crossed"}, {"post_id": 23785, "ts": "2026-07-06T22:39:30Z", "hours": 0.5344, "text": "Fixing up the README and setting up github pages"}, {"post_id": 23772, "ts": "2026-07-06T22:06:57Z", "hours": 2.1356, "text": "Hooray! I think version 1 of XacOS is finished. It is still pretty barebones and the code is a mess (compared to what others have done this is worthless), but I hope I can polish everything in WebOS 2. All the basics are done and I added the feature of icons of open apps in the taskbar, and when you click it it brings the window to the top"}, {"post_id": 23673, "ts": "2026-07-06T19:43:09Z", "hours": 2.3122, "text": "Project is going great! Alough I’m going crazy trying to figure out why The pop up projects movat the same time as the main projects window…"}, {"post_id": 22881, "ts": "2026-07-05T14:44:56Z", "hours": 0.6561, "text": "I didn’t have Hackatime set up properly… But yesterday I locked in and did 71 different versions of XacOS (Each one with a little bit more things than the one before) Last thing I have done fllowing the guide was making the window openable and closable. I kinda panicked when tidying up the code a little bit all the JS stopped working, but it’s fixed now. (btw, I spent way more than 37min on this)"}]...
|
Title: XacOS by @xacobema | Stardance
Devlogs:
I Title: XacOS by @xacobema | Stardance
Devlogs:
I didn’t have Hackatime set up properly… But yesterday I locked in and did 71 different versions of XacOS (Each one with a little bit more things than the one before) Last thing I have done fllowing the guide was making the window openable and closable. I kinda panicked when tidying up the code a little bit all the JS stopped working, but it’s fixed now. (btw, I spent way more than 37min on this)
Project is going great! Alough I’m going crazy trying to figure out why The pop up projects movat the same time as the main projects window…
Hooray! I think version 1 of XacOS is finished. It is still pretty barebones and the code is a mess (compared to what others have done this is worthless), but I hope I can polish everything in WebOS 2. All the basics are done and I added the feature of icons of open apps in the taskbar, and when you click it it brings the window to the top
Fixing up the README and setting up github pages
Tidied up a lot the JavaScript code. Much needed! Now to try if it still works… fingers crossed
Of course it didn’t work after reorganizing the code. After fixing it up I started implementing the Start Menu (still needs a lot of work) , and only had opened Welome Screen, so I din’t realise that every other window closed with the start Menu, so I started re-cheking the code and found nothing, changed a couple of things that I thought hat was causing that, nothing. I gave up and asked Github AI what was going on but it DIDN’T KNOW (and tried rewriting my code)… I ended up checking again the html….. there was a missing div ending declaration. AAAAAAAAA
Found a way to preview the page without having to redownload the files every single time, wich was much needed. Added a working start menuthat opens when you click XacOS and closes by clicking it again, opening an app with it or clicking a window. I still have to fix the problem of windows deforming when they get to the right side of the screen…
I figured out how to make windows not do weird things when they are dragged to the right (It was a very simple solution), gave Settings more functions, like changing the font and uploading your own wallpaper, fixed a couple of bugs and made a very simple Sticky Notes app. I think I will update the repo, do some slight changes, and ship XacOS v1.0! (Previous was beta)
Updated GitHub and touched up some minor things before shipping!
I know I said that I was starting school, but the first days we aren’t having a lot of work, and I was dissapointed on only getting a x1.98 multiplier in v1, so I’ve decided to fix everything the reviewers have pointed out, starting by making everything smaller, and using relative percentages, instead of fixed px values both in HTML and in CSS. Secondly, I have added a little animation on the opening and closing of the Start Menu, turns out it was way easier than I thought, I thought that you had to code the animation by hand. I will also add animations to the other windows (probably easier since they all have a common css class). Lastly, I renamed the welcome screen to About Me, as I plan to do an onboarding foor the OS, and some reviewers pointed out that XacOS v1 seemed more like a personal website instead of a WebOS. As you can read, I am also giving more details in the devlog, and doing them more often.
Sticky Notes now has more functions and windows are animated! I still have to code all the saving to localstorage when you click save and displaying them as openeable files, but for now you can export your note to a txt file to view whenever. Also, looking at the screenshot, looks like I made Settings not be a square anymore, probably when making the text centered with the icon… I will fix that too
Started adding quite some things, but more work is required. (I plan on adding more features, this is v2.0, not v1.1 ;) ) 1. Changed the old welcome window for a placeholder OOBE/Setup, 2. Started working on locally saving the notes to be persistant even when you close the browser, 3. Moved my personal projects to a separate folder inside of file explorer, 4. Added an outline to program names in the desktop, so it can work with both dark and light wallpapers, 5. Fixed the problem of when selecting an icon it would move slightly. Wish me luck, I have no idea why the local saving is working (Why does it need a random cryptographic ID?)
I added quite some new features, including: 1. Most setup/OOBE is done, but I will probably add the cusomization options in there. 2. Added a low graphics mode, as some reviewers pointed out that XacOS ran badly on their PC, wich disables animations and disables blur. 3.Compressed all images, wich will also help with performane. 4.Added a new wallpaper by NASA, to resemble StarDance. 5. Added a Security section in settings, wich checks for the URL to make sure it is “genuine XacOS” (It is just a gimmick, XacOS is still completly open source) 6. Added a factory reset option in settings, wich deletes all settings and files saved in localStorage. 7. Added a start-up sound. Still have some things that I want to add but I’m happy on how this is turning out, altough I lost my streak because of school…
Let’s see if I remember everything: 1. Changed the default system font to one that I think fits better 2. Added paint.js as an app 3. Added user profile customization, with profile picture and username (for now it doesn’t do much, just show it in the start menu) 4. Now there’s a little indicator in the taskbar on what app is currently on top 5. Changed the buttons of the notes apps to icons 6. Setup now tells you to choose your favourite font 7. A little calendar will appear when hovering over the date and time on the taskbar 8. Made most settings persist between page refresh with localStorage and some minor bug-fixes, like the aboutMe screen not going to the top when it’s taskbar icon was clicked. I thinks that’s everything, I also plan on adding at least one or two more apps coded by me and maybe something like a launcher or app store for iframe/embeded stuff by other people
Ships:
I think I finally finished the first version of XacOS! It was quite challenging to fix up bugs, as I had never coded in HTML nor JavaScript
XacOS v1.0 [You will probably have to zoom out to see everything properly, I didn´t find a reliable and simple way to make everything fit every screen, altough there is probably a way] What’s new in 1.0 Fixed bugs, like the windows changing shape when dragged to the right corner of the screen Revamped settings: you can now add your own wallpaper, change the font of the whole OS and see some information about your PC Added very simple notes app Start menu: access it by clicking the XacOS logo in the corner of the taskbar, see and open all of your apps There was A LOT of debugging Honestly, since almost 2 months have passed since I made v0.1, and that being my first real experience with HTML, CSS and JavaScript, and also forgetting how I coded the project, this update was a little challenging. Obviously, a lot of googling and W3schools helped me. I still think that maybe in the future I will make a 1.1 or 2.0 with more interesting features, but as a first experience with web development, I think it was great. I would love to mke 1.1 now, but I start school tomorrow, so it’s going to be difficult… Also, thank you very much HackClub and all it’s volunteers for making these awesome projects, I hope summer next year I will be able to participate again, because it’s the last year before I turn 18 😭...
|
1793278117.235277
|
1793364517.235277
|
|
33594
|
Autonomous Trash Drone by @randymo | Stardance
|
randymo
|
0
|
26.73
|
0
|
[]
|
[{"post_id": 71403, "ts": "202 [{"post_id": 71403, "ts": "2026-09-20T19:14:18Z", "hours": 1.6564, "text": "SO MUCH CODING DONE - did not get to record this sadly and took a long break but me and my friend are back at it now and we’re almost completely done with everything on his side(the 3d modeling) and my side(the coding). Below are 4/8 of the scripts that i’ve made so far."}, {"post_id": 32774, "ts": "2026-07-22T04:41:10Z", "hours": 6.6297, "text": "Devlog 4: Worked on actually coding the logic i explained in the previous devlog, coding went smooth with minimal issues. Only issue is if this will actually work when i am able to get funding for the actual hardware, I adjusted and researched a lot to make sure the code I’m creating would be compatible with the hardware I get. I also was able to create some extra logic ideas to patch up issues such as a system where it remembers areas it has already scanned and can use them to readjust and drifting that may have occurred with the data. Also was able to make it make decisions on where to fly and its overall flight direction although it still needs some adjusting for an accurate and efficient flight path. -Next time I work I’ll have to connect it to the flight script so It can actually command the flight controller to do stuff as well as finalize the flight paths. P.S. I also need to fix the drift correct system."}, {"post_id": 32584, "ts": "2026-07-21T21:08:01Z", "hours": 11.575, "text": "Devlog 3: We started working on our own custom SLAM from scratch for a roomba styled tracking system where the autonomous drone already knows where it has already searched The actual coding wasn’t completed very much but we fully understand how the whole system logic will work and what we have to code. To summarize it uses the flight controllers outputs like its yaw, position, and velocity to calculate an initial pose, then creates creates a grid of boxes that contain data to hold status like free, unknown, and blocked based off of the coordinates from our lidar data we converted. It then compares the map of lidar scans that moves based off the pose to the current scan, slowly making slight adjustments to find how much the drone actually moved in real life. This data is then used and converted into another grid that stores only where the drone has been and is used for the whole logic of not checking the same place over and over again."}, {"post_id": 29918, "ts": "2026-07-17T03:00:14Z", "hours": 5.0744, "text": "Devlog #2: Today focused on advancing both the software and mechanical portions of the autonomous trash collection drone. On the software side, the LiDAR subsystem was completed. The Python script for the RPLIDAR C1 was finalized, including initialization, communication with the sensor, and collection of scan data. The script now reads distance measurements and angles from the LiDAR, providing the foundation for future obstacle detection and avoidance logic. Time was also spent organizing the software architecture and researching the required Python libraries for each subsystem of the drone. The project dependencies were separated into categories for computer vision, sensor processing, flight control, and networking, and virtual development environments were configured and tested to prepare for future development. On the mechanical side, significant progress was made on the robotic gripper assembly. Most of the CAD modeling for the gripper arm was completed, including the overall geometry, servo mounting, gear layout, and finger mechanism. Existing component dimensions were reviewed to ensure compatibility with the DS3218 servo, bearings, and planned fasteners. The gripper design is now largely complete and serves as the primary end effector for the drone’s trash collection system. Overall, today’s work established a solid foundation for both the software and hardware systems. The LiDAR subsystem is now operational at the software level, the project’s development environments are organized for continued programming, and the gripper assembly has reached an advanced stage of mechanical design. These milestones prepare the project for integration of obstacle avoidance, object detection, and physical manipulation in future development sessions."}, {"post_id": 28502, "ts": "2026-07-14T19:54:24Z", "hours": 1.7919, "text": "Dev Log #1 – Today I continued working on the mechanical design of the autonomous trash-collecting drone, focusing on the robotic arm and gripper assembly. The main objective was to determine the overall dimensions of the arm, select appropriate hardware, and make design decisions before continuing the CAD model. During today’s work, I finalized the decision to use three DS3218 high-torque servos throughout the robotic arm, including the gripper. Although a smaller servo was considered for the claw, I decided to use the same servo for all three joints to simplify the design, reduce the number of different components, and make future maintenance easier. I also continued determining the dimensions of the upper arm, forearm, and gripper based on the expected payload and overall size of the drone. The arm will be constructed from CF PETG using a lightweight truss-style structure to maximize rigidity while minimizing weight. I researched the DS3218 servo output shaft and confirmed that it uses a 25T spline, which will be used for the servo-driven joints. I also standardized the hardware by selecting M3 machine screws for servo mounting and the majority of the structural connections throughout the arm. A large portion of today’s work focused on the gripper mechanism. After evaluating several concepts, I decided to use a three-gear synchronized design consisting of one servo-driven center gear and two mirrored gears connected to each finger so that both fingers open and close together. I also selected a 1:1 gear ratio and began determining appropriate gear sizes and the overall dimensions of the gripper housing to fit the DS3218 servo. In addition to the mechanical design, I estimated the overall weight of the drone using the currently selected components to ensure the chosen propulsion system should be capable of lifting both the aircraft and its expected payload. This estimate will continue to be refined as the CAD model progresses and additional components are finalized. The next stage of development will focus on continuing the CAD model of the gripper, finalizing the gear layout, finger dimensions, and mounting points, and completing the remaining mechanical details of the robotic arm before beginning assembly of the full system."}]...
|
Title: Autonomous Trash Drone by @randymo | Starda Title: Autonomous Trash Drone by @randymo | Stardance
Devlogs:
Dev Log #1 – Today I continued working on the mechanical design of the autonomous trash-collecting drone, focusing on the robotic arm and gripper assembly. The main objective was to determine the overall dimensions of the arm, select appropriate hardware, and make design decisions before continuing the CAD model. During today’s work, I finalized the decision to use three DS3218 high-torque servos throughout the robotic arm, including the gripper. Although a smaller servo was considered for the claw, I decided to use the same servo for all three joints to simplify the design, reduce the number of different components, and make future maintenance easier. I also continued determining the dimensions of the upper arm, forearm, and gripper based on the expected payload and overall size of the drone. The arm will be constructed from CF PETG using a lightweight truss-style structure to maximize rigidity while minimizing weight. I researched the DS3218 servo output shaft and confirmed that it uses a 25T spline, which will be used for the servo-driven joints. I also standardized the hardware by selecting M3 machine screws for servo mounting and the majority of the structural connections throughout the arm. A large portion of today’s work focused on the gripper mechanism. After evaluating several concepts, I decided to use a three-gear synchronized design consisting of one servo-driven center gear and two mirrored gears connected to each finger so that both fingers open and close together. I also selected a 1:1 gear ratio and began determining appropriate gear sizes and the overall dimensions of the gripper housing to fit the DS3218 servo. In addition to the mechanical design, I estimated the overall weight of the drone using the currently selected components to ensure the chosen propulsion system should be capable of lifting both the aircraft and its expected payload. This estimate will continue to be refined as the CAD model progresses and additional components are finalized. The next stage of development will focus on continuing the CAD model of the gripper, finalizing the gear layout, finger dimensions, and mounting points, and completing the remaining mechanical details of the robotic arm before beginning assembly of the full system.
Devlog #2: Today focused on advancing both the software and mechanical portions of the autonomous trash collection drone. On the software side, the LiDAR subsystem was completed. The Python script for the RPLIDAR C1 was finalized, including initialization, communication with the sensor, and collection of scan data. The script now reads distance measurements and angles from the LiDAR, providing the foundation for future obstacle detection and avoidance logic. Time was also spent organizing the software architecture and researching the required Python libraries for each subsystem of the drone. The project dependencies were separated into categories for computer vision, sensor processing, flight control, and networking, and virtual development environments were configured and tested to prepare for future development. On the mechanical side, significant progress was made on the robotic gripper assembly. Most of the CAD modeling for the gripper arm was completed, including the overall geometry, servo mounting, gear layout, and finger mechanism. Existing component dimensions were reviewed to ensure compatibility with the DS3218 servo, bearings, and planned fasteners. The gripper design is now largely complete and serves as the primary end effector for the drone’s trash collection system. Overall, today’s work established a solid foundation for both the software and hardware systems. The LiDAR subsystem is now operational at the software level, the project’s development environments are organized for continued programming, and the gripper assembly has reached an advanced stage of mechanical design. These milestones prepare the project for integration of obstacle avoidance, object detection, and physical manipulation in future development sessions.
Devlog 3: We started working on our own custom SLAM from scratch for a roomba styled tracking system where the autonomous drone already knows where it has already searched The actual coding wasn’t completed very much but we fully understand how the whole system logic will work and what we have to code. To summarize it uses the flight controllers outputs like its yaw, position, and velocity to calculate an initial pose, then creates creates a grid of boxes that contain data to hold status like free, unknown, and blocked based off of the coordinates from our lidar data we converted. It then compares the map of lidar scans that moves based off the pose to the current scan, slowly making slight adjustments to find how much the drone actually moved in real life. This data is then used and converted into another grid that stores only where the drone has been and is used for the whole logic of not checking the same place over and over again.
Devlog 4: Worked on actually coding the logic i explained in the previous devlog, coding went smooth with minimal issues. Only issue is if this will actually work when i am able to get funding for the actual hardware, I adjusted and researched a lot to make sure the code I’m creating would be compatible with the hardware I get. I also was able to create some extra logic ideas to patch up issues such as a system where it remembers areas it has already scanned and can use them to readjust and drifting that may have occurred with the data. Also was able to make it make decisions on where to fly and its overall flight direction although it still needs some adjusting for an accurate and efficient flight path. -Next time I work I’ll have to connect it to the flight script so It can actually command the flight controller to do stuff as well as finalize the flight paths. P.S. I also need to fix the drift correct system.
SO MUCH CODING DONE - did not get to record this sadly and took a long break but me and my friend are back at it now and we’re almost completely done with everything on his side(the 3d modeling) and my side(the coding). Below are 4/8 of the scripts that i’ve made so far....
|
1792691247.0073178
|
1793296047.0073178
|
|
61892
|
My Basic Portfolio by @Darknow90 | Stardance
|
Darknow90
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T19:54:23Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I’m very happy to finish this project , I made : -3 categories -A pages for my project -2 pages about me Thanks you for this challenge !", "repo": "https://github.com/Manu7611/MyBasicPortfolio", "demo": "https://manu7611.github.io/MyBasicPortfolio/"}]...
|
[{"post_id": 71411, "ts": "202 [{"post_id": 71411, "ts": "2026-09-20T19:36:09Z", "hours": 0.3167, "text": "DevLog #8 : I made the Readme and I’m ready to ship my project now !"}, {"post_id": 70763, "ts": "2026-09-19T18:36:21Z", "hours": 0.36, "text": "DevLog #7 : I restructured the code a bit and added an icon in front of the bar, but that last session wasn’t very productive… I think I’ll submit my project at this stage and keep improving it once I have new ideas!"}, {"post_id": 70218, "ts": "2026-09-18T18:49:09Z", "hours": 0.3333, "text": "DevLog #6: Hehe NyanCat is here now 🤣. Anything to add at my page ?"}, {"post_id": 69785, "ts": "2026-09-17T19:43:30Z", "hours": 0.7017, "text": "DevLog #5 : Working on css but it’s impossible to make a rainbow animation like 90s 😭"}, {"post_id": 69314, "ts": "2026-09-16T19:41:37Z", "hours": 0.5706, "text": "DevLog #4 : I worked on the css and now I can understand more things ! It’s not very beautiful but for now It’s okay."}, {"post_id": 68810, "ts": "2026-09-15T19:46:43Z", "hours": 1.0628, "text": "DevLog #3 : I found the problem in my code thanks to the comments 🤣. Now I’m trying to improve the aesthetics, but I really don’t see how, lol."}, {"post_id": 68252, "ts": "2026-09-14T19:43:37Z", "hours": 0.65, "text": "DevLog #2 : I’m working on the logic of the js code to switch on each text without make other page but it’s difficult…"}, {"post_id": 67641, "ts": "2026-09-13T19:52:39Z", "hours": 0.2833, "text": "Devlog #1: Sorry , I don’t have a lot of time today 😭. I just set up my index and link the js ,css and my pages of projects…"}]...
|
Title: My Basic Portfolio by @Darknow90 | Stardanc Title: My Basic Portfolio by @Darknow90 | Stardance
Devlogs:
Devlog #1: Sorry , I don’t have a lot of time today 😭. I just set up my index and link the js ,css and my pages of projects…
DevLog #2 : I’m working on the logic of the js code to switch on each text without make other page but it’s difficult…
DevLog #3 : I found the problem in my code thanks to the comments 🤣. Now I’m trying to improve the aesthetics, but I really don’t see how, lol.
DevLog #4 : I worked on the css and now I can understand more things ! It’s not very beautiful but for now It’s okay.
DevLog #5 : Working on css but it’s impossible to make a rainbow animation like 90s 😭
DevLog #6: Hehe NyanCat is here now 🤣. Anything to add at my page ?
DevLog #7 : I restructured the code a bit and added an icon in front of the bar, but that last session wasn’t very productive… I think I’ll submit my project at this stage and keep improving it once I have new ideas!
DevLog #8 : I made the Readme and I’m ready to ship my project now !
Ships:
I’m very happy to finish this project , I made : -3 categories -A pages for my project -2 pages about me Thanks you for this challenge !...
|
1793209836.7562242
|
1793296236.7562242
|
|
56480
|
21 Days of Python by @LPcomix123 | Stardance
|
LPcomix123
|
1
|
11.42
|
21
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-19T20:09:23Z", "hours": 11.0, "multiplier": 1.96, "payout": 21, "blessing": "neutral", "text": "I made Sticky Streaks for the 21 Days of Python challenge. I started with a basic Python project and slowly added more features over the 21 days, including a day counter, coin flip, dice, number guesser, calculator, Magic 8 Ball, slot machine, unit converter and more. The hardest part was probably keeping myself working on it for all 21 days and fixing all the random bugs I came across. I’m really proud that I actually finished it and managed to keep adding things throughout the challenge. If you want to test it, just download the project and run main.py. Have fun :)", "repo": "https://github.com/LPcomix123/21-Days-of-Python", "demo": "https://github.com/LPcomix123/21-Days-of-Python/releases/tag/v1.0.0"}]...
|
[{"post_id": 71421, "ts": "202 [{"post_id": 71421, "ts": "2026-09-20T19:51:47Z", "hours": 0.4164, "text": "I’ve added an executable for windows for the reviewer to the release page Here and updated the Installation guide in the readme Here and finally I have vibe-coded a cool website for the project Here and added a link to my main website Here and finally I have changed the banner, and that’s it! :)"}, {"post_id": 70707, "ts": "2026-09-19T16:58:38Z", "hours": 1.0258, "text": "Days 18-21!!!!! Over the past few days I have added and fixed and polished the last few features and I think the last commit ever to this project will give you an understanding to what I have done over the past few days and how I feel, here it is: Added it so you can exit the calculator easier just by typing \"exit\", added a new log to the about section and added completed text for after the completion date of: 19 of September 2026, removed a feature cause i wont have time to fulfill it and I have removed the under development text cause it's all done!!!!!!!!!!! :) Thank you to everyone who has followed this journey from day 1 to day 21! CYA!!!! :) , there ya go, this is the last devlog to this project and I am really proud of the way I have come and what I have learned over this period and yeah, that is 21 DAYS OF PYTHON , thank you all for following along and bye! :)"}, {"post_id": 69016, "ts": "2026-09-16T07:01:53Z", "hours": 0.5383, "text": "Days 15-17! Over the past few days I have addded a modderate amount of features and those are: a first working version of the calculator, more dev friendly spacing, bug fixes and another few new number guesser session stats. Anddthose were Days 15-17"}, {"post_id": 67526, "ts": "2026-09-13T17:20:38Z", "hours": 0.4069, "text": "Day 14! Finally got to the 2/3 milestone, ok, today I haven’t done too much again, but I have added a working most guesses counter and a buggy fewest guesses counter in the number guesser stats feature, but I have fixed a bug where if you haven’t played a number guesser game before in that session it would error but now it doesn’t. And that’s Day 14! :) p.s. sorry for light mode in images"}, {"post_id": 66221, "ts": "2026-09-11T22:11:54Z", "hours": 1.0608, "text": "Days 11-13! Over the past few days I have added a WORKING magic 8 ball and fixed all the bugs in it, I have added some stats to the number guesser and I have fixed some bugs that have been in the back of my mind"}, {"post_id": 64457, "ts": "2026-09-08T21:08:02Z", "hours": 0.2872, "text": "Day 10! Finally got to double digits, almost half way to the ultimate plushie goal, anyway today I have added: a basic feature under development feature, and I tested and fixed a few bugs, and that’s it really, anyway bye, That’s Day 10!"}, {"post_id": 63838, "ts": "2026-09-07T20:20:05Z", "hours": 1.2444, "text": "Day 7-9! over the past 3 days I have added a new Easter egg, I have fixed a lot of bugs and just other cool stuff, I have mainly over the past 3 days, been sailing and making my pc multi-bootable with 5 Linux distros and windows, then I’m gonna customise my Grub. And that’s Days 7-9!"}, {"post_id": 61769, "ts": "2026-09-04T20:47:28Z", "hours": 1.0753, "text": "Day 6! Well today I have brought back a big hour of development to the project, and today I have accomplished: finalised the countdown and started the number guesser game, I have added difficulty levels to the number guesser: Easy, Medium, Hard, Extreme, and UNLIMITED; and I have made the difficulties actually work, I have added basic exit and checking code, and started range validation! And that’s Day 6!"}, {"post_id": 60782, "ts": "2026-09-03T11:33:47Z", "hours": 0.4056, "text": "Day 5!, Another day of barely anything to do with this project, but in fairness I have got my website running on Hackclub Nest, but Today I have added: emojis to the main menu and I have added Time up text to the Countdown feature, and that’s Day 5"}, {"post_id": 60164, "ts": "2026-09-02T11:27:55Z", "hours": 0.4672, "text": "Day 4! Again today I haven’t done a lot but I have done a cool feature; I have committed the first version of a Countdown timer, and I have fixed all known bugs and given it some flare as well as a small update to an Easter egg but I’m probably going to do some Roblox game dev for the rest of the day, and that’s Day 4! :)"}, {"post_id": 59445, "ts": "2026-09-01T09:26:43Z", "hours": 0.2992, "text": "Day 3! Today I haven’t done as much as usual, but I have done something; I have added the Dice Roller feature and tested and fixed the bugs in it, I gave the Dice Roller some flair by adding emojis, I’m probably gonna spend the rest of today doing some pc config, but that’s Day 3. :)"}, {"post_id": 59116, "ts": "2026-08-31T19:00:18Z", "hours": 2.7858, "text": "Day 2! Today I have fully completed and tested the modular foundation (a day early) and I have added a working day counter out of 21, I have finished laying out the about section and the main menu and I have updated the code behind “feature 5 is currently in development, please check again later” so its a lot simpler, I have also added comments to keep the big chunk of code organised, and FINALLY I have added and tested a coin flip mechanic that has an invalid option fallback similar to the main menu’s one, and I have shown the code to my Dad and he has officially approved!!! 😃"}, {"post_id": 58495, "ts": "2026-08-30T22:21:51Z", "hours": 1.1078, "text": "Day 1! I have coded a startup message and a main menu with a modular “if mode is” architecture for later features, the menu also has an Exit option that displays a goodbye message and quits the program, the program has a nice typewriter typing style and uses a few functions to save time as well as all the options are in a list to save time writing type(“…”) over and over again, I’d say a pretty successful day 1! :)"}]...
|
Title: 21 Days of Python by @LPcomix123 | Stardanc Title: 21 Days of Python by @LPcomix123 | Stardance
Devlogs:
Day 1! I have coded a startup message and a main menu with a modular “if mode is” architecture for later features, the menu also has an Exit option that displays a goodbye message and quits the program, the program has a nice typewriter typing style and uses a few functions to save time as well as all the options are in a list to save time writing type(“…”) over and over again, I’d say a pretty successful day 1! :)
Day 2! Today I have fully completed and tested the modular foundation (a day early) and I have added a working day counter out of 21, I have finished laying out the about section and the main menu and I have updated the code behind “feature 5 is currently in development, please check again later” so its a lot simpler, I have also added comments to keep the big chunk of code organised, and FINALLY I have added and tested a coin flip mechanic that has an invalid option fallback similar to the main menu’s one, and I have shown the code to my Dad and he has officially approved!!! 😃
Day 3! Today I haven’t done as much as usual, but I have done something; I have added the Dice Roller feature and tested and fixed the bugs in it, I gave the Dice Roller some flair by adding emojis, I’m probably gonna spend the rest of today doing some pc config, but that’s Day 3. :)
Day 4! Again today I haven’t done a lot but I have done a cool feature; I have committed the first version of a Countdown timer, and I have fixed all known bugs and given it some flare as well as a small update to an Easter egg but I’m probably going to do some Roblox game dev for the rest of the day, and that’s Day 4! :)
Day 5!, Another day of barely anything to do with this project, but in fairness I have got my website running on Hackclub Nest, but Today I have added: emojis to the main menu and I have added Time up text to the Countdown feature, and that’s Day 5
Day 6! Well today I have brought back a big hour of development to the project, and today I have accomplished: finalised the countdown and started the number guesser game, I have added difficulty levels to the number guesser: Easy, Medium, Hard, Extreme, and UNLIMITED; and I have made the difficulties actually work, I have added basic exit and checking code, and started range validation! And that’s Day 6!
Day 7-9! over the past 3 days I have added a new Easter egg, I have fixed a lot of bugs and just other cool stuff, I have mainly over the past 3 days, been sailing and making my pc multi-bootable with 5 Linux distros and windows, then I’m gonna customise my Grub. And that’s Days 7-9!
Day 10! Finally got to double digits, almost half way to the ultimate plushie goal, anyway today I have added: a basic feature under development feature, and I tested and fixed a few bugs, and that’s it really, anyway bye, That’s Day 10!
Days 11-13! Over the past few days I have added a WORKING magic 8 ball and fixed all the bugs in it, I have added some stats to the number guesser and I have fixed some bugs that have been in the back of my mind
Day 14! Finally got to the 2/3 milestone, ok, today I haven’t done too much again, but I have added a working most guesses counter and a buggy fewest guesses counter in the number guesser stats feature, but I have fixed a bug where if you haven’t played a number guesser game before in that session it would error but now it doesn’t. And that’s Day 14! :) p.s. sorry for light mode in images
Days 15-17! Over the past few days I have addded a modderate amount of features and those are: a first working version of the calculator, more dev friendly spacing, bug fixes and another few new number guesser session stats. Anddthose were Days 15-17
Days 18-21!!!!! Over the past few days I have added and fixed and polished the last few features and I think the last commit ever to this project will give you an understanding to what I have done over the past few days and how I feel, here it is: Added it so you can exit the calculator easier just by typing "exit", added a new log to the about section and added completed text for after the completion date of: 19 of September 2026, removed a feature cause i wont have time to fulfill it and I have removed the under development text cause it's all done!!!!!!!!!!! :) Thank you to everyone who has followed this journey from day 1 to day 21! CYA!!!! :) , there ya go, this is the last devlog to this project and I am really proud of the way I have come and what I have learned over this period and yeah, that is 21 DAYS OF PYTHON , thank you all for following along and bye! :)
I’ve added an executable for windows for the reviewer to the release page Here and updated the Installation guide in the readme Here and finally I have vibe-coded a cool website for the project Here and added a link to my main website Here and finally I have changed the banner, and that’s it! :)
Ships:
I made Sticky Streaks for the 21 Days of Python challenge. I started with a basic Python project and slowly added more features over the 21 days, including a day counter, coin flip, dice, number guesser, calculator, Magic 8 Ball, slot machine, unit converter and more. The hardest part was probably keeping myself working on it for all 21 days and fixing all the random bugs I came across. I’m really proud that I actually finished it and managed to keep adding things throughout the challenge. If you want to test it, just download the project and run main.py. Have fun :)...
|
1793346829.0519884
|
1793433229.0519884
|
|
7165
|
Eve by @Light | Stardance
|
Light
|
1
|
294.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T20:53:22Z", "hours": 294.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Eve is a graphics engine written entirely in Vulkan , with the primary goal of learning Vulkan and C++ while simplifying their usage. Originally conceived as a simple, lightweight wrapper around Vulkan , Eve now includes: A Render Graph designed from scratch that leverages technologies such as memory aliasing (where multiple resources share the same memory space) and resource pooling (reusing resources across frames). It performs the core function of a Render Graph: by simply knowing how resources are utilized, it automatically issues the necessary synchronization barriers to the GPU. Developing the Render Graph was a grueling process, but it proved worthwhile in terms of both performance and the educational value of the experience. An ECS (Entity Component System) also designed from scratch, following the model of Unity’s DOTS ECS . Instead of scattering resources across VRAM—which slows down access due to constant memory jumps—game objects are organized into Archetypes. Components are distributed in contiguous memory batches, thereby minimizing cache misses. A rendering system that automates the insertion of transforms into buffers; these are subsequently processed into matrices via a compute shader and sent to the rendering shaders. It also features a material system that analyzes shader composition, looking for a struct named “Properties” that allows fields to be assigned by name from the C++ side. Support for the Slang shading language with a bindless system . Eve provides a file named Eve.slangh that simplifies and automates the retrieval of textures, buffers, and samplers from descriptors. Compute shader support is also included. An integrated, easy-to-use Input system inspired by Unity’s Input System , along with a lightweight UI wrapper that makes using Dear ImGui simpler and more intuitive. Eve also includes a demo featuring a gravitational simulation of thousands of entities orbiting a black hole, allowing various parameters to be adjusted in real-time.", "repo": "https://github.com/SonoUnBot09/Eve", "demo": "https://github.com/SonoUnBot09/Eve/releases/tag/v1.0.0"}]...
|
[{"post_id": 71422, "ts": "202 [{"post_id": 71422, "ts": "2026-09-20T19:52:09Z", "hours": 8.8461, "text": "DEVLOG 36 - Black Hole! Hi Stardance! Intro I’ve been working really hard lately, and I think I’ve reached a milestone with Eve that I honestly never expected to hit. The project is finally complete; now I just need to click that nice button to ship it. I’ve spent this time working on the README, improving the documentation, fixing bugs, and building a demo using Eve. Eve Demo The demo is a gravity simulation featuring hundreds of thousands of entities orbiting a black hole. You can tweak various parameters—such as time, the black hole’s gravitational pull, lighting, colors, meshes, and much more. If you’d like to test it out, you can find it in the GitHub releases; there’s a ready-to-use .exe, or the source code if you’re on Linux—or if you simply want to understand how Eve works or make some modifications yourself. Problems Encountered While building the demo, I ran into—and have since resolved—some very frustrating bugs, such as memory corruption in the ECS caused by the continuous creation and destruction of entities and their components. I also added UI text support and implemented the ability to register “stages” belonging to classes or structs that can be called by the engine."}, {"post_id": 70544, "ts": "2026-09-19T10:27:28Z", "hours": 8.0992, "text": "DEVLOG 35 - Documentation Hi Stardance! Intro I’ve finally finished writing the documentation for Eve—a rather tedious and repetitive process, but a necessary one. How The Docs Is Structured: Every part of the engine is documented; inside the docs folder, you’ll find instructions on how to launch the engine, along with subfolders for each component—graphics, input, window management, and so on. Next Last Steps: I still need to create the README and tidy up a few things in the project, as well as write instructions on how to configure Eve for use on one’s own PC… But after a whole summer, I’m finally close to shipping!"}, {"post_id": 69366, "ts": "2026-09-16T22:11:41Z", "hours": 2.8144, "text": "DEVLOG 34 - Icon, Windows & More Hi Stardance! Intro The release is getting close, so I’m tidying up a few final details; I’ve finally turned my attention to a slightly more relaxed and lighthearted part of the project. Engine Settings I added a method to start the engine that accepts configuration settings for how the app runs. You can also choose whether or not to enable VSync at runtime. Window Class I added a window management class that allows for various operations, such as toggling fullscreen mode and manually changing the resolution, position, title, etc. I also included a method to set the window icon using a PNG image. Eve’s Icon I also spent some time on Canva trying to create an icon—a logo—for Eve. After several attempts, I settled on the one in the attachment."}, {"post_id": 68288, "ts": "2026-09-14T21:13:02Z", "hours": 4.0392, "text": "DEVLOG 33 - Meshes & Fixes Hi Stardance! Intro We’re getting closer to the release build of Eve! I have to say that with this devlog, the engine is practically finished and ready for shipping; I just need to tweak a few final details and we’re all set… Meshes: In this devlog, I worked on the mesh system—fleshing it out and making it functional—and added standard meshes to Eve: a cube, a UV sphere, an icosphere, a plane, and a quad. Some Bugs Fixed While implementing this, the program kept crashing for no apparent reason; after two hours of debugging, I found the error in the Render Graph—caused by the order of Eve’s internal passes—which is now fixed. Internal Shaders Organization I also embedded the engine’s internal shaders directly into the executable, so there’s no need to remember to include them alongside the executable when creating an app. The video shows the same UI as the previous devlog—featuring controls for color, rotation, cube position, and direct light direction—but this time, you can change the meshes of the “thousand-odd” cubes at runtime using the standard Eve meshes listed above, via a simple UI dropdown menu."}, {"post_id": 67640, "ts": "2026-09-13T19:52:38Z", "hours": 7.8861, "text": "DEVLOG 32 - UI Support Hi Stardance, Intro I’ve been working on the UI lately, as I wanted to give the user a way to interact with the engine beyond just mouse and keyboard input. The UI in Eve I opted for Dear ImGui and created a lightweight wrapper that allows it to run within Eve. I stripped away some of the boilerplate code associated with the standard Begin and End calls, making it slightly simpler and safer to use than raw ImGui. I also added support for dockable windows. The video shows a scene with 1,000 cubes; thanks to the UI, you can modify their color, position, and rotation. You can also change the direction of the direct light. The code required by this UI is just five lines."}, {"post_id": 65309, "ts": "2026-09-10T11:36:28Z", "hours": 0.2975, "text": "DEVLOG 31 - It’s not my fault! Hi Stardance! Unlike the other devlogs, this one is very quick and simple. A Little Recap In devlog 29, I encountered some issues with RenderDoc, even though the app kept running fine and caused no problems outside of RenderDoc itself. What I Did After doing some online research, I discovered that RenderDoc has issues with AMD drivers, which can cause the app to crash. So, I decided to try AMD’s Radeon Developer Tools (a profiler similar to RenderDoc, designed specifically for AMD GPUs). No errors were reported and everything works perfectly, so the problem most likely lies in how AMD drivers interface with RenderDoc."}, {"post_id": 64811, "ts": "2026-09-09T14:20:04Z", "hours": 5.6439, "text": "DEVLOG 30 - Compute Shaders Hi Stardance! Intro I’ve finally implemented compute shaders—as the title suggests—alongside conducting some tests and reorganizing the project. Compute Shader Support I’ve added support for compute shaders, meaning they can now be used just like any other type of pass, whether graphics or transfer. Optimizations I’ve also utilized compute shaders internally within the engine to speed up matrix calculations; here are the results: With 100,000 entities using instanced rendering, I’m getting 800 FPS, up from the previous 250. With 1,000,000 entities using instanced rendering, I’m getting around 90 FPS, up from the previous 30. With 100,000 entities using independent draw calls, I’m getting around 90 FPS, up from the previous 30. I’d say the results speak for themselves, and I’m quite happy with these optimizations. As mentioned in the previous devlog, testing was performed on my PC, which is equipped with a Ryzen 5 5600X and an RX 6600. Swapchain & CMake I also made slight modifications to the swapchain recreation code to make it faster and reduce stuttering. Finally, I tidied up the CMakeLists file to make it more organized and prepare for the release. The video shows a scene with 1M entities rendered in real-time using instanced draw call at 90 FPS"}, {"post_id": 63615, "ts": "2026-09-07T15:19:57Z", "hours": 8.0778, "text": "DEVLOG 29 - 1M Entities! Hi Stardance! Intro Since the last day, I’ve been working alone and have run into several issues… Most of them have been resolved. Some Tests So I started running some tests to check the speed of my new rendering system, and with 100,000 entities drawn to the screen with a single draw call, I was getting 30 FPS. After parallelizing the code a bit and reducing the copies, the results are now better: 100,000 entities with single draw calls get 50-60 FPS. 100,000 entities with a single instanced draw call get 230-250 FPS. 1,000,000 entities with a single instanced draw call get 30 FPS. What Need To Be Optimized Actually, I could optimize even more and double these FPS, but the current problem is that I’m calculating the matrices on the CPU side, so I’m doing a lot of calculations that currently take up a good portion of the necessary CPU time, about 50%. The idea would be to move all the work to the GPU in the future with compute shaders, thus significantly reducing the CPU load. I’ll see if I can do this… Maybe in a while, when I add full support for compute shaders. (I have a Ryzen 5 5600 X and an RX 6600) Rendering System Time: Not counting the matrices, the rendering cycle along with the Render Graph takes about 2-2.5 ms, almost all of which is spent on the Render Graph. I have also fixed some problems with Swapchain Recreation when the window is minimized. Problems With RenderDoc Five of these eight hours have been pure frustration, as I don’t understand why, but the app crashes on RenderDoc. Normally, on my PC it starts and works, but on RenderDoc it crashes… I’ve tried every way to understand the problem, but unfortunately I haven’t been able to. I’ll also test on other PCs to better understand the problem. Unfortunately, I don’t have time on my side, so I’ve had to put the issue aside for now…"}, {"post_id": 61817, "ts": "2026-09-04T22:10:27Z", "hours": 10.2261, "text": "DEVLOG 28 - New Render System Hi Stardance! Intro I think this devlog is consistent with the next one I’m working on, since the work I’ve done in the last few hours isn’t quite finished, as there are still some bugs to resolve… Why a new render system? So far, I’ve been working on improving Eve’s rendering system. Instead of having to manually create buffers and the like, Eve has a completely automated system similar to the one used by Unity. For example, when you try to draw an object, you need things like object transformation matrices. If you then need more data, the limited size of push constants is no longer enough. Per Instance Params Eve, therefore, with its new rendering system, revolutionizes the way we write code, reduces bugs, and simplifies it. For each draw call sent to the GPU, the engine sends a buffer called InstanceParams to the GPU, which contains, for each drawing instance, its model matrix and its inverse. These matrices can then be retrieved using simple, custom functions ready for use in the shader. Per Render View Data For camera data, the process is similar. For each RenderView object, Eve allocates these objects on the GPU in a contiguous buffer from which the view, perspective, VP, and other matrices can be accessed. Custom Draw Info Data If you want to send custom data to the shader, each drawing function offers a pointer called DrawInfo that allows you to send data to the shader, which can then be accessed. If set to null, the shader will not send anything. GLM & A Flycam I also created a flycam and deprecated the Eve math package to use the glm one. Honestly, I want to focus on Eve and not the math, which is why I chose this option. Next Step: I still have some bugs to fix regarding making more than one draw call, but I’m working on it."}, {"post_id": 59920, "ts": "2026-09-01T23:02:30Z", "hours": 7.4931, "text": "DEVLOG 27 - Material System Intro After some code rewrites, such as the separation between shaders and materials, the materials system now works. It’s very similar to how it works in Unity. I’ve figured out how to set things like material properties (floats, integers, vectors, etc.) directly from C++ using their names, without manually binding code. How Vulkan Handle All Of This? In Vulkan, you can’t set a shader parameter directly with a name. You need to create a buffer on the GPU, specifically a UBO, typically used for materials, bind it using a descriptor, and then bind it on the CPU. All of this is hidden by Eve, making the code easier and faster to write. What It Does? Basically, once the shader is compiled, it’s analyzed and checked for a struct called Properties. If it exists, this struct will be used for the material properties. Each field within it will be settable directly from the CPU using its name. Eve, now knowing the size of the struct and the field offsets, creates a buffer for the materials (actually, one for each frame in flight) and uses it to write everything a material might need, thus allowing for very simple parameter setting. How To Use It: The material provides an ID via the GetPropertyUBOId function, which must always be retrieved at each frame since it is not the same from frame to frame. This ID can be sent to the shader via push constant, which then allows access to the material’s property UBO, which contains all the values set on the CPU side. A simple cube rotating on itself using the new Material System and simple direct lighting"}, {"post_id": 58517, "ts": "2026-08-30T23:07:29Z", "hours": 4.8986, "text": "DEVLOG 26 - Input System Hi Stardance! The New Input System Since I couldn’t interact much with the graphics engine at the moment, I chose to create an Input System that currently only supports keyboard and mouse. It has methods like IsKeyDown(...) , GetMouseState(...) , IsMouseUp(...) , and similar ones. It’s quite simple, but it allows you to interact with the world, for example by creating a camera or a moving player. The Cube For fun and to test a bit, I tried creating a scene with a slightly rotated cube with direct light, obviously using my Render Graph, which allows you to do all this in about 150 lines of code (CPU side) instead of having to manually write barriers, configure passes, and many other repetitive tasks. I’m still using glm for matrix math, but I’m trying to reach a more stable level with the Eve package."}, {"post_id": 57455, "ts": "2026-08-29T16:33:40Z", "hours": 7.1736, "text": "DEVLOG 25 - Eve is “Multi PC” Hi everyone! What’s changed since last time? More Device Supported As promised, Eve now uses Vulkan 1.2, so it can be used on multiple devices. Obviously, the device requires that, in addition to supporting Vulkan 1.2, it also supports some extensions that became core in Vulkan 1.3. Tests On Other PCs I then tried running the app on the only PC I had at home, but it crashed. I then tried updating the graphics driver, but that didn’t help; unfortunately, that PC is too old. I then asked a friend of mine to test the app. After fixing some issues, it started, but it would crash instantly. After hours of debugging, I found the problem: the problem was in resource allocation within the Render Graph, which only occurred with integrated GPUs (my heap selection algorithm for integrated GPUs was wrong). It’s now fixed. I also added my checks for failed Vulkan or VMA calls in places where they were missing, so now everything should work properly. Math Packet In Eve I also added a small mathematical component to Eve, including Vector2,3,4 ; Vector2Int,3Int,4Int ; Quaternion ; and Matrix4x4 . I must say that quaternions were difficult to understand at first, but once you understand how they work, it’s very easy to visualize them in your head. The first attachment shows Eve running on the PC of this friend of mine, whom I thank so much for his help, and the second image shows Eve running on my PC."}, {"post_id": 55554, "ts": "2026-08-27T14:10:22Z", "hours": 4.5942, "text": "DEVLOG 24 - Error Manager, Copies & More Intro Hi Stardance! Lately, I’ve been focusing mainly on improving error handling returned by Vulkan and fixing some code here and there. New Error Manager System I’ve created a system responsible for error handling so that when an error occurs, such as a failure to allocate memory due to fragmentation or any other critical error, the app places a text file with information about the error in a folder called logs (created on the fly if it doesn’t exist). Immediately afterward, an error message is displayed on the screen explaining what happened. When the user presses the OK button, the app closes in the pop-up by calling std::abort(); . Some Test On Other PCs I tried running Eve outside of my PC on two other PCs, but since they’re a bit older, they don’t have support for Vulkan 1.4, so the app can’t be started. Swapchain Improvements The code for creating the swapchain has been improved somewhat, making it more secure and robust. New Copy Support I’ve added support for buffer and texture copy operations between resources that aren’t the same type (one transient and one persistent). Next Step: I want to make Eve a little more portable, so in the next few hours I’ll try using Vulkan 1.2, trying not to mess with the code. If necessary, I might resort to using Vulkan 1.3; I’ll see…"}, {"post_id": 54816, "ts": "2026-08-25T23:26:03Z", "hours": 3.9353, "text": "DEVLOG 23 - Instanced Draw & Some Fixes Intro Devlog time!! In the last devlog, I had some issues with instanced drawing and reading a position buffer. What Was The Problem? I worked hard, but I managed to figure out where the problem was and fix it. (The problem was due to a for loop responsible for creating the address buffers. I was saving pointers outside the for loop with structs allocated inside the for loop; therefore, the pointers were pointing to corrupted memory or nothing.) Render Graph Fixes I fixed several things in the Render Graph that could cause future problems. I added small guards within the Render Graph so that if the user does something wrong, the application doesn’t crash unexpectedly. For example, previously, if the user set a texture to display that they’d never used (never involved in a transfer operation, never used as a graphic attachment), the program would crash. With these simple guards, everything is solved. Easier Resource Usage Declaration I’ve also added the ability to easily declare textures and buffers usage in the Graphics Pass class with dedicated methods like UseBufferReadOnlyVertex(...) , UseTextureVertex(...) , and others. The image shows a grid of 20x20 quad meshes drawn with a single draw call instead of 400 using instanced draw."}, {"post_id": 54096, "ts": "2026-08-24T21:43:20Z", "hours": 10.5117, "text": "DEVLOG 22 - ECS Bugs Fixed, Graphics Files Reorganized Hi Stardance! What I Did In this dev log, I fixed some of the last bugs the ECS code, so it now works and is very efficient. I ran several tests destroying, creating, and moving entities from one archtype to another, and everything works. I then worked on the project structure of the graphics part by fixing the graphics include files. What Went Wrong These updates mentioned so far have been successful. Two hours ago, I added a method in the graphics pass responsible for instanced drawing, so I took advantage of the opportunity to create a buffer to read the instance positions to see if it worked. I still don’t know why, but it doesn’t work. The application freezes, and sometimes the driver crashes (it scared me a little… :/ ). The Validation Layers don’t report anything wrong… So I need to figure out what’s wrong and fix it. The image shows some of the methods available after fixing the folders. The methods are in the Graphics class in the include folder."}, {"post_id": 51727, "ts": "2026-08-21T15:40:39Z", "hours": 10.1514, "text": "DEVLOG 21 - ECS Refactoring Intro Over the past ten hours, I’ve worked extensively on the ECS , making it more robust, easier to use, more secure, and more efficient. What’s changed: New Way To Record Entity Commands Entity Command Pools are still used, but they’re managed not by the user but by the Entity Manager. The old CreateCommandPool() method no longer exists. Now, to execute a command on entities, you make a request to the EntityManager , which takes the command and places it in an EntityCommandPool of its choosing. The EntityCommandPool is chosen based on the SystemId provided by the engine with methods like Start, Awake, Update, etc. This reduces complexity and allows for systems that can run natively in parallel on multiple threads. Improved Efficiency Internally, the Entity Manager has improved the way to compact batches after command execution, making it simpler and faster. Instead, iterating over all batches only iterates on the entities that are no longer valid, and those slots are refilled with the components of the valid entities at the end of the last batches. Batch creation and destruction is handled automatically by the EntityManager . New Way To Query Tables The way to find tables with certain requirements has improved; the old method required registering a query and then returning a “ticket” used to access the query results. The operation is now simpler and more unified: The EntityManager is asked for all tables that meet the QueryInfo structure requirements, such as the archtype. The EntityManager checks whether the query already exists; if it doesn’t, it calculates it on the fly and returns it. Queries Updated Only When Needed Queries are updated only when tables are created/destroyed; otherwise, they remain - static and aren’t updated, saving calculations . The next step will be to verify if everything works, since I haven’t tested anything yet because I’m forced to do this devlog due to the ten-hour time limit. :/ Sorry about the picture, it’s the same, I didn’t have time to do anything else"}, {"post_id": 48967, "ts": "2026-08-17T15:28:34Z", "hours": 5.8128, "text": "DEVLOG 20 - A Better Triangle Intro Hi Stardance! This triangle was created with Render Graph . The entire process is divided into two steps: the first draws the triangle on a user-selected image, and the second takes that image, samples it, and draws it on the swapchain so the triangle can be seen on screen. Clean and Simple API The beauty of this is evident in the photo (third attachment). You only need to write a few lines of code to achieve all this compared to the complexity and number of lines of code required by Vulkan. Render Graph thus creates all the resources needed for synchronization, such as barriers , and attempts to alias memory whenever possible. It also leverages Resource Pooling , so images aren’t destroyed and recreated at every frame. Instead, if they have identical requirements, they are reused, avoiding unnecessary Vulkan calls. MSAA Deprecated MSAA images have been deprecated because, from a desktop computer perspective, they aren’t worth using because they require a lot of computational resources. To achieve anti-aliasing, it’s best to use post-processing passes that use FXAA (Fast Approximate Anti-Aliasing) or TAA (Temporal Anti-Aliasing). There are probably some bugs still present in the Render Graph despite the many already fixed; I’ll work on them."}, {"post_id": 47136, "ts": "2026-08-14T20:10:25Z", "hours": 9.8778, "text": "DEVLOG 19 - Colors! Hi Stardance! I’ve made some progress and finally drew something on the screen! Improvements on the Swapchain Pass I’ve improved the Render Graph a bit by cleaning up old methods and making all the improvements discussed in the last devlog, such as improving the rendering code for the swapchain. Normally, you would set the 2D texture to display on the screen using the RenderGraph::SetPresentTexture(); In reality, this texture isn’t displayed directly on the screen but is first sampled and copied to the swapchain, so the Render Graph adds a hidden pass for this. When this texture hasn’t been assigned to any texture, the swapchain will be colored with the clear value set to black and sent to the screen. Push Constants Supported I’ve added the ability to use Vulkan Push Constants. Push Constants are data packets that can be sent to the GPU in parallel with the drawing command. Their size is very limited, 128 bytes, but their transfer speed is extremely fast. A hardware limitation is that the offset and size parameters must be multiples of four, so I used a struct called Words32 to dictate the 32-bit size and offset, not the 8-bit one. Furthermore, internally, the engine checks the state of the previous push constant for each push constant update, so as not to make unnecessary updates and to register the push constant command only when necessary, and only partially for the relevant bytes. Shaders Improvements I improved the shader code a bit by reducing the arguments needed to create a shader, and I also unified the layout; all shaders use the same VkPipelineLayout . The Problem and The Solution When I was writing the shaders to get these things on screen, I ran into errors telling me I was assigning a buffer descriptor to Descriptor Set 0 with binding 0, even though they’re actually textures. However, in the shader, I wasn’t requesting any of this, since the vertex data was written directly into the shader. After some research, I discovered that Slang shaders were creating bindings for these arrays outside the shader. To fix this, I simply moved the arrays into the vertex shader function, marking them with const. And note that all these images/videos use the swapchain pass, so this was all just a test. Now I’ll have to try declaring a real pass with Render Graph and try to draw something, hoping everything works correctly :/"}, {"post_id": 44624, "ts": "2026-08-10T14:56:52Z", "hours": 10.0239, "text": "DEVLOG 18 - More Refactoring Hi Stardance! I don’t know what to say about this devlog, since I’ve written a lot of code for my specific implementation… I’ll try to describe what I did without being too boring. Why I refactored again? As discussed in the previous devlog, I felt the code wasn’t “nice” or at least not very tidy, and honestly, I don’t like that very much, so I rewrote the Render Graph (partially) for the third time. Now, the Render Graph only manages single-frame resources, while all multi-frame resources are managed by a separate class called TransientResourcePool, which is therefore responsible for storing the resources. The Render Graph: A single frame responsibility The Render Graph is still responsible for memory aliasing and resource pooling, of course, as well as generating barriers and inserting the draw, copy, and, in the future, compute commands. (I still need to improve the code for compiling commands into the Command Buffers a bit.) Improvement in the searching of pooled resources Now, searching for resources to reuse is even faster, since resources are divided by their composition, for example. For textures, the parameters for this division are height, depth, width, samples, etc. This allows you to immediately find a resource if it’s available. More organization is the TransientResourcePool The TransientResourcePool is also responsible for permanently destroying unused resources for several frames. I had written the destruction code within the TransientResourcePool, but I thought maybe it wasn’t its responsibility, but rather an existing class called MemoryBin. The MemoryBin class was configured to work only for persistent resources, but now it handles the destruction of persistent and transient resources. What I need to fix: There’s a small problem in the code: Normally, when you want to destroy a resource, it’s queued and usually assigned a countdown. This countdown is a number that corresponds to the maximum frames in flight and decreases by one every frame. When this number reaches zero, the resource can be destroyed. This works perfectly, but when, for example, the swapchain needs to be recreated because the window size has changed, the GPU needs to be put into idle mode. This means that all in-flight frames have finished, and therefore all resources queued for destruction can and must be destroyed immediately, otherwise they would pile up. Otherwise, I think everything is perfect. I don’t think it will take me long to implement these little tricks, so I assume and hope :/ to start writing the code to display something on the screen soon. I’ll go back to my old, dear little triangle :)"}, {"post_id": 41971, "ts": "2026-08-06T14:41:01Z", "hours": 11.1292, "text": "DEVLOG 17 - Meshes & New Architecture Into See you again, Stardance. I’ve been implementing several things lately, as the title suggests, and I think we might soon have some geometry on the screen. Mesh System I’ve been working on meshes, creating everything needed to support mesh creation, editing, and destruction. Currently, if you create a mesh, you obviously create all the necessary buffers: one for vertex positions, one for normals, one for UVs, etc. So, for example, if I load position data and the buffer doesn’t exist, a new buffer is created and a CPU-GPU upload operation is performed. However, if the buffer exists and its size is greater than the new vertex size, the buffer isn’t reallocated to a smaller size but remains the same, reducing the number of vertices used for drawing. I’m not sure how useful this option is, but I plan to add an option to specify this in the future. Image Presentation Supported I’ve also been working on how to display an image on the screen. Currently, the Render Graph has a method that, given a texture’s Transient handle, sets that texture as the image to display on the screen. Internally, the Render Graph creates a draw pass at the end of all existing passes and then samples from the presentation texture set to draw on the swapchain. The code for all this might be a little rough at the moment; I’ll improve it later. The New Architecture For a while now, I’ve felt like the code was stepping on its own toes. I had a class called MemoryRegistry that was responsible for assigning slots to resources, allocating them, and managing their lifecycle. I didn’t like this, so I decided to rewrite much of it, splitting everything into multiple classes. Now I have a class called ResourceRegistry that provides resource IDs. A class called ResourceMapper that inserts resources into their respective global descriptors. A class called ResourceTracker that manages the resource lifecycle, their last use, which stage they were in, and similar information. Until recently, the MemoryRegistry managed both persistent and transient resources, which was a mess. I’ve decided that the MemoryRegistry should only manage persistent resources, while transient resources should be managed by a class called TransientResourcePool or something similar, which should be managed by the RenderGraph. That’s exactly what I’m working on. Some Stupid Bugs I overran the timeframe because I was partially testing the new code and encountered a stupid bug that made me lose time. (I was iterating an Array starting from the last element, but I forgot to subtract one from the size of the vector assigned to the for loop index, thus causing an out-of-memory access.) I think I’ll also rewrite a good portion of the RenderGraph first to adapt it to the new architecture. Advantages These changes will make developing new features faster and less cumbersome without having to adapt to an architecture that was poorly designed from the start. I swear that after I’ve done all this, I’ll render something to the screen, assuming there are no unforeseen issues ;)"}, {"post_id": 39763, "ts": "2026-08-02T22:53:53Z", "hours": 9.9536, "text": "DEVLOG 16 - Blank Window, Draw Calls & More The last ten hours have been very productive. As the devlog title suggests, I managed to get the classic black window, completed the code for draw calls, and also accomplished many other things. Draw Calls Commands I then completed the code for making draw calls with a simple mesh, integrating all the logic into the Render Graph. If you want to send any command to the GPU—a draw call, a copy, a dispatch, or anything else—it must necessarily go through the Render Graph. This allows me to have a central entity that can manage barriers and commands in a highly optimized, precise, and secure manner. When you want to draw something, you must declare a graphics pass. This pass has methods to execute the drawing commands, but it also has methods to set things like the texture depth/stencil to use, the target texture to draw on, etc. You can also have multiple color targets, as long as they have the same resolution. Blank Window Since I haven’t seen any tangible results on screen for a while, only code, I tried displaying a black window and then initializing the engine. The new context, window, and swapchain builders all work. The Resource Mapper, the class that manages the global descriptor set, also works. Testing the other classes will require a bit more work until I’ve got all the missing pieces, but it’s almost there. Persistent Resources Support Since creating a mesh also involves creating data and sending it to the GPU via buffers, I need a way to upload data from the CPU to the GPU. Mesh buffers are persistent, not transient. Currently, in the Render Graph code, I only had support for copying and uploading transient resources. From now on, this is also available for Persistent resources, as I’ve written the same code for them as well. I also implemented barrier generation for persistent resources so that synchronization is handled internally by the Render Graph, as with transient resources. New Resource Handles Up until now, each resource has been represented as a handle corresponding to an unsigned 32-bit number. From now on, resources are represented by two unsigned 32-bit numbers: one for the previously existing identification number and a generation number. By combining both numbers, each resource is unique, thus eliminating the possibility that if a resource is destroyed and recreated with the same ID, it could be mistaken for an older resource that no longer exists. Project Cleaning I finally cleaned up the project a bit and made it a bit more organized by dividing the files into more specific subfolders."}, {"post_id": 37211, "ts": "2026-07-29T19:14:02Z", "hours": 10.0533, "text": "DEVLOG 15 - Slang & Render Graph Reorganization So, I’ve been dividing the project into folders, making everything more organized, which wasn’t the case until now. The New Shader Language: Slang I saw that there was a more modern alternative to GLSL I could use, so I chose Slang. I created the code to create it in real time, and then I also changed the architecture of the Pipeline Builder a bit (the class responsible for creating Vulkan’s Pipeline and PipelineLayout objects). Vertex Fetch, Why Did I Choose It? I’ve been thinking for a while about forcing users of the engine to use Vertex Fetch. What is it? Well, normally when using a shader, before the Vertex Shader there’s a phase called Input Assembly that, based on the triangle indices, samples vertices from the vertex buffer, allowing them to be used directly in the Vertex Shader without manual sampling. However, this means that the layout of the vertex buffer must never change; if it were to change, you’d have to create another Pipeline object and bind it. Honestly, I don’t like this limitation very much. That’s why I removed this feature and adopted Vertex Fetch, which allows you to not specify a vertex layout, thus having as few Pipeline objects as possible. Obviously, you have to manually fetch the vertex from the respective buffer in the Vertex Shader, but frankly, it’s not a huge problem. Work In Progress On The Render Graph Another thing I’m implementing is commands that can be sent to the GPU via the Render Graph. So now you can draw, make GPU-GPU copies between buffers, between textures, and even between textures and buffers. Copies currently only support Transient resources; I’ll add the functionality for Persistent resources later. The same goes for using Compute Shaders. I’ve also added the ability to upload data from the CPU to the GPU, again for transient resources. For Persistent resources, I’ll also add this functionality later. I’m still writing the code for this, so I’m not finished yet, but I’m forced to devlog for the usual 10 hours of Stardance…"}, {"post_id": 34710, "ts": "2026-07-25T17:18:03Z", "hours": 9.9128, "text": "DEVLOG 14 - I Rewrote The Memory Aliasing Algorithm Intro Unfortunately, I don’t have anything exciting to say. I’m forced to do this devlog since I’ve reached ten hours since my last devlog, so I have to publish one, otherwise my hours wouldn’t count in full. I’ll try to share what I did, the problems I encountered, and how I solved them. The Problem I might sound crazy, but after working on the Render Graph for twenty hours, I rewrote it entirely from scratch. You might ask, why? The reason I did this was Vulkan itself. I discovered that, since I’d previously relied on VMA (Vulkan Memory Allocator) to manage memory, now that I was managing memory without it, there was something I’d overlooked: a parameter called Memory Type Index. The Memory Type Index indicates where to allocate memory. There could be a Memory Type Index for the GPU’s local memory, one for the Resizable BAR, etc. So, what’s the problem if all the Render Graph resources must live exclusively in the GPU’s local memory anyway? Wouldn’t it be enough to simply add a few lines of code and everything would be solved? Unfortunately, not because this index indicates in which memory to allocate that resource, but there’s also another parameter called Memory Type Bits, which is a bitmask that indicates in which Memory Type Indexes a resource can or cannot be allocated. All resources are allocated in the same Memory Type Index, but they may have different Memory Type Bits. This means, for example, that a texture without multi-samples cannot fit in the same memory space as a texture with multi-samples. This can also happen with the aspect mask, so a color texture and a depth texture might not fit in the same place. It could also happen with the format or tiling. The same goes for buffers, but these are more flexible than textures. The Solution My Memory Aliasing algorithm was designed without taking all this into account, so I chose to rewrite a large part of the Render Graph, trying to recycle some parts. Therefore, the Aliasing algorithm now operates on “Buckets,” which are in-memory containers containing resources that can fit in the same space. Without this distinction, memory aliasing wouldn’t be possible because a resource attempting to reuse memory used by previous resources must only check among resources with the same requirements, not among all resources. Therefore, it checks per bucket, not all existing resources. This has also made the code much cleaner and more organized."}, {"post_id": 32449, "ts": "2026-07-21T17:21:23Z", "hours": 10.0289, "text": "DEVLOG 13 - Memory Aliasing Recap In the last devlog, I explained what I did and why I was creating a Render Graph. I mentioned a concept called Memory Aliasing, but I explained it briefly. I’ve been working extensively on the Render Graph these past few hours to implement the Memory Aliasing algorithm. What is Memory Aliasing? Memory Aliasing involves having two or more resources use the same portions of memory, thus sharing that memory. For example, let’s take a texture we’ll call A. This texture is used as Depth in pass 1 and read in pass 2. Another texture, called B, is used in pass 3 and pass 4 (see photo). We could allocate both resources independently, but you can clearly see that the resources don’t overlap in the passes. Texture A begins its usage cycle in pass 1 and ends in pass 2, and immediately after, in pass 3, texture B is used for the first time. What we could do is have both textures occupy the same memory space to save VRAM. This is the concept of Memory Aliasing. Obviously, since the resources share the same memory space, barriers must be created to synchronize resource access, otherwise there would be a race condition (two threads operating in parallel on the same memory space, not just for read-only operations). Resource Pooling In addition to memory aliasing, I wanted to optimize another aspect that took me some time. In Vulkan, when you want to create resources, you use vkCreateImage and vkCreateBuffer. These functions create a handle without associating physical memory with these objects. Binding occurs later, after executing the memory aliasing algorithm, which determines which memory space to assign to a resource. This means that I have to create and destroy resource handles every frame, which apparently isn’t a light operation to perform on multiple resources. So I thought that if there was a possibility, I could reuse handles from previous frames by simply comparing whether the settings of the requested handle were the same as the one to be reused and then binding the memory. The Problem and the Solution This was the idea I had, but unfortunately it’s not feasible because Vulkan doesn’t allow memory binding to a resource more than once, so this approach wouldn’t have worked. After thinking for a while about how to solve this, I decided to include in the requirements for using old handles, in addition to the texture or buffer settings, the offset and stride of how they were bound in memory. This way, if the pass structure and usage hadn’t changed significantly during the user’s setup phase, the Memory Aliasing algorithm would always produce the same results, given the deterministic nature, making this all feasible. Finally, if the resources aren’t reused for an N number of consecutive frames, they are permanently destroyed."}, {"post_id": 30667, "ts": "2026-07-18T13:14:32Z", "hours": 9.9683, "text": "DEVLOG 12 - Render Graph, Code Refactoring A Little Recap In the last devlog, I mentioned I watched the 2017 GDC conference, where they explained how the Frostbite development team had created a Render Graph. But what is a Render Graph, and what is it used for? To answer this question, we must first understand how the GPU works. The Difference: CPU & GPU First, a GPU, unlike a CPU, performs all its operations in parallel. When we write code for the CPU, we say: do this operation, then this, then that, and so on. The CPU performs its operations synchronously, in sequential order. The GPU, however, doesn’t work that way. If we tell the GPU that we want to draw three objects, we can send it three draw calls, which we’ll call A, B, and C. These draw calls are sent in order, so first A, then B, and then C. The order in which the commands are sent doesn’t correspond to the order in which they are executed, because the GPU could execute the commands in this order: C, B, A, or B, A, C, or A, C, B, and so on. This is because, while operation A might be in progress, operation B might start executing, so both commands will use the same resources and therefore run into a race condition if both operations are not read-only. The Problem From this perspective, the GPU is very powerful because it tries to stay constantly busy, eliminating dead time. However, this greatly complicates things on the synchronization side. Let’s take two operations: operation A that writes an image and operation B that reads the image. How can we be sure that the GPU executes operation A first and not B? Who can assure us that the GPU, while executing A, doesn’t have to execute B? The answer to all these questions is no one. How Graphics APIs Handle All Of This In graphics APIs like OpenGL, all of this is hidden from the programmer, so they don’t have to worry about it. But in graphics APIs like Vulkan and DirectX 12, this is the programmer’s responsibility. The programmer must write a barrier and tell the GPU not to touch the image from operation B before A has finished. For a few barriers, this is feasible, but as soon as you write more complex applications, making the code sufficiently organized, non-repetitive, and fast to develop becomes very challenging. This is why the concept of a Render Graph exists. What A Render Graph Does A Render Graph allows the programmer to specify which steps the GPU should execute, which operations resources like images and textures will perform, and in what order. The Frame Graph looks at this graph constructed by the programmer at each frame and internally understands where barriers and sometimes semaphores are needed (if we’re working with multiple queues, that’s not the case for me). Another responsibility of the Frame Graph is to internally allocate and manage resources that only exist within a single frame, called transient resources. Finally, I’m implementing Memory Aliasing. This reduces the memory used by resources: for example, if resource A is used for the last time in pass 3 and resource B for the first time in pass 4, they can share the same physical memory, thus reducing the overall memory requirement. Bonus I’ve also restructured the texture creation methods, making them simpler and allowing for fewer specifications. The before and after is a good result… The same goes for 1D and 3D textures."}, {"post_id": 28272, "ts": "2026-07-14T12:58:23Z", "hours": 10.2439, "text": "DEVLOG 11 - BDA, Pipeline, Shaders In the last devlog, I explained how I wanted to structure my bindless descriptor set. With that approach, I had a buffer for each data type. This approach works, but it’s a bit cumbersome, so I switched to using Buffer Device Addresses (BDAs). The idea behind it is: Create buffers, around VRAM, placing the buffers within VRAM memory pools. Instead of saving the physical data inside the descriptor buffer, we can only save pointers to the buffers, so I’ll have a buffer of pointers to the buffers scattered across VRAM. Since the pointers take up 8 bytes, managing the buffer is very simple, as it will be very light. So, essentially, I separate the physical data of the buffers from the shader binding logic. Rather than using namespaces to hide the internal implementation, I chose to use Hadles, which are simply numbers that identify that resource. So I could have a BufferHandle, ImageHandle, SamplerHandle, PipelineHandle, and so on. I chose not to call the structure that manages all this with names that might be reminiscent of the Vulkan API, but instead called this system Resource Mapper. At the moment, I think I’ve done something wrong with the code: Since the buffers are simply exposed via a 32-bit index, internally the buffer index corresponds to the index of the vector in which the Vulkan buffer handles and all the allocation information are allocated. I think I’ve erred in saving the buffers in vector indices that don’t match their exposed handle index outside of Eve. This causes access to incorrect buffers or buffers that don’t even exist, causing UBs or crashes. I still need to verify this issue and, if it occurs, I’ll have to fix it. Furthermore, yesterday I added all the code responsible for creating the graphics pipeline and compiling the shaders. This code is still a bit rough and needs improvement. Furthermore, since I don’t want the user to have to manage synchronization outside of the engine, I’ve been thinking about how to structure a Render Graph. I saw Frostbite’s presentation at GDC 2017 where they explained how their Render Graph works and that gave me some insights."}, {"post_id": 25895, "ts": "2026-07-10T11:55:09Z", "hours": 11.2272, "text": "DEVLOG 10 - Working On The Vulkan Wrapper For now, I’m focused on creating a wrapper for Vulkan to make it simpler and less repetitive to use. I don’t want to create a wrapper that abstracts too much, thus losing control; instead, I’m creating a fairly thin wrapper. I’m currently restructured the Application class a bit and divided some of its parts into three “modules.” I’m structuring this using the Factory Pattern. I’ve created three Builders: one for the window and SDL initialization, one for creating a Vulkan context—VulkanInstace, PhysicalDevice, LogicalDevice, and the graphics queue—and the last one for building the swapchain. I chose this approach because I consider it flexible and I don’t want everything to fit into one huge monolith; I prefer having multiple modular classes. In addition to these more or less complete builders, I’m focusing on creating a system that can allow shaders to see and manipulate the data stored in VRAM. This is usually done with DescriptorSets, which have been the standard for years. They’re more or less like pointers to objects in VRAM so shaders can access them. In reality, they’re fat pointers because they contain other information besides the address. However, this approach is good but not optimal because it introduces CPU overhead. Since the draw calls may not share the same materials and therefore require different textures, a new DescriptorSet must be bound before each draw call, which, with many draw calls, incurs CPU overhead. What I’m doing to solve this problem is looking towards a more modern and efficient approach called Bindless. Basically, instead of having multiple small DescriptorSets, you have one huge global DescriptorSet that contains all the resources used by the application. So we could have a sort of array containing all the samplers, then another containing all the textures, another containing all the buffers of a specific type, etc. Then we just need to bind this DescriptorSet at the start of rendering, which will be used for the entire rendering process, and pass indices to the shader that will tell it which resources to use from the DescriptorSet. I’m a little slow in developing all this because I’ve never used Vulkan; in fact, I’m still learning. The second reason is that Vulkan is very complex and there’s a lot of boilerplate code. I still have to finish the ECS system since I don’t yet have a centralized approach for obtaining the IDs and GenerationIds of new entities, which are verified and therefore safely managed internally by the engine. But I think I’ll do it later since I’m a little tired of fiddling with entities and want to do something different for a while."}, {"post_id": 21085, "ts": "2026-07-02T21:28:10Z", "hours": 4.3578, "text": "DEVLOG 9 - 100K Entities After the last devlog, in which I rendered 1K entities, I tried increasing the number of entities to a 15x15x15 cube, or 3375 entities, and I saw the frame rate drop unexpectedly, 25 FPS. I was wondering if this was normal or not… Apparently, it wasn’t… I tried to figure out the problem, but it wasn’t easy. I tried using a tool called RenderDoc that lets you see what’s happening on the GPU, so all the calls, data passed to the GPU, buffers, textures, etc. That information also included the time, and the GPU indicated it was taking about 16 ms, which was quite strange. I started to suspect Vulkan’s validation layers. By disabling them, I got to 30 FPS or a little higher, I don’t remember exactly. Then I disabled ASan and set the swapchain to Immediate Mode so as not to be constrained by the screen refresh rate, and I got to about 100 FPS. Then I made several CPU-level optimizations at the code level by changing the way components are obtained from batches in my ECS system, specifically limiting those operations that can be avoided in the internal component iteration loop, and I got up to 140 fps. Finally, the thing that made me open my eyes and say WOW was compiling in Release and not Debug, the fps skyrocketed to around 2300… I couldn’t believe it either… After doing all this, I rendered 100,000 entities and my fps were stable at 90… Incredible! Finally, just for the sake of curiosity, I tested 1,000,000 entities and got 9 fps, which is good because it means the system scales linearly. This is what I’ve been doing for the last two hours. Before that, I spent some time revisiting my ECS code to make it more secure. For example, many of the Table and EntityManager methods now return references and not pointers. I’ve also made the ComponentRegistry class much more efficient by storing component information in contiguous arrays instead of lists, which therefore contain non-contiguous data. Next Steps: I need to implement a way to get verified IDs from the EntityManager, since currently the IDs are only manual and non-unique. And then I’ll need to refactor the rendering code again, making it more modular, since it’s currently all in a single class."}, {"post_id": 20319, "ts": "2026-07-01T21:44:13Z", "hours": 9.6286, "text": "DEVLOG 8 - 1K Entities I implemented several things: One of these is a manager that allows systems to register their functions so they can be called, for example, when Update, Start, LateUpdate, etc. I implemented Address Sanitizer in the project to detect leaks, overflows, or out-of-bounds reads, thus uncovering some bugs. I didn’t understand why, but ASan was having trouble integrating with the project; apparently, the shaderc library was causing problems because it had a different connotation than the project. I finally solved the problem by telling CMake to use the Release version of shaderc, not Debug. I created a test system called S_Test, which I used to verify that I could create and manage multiple entities (apparently, yes). After having several memory issues, which I resolved with the help of ASan, I also started creating a camera component so I could move freely in 3D space. I’ve improved the security of the code; Entity Command Pools now no longer need to be created by the programmer, but by the Entity Manager itself, which manages them. This minimizes the risk of freeing memory too early, resulting in cleaner code for the game. Furthermore, the EntityCommandInfo and QueryInfo classes can now be allocated on the stack rather than the heap, resulting in a more secure program. Finally, for fun, I wanted to try creating a thousand entities, also to see if the system was capable of it and if there were any problems. I have to say, I’m quite happy with the result. Next Step: I still have to improve several parts of the code to make it more secure and faster, such as the Component Registry."}, {"post_id": 18339, "ts": "2026-06-29T13:31:38Z", "hours": 6.0772, "text": "DEVLOG 7 - Code Reorganization I tried to reorganize the project so that the headers needed by users of the engine are visible, while the internal, and therefore unnecessary, ones are not. What do I mean? Let’s say we have a class called A. This class is used by the engine itself, but it can also be used by the developer, for example, to record commands or something similar. So the developer will include class A in their header or source files so it can be used. But there’s a problem: Header A could include other headers that aren’t necessarily needed by the developer using the engine, thus polluting the headers. How do I solve this problem? Since I haven’t used C++ for years, I’ve been researching the problem online for months and found the following solutions: Forward Declaration - This consists of declaring the required class in the header, in this case A, without using the include directive, which literally copies the headers included in the file containing the directive. This seems like a good method, but unfortunately the data can’t be variable by value, only by reference or pointer, since the compiler must know at compile time how much memory that specific object occupies. Pimpl Idiom - This involves enclosing or encapsulating the information needed for the internal functioning of A in a class or struct that is hidden from the developer using the engine. This method could work and is almost standard, but personally, I don’t really like the idea of having to create another structure to achieve this goal. It’s more of a workaround, since the language has significant limitations in this regard. C++20 Modules - Modules are a new way of programming in C++ because, among other things, they solve this problem. They also reduce compilation times and avoid separating the code into two separate files (.hpp and .cpp). I tried using them, and from a compiler perspective, they work great (I’m using Clang), but from a Clangd perspective, the situation is quite different: While the compiler support is fairly mature, Clangd still has several issues; in fact, it reported errors everywhere. I even tried modifying the .clangd file by adding various flags, but the situation didn’t improve. There are other methods, such as Fast Pimpl, but they aren’t as flexible. What I’m looking for is something flexible that generally works in all conditions and doesn’t introduce overhead, which Pimpl Idiom doesn’t. The final solution was to use namespaces . All the public headers that must be used by the developer using the engine are in the Eve/ namespace, while the internal headers that shouldn’t be used by the developer are in a namespace called Eve/Internal. If the developer uses these files, it’s their fault; they’re marked as internal to the engine and therefore shouldn’t be used. I also changed build system and switched to CMake as it is more widespread in the C++ community and this can also give an advantage in the engine configuration section for other users"}, {"post_id": 15067, "ts": "2026-06-24T14:08:55Z", "hours": 28.5411, "text": "DEVLOG 6 - Crash, Crash, Crash and…. Crash What I did After spending several hours designing my ECS architecture, I realized I could do better, so I basically started from scratch and, as I mentioned in the previous devlog, I chose to use Archtypes so everything would be extremely efficient. Maybe I’m a bit too obsessed with performance… The Problem Anyway, after finishing the entire system, I started the app and it crashed. After several hours of debugging with simple print(); I thought the problem was in the memory, but I couldn’t figure out where… I finally decided to use Address Sanitizer, a tool that alerts you to out-of-bounds writes or reads, which allowed me to pinpoint the problem. I had performed a nonsensical multiplication, so the memory pointer was pointing to the wrong place, specifically to the end of the allocated memory portion, causing the metadata to be overwritten. (Apparently, when allocating memory, the program itself allocates additional memory slices that store information about the allocated memory portion.) The problem was that the app didn’t always crash, only sometimes, and I didn’t understand why. But I finally managed to get it working… The Result At the moment, this is a single entity, and since I haven’t tested the rest of the code, such as the destruction logic and entity transitions from one archtype to another, there are likely other bugs waiting for me."}, {"post_id": 9873, "ts": "2026-06-16T10:28:19Z", "hours": 4.6411, "text": "DEVLOG 5 - The ECS Architecture Since I can now draw something on the screen, I’d say it’s time to start building the actual graphics engine. The first system I need to create for Eve is the management of game objects. There are two options: the first is to use the OOP programming paradigm and therefore manage game objects just like Unity does; the other, which is the one I chose, is to use the ECS (Entity, Component, System) architecture. To understand why I chose ECS, you need to understand how this architecture works. As I mentioned, the word ECS is an acronym for Entity, Component, and System, which represent the three pillars on which this architecture is based. In short, entities represent objects, the essence of the object; that object simply exists, and they are usually represented by a simple numeric ID. Components, on the other hand, represent pure data; therefore, each entity can have its own components and therefore its own data. Systems, on the other hand, are the part of the code that executes the logic. Let’s take the rendering system as an example. This will iterate over all entities that have mesh components, and a transform will take their data and send it to the GPU for rendering. This division of responsibilities ensures incredible efficiency, given how the CPU works, since the component data is stored contiguously in memory. This facilitates the work of a CPU component called the Hardware Prefetcher, which tries to predict which portion of RAM the CPU will use next, thus reducing cache misses. There are many ready-to-use libraries for this architecture, such as Flecs, EnTT, and others. I chose to try and create my own so I could learn and understand more. Currently, I’m using, broadly speaking, the same approach Unity uses with their ECS architecture, which is part of their Unity DOTS ecosystem. All entities in the game can be classified based on an ID called an Archtype, which identifies the type of entity being viewed based on its components. This way, you can have contiguous arrays and minimize cache misses, thus maximizing CPU efficiency. I’m still working on it, but I have to say it’s extremely interesting…"}, {"post_id": 8166, "ts": "2026-06-13T16:39:12Z", "hours": 4.5819, "text": "DEVLOG 4 - Textures! I finally managed to use textures; Vulkan has a bit of boilerplate in their configuration, especially with the descriptor sets. This was the part that slowed me down a bit. The code isn’t very tidy at the moment… For now, I’ve focused more on learning, so I haven’t written anything extremely tidy and readable. As I said, I’ve only learned the basics so far. Now that I feel more confident about the subject, I think I’ll start writing something. I’m thinking of a framework or something simple that allows you to draw geometry on the screen without having to write hundreds of lines of code directly with Vulkan. So, more generally, I think I’ll create a layer of abstraction while still trying to maintain excellent flexibility."}, {"post_id": 7178, "ts": "2026-06-11T23:53:28Z", "hours": 2.3814, "text": "DEVLOG 3 - First Cube!!! How satisfying, my first 3D object! Since previously all vertices were written manually in the shader, I opted to learn how to create buffers to load more complex 3D geometry onto the screen. I’m loading the resources directly into a specific portion of memory called Host Visible, where the CPU can also write, and the GPU’s reading isn’t as fast as it could be. If I instead allocate the memory in a portion of VRAM called Device Local, the GPU will be very fast at accessing the data, but the CPU, on the other hand, won’t be able to do anything with that memory. To modify it, you need to first allocate the data in an intermediate buffer called Staging Buffer, and then from there the data can go to Device Local memory (the GPU’s fast memory). I also added some transformations and rotations with GLM to rotate the cube, and this is the result, which is nice. I think I’ll try using Device Local memory by loading data to it, as discussed before, with a Staging Buffer and after that I think I’ll start experimenting with textures."}, {"post_id": 6502, "ts": "2026-06-10T22:34:52Z", "hours": 9.0367, "text": "DEVLOG 2 - Consolidation of things learned Well, What’s new? Just a square? It might not seem like much, but yes. I spent all these hours rewriting the entire code from scratch so I could understand where I had the most doubts and therefore review some concepts. Synchronization was and still is the most difficult concept to grasp; understanding how the semaphores and barriers are linked together wasn’t easy for me, and I must admit I still have some doubts about it, but certainly much less than before. Given the asynchronous nature of the graphics card, you can’t program operations that will be executed in order, unlike the CPU, and this is one of the graphics card’s strengths and weaknesses. You can parallelize many operations, but you have to be careful how they are linked together and synchronize them as correctly as possible. My next step, I think, will be to use buffers to give more complex geometry to the shaders, primarily for drawing 3D geometry. I also think I still have to delve deeper and better understand things like semaphores, timeline semaphores, and barriers, which are topics I feel I haven’t internalized as well as others."}, {"post_id": 5182, "ts": "2026-06-08T21:32:27Z", "hours": 11.6153, "text": "DEVLOG 1 - Hello Triangle!!! Finally, after several hours trying to understand how Vulkan works, watching and reading several tutorials, I got it, my first triangle, isn’t it cute?🫠🫠 I’ve figured out most of the things, but I think I need to delve a little deeper into the process of creating a pipeline with dynamic rendering and synchronization. These are the two topics that have been giving me the most trouble. I think the next step will be to re-explore the code and try to create something on my own, without a guided tutorial, to see if I’ve really understood the concepts."}]...
|
Title: Eve by @Light | Stardance
Devlogs:
DEVLOG Title: Eve by @Light | Stardance
Devlogs:
DEVLOG 1 - Hello Triangle!!! Finally, after several hours trying to understand how Vulkan works, watching and reading several tutorials, I got it, my first triangle, isn’t it cute?🫠🫠 I’ve figured out most of the things, but I think I need to delve a little deeper into the process of creating a pipeline with dynamic rendering and synchronization. These are the two topics that have been giving me the most trouble. I think the next step will be to re-explore the code and try to create something on my own, without a guided tutorial, to see if I’ve really understood the concepts.
DEVLOG 2 - Consolidation of things learned Well, What’s new? Just a square? It might not seem like much, but yes. I spent all these hours rewriting the entire code from scratch so I could understand where I had the most doubts and therefore review some concepts. Synchronization was and still is the most difficult concept to grasp; understanding how the semaphores and barriers are linked together wasn’t easy for me, and I must admit I still have some doubts about it, but certainly much less than before. Given the asynchronous nature of the graphics card, you can’t program operations that will be executed in order, unlike the CPU, and this is one of the graphics card’s strengths and weaknesses. You can parallelize many operations, but you have to be careful how they are linked together and synchronize them as correctly as possible. My next step, I think, will be to use buffers to give more complex geometry to the shaders, primarily for drawing 3D geometry. I also think I still have to delve deeper and better understand things like semaphores, timeline semaphores, and barriers, which are topics I feel I haven’t internalized as well as others.
DEVLOG 3 - First Cube!!! How satisfying, my first 3D object! Since previously all vertices were written manually in the shader, I opted to learn how to create buffers to load more complex 3D geometry onto the screen. I’m loading the resources directly into a specific portion of memory called Host Visible, where the CPU can also write, and the GPU’s reading isn’t as fast as it could be. If I instead allocate the memory in a portion of VRAM called Device Local, the GPU will be very fast at accessing the data, but the CPU, on the other hand, won’t be able to do anything with that memory. To modify it, you need to first allocate the data in an intermediate buffer called Staging Buffer, and then from there the data can go to Device Local memory (the GPU’s fast memory). I also added some transformations and rotations with GLM to rotate the cube, and this is the result, which is nice. I think I’ll try using Device Local memory by loading data to it, as discussed before, with a Staging Buffer and after that I think I’ll start experimenting with textures.
DEVLOG 4 - Textures! I finally managed to use textures; Vulkan has a bit of boilerplate in their configuration, especially with the descriptor sets. This was the part that slowed me down a bit. The code isn’t very tidy at the moment… For now, I’ve focused more on learning, so I haven’t written anything extremely tidy and readable. As I said, I’ve only learned the basics so far. Now that I feel more confident about the subject, I think I’ll start writing something. I’m thinking of a framework or something simple that allows you to draw geometry on the screen without having to write hundreds of lines of code directly with Vulkan. So, more generally, I think I’ll create a layer of abstraction while still trying to maintain excellent flexibility.
DEVLOG 5 - The ECS Architecture Since I can now draw something on the screen, I’d say it’s time to start building the actual graphics engine. The first system I need to create for Eve is the management of game objects. There are two options: the first is to use the OOP programming paradigm and therefore manage game objects just like Unity does; the other, which is the one I chose, is to use the ECS (Entity, Component, System) architecture. To understand why I chose ECS, you need to understand how this architecture works. As I mentioned, the word ECS is an acronym for Entity, Component, and System, which represent the three pillars on which this architecture is based. In short, entities represent objects, the essence of the object; that object simply exists, and they are usually represented by a simple numeric ID. Components, on the other hand, represent pure data; therefore, each entity can have its own components and therefore its own data. Systems, on the other hand, are the part of the code that executes the logic. Let’s take the rendering system as an example. This will iterate over all entities that have mesh components, and a transform will take their data and send it to the GPU for rendering. This division of responsibilities ensures incredible efficiency, given how the CPU works, since the component data is stored contiguously in memory. This facilitates the work of a CPU component called the Hardware Prefetcher, which tries to predict which portion of RAM the CPU will use next, thus reducing cache misses. There are many ready-to-use libraries for this architecture, such as Flecs, EnTT, and others. I chose to try and create my own so I could learn and understand more. Currently, I’m using, broadly speaking, the same approach Unity uses with their ECS architecture, which is part of their Unity DOTS ecosystem. All entities in the game can be classified based on an ID called an Archtype, which identifies the type of entity being viewed based on its components. This way, you can have contiguous arrays and minimize cache misses, thus maximizing CPU efficiency. I’m still working on it, but I have to say it’s extremely interesting…
DEVLOG 6 - Crash, Crash, Crash and…. Crash What I did After spending several hours designing my ECS architecture, I realized I could do better, so I basically started from scratch and, as I mentioned in the previous devlog, I chose to use Archtypes so everything would be extremely efficient. Maybe I’m a bit too obsessed with performance… The Problem Anyway, after finishing the entire system, I started the app and it crashed. After several hours of debugging with simple print(); I thought the problem was in the memory, but I couldn’t figure out where… I finally decided to use Address Sanitizer, a tool that alerts you to out-of-bounds writes or reads, which allowed me to pinpoint the problem. I had performed a nonsensical multiplication, so the memory pointer was pointing to the wrong place, specifically to the end of the allocated memory portion, causing the metadata to be overwritten. (Apparently, when allocating memory, the program itself allocates additional memory slices that store information about the allocated memory portion.) The problem was that the app didn’t always crash, only sometimes, and I didn’t understand why. But I finally managed to get it working… The Result At the moment, this is a single entity, and since I haven’t tested the rest of the code, such as the destruction logic and entity transitions from one archtype to another, there are likely other bugs waiting for me.
DEVLOG 7 - Code Reorganization I tried to reorganize the project so that the headers needed by users of the engine are visible, while the internal, and therefore unnecessary, ones are not. What do I mean? Let’s say we have a class called A. This class is used by the engine itself, but it can also be used by the developer, for example, to record commands or something similar. So the developer will include class A in their header or source files so it can be used. But there’s a problem: Header A could include other headers that aren’t necessarily needed by the developer using the engine, thus polluting the headers. How do I solve this problem? Since I haven’t used C++ for years, I’ve been researching the problem online for months and found the following solutions: Forward Declaration - This consists of declaring the required class in the header, in this case A, without using the include directive, which literally copies the headers included in the file containing the directive. This seems like a good method, but unfortunately the data can’t be variable by value, only by reference or pointer, since the compiler must know at compile time how much memory that specific object occupies. Pimpl Idiom - This involves enclosing or encapsulating the information needed for the internal functioning of A in a class or struct that is hidden from the developer using the engine. This method could work and is almost standard, but personally, I don’t really like the idea of having to create another structure to achieve this goal. It’s more of a workaround, since the language has significant limitations in this regard. C++20 Modules - Modules are a new way of programming in C++ because, among other things, they solve this problem. They also reduce compilation times and avoid separating the code into two separate files (.hpp and .cpp). I tried using them, and from a compiler perspective, they work great (I’m using Clang), but from a Clangd perspective, the situation is quite different: While the compiler support is fairly mature, Clangd still has several issues; in fact, it reported errors everywhere. I even tried modifying the .clangd file by adding various flags, but the situation didn’t improve. There are other methods, such as Fast Pimpl, but they aren’t as flexible. What I’m looking for is something flexible that generally works in all conditions and doesn’t introduce overhead, which Pimpl Idiom doesn’t. The final solution was to use namespaces . All the public headers that must be used by the developer using the engine are in the Eve/ namespace, while the internal headers that shouldn’t be used by the developer are in a namespace called Eve/Internal. If the developer uses these files, it’s their fault; they’re marked as internal to the engine and therefore shouldn’t be used. I also changed build system and switched to CMake as it is more widespread in the C++ community and this can also give an advantage in the engine configuration section for other users
DEVLOG 8 - 1K Entities I implemented several things: One of these is a manager that allows systems to register their functions so they can be called, for example, when Update, Start, LateUpdate, etc. I implemented Address Sanitizer in the project to detect leaks, overflows, or out-of-bounds reads, thus uncovering some bugs. I didn’t understand why, but ASan was having trouble integrating with the project; apparently, the shaderc library was causing problems because it had a different connotation than the project. I finally solved the problem by telling CMake to use the Release version of shaderc, not Debug. I created a test system called S_Test, which I used to verify that I could create and manage multiple entities (apparently, yes). After having several memory issues, which I resolved with the help of ASan, I also started creating a camera component so I could move freely in 3D space. I’ve improved the security of the code; Entity Command Pools now no longer need to be created by the programmer, but by the Entity Manager itself, which manages them. This minimizes the risk of freeing memory too early, resulting in cleaner code for the game. Furthermore, the EntityCommandInfo and QueryInfo classes can now be allocated on the stack rather than the heap, resulting in a more secure program. Finally, for fun, I wanted to try creating a thousand entities, also to see if the system was capable of it and if there were any problems. I have to say, I’m quite happy with the result. Next Step: I still have to improve several parts of the code to make it more secure and faster, such as the Component Registry.
DEVLOG 9 - 100K Entities After the last devlog, in which I rendered 1K entities, I tried increasing the number of entities to a 15x15x15 cube, or 3375 entities, and I saw the frame rate drop unexpectedly, 25 FPS. I was wondering if this was normal or not… Apparently, it wasn’t… I tried to figure out the problem, but it wasn’t easy. I tried using a tool called RenderDoc that lets you see what’s happening on the GPU, so all the calls, data passed to the GPU, buffers, textures, etc. That information also included the time, and the GPU indicated it was taking about 16 ms, which was quite strange. I started to suspect Vulkan’s validation layers. By disabling them, I got to 30 FPS or a little higher, I don’t remember exactly. Then I disabled ASan and set the swapchain to Immediate Mode so as not to be constrained by the screen refresh rate, and I got to about 100 FPS. Then I made several CPU-level optimizations at the code level by changing the way components are obtained from batches in my ECS system, specifically limiting those operations that can be avoided in the internal component iteration loop, and I got up to 140 fps. Finally, the thing that made me open my eyes and say WOW was compiling in Release and not Debug, the fps skyrocketed to around 2300… I couldn’t believe it either… After doing all this, I rendered 100,000 entities and my fps were stable at 90… Incredible! Finally, just for the sake of curiosity, I tested 1,000,000 entities and got 9 fps, which is good because it means the system scales linearly. This is what I’ve been doing for the last two hours. Before that, I spent some time revisiting my ECS code to make it more secure. For example, many of the Table and EntityManager methods now return references and not pointers. I’ve also made the ComponentRegistry class much more efficient by storing component information in contiguous arrays instead of lists, which therefore contain non-contiguous data. Next Steps: I need to implement a way to get verified IDs from the EntityManager, since currently the IDs are only manual and non-unique. And then I’ll need to refactor the rendering code again, making it more modular, since it’s currently all in a single class.
DEVLOG 10 - Working On The Vulkan Wrapper For now, I’m focused on creating a wrapper for Vulkan to make it simpler and less repetitive to use. I don’t want to create a wrapper that abstracts too much, thus losing control; instead, I’m creating a fairly thin wrapper. I’m currently restructured the Application class a bit and divided some of its parts into three “modules.” I’m structuring this using the Factory Pattern. I’ve created three Builders: one for the window and SDL initialization, one for creating a Vulkan context—VulkanInstace, PhysicalDevice, LogicalDevice, and the graphics queue—and the last one for building the swapchain. I chose this approach because I consider it flexible and I don’t want everything to fit into one huge monolith; I prefer having multiple modular classes. In addition to these more or less complete builders, I’m focusing on creating a system that can allow shaders to see and manipulate the data stored in VRAM. This is usually done with DescriptorSets, which have been the standard for years. They’re more or less like pointers to objects in VRAM so shaders can access them. In reality, they’re fat pointers because they contain other information besides the address. However, this approach is good but not optimal because it introduces CPU overhead. Since the draw calls may not share the same materials and therefore require different textures, a new DescriptorSet must be bound before each draw call, which, with many draw calls, incurs CPU overhead. What I’m doing to solve this problem is looking towards a more modern and efficient approach called Bindless. Basically, instead of having multiple small DescriptorSets, you have one huge global DescriptorSet that contains all the resources used by the application. So we could have a sort of array containing all the samplers, then another containing all the textures, another containing all the buffers of a specific type, etc. Then we just need to bind this DescriptorSet at the start of rendering, which will be used for the entire rendering process, and pass indices to the shader that will tell it which resources to use from the DescriptorSet. I’m a little slow in developing all this because I’ve never used Vulkan; in fact, I’m still learning. The second reason is that Vulkan is very complex and there’s a lot of boilerplate code. I still have to finish the ECS system since I don’t yet have a centralized approach for obtaining the IDs and GenerationIds of new entities, which are verified and therefore safely managed internally by the engine. But I think I’ll do it later since I’m a little tired of fiddling with entities and want to do something different for a while.
DEVLOG 11 - BDA, Pipeline, Shaders In the last devlog, I explained how I wanted to structure my bindless descriptor set. With that approach, I had a buffer for each data type. This approach works, but it’s a bit cumbersome, so I switched to using Buffer Device Addresses (BDAs). The idea behind it is: Create buffers, around VRAM, placing the buffers within VRAM memory pools. Instead of saving the physical data inside the descriptor buffer, we can only save pointers to the buffers, so I’ll have a buffer of pointers to the buffers scattered across VRAM. Since the pointers take up 8 bytes, managing the buffer is very simple, as it will be very light. So, essentially, I separate the physical data of the buffers from the shader binding logic. Rather than using namespaces to hide the internal implementation, I chose to use Hadles, which are simply numbers that identify that resource. So I could have a BufferHandle, ImageHandle, SamplerHandle, PipelineHandle, and so on. I chose not to call the structure that manages all this with names that might be reminiscent of the Vulkan API, but instead called this system Resource Mapper. At the moment, I think I’ve done something wrong with the code: Since the buffers are simply exposed via a 32-bit index, internally the buffer index corresponds to the index of the vector in which the Vulkan buffer handles and all the allocation information are allocated. I think I’ve erred in saving the buffers in vector indices that don’t match their exposed handle index outside of Eve. This causes access to incorrect buffers or buffers that don’t even exist, causing UBs or crashes. I still need to verify this issue and, if it occurs, I’ll have to fix it. Furthermore, yesterday I added all the code responsible for creating the graphics pipeline and compiling the shaders. This code is still a bit rough and needs improvement. Furthermore, since I don’t want the user to have to manage synchronization outside of the engine, I’ve been thinking about how to structure a Render Graph. I saw Frostbite’s presentation at GDC 2017 where they explained how their Render Graph works and that gave me some insights.
DEVLOG 12 - Render Graph, Code Refactoring A Little Recap In the last devlog, I mentioned I watched the 2017 GDC conference, where they explained how the Frostbite development team had created a Render Graph. But what is a Render Graph, and what is it used for? To answer this question, we must first understand how the GPU works. The Difference: CPU & GPU First, a GPU, unlike a CPU, performs all its operations in parallel. When we write code for the CPU, we say: do this operation, then this, then that, and so on. The CPU performs its operations synchronously, in sequential order. The GPU, however, doesn’t work that way. If we tell the GPU that we want to draw three objects, we can send it three draw calls, which we’ll call A, B, and C. These draw calls are sent in order, so first A, then B, and then C. The order in which the commands are sent doesn’t correspond to the order in which they are executed, because the GPU could execute the commands in this order: C, B, A, or B, A, C, or A, C, B, and so on. This is because, while operation A might be in progress, operation B might start executing, so both commands will use the same resources and therefore run into a race condition if both operations are not read-only. The Problem From this perspective, the GPU is very powerful because it tries to stay constantly busy, eliminating dead time. However, this greatly complicates things on the synchronization side. Let’s take two operations: operation A that writes an image and operation B that reads the image. How can we be sure that the GPU executes operation A first and not B? Who can assure us that the GPU, while executing A, doesn’t have to execute B? The answer to all these questions is no one. How Graphics APIs Handle All Of This In graphics APIs like OpenGL, all of this is hidden from the programmer, so they don’t have to worry about it. But in graphics APIs like Vulkan and DirectX 12, this is the programmer’s responsibility. The programmer must write a barrier and tell the GPU not to touch the image from operation B before A has finished. For a few barriers, this is feasible, but as soon as you write more complex applications, making the code sufficiently organized, non-repetitive, and fast to develop becomes very challenging. This is why the concept of a Render Graph exists. What A Render Graph Does A Render Graph allows the programmer to specify which steps the GPU should execute, which operations resources like images and textures will perform, and in what order. The Frame Graph looks at this graph constructed by the programmer at each frame and internally understands where barriers and sometimes semaphores are needed (if we’re working with multiple queues, that’s not the case for me). Another responsibility of the Frame Graph is to internally allocate and manage resources that only exist within a single frame, called transient resources. Finally, I’m implementing Memory Aliasing. This reduces the memory used by resources: for example, if resource A is used for the last time in pass 3 and resource B for the first time in pass 4, they can share the same physical memory, thus reducing the overall memory requirement. Bonus I’ve also restructured the texture creation methods, making them simpler and allowing for fewer specifications. The before and after is a good result… The same goes for 1D and 3D textures.
DEVLOG 13 - Memory Aliasing Recap In the last devlog, I explained what I did and why I was creating a Render Graph. I mentioned a concept called Memory Aliasing, but I explained it briefly. I’ve been working extensively on the Render Graph these past few hours to implement the Memory Aliasing algorithm. What is Memory Aliasing? Memory Aliasing involves having two or more resources use the same portions of memory, thus sharing that memory. For example, let’s take a texture we’ll call A. This texture is used as Depth in pass 1 and read in pass 2. Another texture, called B, is used in pass 3 and pass 4 (see photo). We could allocate both resources independently, but you can clearly see that the resources don’t overlap in the passes. Texture A begins its usage cycle in pass 1 and ends in pass 2, and immediately after, in pass 3, texture B is used for the first time. What we could do is have both textures occupy the same memory space to save VRAM. This is the concept of Memory Aliasing. Obviously, since the resources share the same memory space, barriers must be created to synchronize resource access, otherwise there would be a race condition (two threads operating in parallel on the same memory space, not just for read-only operations). Resource Pooling In addition to memory aliasing, I wanted to optimize another aspect that took me some time. In Vulkan, when you want to create resources, you use vkCreateImage and vkCreateBuffer. These functions create a handle without associating physical memory with these objects. Binding occurs later, after executing the memory aliasing algorithm, which determines which memory space to assign to a resource. This means that I have to create and destroy resource handles every frame, which apparently isn’t a light operation to perform on multiple resources. So I thought that if there was a possibility, I could reuse handles from previous frames by simply comparing whether the settings of the requested handle were the same as the one to be reused and then binding the memory. The Problem and the Solution This was the idea I had, but unfortunately it’s not feasible because Vulkan doesn’t allow memory binding to a resource more than once, so this approach wouldn’t have worked. After thinking for a while about how to solve this, I decided to include in the requirements for using old handles, in addition to the texture or buffer settings, the offset and stride of how they were bound in memory. This way, if the pass structure and usage hadn’t changed significantly during the user’s setup phase, the Memory Aliasing algorithm would always produce the same results, given the deterministic nature, making this all feasible. Finally, if the resources aren’t reused for an N number of consecutive frames, they are permanently destroyed.
DEVLOG 14 - I Rewrote The Memory Aliasing Algorithm Intro Unfortunately, I don’t have anything exciting to say. I’m forced to do this devlog since I’ve reached ten hours since my last devlog, so I have to publish one, otherwise my hours wouldn’t count in full. I’ll try to share what I did, the problems I encountered, and how I solved them. The Problem I might sound crazy, but after working on the Render Graph for twenty hours, I rewrote it entirely from scratch. You might ask, why? The reason I did this was Vulkan itself. I discovered that, since I’d previously relied on VMA (Vulkan Memory Allocator) to manage memory, now that I was managing memory without it, there was something I’d overlooked: a parameter called Memory Type Index. The Memory Type Index indicates where to allocate memory. There could be a Memory Type Index for the GPU’s local memory, one for the Resizable BAR, etc. So, what’s the problem if all the Render Graph resources must live exclusively in the GPU’s local memory anyway? Wouldn’t it be enough to simply add a few lines of code and everything would be solved? Unfortunately, not because this index indicates in which memory to allocate that resource, but there’s also another parameter called Memory Type Bits, which is a bitmask that indicates in which Memory Type Indexes a resource can or cannot be allocated. All resources are allocated in the same Memory Type Index, but they may have different Memory Type Bits. This means, for example, that a texture without multi-samples cannot fit in the same memory space as a texture with multi-samples. This can also happen with the aspect mask, so a color texture and a depth texture might not fit in the same place. It could also happen with the format or tiling. The same goes for buffers, but these are more flexible than textures. The Solution My Memory Aliasing algorithm was designed without taking all this into account, so I chose to rewrite a large part of the Render Graph, trying to recycle some parts. Therefore, the Aliasing algorithm now operates on “Buckets,” which are in-memory containers containing resources that can fit in the same space. Without this distinction, memory aliasing wouldn’t be possible because a resource attempting to reuse memory used by previous resources must only check among resources with the same requirements, not among all resources. Therefore, it checks per bucket, not all existing resources. This has also made the code much cleaner and more organized.
DEVLOG 15 - Slang & Render Graph Reorganization So, I’ve been dividing the project into folders, making everything more organized, which wasn’t the case until now. The New Shader Language: Slang I saw that there was a more modern alternative to GLSL I could use, so I chose Slang. I created the code to create it in real time, and then I also changed the architecture of the Pipeline Builder a bit (the class responsible for creating Vulkan’s Pipeline and PipelineLayout objects). Vertex Fetch, Why Did I Choose It? I’ve been thinking for a while about forcing users of the engine to use Vertex Fetch. What is it? Well, normally when using a shader, before the Vertex Shader there’s a phase called Input Assembly that, based on the triangle indices, samples vertices from the vertex buffer, allowing them to be used directly in the Vertex Shader without manual sampling. However, this means that the layout of the vertex buffer must never change; if it were to change, you’d have to create another Pipeline object and bind it. Honestly, I don’t like this limitation very much. That’s why I removed this feature and adopted Vertex Fetch, which allows you to not specify a vertex layout, thus having as few Pipeline objects as possible. Obviously, you have to manually fetch the vertex from the respective buffer in the Vertex Shader, but frankly, it’s not a huge problem. Work In Progress On The Render Graph Another thing I’m implementing is commands that can be sent to the GPU via the Render Graph. So now you can draw, make GPU-GPU copies between buffers, between textures, and even between textures and buffers. Copies currently only support Transient resources; I’ll add the functionality for Persistent resources later. The same goes for using Compute Shaders. I’ve also added the ability to upload data from the CPU to the GPU, again for transient resources. For Persistent resources, I’ll also add this functionality later. I’m still writing the code for this, so I’m not finished yet, but I’m forced to devlog for the usual 10 hours of Stardance…
DEVLOG 16 - Blank Window, Draw Calls & More The last ten hours have been very productive. As the devlog title suggests, I managed to get the classic black window, completed the code for draw calls, and also accomplished many other things. Draw Calls Commands I then completed the code for making draw calls with a simple mesh, integrating all the logic into the Render Graph. If you want to send any command to the GPU—a draw call, a copy, a dispatch, or anything else—it must necessarily go through the Render Graph. This allows me to have a central entity that can manage barriers and commands in a highly optimized, precise, and secure manner. When you want to draw something, you must declare a graphics pass. This pass has methods to execute the drawing commands, but it also has methods to set things like the texture depth/stencil to use, the target texture to draw on, etc. You can also have multiple color targets, as long as they have the same resolution. Blank Window Since I haven’t seen any tangible results on screen for a while, only code, I tried displaying a black window and then initializing the engine. The new context, window, and swapchain builders all work. The Resource Mapper, the class that manages the global descriptor set, also works. Testing the other classes will require a bit more work until I’ve got all the missing pieces, but it’s almost there. Persistent Resources Support Since creating a mesh also involves creating data and sending it to the GPU via buffers, I need a way to upload data from the CPU to the GPU. Mesh buffers are persistent, not transient. Currently, in the Render Graph code, I only had support for copying and uploading transient resources. From now on, this is also available for Persistent resources, as I’ve written the same code for them as well. I also implemented barrier generation for persistent resources so that synchronization is handled internally by the Render Graph, as with transient resources. New Resource Handles Up until now, each resource has been represented as a handle corresponding to an unsigned 32-bit number. From now on, resources are represented by two unsigned 32-bit numbers: one for the previously existing identification number and a generation number. By combining both numbers, each resource is unique, thus eliminating the possibility that if a resource is destroyed and recreated with the same ID, it could be mistaken for an older resource that no longer exists. Project Cleaning I finally cleaned up the project a bit and made it a bit more organized by dividing the files into more specific subfolders.
DEVLOG 17 - Meshes & New Architecture Into See you again, Stardance. I’ve been implementing several things lately, as the title suggests, and I think we might soon have some geometry on the screen. Mesh System I’ve been working on meshes, creating everything needed to support mesh creation, editing, and destruction. Currently, if you create a mesh, you obviously create all the necessary buffers: one for vertex positions, one for normals, one for UVs, etc. So, for example, if I load position data and the buffer doesn’t exist, a new buffer is created and a CPU-GPU upload operation is performed. However, if the buffer exists and its size is greater than the new vertex size, the buffer isn’t reallocated to a smaller size but remains the same, reducing the number of vertices used for drawing. I’m not sure how useful this option is, but I plan to add an option to specify this in the future. Image Presentation Supported I’ve also been working on how to display an image on the screen. Currently, the Render Graph has a method that, given a texture’s Transient handle, sets that texture as the image to display on the screen. Internally, the Render Graph creates a draw pass at the end of all existing passes and then samples from the presentation texture set to draw on the swapchain. The code for all this might be a little rough at the moment; I’ll improve it later. The New Architecture For a while now, I’ve felt like the code was stepping on its own toes. I had a class called MemoryRegistry that was responsible for assigning slots to resources, allocating them, and managing their lifecycle. I didn’t like this, so I decided to rewrite much of it, splitting everything into multiple classes. Now I have a class called ResourceRegistry that provides resource IDs. A class called ResourceMapper that inserts resources into their respective global descriptors. A class called ResourceTracker that manages the resource lifecycle, their last use, which stage they were in, and similar information. Until recently, the MemoryRegistry managed both persistent and transient resources, which was a mess. I’ve decided that the MemoryRegistry should only manage persistent resources, while transient resources should be managed by a class called TransientResourcePool or something similar, which should be managed by the RenderGraph. That’s exactly what I’m working on. Some Stupid Bugs I overran the timeframe because I was partially testing the new code and encountered a stupid bug that made me lose time. (I was iterating an Array starting from the last element, but I forgot to subtract one from the size of the vector assigned to the for loop index, thus causing an out-of-memory access.) I think I’ll also rewrite a good portion of the RenderGraph first to adapt it to the new architecture. Advantages These changes will make developing new features faster and less cumbersome without having to adapt to an architecture that was poorly designed from the start. I swear that after I’ve done all this, I’ll render something to the screen, assuming there are no unforeseen issues ;)
DEVLOG 18 - More Refactoring Hi Stardance! I don’t know what to say about this devlog, since I’ve written a lot of code for my specific implementation… I’ll try to describe what I did without being too boring. Why I refactored again? As discussed in the previous devlog, I felt the code wasn’t “nice” or at least not very tidy, and honestly, I don’t like that very much, so I rewrote the Render Graph (partially) for the third time. Now, the Render Graph only manages single-frame resources, while all multi-frame resources are managed by a separate class called TransientResourcePool, which is therefore responsible for storing the resources. The Render Graph: A single frame responsibility The Render Graph is still responsible for memory aliasing and resource pooling, of course, as well as generating barriers and inserting the draw, copy, and, in the future, compute commands. (I still need to improve the code for compiling commands into the Command Buffers a bit.) Improvement in the searching of pooled resources Now, searching for resources to reuse is even faster, since resources are divided by their composition, for example. For textures, the parameters for this division are height, depth, width, samples, etc. This allows you to immediately find a resource if it’s available. More organization is the TransientResourcePool The TransientResourcePool is also responsible for permanently destroying unused resources for several frames. I had written the destruction code within the TransientResourcePool, but I thought maybe it wasn’t its responsibility, but rather an existing class called MemoryBin. The MemoryBin class was configured to work only for persistent resources, but now it handles the destruction of persistent and transient resources. What I need to fix: There’s a small problem in the code: Normally, when you want to destroy a resource, it’s queued and usually assigned a countdown. This countdown is a number that corresponds to the maximum frames in flight and decreases by one every frame. When this number reaches zero, the resource can be destroyed. This works perfectly, but when, for example, the swapchain needs to be recreated because the window size has changed, the GPU needs to be put into idle mode. This means that all in-flight frames have finished, and therefore all resources queued for destruction can and must be destroyed immediately, otherwise they would pile up. Otherwise, I think everything is perfect. I don’t think it will take me long to implement these little tricks, so I assume and hope :/ to start writing the code to display something on the screen soon. I’ll go back to my old, dear little triangle :)
DEVLOG 19 - Colors! Hi Stardance! I’ve made some progress and finally drew something on the screen! Improvements on the Swapchain Pass I’ve improved the Render Graph a bit by cleaning up old methods and making all the improvements discussed in the last devlog, such as improving the rendering code for the swapchain. Normally, you would set the 2D texture to display on the screen using the RenderGraph::SetPresentTexture(); In reality, this texture isn’t displayed directly on the screen but is first sampled and copied to the swapchain, so the Render Graph adds a hidden pass for this. When this texture hasn’t been assigned to any texture, the swapchain will be colored with the clear value set to black and sent to the screen. Push Constants Supported I’ve added the ability to use Vulkan Push Constants. Push Constants are data packets that can be sent to the GPU in parallel with the drawing command. Their size is very limited, 128 bytes, but their transfer speed is extremely fast. A hardware limitation is that the offset and size parameters must be multiples of four, so I used a struct called Words32 to dictate the 32-bit size and offset, not the 8-bit one. Furthermore, internally, the engine checks the state of the previous push constant for each push constant update, so as not to make unnecessary updates and to register the push constant command only when necessary, and only partially for the relevant bytes. Shaders Improvements I improved the shader code a bit by reducing the arguments needed to create a shader, and I also unified the layout; all shaders use the same VkPipelineLayout . The Problem and The Solution When I was writing the shaders to get these things on screen, I ran into errors telling me I was assigning a buffer descriptor to Descriptor Set 0 with binding 0, even though they’re actually textures. However, in the shader, I wasn’t requesting any of this, since the vertex data was written directly into the shader. After some research, I discovered that Slang shaders were creating bindings for these arrays outside the shader. To fix this, I simply moved the arrays into the vertex shader function, marking them with const. And note that all these images/videos use the swapchain pass, so this was all just a test. Now I’ll have to try declaring a real pass with Render Graph and try to draw something, hoping everything works correctly :/
DEVLOG 20 - A Better Triangle Intro Hi Stardance! This triangle was created with Render Graph . The entire process is divided into two steps: the first draws the triangle on a user-selected image, and the second takes that image, samples it, and draws it on the swapchain so the triangle can be seen on screen. Clean and Simple API The beauty of this is evident in the photo (third attachment). You only need to write a few lines of code to achieve all this compared to the complexity and number of lines of code required by Vulkan. Render Graph thus creates all the resources needed for synchronization, such as barriers , and attempts to alias memory whenever possible. It also leverages Resource Pooling , so images aren’t destroyed and recreated at every frame. Instead, if they have identical requirements, they are reused, avoiding unnecessary Vulkan calls. MSAA Deprecated MSAA images have been deprecated because, from a desktop computer perspective, they aren’t worth using because they require a lot of computational resources. To achieve anti-aliasing, it’s best to use post-processing passes that use FXAA (Fast Approximate Anti-Aliasing) or TAA (Temporal Anti-Aliasing). There are probably some bugs still present in the Render Graph despite the many already fixed; I’ll work on them.
DEVLOG 21 - ECS Refactoring Intro Over the past ten hours, I’ve worked extensively on the ECS , making it more robust, easier to use, more secure, and more efficient. What’s changed: New Way To Record Entity Commands Entity Command Pools are still used, but they’re managed not by the user but by the Entity Manager. The old CreateCommandPool() method no longer exists. Now, to execute a command on entities, you make a request to the EntityManager , which takes the command and places it in an EntityCommandPool of its choosing. The EntityCommandPool is chosen based on the SystemId provided by the engine with methods like Start, Awake, Update, etc. This reduces complexity and allows for systems that can run natively in parallel on multiple threads. Improved Efficiency Internally, the Entity Manager has improved the way to compact batches after command execution, making it simpler and faster. Instead, iterating over all batches only iterates on the entities that are no longer valid, and those slots are refilled with the components of the valid entities at the end of the last batches. Batch creation and destruction is handled automatically by the EntityManager . New Way To Query Tables The way to find tables with certain requirements has improved; the old method required registering a query and then returning a “ticket” used to access the query results. The operation is now simpler and more unified: The EntityManager is asked for all tables that meet the QueryInfo structure requirements, such as the archtype. The EntityManager checks whether the query already exists; if it doesn’t, it calculates it on the fly and returns it. Queries Updated Only When Needed Queries are updated only when tables are created/destroyed; otherwise, they remain - static and aren’t updated, saving calculations . The next step will be to verify if everything works, since I haven’t tested anything yet because I’m forced to do this devlog due to the ten-hour time limit. :/ Sorry about the picture, it’s the same, I didn’t have time to do anything else
DEVLOG 22 - ECS Bugs Fixed, Graphics Files Reorganized Hi Stardance! What I Did In this dev log, I fixed some of the last bugs the ECS code, so it now works and is very efficient. I ran several tests destroying, creating, and moving entities from one archtype to another, and everything works. I then worked on the project structure of the graphics part by fixing the graphics include files. What Went Wrong These updates mentioned so far have been successful. Two hours ago, I added a method in the graphics pass responsible for instanced drawing, so I took advantage of the opportunity to create a buffer to read the instance positions to see if it worked. I still don’t know why, but it doesn’t work. The application freezes, and sometimes the driver crashes (it scared me a little… :/ ). The Validation Layers don’t report anything wrong… So I need to figure out what’s wrong and fix it. The image shows some of the methods available after fixing the folders. The methods are in the Graphics class in the include folder.
DEVLOG 23 - Instanced Draw & Some Fixes Intro Devlog time!! In the last devlog, I had some issues with instanced drawing and reading a position buffer. What Was The Problem? I worked hard, but I managed to figure out where the problem was and fix it. (The problem was due to a for loop responsible for creating the address buffers. I was saving pointers outside the for loop with structs allocated inside the for loop; therefore, the pointers were pointing to corrupted memory or nothing.) Render Graph Fixes I fixed several things in the Render Graph that could cause future problems. I added small guards within the Render Graph so that if the user does something wrong, the application doesn’t crash unexpectedly. For example, previously, if the user set a texture to display that they’d never used (never involved in a transfer operation, never used as a graphic attachment), the program would crash. With these simple guards, everything is solved. Easier Resource Usage Declaration I’ve also added the ability to easily declare textures and buffers usage in the Graphics Pass class with dedicated methods like UseBufferReadOnlyVertex(...) , UseTextureVertex(...) , and others. The image shows a grid of 20x20 quad meshes drawn with a single draw call instead of 400 using instanced draw.
DEVLOG 24 - Error Manager, Copies & More Intro Hi Stardance! Lately, I’ve been focusing mainly on improving error handling returned by Vulkan and fixing some code here and there. New Error Manager System I’ve created a system responsible for error handling so that when an error occurs, such as a failure to allocate memory due to fragmentation or any other critical error, the app places a text file with information about the error in a folder called logs (created on the fly if it doesn’t exist). Immediately afterward, an error message is displayed on the screen explaining what happened. When the user presses the OK button, the app closes in the pop-up by calling std::abort(); . Some Test On Other PCs I tried running Eve outside of my PC on two other PCs, but since they’re a bit older, they don’t have support for Vulkan 1.4, so the app can’t be started. Swapchain Improvements The code for creating the swapchain has been improved somewhat, making it more secure and robust. New Copy Support I’ve added support for buffer and texture copy operations between resources that aren’t the same type (one transient and one persistent). Next Step: I want to make Eve a little more portable, so in the next few hours I’ll try using Vulkan 1.2, trying not to mess with the code. If necessary, I might resort to using Vulkan 1.3; I’ll see…
DEVLOG 25 - Eve is “Multi PC” Hi everyone! What’s changed since last time? More Device Supported As promised, Eve now uses Vulkan 1.2, so it can be used on multiple devices. Obviously, the device requires that, in addition to supporting Vulkan 1.2, it also supports some extensions that became core in Vulkan 1.3. Tests On Other PCs I then tried running the app on the only PC I had at home, but it crashed. I then tried updating the graphics driver, but that didn’t help; unfortunately, that PC is too old. I then asked a friend of mine to test the app. After fixing some issues, it started, but it would crash instantly. After hours of debugging, I found the problem: the problem was in resource allocation within the Render Graph, which only occurred with integrated GPUs (my heap selection algorithm for integrated GPUs was wrong). It’s now fixed. I also added my checks for failed Vulkan or VMA calls in places where they were missing, so now everything should work properly. Math Packet In Eve I also added a small mathematical component to Eve, including Vector2,3,4 ; Vector2Int,3Int,4Int ; Quaternion ; and Matrix4x4 . I must say that quaternions were difficult to understand at first, but once you understand how they work, it’s very easy to visualize them in your head. The first attachment shows Eve running on the PC of this friend of mine, whom I thank so much for his help, and the second image shows Eve running on my PC.
DEVLOG 26 - Input System Hi Stardance! The New Input System Since I couldn’t interact much with the graphics engine at the moment, I chose to create an Input System that currently only supports keyboard and mouse. It has methods like IsKeyDown(...) , GetMouseState(...) , IsMouseUp(...) , and similar ones. It’s quite simple, but it allows you to interact with the world, for example by creating a camera or a moving player. The Cube For fun and to test a bit, I tried creating a scene with a slightly rotated cube with direct light, obviously using my Render Graph, which allows you to do all this in about 150 lines of code (CPU side) instead of having to manually write barriers, configure passes, and many other repetitive tasks. I’m still using glm for matrix math, but I’m trying to reach a more stable level with the Eve package.
DEVLOG 27 - Material System Intro After some code rewrites, such as the separation between shaders and materials, the materials system now works. It’s very similar to how it works in Unity. I’ve figured out how to set things like material properties (floats, integers, vectors, etc.) directly from C++ using their names, without manually binding code. How Vulkan Handle All Of This? In Vulkan, you can’t set a shader parameter directly with a name. You need to create a buffer on the GPU, specifically a UBO, typically used for materials, bind it using a descriptor, and then bind it on the CPU. All of this is hidden by Eve, making the code easier and faster to write. What It Does? Basically, once the shader is compiled, it’s analyzed and checked for a struct called Properties. If it exists, this struct will be used for the material properties. Each field within it will be settable directly from the CPU using its name. Eve, now knowing the size of the struct and the field offsets, creates a buffer for the materials (actually, one for each frame in flight) and uses it to write everything a material might need, thus allowing for very simple parameter setting. How To Use It: The material provides an ID via the GetPropertyUBOId function, which must always be retrieved at each frame since it is not the same from frame to frame. This ID can be sent to the shader via push constant, which then allows access to the material’s property UBO, which contains all the values set on the CPU side. A simple cube rotating on itself using the new Material System and simple direct lighting
DEVLOG 28 - New Render System Hi Stardance! Intro I think this devlog is consistent with the next one I’m working on, since the work I’ve done in the last few hours isn’t quite finished, as there are still some bugs to resolve… Why a new render system? So far, I’ve been working on improving Eve’s rendering system. Instead of having to manually create buffers and the like, Eve has a completely automated system similar to the one used by Unity. For example, when you try to draw an object, you need things like object transformation matrices. If you then need more data, the limited size of push constants is no longer enough. Per Instance Params Eve, therefore, with its new rendering system, revolutionizes the way we write code, reduces bugs, and simplifies it. For each draw call sent to the GPU, the engine sends a buffer called InstanceParams to the GPU, which contains, for each drawing instance, its model matrix and its inverse. These matrices can then be retrieved using simple, custom functions ready for use in the shader. Per Render View Data For camera data, the process is similar. For each RenderView object, Eve allocates these objects on the GPU in a contiguous buffer from which the view, perspective, VP, and other matrices can be accessed. Custom Draw Info Data If you want to send custom data to the shader, each drawing function offers a pointer called DrawInfo that allows you to send data to the shader, which can then be accessed. If set to null, the shader will not send anything. GLM & A Flycam I also created a flycam and deprecated the Eve math package to use the glm one. Honestly, I want to focus on Eve and not the math, which is why I chose this option. Next Step: I still have some bugs to fix regarding making more than one draw call, but I’m working on it.
DEVLOG 29 - 1M Entities! Hi Stardance! Intro Since the last day, I’ve been working alone and have run into several issues… Most of them have been resolved. Some Tests So I started running some tests to check the speed of my new rendering system, and with 100,000 entities drawn to the screen with a single draw call, I was getting 30 FPS. After parallelizing the code a bit and reducing the copies, the results are now better: 100,000 entities with single draw calls get 50-60 FPS. 100,000 entities with a single instanced draw call get 230-250 FPS. 1,000,000 entities with a single instanced draw call get 30 FPS. What Need To Be Optimized Actually, I could optimize even more and double these FPS, but the current problem is that I’m calculating the matrices on the CPU side, so I’m doing a lot of calculations that currently take up a good portion of the necessary CPU time, about 50%. The idea would be to move all the work to the GPU in the future with compute shaders, thus significantly reducing the CPU load. I’ll see if I can do this… Maybe in a while, when I add full support for compute shaders. (I have a Ryzen 5 5600 X and an RX 6600) Rendering System Time: Not counting the matrices, the rendering cycle along with the Render Graph takes about 2-2.5 ms, almost all of which is spent on the Render Graph. I have also fixed some problems with Swapchain Recreation when the window is minimized. Problems With RenderDoc Five of these eight hours have been pure frustration, as I don’t understand why, but the app crashes on RenderDoc. Normally, on my PC it starts and works, but on RenderDoc it crashes… I’ve tried every way to understand the problem, but unfortunately I haven’t been able to. I’ll also test on other PCs to better understand the problem. Unfortunately, I don’t have time on my side, so I’ve had to put the issue aside for now…
DEVLOG 30 - Compute Shaders Hi Stardance! Intro I’ve finally implemented compute shaders—as the title suggests—alongside conducting some tests and reorganizing the project. Compute Shader Support I’ve added support for compute shaders, meaning they can now be used just like any other type of pass, whether graphics or transfer. Optimizations I’ve also utilized compute shaders internally within the engine to speed up matrix calculations; here are the results: With 100,000 entities using instanced rendering, I’m getting 800 FPS, up from the previous 250. With 1,000,000 entities using instanced rendering, I’m getting around 90 FPS, up from the previous 30. With 100,000 entities using independent draw calls, I’m getting around 90 FPS, up from the previous 30. I’d say the results speak for themselves, and I’m quite happy with these optimizations. As mentioned in the previous devlog, testing was performed on my PC, which is equipped with a Ryzen 5 5600X and an RX 6600. Swapchain & CMake I also made slight modifications to the swapchain recreation code to make it faster and reduce stuttering. Finally, I tidied up the CMakeLists file to make it more organized and prepare for the release. The video shows a scene with 1M entities rendered in real-time using instanced draw call at 90 FPS
DEVLOG 31 - It’s not my fault! Hi Stardance! Unlike the other devlogs, this one is very quick and simple. A Little Recap In devlog 29, I encountered some issues with RenderDoc, even though the app kept running fine and caused no problems outside of RenderDoc itself. What I Did After doing some online research, I discovered that RenderDoc has issues with AMD drivers, which can cause the app to crash. So, I decided to try AMD’s Radeon Developer Tools (a profiler similar to RenderDoc, designed specifically for AMD GPUs). No errors were reported and everything works perfectly, so the problem most likely lies in how AMD drivers interface with RenderDoc.
DEVLOG 32 - UI Support Hi Stardance, Intro I’ve been working on the UI lately, as I wanted to give the user a way to interact with the engine beyond just mouse and keyboard input. The UI in Eve I opted for Dear ImGui and created a lightweight wrapper that allows it to run within Eve. I stripped away some of the boilerplate code associated with the standard Begin and End calls, making it slightly simpler and safer to use than raw ImGui. I also added support for dockable windows. The video shows a scene with 1,000 cubes; thanks to the UI, you can modify their color, position, and rotation. You can also change the direction of the direct light. The code required by this UI is just five lines.
DEVLOG 33 - Meshes & Fixes Hi Stardance! Intro We’re getting closer to the release build of Eve! I have to say that with this devlog, the engine is practically finished and ready for shipping; I just need to tweak a few final details and we’re all set… Meshes: In this devlog, I worked on the mesh system—fleshing it out and making it functional—and added standard meshes to Eve: a cube, a UV sphere, an icosphere, a plane, and a quad. Some Bugs Fixed While implementing this, the program kept crashing for no apparent reason; after two hours of debugging, I found the error in the Render Graph—caused by the order of Eve’s internal passes—which is now fixed. Internal Shaders Organization I also embedded the engine’s internal shaders directly into the executable, so there’s no need to remember to include them alongside the executable when creating an app. The video shows the same UI as the previous devlog—featuring controls for color, rotation, cube position, and direct light direction—but this time, you can change the meshes of the “thousand-odd” cubes at runtime using the standard Eve meshes listed above, via a simple UI dropdown menu.
DEVLOG 34 - Icon, Windows & More Hi Stardance! Intro The release is getting close, so I’m tidying up a few final details; I’ve finally turned my attention to a slightly more relaxed and lighthearted part of the project. Engine Settings I added a method to start the engine that accepts configuration settings for how the app runs. You can also choose whether or not to enable VSync at runtime. Window Class I added a window management class that allows for various operations, such as toggling fullscreen mode and manually changing the resolution, position, title, etc. I also included a method to set the window icon using a PNG image. Eve’s Icon I also spent some time on Canva trying to create an icon—a logo—for Eve. After several attempts, I settled on the one in the attachment.
DEVLOG 35 - Documentation Hi Stardance! Intro I’ve finally finished writing the documentation for Eve—a rather tedious and repetitive process, but a necessary one. How The Docs Is Structured: Every part of the engine is documented; inside the docs folder, you’ll find instructions on how to launch the engine, along with subfolders for each component—graphics, input, window management, and so on. Next Last Steps: I still need to create the README and tidy up a few things in the project, as well as write instructions on how to configure Eve for use on one’s own PC… But after a whole summer, I’m finally close to shipping!
DEVLOG 36 - Black Hole! Hi Stardance! Intro I’ve been working really hard lately, and I think I’ve reached a milestone with Eve that I honestly never expected to hit. The project is finally complete; now I just need to click that nice button to ship it. I’ve spent this time working on the README, improving the documentation, fixing bugs, and building a demo using Eve. Eve Demo The demo is a gravity simulation featuring hundreds of thousands of entities orbiting a black hole. You can tweak various parameters—such as time, the black hole’s gravitational pull, lighting, colors, meshes, and much more. If you’d like to test it out, you can find it in the GitHub releases; there’s a ready-to-use .exe, or the source code if you’re on Linux—or if you simply want to understand how Eve works or make some modifications yourself. Problems Encountered While building the demo, I ran into—and have since resolved—some very frustrating bugs, such as memory corruption in the ECS caused by the continuous creation and destruction of entities and their components. I also added UI text support and implemented the ability to register “stages” belonging to classes or structs that can be called by the engine.
Ships:
Eve is a graphics engine written entirely in Vulkan , with the primary goal of learning Vulkan and C++ while simplifying their usage. Originally conceived as a simple, lightweight wrapper around Vulkan , Eve now includes: A Render Graph designed from scratch that leverages technologies such as memory aliasing (where multiple resources share the same memory space) and resource pooling (reusing resources across frames). It performs the core function of a Render Graph: by simply knowing how resources are utilized, it automatically issues the necessary synchronization barriers to the GPU. Developing the Render Graph was a grueling process, but it proved worthwhile in terms of both performance and the educational value of the experience. An ECS (Entity Component System) also designed from scratch, following the model of Unity’s DOTS ECS . Instead of scattering resources across VRAM—which slows down access due to constant memory jumps—game objects are organized into Archetypes. Components are distributed in contiguous memory batches, thereby minimizing cache misses. A rendering system that automates the insertion of transforms into buffers; these are subsequently processed into matrices via a compute shader and sent to the rendering shaders. It also features a material system that analyzes shader composition, looking for a struct named “Properties” that allows fields to be assigned by name from the C++ side. Support for the Slang shading language with a bindless system . Eve provides a file named Eve.slangh that simplifies and automates the retrieval of textures, buffers, and samplers from descriptors. Compute shader support is also included. An integrated, easy-to-use Input system inspired by Unity’s Input System , along with a lightweight UI wrapper that makes using Dear ImGui simpler and more intuitive. Eve also includes a demo featuring a gravitational simulation of thousands of entities orbiting a black hole, allowing various parameters to be adjusted in real-time....
|
1793350587.5026329
|
1793436987.5026329
|
|
22005
|
Zenith V model rocket by @alexpleson49 | Stardance
|
alexpleson49
|
1
|
19.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-25T23:18:56Z", "hours": 19.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "hello. this is the failure of the Zenith V model rocket. the rocket launch earlier today ended in a failure with the rocket violently veering of course due to a faulty engine stabilizer resulting in a fiery crash. I am shipping it as is because i do not have the ability for another launch. although i have only logged 20 hours i have undoubtably spend over 100 which makes this a very sad loss. Thank you for taking the time to read this regardless what you choose to rate it. Here i will end it off with the launch and my favourite picture from the process, again thank you.", "repo": "https://github.com/zanderman106/Zenith-V-model-rocket-flight-computer-software", "demo": ""}]...
|
[{"post_id": 71425, "ts": "202 [{"post_id": 71425, "ts": "2026-09-20T19:57:12Z", "hours": 1.935, "text": "finished wiring the flight computer, uploaded the code to the ground station, and prepped the flight computer for the code and launch."}, {"post_id": 69443, "ts": "2026-09-17T02:04:41Z", "hours": 2.1664, "text": "a longer work period here, i completely soldered the ground station and begun to solder the flight computer (sorry about the image quality it was taken form my laptop =) )"}, {"post_id": 38009, "ts": "2026-07-31T04:04:30Z", "hours": 0.9342, "text": "nothing too exciting today, just figuring out some random things if anyone has any questions about the rocket/project please ask!"}, {"post_id": 37390, "ts": "2026-07-30T02:20:04Z", "hours": 1.8169, "text": "finalized the designs for the flight computer and LoRa receiver, the final design is to have GPS in the flight computer and have all of the info transmitted rather than stored. the information will be received by a module that plugs into the USB port on my laptop so that it can by interpreted and displayed in real time. the information will include: altitude, barometric pressure, temperature, and a video feed will be saved to an onboard SD card."}, {"post_id": 36132, "ts": "2026-07-28T00:47:52Z", "hours": 0.4503, "text": "finalized flight computer components, and found launch site candidates."}, {"post_id": 21247, "ts": "2026-07-03T02:42:07Z", "hours": 4.1219, "text": "i did a lot and kind of forgot to devlog, so i finalized connection rings, made the nosecone design, and begun to work on the PCB for the flight computer"}, {"post_id": 17347, "ts": "2026-06-28T03:04:11Z", "hours": 1.2508, "text": "the first parts of the rocket have been finalized, printed, and assembled. The structure of the main body is now ready for testing."}, {"post_id": 16673, "ts": "2026-06-27T03:21:49Z", "hours": 1.5669, "text": "Parachute bay and main body tube almost complete, this is an image of a 3D model for the parachute bay and main body tube, all that needs to be done on these is adding strength via interior support bars."}, {"post_id": 12836, "ts": "2026-06-21T00:34:45Z", "hours": 5.3375, "text": "The final version of the Zenith V booster stage is complete. This is the version that will launch the rocket about 2000 ft before the sustainer stage activates and this stage falls back to the ground."}, {"post_id": 11976, "ts": "2026-06-19T15:35:47Z", "hours": 0.5003, "text": "now printing the final version of the main booster stage for the Zenith V"}, {"post_id": 11956, "ts": "2026-06-19T14:48:17Z", "hours": 0.3492, "text": "Zenith V booster stage test model –––––––––––––––––––––––––––––––This is a test model for the booster stage of my zenith V model rocket, the booster stage will house 2 Estes E 12 0 motors."}]...
|
Title: Zenith V model rocket by @alexpleson49 | St Title: Zenith V model rocket by @alexpleson49 | Stardance
Devlogs:
Zenith V booster stage test model –––––––––––––––––––––––––––––––This is a test model for the booster stage of my zenith V model rocket, the booster stage will house 2 Estes E 12 0 motors.
now printing the final version of the main booster stage for the Zenith V
The final version of the Zenith V booster stage is complete. This is the version that will launch the rocket about 2000 ft before the sustainer stage activates and this stage falls back to the ground.
Parachute bay and main body tube almost complete, this is an image of a 3D model for the parachute bay and main body tube, all that needs to be done on these is adding strength via interior support bars.
the first parts of the rocket have been finalized, printed, and assembled. The structure of the main body is now ready for testing.
i did a lot and kind of forgot to devlog, so i finalized connection rings, made the nosecone design, and begun to work on the PCB for the flight computer
finalized flight computer components, and found launch site candidates.
finalized the designs for the flight computer and LoRa receiver, the final design is to have GPS in the flight computer and have all of the info transmitted rather than stored. the information will be received by a module that plugs into the USB port on my laptop so that it can by interpreted and displayed in real time. the information will include: altitude, barometric pressure, temperature, and a video feed will be saved to an onboard SD card.
nothing too exciting today, just figuring out some random things if anyone has any questions about the rocket/project please ask!
a longer work period here, i completely soldered the ground station and begun to solder the flight computer (sorry about the image quality it was taken form my laptop =) )
finished wiring the flight computer, uploaded the code to the ground station, and prepped the flight computer for the code and launch.
Ships:
hello. this is the failure of the Zenith V model rocket. the rocket launch earlier today ended in a failure with the rocket violently veering of course due to a faulty engine stabilizer resulting in a fiery crash. I am shipping it as is because i do not have the ability for another launch. although i have only logged 20 hours i have undoubtably spend over 100 which makes this a very sad loss. Thank you for taking the time to read this regardless what you choose to rate it. Here i will end it off with the launch and my favourite picture from the process, again thank you....
|
1793346714.0008168
|
1793433114.0008168
|
|
61613
|
ONE TAB by @Devadutt | Stardance
|
Devadutt
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T20:20:19Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I build a Website with google search bar and hyperlinks to some of my favorites sites. The hardest part was setting up the workflow. I messed it up a couple time I misspelled the depoly.yml file and so on. I am happy I made something like this. Thank YOu", "repo": "https://github.com/Devadutt-11/ONE-TAB", "demo": "https://devadutt-11.github.io/ONE-TAB/"}]...
|
[{"post_id": 71432, "ts": "202 [{"post_id": 71432, "ts": "2026-09-20T20:15:00Z", "hours": 1.2419, "text": "completed …..!"}, {"post_id": 71362, "ts": "2026-09-20T18:06:39Z", "hours": 2.1028, "text": "Done some designing and added few hyperlink"}, {"post_id": 70781, "ts": "2026-09-19T19:10:19Z", "hours": 2.3478, "text": "I completed my guide almost correctly.I am looking forward for my next part of the project…!"}]...
|
Title: ONE TAB by @Devadutt | Stardance
Devlogs:
Title: ONE TAB by @Devadutt | Stardance
Devlogs:
I completed my guide almost correctly.I am looking forward for my next part of the project…!
Done some designing and added few hyperlink
completed …..!
Ships:
I build a Website with google search bar and hyperlinks to some of my favorites sites. The hardest part was setting up the workflow. I messed it up a couple time I misspelled the depoly.yml file and so on. I am happy I made something like this. Thank YOu...
|
1793209744.9280736
|
1793296144.9280736
|
|
62127
|
Macropad by @deshnaarun | Stardance
|
deshnaarun
|
0
|
1.88
|
0
|
[]
|
[{"post_id": 71440, "ts": "202 [{"post_id": 71440, "ts": "2026-09-20T20:27:40Z", "hours": 1.8839, "text": "I’ve been working on this macropad project over the summer where I had already finished up the case design and the pcb design. Today I focused on setting up the firmware for my simple macropad which consists of 4 switches, a rotary encorder and an OLED display where I mapped each component to its correct pin by exporting net list from kicad schematics and after troubleshooting a couple of errors, I was able to successfully compile the firmware"}]...
|
Title: Macropad by @deshnaarun | Stardance
Devlog Title: Macropad by @deshnaarun | Stardance
Devlogs:
I’ve been working on this macropad project over the summer where I had already finished up the case design and the pcb design. Today I focused on setting up the firmware for my simple macropad which consists of 4 switches, a rotary encorder and an OLED display where I mapped each component to its correct pin by exporting net list from kicad schematics and after troubleshooting a couple of errors, I was able to successfully compile the firmware...
|
1793044215.512125
|
1793649015.512125
|
|
51987
|
Hayai - Mini Rythm Keeb by @xstempell | Stardance
|
xstempell
|
0
|
23.78
|
0
|
[]
|
[{"post_id": 71441, "ts": "202 [{"post_id": 71441, "ts": "2026-09-20T20:27:48Z", "hours": 4.6844, "text": "moving the zif connector and OnShape issues we’re not sqishing the cable anymore Soooo i realised, that when assembling the whole thing, the fpc connector would only have like 1,5mm of space under the panel and that is WAAAY to little for it to not break so i had to lay it flat on the pcb and move the zif connector behind the mcu pins. time for some bad news When i tried to import the new board design into onshape for assembly, it spewed out an error that the step file coud not be translated. I thought to myself - fine just try again. Same thing happened so i started troubleshooting: -gaps in edge-cuts? No -corrupted models? Nope -weird design? Nu uh, tried to import a plain rectangle and nothing changed. -Kicad issues? Wrong, dropped a 3d model from a website, still couldn’t translate The worst thing about it was that it wasn’t just the .step format that could not be translated by onshape. I tried stl, 3mf, gbl - the result was still the same. I ran out of ideas so i decided to switch to a different cad program (onshape failed to export the existing models too, so my work there is unaccesable now. Thanks ig) and face my worst fear - Autodesk Fusion. I hate this software for the dephts of my pure soul. this program is REALLY overengineered for me and my skills and all the tools, mechanics and functions are too complicated for me to handle and end up working against me and themselves. I had to redo all of the plates inside a program which I despise. I was so frustrated i forgot to log some hours. After a long work session I managed to finish them. You can see the results of my hard work below. Oh and we hit the 20 hour mark with this one!"}, {"post_id": 68878, "ts": "2026-09-15T22:51:46Z", "hours": 4.3347, "text": "PCBA IS TOO EXPENSIVE I looked over the pcb assembly costs and boy were they high. So high in fact, that it exceeds the max funding for the tier hayai falls into. to reduce assembly costs, i decided to use a microcontroller module instead of the chip. I used a rp2350 zero from waveshare and rerouted the whole board (and also expanded the borders a bit). Im a bit frustrated about the whole thing bescause the project was like 99% ready to submit and now i gotta do so many things all over again but it is what it is."}, {"post_id": 65642, "ts": "2026-09-10T22:16:19Z", "hours": 0.9992, "text": "Added mounting holes i decided on a system where 4 holes will be occupied by screws attached from both sides to a female to female spacer, and the other 4 by dowel pins to prevent the plates from wobbling sideways. i’ll adjust the hole sizes later when im ordering exact pins and screws"}, {"post_id": 64466, "ts": "2026-09-08T21:37:56Z", "hours": 1.2303, "text": "Case plates finished! And with that, the whole project, i think. I took inspiration for the casing method from the sayo device with the pcb “sandwitched” between these plates. mine will be made from acrylic and im still thinking about priting some designs on top of the top plate and maybe making the bottom plate transparent but we’ll think about that later. Only thing left is some double checks, finishing up the repository and i think we’re ready to submit! (btw i never told you but Hayai means swift in japanese :>)"}, {"post_id": 57711, "ts": "2026-08-29T23:21:47Z", "hours": 3.5, "text": "PC crashed, lost my work :C so unfortunaly my pc crashed and i lost almost all work on the pcb, wchich was weird bescause i could have sworn i’ve been saving my progress regurarly. But we don’t cry over spilled milk do we? I started over and made the pcb again it was easier as i just needed to redo it from memory. still have some silkscreen art to do tho."}, {"post_id": 56785, "ts": "2026-08-28T18:05:42Z", "hours": 2.5, "text": "I fancy an upgrade, so lets start over After some thought, i decided to upgrade the regular mechanical switches to hall effect magnetic ones. That of course requires them to be hooked up to analog pins. But I already wired everything and stuff and the adc pins are on the opposite side of the board so it would really be a mess dragging them all the way so i decided to start over and redo the pcb. I also made a custom footprint for the switches i wanna use (the gateron magnetic jade Air HE’s)."}, {"post_id": 52974, "ts": "2026-08-23T10:57:52Z", "hours": 6.5361, "text": "Schematic and initial pcb design After some trial, error and deviously long time looking for the right ips panel (asking guys on reddit came in handy as always) I completed the schematic and the initial pcb design. As for the parts i suppose they will remain unchanged but im sure the arrangement of them on the board will as i move on to designing the case for it, especially the ips panel bescause i just put it somewhere in the middle without a care in the world :P. I had to make my own footprint and symbol for the 8pin 0,5mm pich ZIF connector (i did not find any online :cc ) but at least now i know how to make these right? Arranging everything on the board is fairly easy given the space i have. Seriously - running a straight trace across the whole board has never been more refreshing after doing a pi pico devboard project!"}]...
|
Title: Hayai - Mini Rythm Keeb by @xstempell | Sta Title: Hayai - Mini Rythm Keeb by @xstempell | Stardance
Devlogs:
Schematic and initial pcb design After some trial, error and deviously long time looking for the right ips panel (asking guys on reddit came in handy as always) I completed the schematic and the initial pcb design. As for the parts i suppose they will remain unchanged but im sure the arrangement of them on the board will as i move on to designing the case for it, especially the ips panel bescause i just put it somewhere in the middle without a care in the world :P. I had to make my own footprint and symbol for the 8pin 0,5mm pich ZIF connector (i did not find any online :cc ) but at least now i know how to make these right? Arranging everything on the board is fairly easy given the space i have. Seriously - running a straight trace across the whole board has never been more refreshing after doing a pi pico devboard project!
I fancy an upgrade, so lets start over After some thought, i decided to upgrade the regular mechanical switches to hall effect magnetic ones. That of course requires them to be hooked up to analog pins. But I already wired everything and stuff and the adc pins are on the opposite side of the board so it would really be a mess dragging them all the way so i decided to start over and redo the pcb. I also made a custom footprint for the switches i wanna use (the gateron magnetic jade Air HE’s).
PC crashed, lost my work :C so unfortunaly my pc crashed and i lost almost all work on the pcb, wchich was weird bescause i could have sworn i’ve been saving my progress regurarly. But we don’t cry over spilled milk do we? I started over and made the pcb again it was easier as i just needed to redo it from memory. still have some silkscreen art to do tho.
Case plates finished! And with that, the whole project, i think. I took inspiration for the casing method from the sayo device with the pcb “sandwitched” between these plates. mine will be made from acrylic and im still thinking about priting some designs on top of the top plate and maybe making the bottom plate transparent but we’ll think about that later. Only thing left is some double checks, finishing up the repository and i think we’re ready to submit! (btw i never told you but Hayai means swift in japanese :>)
Added mounting holes i decided on a system where 4 holes will be occupied by screws attached from both sides to a female to female spacer, and the other 4 by dowel pins to prevent the plates from wobbling sideways. i’ll adjust the hole sizes later when im ordering exact pins and screws
PCBA IS TOO EXPENSIVE I looked over the pcb assembly costs and boy were they high. So high in fact, that it exceeds the max funding for the tier hayai falls into. to reduce assembly costs, i decided to use a microcontroller module instead of the chip. I used a rp2350 zero from waveshare and rerouted the whole board (and also expanded the borders a bit). Im a bit frustrated about the whole thing bescause the project was like 99% ready to submit and now i gotta do so many things all over again but it is what it is.
moving the zif connector and OnShape issues we’re not sqishing the cable anymore Soooo i realised, that when assembling the whole thing, the fpc connector would only have like 1,5mm of space under the panel and that is WAAAY to little for it to not break so i had to lay it flat on the pcb and move the zif connector behind the mcu pins. time for some bad news When i tried to import the new board design into onshape for assembly, it spewed out an error that the step file coud not be translated. I thought to myself - fine just try again. Same thing happened so i started troubleshooting: -gaps in edge-cuts? No -corrupted models? Nope -weird design? Nu uh, tried to import a plain rectangle and nothing changed. -Kicad issues? Wrong, dropped a 3d model from a website, still couldn’t translate The worst thing about it was that it wasn’t just the .step format that could not be translated by onshape. I tried stl, 3mf, gbl - the result was still the same. I ran out of ideas so i decided to switch to a different cad program (onshape failed to export the existing models too, so my work there is unaccesable now. Thanks ig) and face my worst fear - Autodesk Fusion. I hate this software for the dephts of my pure soul. this program is REALLY overengineered for me and my skills and all the tools, mechanics and functions are too complicated for me to handle and end up working against me and themselves. I had to redo all of the plates inside a program which I despise. I was so frustrated i forgot to log some hours. After a long work session I managed to finish them. You can see the results of my hard work below. Oh and we hit the 20 hour mark with this one!...
|
1792691485.5950644
|
1793296285.5950644
|
|
33592
|
KnowNow by @TheGeekachu | Stardance
|
TheGeekachu
|
1
|
3.97
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-11T22:02:12Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built an AI web browser extension for Chrome, Edge and Safari that lets you highlight any text on a webpage and instantly get context and additional information on that topic.", "repo": "https://github.com/TheGeekachu/know-now", "demo": "https://github.com/vijayakasee-debug/know-now/releases/tag/hackclubstardance"}]...
|
[{"post_id": 71446, "ts": "202 [{"post_id": 71446, "ts": "2026-09-20T20:43:18Z", "hours": 0.27, "text": "My README got accused of AI use again. It’s not my fault if I have a good sense of aesthetics, and it definitely doesn’t indicate AI use. This is my first ship, and right now the only unapproved one. Thanks a lot, shipwrights."}, {"post_id": 66270, "ts": "2026-09-12T00:32:45Z", "hours": 0.3756, "text": "So, a bumch of weird stuff happened. They told me to add a .crx file when the GitHub release only had a .zip file, clarifying that it wouldn’t work because Chrome blocks direct .crx installs, and then later rejected my project again because the .crx file didn’t work. Go figure. So, somebody in the Slack helped me out, and I’ve requested re-certification. Fingers crossed!"}, {"post_id": 27895, "ts": "2026-07-13T20:21:02Z", "hours": 0.3278, "text": "Switched reasoning model to Qwen. Also, I got flagged for AI, so just want to clear up that I did not use any AI on the README. I also got flagged for my Demo page, which is a drive link to a demo video, so I’m publishing a GitHub Pages website as it is impossible to create a proper demo website for a browser extension. it won’t be pretty, it’ll just say “View source code,” but hopefully it’ll remove the flag."}, {"post_id": 26863, "ts": "2026-07-11T21:52:20Z", "hours": 1.6664, "text": "Ta-da! All finished! Just to spite Apple, I added Liquid Glass, something they boasted about for a whole WWDC, in 15 minutes! MWHAHAHAHA"}, {"post_id": 26360, "ts": "2026-07-11T03:20:15Z", "hours": 1.3761, "text": "I just got it to work, you can officially download the browser extension."}]...
|
Title: KnowNow by @TheGeekachu | Stardance
Devlog Title: KnowNow by @TheGeekachu | Stardance
Devlogs:
I just got it to work, you can officially download the browser extension.
Ta-da! All finished! Just to spite Apple, I added Liquid Glass, something they boasted about for a whole WWDC, in 15 minutes! MWHAHAHAHA
Switched reasoning model to Qwen. Also, I got flagged for AI, so just want to clear up that I did not use any AI on the README. I also got flagged for my Demo page, which is a drive link to a demo video, so I’m publishing a GitHub Pages website as it is impossible to create a proper demo website for a browser extension. it won’t be pretty, it’ll just say “View source code,” but hopefully it’ll remove the flag.
So, a bumch of weird stuff happened. They told me to add a .crx file when the GitHub release only had a .zip file, clarifying that it wouldn’t work because Chrome blocks direct .crx installs, and then later rejected my project again because the .crx file didn’t work. Go figure. So, somebody in the Slack helped me out, and I’ve requested re-certification. Fingers crossed!
My README got accused of AI use again. It’s not my fault if I have a good sense of aesthetics, and it definitely doesn’t indicate AI use. This is my first ship, and right now the only unapproved one. Thanks a lot, shipwrights.
Ships:
I built an AI web browser extension for Chrome, Edge and Safari that lets you highlight any text on a webpage and instantly get context and additional information on that topic....
|
1793314305.4790149
|
1793400705.4790149
|
|
62366
|
Eli Site by @eliziv027 | Stardance
|
eliziv027
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T22:04:41Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I refined the Eli Site homepage structure and content to better present my interests, projects, and journey. I focused on improving the layout and making the site easier to explore.", "repo": "https://github.com/zivzancoeli-commits/Eli-site", "demo": "https://zivzancoeli-commits.github.io/Eli-site/"}]...
|
[{"post_id": 71457, "ts": "202 [{"post_id": 71457, "ts": "2026-09-20T21:20:12Z", "hours": 0.5022, "text": "I worked on the Eli Site today and refined the personal homepage structure. I improved the layout and content so the site better presents my interests, projects, and journey. Next I will continue polishing the design and adding more useful sections."}]...
|
Title: Eli Site by @eliziv027 | Stardance
Devlogs Title: Eli Site by @eliziv027 | Stardance
Devlogs:
I worked on the Eli Site today and refined the personal homepage structure. I improved the layout and content so the site better presents my interests, projects, and journey. Next I will continue polishing the design and adding more useful sections.
Ships:
I refined the Eli Site homepage structure and content to better present my interests, projects, and journey. I focused on improving the layout and making the site easier to explore....
|
1793209981.5304983
|
1793296381.5304983
|
|
1327
|
Cirqmon by @itsdecodeaditya | Stardance
|
itsdecodeaditya
|
1
|
85.0
|
1594
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T21:50:13Z", "hours": 85.0, "multiplier": 19.19, "payout": 1594, "blessing": "neutral", "text": "Cirqmon is a quantum computing circuit builder on web and It’s idea was like when I used to go on tools like IBM’s or other quantum circuit simulators they used to feel like so dry and academic, So I thought why don’t I make one that’s colorful, looks like game because I guess learning deep tech should not mean that you lose colors. Earlier I thought I would just build UI layer on top of Qiskit via Python API, then I thought what will I learn and from a quite a long time I wanted to build something that involves maths and physics so i thought I should build whole thing by myself. The whole thing was Actually a bit challenging on understanding how Q spheres or Tensors or how bitwise calculations work, aligning it will a Good UI theme, So I just learned and build. sometimes I thought How will i finish or how will I map that understanding into code But I guess AI as a Teacher helped me a lot. For Others to try it you should know about Quantum Gates, read the Readme once and I guess you will understand the project.", "repo": "https://github.com/decodeaditya/cirqmon/", "demo": "https://cirqmon.vercel.app/"}]...
|
[{"post_id": 71464, "ts": "202 [{"post_id": 71464, "ts": "2026-09-20T21:31:02Z", "hours": 2.8469, "text": "Cirqmon Devlog #12 So I guess it’s final Devlog. Here firstly I updated Readme with new UI based snapshots. Made custom Alert box so it matches the theme instead of browser native alert box. Fixed bug in which earlier the gates were being added in circuit without checking if that Block is being used by other gate and its corresponding qubits. I hope if I don’t get a new problem to fix I will ship it;"}, {"post_id": 71194, "ts": "2026-09-20T12:52:50Z", "hours": 8.1419, "text": "Cirqmon Devlog #11 So Guys, I have finally finalized the Cirqmon Playground UI. I replaced the old glassmorphism theme with a rougher, more irregular visual style. Earlier I got feedback that, the old layout felt cluttered because the quantum gates were spread far apart and Due to Space Background and glassmorphism, it looked like Vibe coded. I have now grouped all the gates together in one place to make the interface cleaner and easier to navigate. Here Is what I changed: Removed the Home button. Clicking the Cirqmon logo now takes gets back to the home page. Updated Playground icons with Animal GIFs to give it more lively and engaging appearance. As mentioned above, reduced the use of glassmorphism to due to flickering issues and implemented like hand drawn solid color based UI. Attaching a video Snapshot so you can see changes made. also, The README is the only major task left. Once that’s finished, I’ll be ready to ship the project!"}, {"post_id": 66582, "ts": "2026-09-12T12:50:46Z", "hours": 8.0617, "text": "Cirqmon Devlog #10 Every time I think My project is ready to ship I find something missing and then it gets delayed. After I finished the blog on Deutsch Jozsa algorithm the project worked, as it needed only Single and Double qubit gate. When I started writing about Grover’s algorithm I realized the need of Three Qubit gate too as it needed CCZ gate to flip the phase to achieve 111 State. So I had to fix that. Here is what I did: Firstly as I told earlier I added the 3 Qubit gate feature, the underlying simulator code is working as old Inflating the Matrix approach, I only had to make it work for 3 Qubit gates. Secondly once I was on huddle where we were discussing about Boba bash, I presented the project to people and some said like ’it looks like too stuffed or some said it looked vibe coded. So I thought its a good feedback to work on. Then I improvised the Homepage so it feels like Apple like minimal theme while maintaining game feel. I also added the Background video instead of static image. Thirdly the blog page was pending so I made blog page with similar theme as I updated along with a option to search among the medium posts. So this was what I updated in this Version and now I needs that code review and matching the theme on Playground too. Just Hope I don’t get stuck this time and wrap it up. Thanks for Reading!"}, {"post_id": 46862, "ts": "2026-08-14T12:20:36Z", "hours": 6.1919, "text": "Cirqmon #Devlog 9 This version is more of testing, I thought that I should write blogs and use examples using Cirqmon, So Written 2 blogs on Quantum computing for Beginners and Deutsch Joza algorithm. While writing it I thought I should Show them on Cirqmon Hompage too, earlier I thought I would replace blogs part in Homepage with Just a medium link of mine, but later when I read on internet that medium allows to see RSS version of Blogs so I parsed RSS to JSON and fetched Blogs related Quantum Computing. Along with it, made Qubits limits to 8 and steps to 24 and made a centralized Config file to control parameters from there. Added a Toggle so People can switch indentation of Qubit states either Big endian or Little Endian. Updated Homepage button with Pikachu Button I found while explore on UI verse, also added link to Readme guide. Now After writing Blogs I am getting surge of confidence inside that I understood Quantum Computing more Better. One of topics I am curious about is Cybersecurity and one of Algorithm that challenges classical Approaches like RSA is Shor’s Algorithm so next I am going to explore it, Also along with all these, I have updated Some images in readme too and going to Push updates, so do Share Feedbacks."}, {"post_id": 43067, "ts": "2026-08-08T04:03:36Z", "hours": 3.9364, "text": "Cirqmon #Devlog 8 Actually I was telling my friend about project, and I realized that the Project should have better readme that tells about features, Examples, and Tour. Also added HSL wheel in Q sphere so People can Use it as a reference. Initially its faded, you hover it and it gets Visible. Also the Latest version is now Live with multi qubit gates."}, {"post_id": 41965, "ts": "2026-08-06T14:25:38Z", "hours": 8.0969, "text": "Cirqmon Devlog #7 So, I am posting this Devlog after interval of Almost 20 days since last Posted. Why delay? During this time I learnt a Lot about Quantum computing. Infact, I was planning to ship the Project with Single qubit gates only, but after I joined Qiskit Global Summer School, then I realised that main game in Quantum computing is about entanglement, that comes with multi Qubit gates like CX, CZ, SWAP etc. The Media attached is Demo is of a GHZ circuit is made by combination of H gate and CNOT gates. Basically a GHZ state is larger version of Bell state. For N qubits, only two possible states shows Up with equal probability i.e 1/root2 (000…n + 111…n). So here is What I made Changes and How : 1) 2 Qubit Gates Implementation - So Earlier Version was for Only 1 Qubit Gates, and it used Tensor product. Where it used to tensor Each step and then Multiply each step to StateVector in successive manner. But for 2 Qubit gates, tensor method gets problematic because multi qubit gates need to have dependence on other qubits too, meanwhile tensor assumes every gate on that step is independent and it builds large matrix. This loses dependence and relation as demanded by multi qubit gates. So then I got to know of approach called Embedding or Inflation where we first create Temporary matrix of 2^n rows and 2^n Columns with each entry initially as 0, then we start looping through columns of that Matrix (which represent possibility, like iteration for 0 is actually 00 in binary) and then, matching it with rows and columns in Gate matrix, after that we force the bit in Temporary Matrix’s respective column and row to align with what Gate’s matrix bit has? Either 0 or 1. Finally we get Result of application in that Temporary matrix which we multiply with StateVector later on. That’s how This Inflation Approach works. 2) Applied Phase angle Indicator Now, Quantum State’s node’s color in Q sphere shows its phase Angle, which can be from PI to -PI, calculated using formula tan2a(y,x) , then we constraint it from 0 to 2PI, later convert to degrees, then feeding that value as HUE value in HSL colour format keeping lightness as 50% and Saturation 100% and then it corresponds to Phase Angle with color that degree, like 0deg is red, 90deg is green etc. So this was Major Changes I did along with some Style changes and Minor error fixing that appeared during changing the Simulator’s Approach. And to be very Honest at when I started to Write code for 2 qubit Gates, I earlier thought I would Do something that I dont have to change Simulator, but those were still just making me cry. So finally I gone to AI to learn and for almost 2 days new experiments were going out of head and that way almost I wasted Hours and then to experiment more and Stop Tracking Hackatime since I knew It would track more hours for Experiments too, So I coded in Cursor (Without Any AI, Just as Other Editor) Untracked. At the End it worked :) Now Finally Majority part is Done, after few More Edits, Will Ship it soon!"}, {"post_id": 28525, "ts": "2026-07-14T20:44:03Z", "hours": 7.3483, "text": "Devlog #6 :) So Hey People, I am feeling Immensely satisfied that Q Sphere feature is Mostly done. Also the GateWiki part is also done that tells You about Gate you Clicked on Gates Tray, again to tell you can drag gates into Circuit to build and Tap to know about it . May be I also link blogs on that Later. Now about Q Sphere Part Okay , Now let me share about Making of Q Sphere Part , So earlier I was not able to visualize it, but somehow I got to Know about Spherical Coordinates which is dependent on: theta : angle of Line from Z Axis phi : angle of Line from x Axis But clicked finally after frustration of not understanding it earlier. Then I gone to Google searching to see 3d visuals and AI to understand how we calculate those angles: So - Based on hamming weights (Means how many 1s in that State, Suppose in |01> has 1 1s and 011 have 2 1s ) and total qubits which help us find theta and divide sphere into sort of rings for similar nodes/lines of same hamming weights in same ring. Then we find how we calculate phi based on total active states in each ring and slicing ring into same proportion. I don’t know why but that was a finally a kick for me :) Finally since you will plot lines and nodes on spherical surface you have to convert theta and phi to coordinates [x, y, z] which you do using polar coordinates . Then after plotting them, a major part of Q sphere is made. now as you can see on 2nd screenshot left side the Sphere shows nodes for respective State. more chances of being 0 is on upper half and more 1 chance on bottom half. Structured the folders Also I worked on code Structure to keep all algos separated: To parse stateVectors Parse the frontend data to json circuit instructions Making all q sphere data from stateVectors parsing Code to export in Qiskit. more such functions too.. So yeah that was work I did, little more things is needed to build, after that project is done. Adding some multi qubit gates is next important thing now. I would be pushing on Github this Version and Vercel too now. Go check it out. Namaste!!!"}, {"post_id": 27203, "ts": "2026-07-12T15:29:23Z", "hours": 8.8928, "text": "Devlog #5 :) To be very honest I forget that its 8 hours 47 minutes in hackatime and it didn’t posted devlog until I got a Notification on slack. Sooo Guys! In this part of work I had to decide a thing that should I add Visualization of Qubits or not and then I realized that’s the whole point of project [to let people easily visualize whats happening]. So thats why I have decided add Q sphere . Folder Structure First of all I realized that my project was using url images and project structure was actually messing up as files and folders were increasing, so I decided to first organise the chaos and downloading all internet 3d assets in project. [Screenshot -1]. Because without a better organization of project it would get intimidatingly hard for others to contribute. Big Endian vs Little Endian Now second part is making the Result page of Qubit execution match that 3d glassmorphism design and white browsing through IBM composer (Tool for making Circuits) I got to observe that states were actually reverse in order. Suppose you applied hadamard gate to first qubit in 2 qubit system so instead of showing Probabilities of states as |00> = 50% , |01> = 0 , |10> = 50% , |11> = 0 , it reversed for 01 and 10. So after reading on internet about this I got to know that both ways are right and just differs because order you calcuate tensors: G1 * G2 * G3.. gives you Big Endian Version which considers least qubit as important Vice versa in case of Little Endian as IBM uses. So I implemented both in project. Earlier I thought I broke a physics Law [haha.] Making Q Sphere Its for Q sphere [2nd screenshot], that’s what help you understand statevector, because we can’t imagine more than 3D, so IBM come with this method. Basically I have used react 3 fiber that helps us write Three.js in react easily, using JSX instead of js manually, and it shows 3 lines in space which represent each state in vector: Bigger the node on top, bigger its probability . Color tells phase angle from origin. More 0 probability the vector will be pointing on upper hemisphere’s top and similarly more 1 will point on bottom of lower hemisphere. I am still processing [x,y,z] coordinates of line. Q sphere now shows random plots, I have to parse state vector to correct representation, will tell you about it in next devlog after I have learnt and implemented this. Screen Restrictions Forth is more of usability, side by side you can see either, code and graph or sphere and graph , so understand better. Also I added a screen restrictor for small screens since running this project on phone won’t be possible because design clutterness (forget to add screenshot, but you can check live). So hope you liked this version, I know it’s too much of quantum but yeah like others I am also trying to understand better. At Last, don’t forget to check attachments and share your feedbacks. Also I think I would be pushing on github now before developing futher. Namaste!!!"}, {"post_id": 26000, "ts": "2026-07-10T15:38:00Z", "hours": 5.5644, "text": "Devlog #4 This Part was all about making Navigation work between pages and since last time I got some feedbacks that Home and Playground VIbe Don’t match so made Playground more 3d. Here are Changes - Using react router, Made Navigation between Home and Playground and Vice versa. Used 3d Resources like Background images, Button images to make it look 3d Videogame. Added button animations like some changes images, some spins. Improved qubit adjust box. Added tooltip component so people know what buttons does what, since buttons are image based. So, I have tried to make project look 3d Glassmorphism and minimal too. check out video attached to see progress till now ."}, {"post_id": 25463, "ts": "2026-07-09T19:03:49Z", "hours": 7.8494, "text": "#Devlog 3 Made Homepage for Cirqmon because I wanted to Put Medium blogs and Tool at one place so this will act as Entry door easily. Experimented with designs, fonts and images to make it feel like 3d Cartoon themed. Following things made - At first “what is does” Hero Section telling people that its a Colorful way to play and learn to make Quantum Circuits. Actually in hero section I have experimented with 3d images animations but it looked distracting UI so Removed it. but Kept H and Y gates to give a idea of Builder. Blogs Section is where it will fetch Quantum related Blogs from Medium (will write soon). Don’t forget to notice that Astronaut. Data is dummy. the Boxes use Backdrop transparent design to match with 3d design. Last is for People who would like to give feedbacks. Buttons are Demo for now. Basically UI for Homepage is Done. Now in next Version WIll use router for Navigation. ALso TBH Gemini really Helped me with Box Shadow button effects which I adjusted according to project Later. Do give Feedbacks please :)"}, {"post_id": 23711, "ts": "2026-07-06T20:20:51Z", "hours": 6.1475, "text": "Its Devlog 2 and in midway didn’t knew That I will be able to go further in project but somehow Curosity pushed it. So I have basically in this Version I made following new Things - Added fundamental Single Qubit Gates and the Moment someone drag Gates into Circuit and it get Translated into circuit Instructions JSON which tracks for which gate is applied at target and step; The moment you click on Playcircuit button it Calculates the probability of Each possible Qubit state and corresponding qiskit code; Basically this part of calculating the Circuit I had options either to use Qiskit directly via Python, Use react pre-written Scripts in react or Reinvent the Wheel by making my own Simulator which might not be as Efficient as Already made ones. So to see how strong my kidneys are I chose 3rd one. But you won’t believe I got answers to all My questions whether Why more qubits means exponential computation time, or tensors and many other things which I will write in blogs in some time. So basically it was about initializing a State vector and then running step by step tensor product of gates applied and then when I got a single wire as a result of all gates in each step, then multiply the state vector with Matrix which contains 2^N rows and columns (n is number of qubits) which finally gives you the amplitudes of each state. FInally you format them to Show. Now it still need better design and More code organization after which I will push new Version; till then You are welcome for Questions and Suggestions. Note - This version handle single qubits till now."}, {"post_id": 17512, "ts": "2026-06-28T10:11:41Z", "hours": 11.5036, "text": "Quite a While I started to learn about quantum Computing and observed that its still gives too research vibes for a beginner to overwhelm and leave it. This is Cirqmon which I am making so Building Quantum circuits become some fun without dumping every information and expecting everyone to be a Researcher. Started with making on React, giving it Cartoon or Animated vibe, earlier I thought to make it Doremon themed but later found that it would give copyright issues. For now features added- 1 ) You can Drag and Drog Quantum gates from Tray into Circuit Canvas. 2 ) Music and Background Manage buttons. 3 ) I have tried to play with Vector and Cartoon Images in Transition. 4 ) Adjust Qubits and Nodes/Steps from Drawer earlier I thought to Use Slider but used Buttons later to Avoid touch screen inconsistencies. While making the Drag and Drop canvas Features, found that using HTML Drag and drop API sometimes break on Safari and other browers and it was still making codebase look complicated for others or even me in future to Contribute. So I used @dnd kit for drag and drop feature. Also I kept a Limit on Qubits and Nodes to Keep Execution Easier and test. Majorly a Structure is Done,"}]...
|
Title: Cirqmon by @itsdecodeaditya | Stardance
De Title: Cirqmon by @itsdecodeaditya | Stardance
Devlogs:
Quite a While I started to learn about quantum Computing and observed that its still gives too research vibes for a beginner to overwhelm and leave it. This is Cirqmon which I am making so Building Quantum circuits become some fun without dumping every information and expecting everyone to be a Researcher. Started with making on React, giving it Cartoon or Animated vibe, earlier I thought to make it Doremon themed but later found that it would give copyright issues. For now features added- 1 ) You can Drag and Drog Quantum gates from Tray into Circuit Canvas. 2 ) Music and Background Manage buttons. 3 ) I have tried to play with Vector and Cartoon Images in Transition. 4 ) Adjust Qubits and Nodes/Steps from Drawer earlier I thought to Use Slider but used Buttons later to Avoid touch screen inconsistencies. While making the Drag and Drop canvas Features, found that using HTML Drag and drop API sometimes break on Safari and other browers and it was still making codebase look complicated for others or even me in future to Contribute. So I used @dnd kit for drag and drop feature. Also I kept a Limit on Qubits and Nodes to Keep Execution Easier and test. Majorly a Structure is Done,
Its Devlog 2 and in midway didn’t knew That I will be able to go further in project but somehow Curosity pushed it. So I have basically in this Version I made following new Things - Added fundamental Single Qubit Gates and the Moment someone drag Gates into Circuit and it get Translated into circuit Instructions JSON which tracks for which gate is applied at target and step; The moment you click on Playcircuit button it Calculates the probability of Each possible Qubit state and corresponding qiskit code; Basically this part of calculating the Circuit I had options either to use Qiskit directly via Python, Use react pre-written Scripts in react or Reinvent the Wheel by making my own Simulator which might not be as Efficient as Already made ones. So to see how strong my kidneys are I chose 3rd one. But you won’t believe I got answers to all My questions whether Why more qubits means exponential computation time, or tensors and many other things which I will write in blogs in some time. So basically it was about initializing a State vector and then running step by step tensor product of gates applied and then when I got a single wire as a result of all gates in each step, then multiply the state vector with Matrix which contains 2^N rows and columns (n is number of qubits) which finally gives you the amplitudes of each state. FInally you format them to Show. Now it still need better design and More code organization after which I will push new Version; till then You are welcome for Questions and Suggestions. Note - This version handle single qubits till now.
#Devlog 3 Made Homepage for Cirqmon because I wanted to Put Medium blogs and Tool at one place so this will act as Entry door easily. Experimented with designs, fonts and images to make it feel like 3d Cartoon themed. Following things made - At first “what is does” Hero Section telling people that its a Colorful way to play and learn to make Quantum Circuits. Actually in hero section I have experimented with 3d images animations but it looked distracting UI so Removed it. but Kept H and Y gates to give a idea of Builder. Blogs Section is where it will fetch Quantum related Blogs from Medium (will write soon). Don’t forget to notice that Astronaut. Data is dummy. the Boxes use Backdrop transparent design to match with 3d design. Last is for People who would like to give feedbacks. Buttons are Demo for now. Basically UI for Homepage is Done. Now in next Version WIll use router for Navigation. ALso TBH Gemini really Helped me with Box Shadow button effects which I adjusted according to project Later. Do give Feedbacks please :)
Devlog #4 This Part was all about making Navigation work between pages and since last time I got some feedbacks that Home and Playground VIbe Don’t match so made Playground more 3d. Here are Changes - Using react router, Made Navigation between Home and Playground and Vice versa. Used 3d Resources like Background images, Button images to make it look 3d Videogame. Added button animations like some changes images, some spins. Improved qubit adjust box. Added tooltip component so people know what buttons does what, since buttons are image based. So, I have tried to make project look 3d Glassmorphism and minimal too. check out video attached to see progress till now .
Devlog #5 :) To be very honest I forget that its 8 hours 47 minutes in hackatime and it didn’t posted devlog until I got a Notification on slack. Sooo Guys! In this part of work I had to decide a thing that should I add Visualization of Qubits or not and then I realized that’s the whole point of project [to let people easily visualize whats happening]. So thats why I have decided add Q sphere . Folder Structure First of all I realized that my project was using url images and project structure was actually messing up as files and folders were increasing, so I decided to first organise the chaos and downloading all internet 3d assets in project. [Screenshot -1]. Because without a better organization of project it would get intimidatingly hard for others to contribute. Big Endian vs Little Endian Now second part is making the Result page of Qubit execution match that 3d glassmorphism design and white browsing through IBM composer (Tool for making Circuits) I got to observe that states were actually reverse in order. Suppose you applied hadamard gate to first qubit in 2 qubit system so instead of showing Probabilities of states as |00> = 50% , |01> = 0 , |10> = 50% , |11> = 0 , it reversed for 01 and 10. So after reading on internet about this I got to know that both ways are right and just differs because order you calcuate tensors: G1 * G2 * G3.. gives you Big Endian Version which considers least qubit as important Vice versa in case of Little Endian as IBM uses. So I implemented both in project. Earlier I thought I broke a physics Law [haha.] Making Q Sphere Its for Q sphere [2nd screenshot], that’s what help you understand statevector, because we can’t imagine more than 3D, so IBM come with this method. Basically I have used react 3 fiber that helps us write Three.js in react easily, using JSX instead of js manually, and it shows 3 lines in space which represent each state in vector: Bigger the node on top, bigger its probability . Color tells phase angle from origin. More 0 probability the vector will be pointing on upper hemisphere’s top and similarly more 1 will point on bottom of lower hemisphere. I am still processing [x,y,z] coordinates of line. Q sphere now shows random plots, I have to parse state vector to correct representation, will tell you about it in next devlog after I have learnt and implemented this. Screen Restrictions Forth is more of usability, side by side you can see either, code and graph or sphere and graph , so understand better. Also I added a screen restrictor for small screens since running this project on phone won’t be possible because design clutterness (forget to add screenshot, but you can check live). So hope you liked this version, I know it’s too much of quantum but yeah like others I am also trying to understand better. At Last, don’t forget to check attachments and share your feedbacks. Also I think I would be pushing on github now before developing futher. Namaste!!!
Devlog #6 :) So Hey People, I am feeling Immensely satisfied that Q Sphere feature is Mostly done. Also the GateWiki part is also done that tells You about Gate you Clicked on Gates Tray, again to tell you can drag gates into Circuit to build and Tap to know about it . May be I also link blogs on that Later. Now about Q Sphere Part Okay , Now let me share about Making of Q Sphere Part , So earlier I was not able to visualize it, but somehow I got to Know about Spherical Coordinates which is dependent on: theta : angle of Line from Z Axis phi : angle of Line from x Axis But clicked finally after frustration of not understanding it earlier. Then I gone to Google searching to see 3d visuals and AI to understand how we calculate those angles: So - Based on hamming weights (Means how many 1s in that State, Suppose in |01> has 1 1s and 011 have 2 1s ) and total qubits which help us find theta and divide sphere into sort of rings for similar nodes/lines of same hamming weights in same ring. Then we find how we calculate phi based on total active states in each ring and slicing ring into same proportion. I don’t know why but that was a finally a kick for me :) Finally since you will plot lines and nodes on spherical surface you have to convert theta and phi to coordinates [x, y, z] which you do using polar coordinates . Then after plotting them, a major part of Q sphere is made. now as you can see on 2nd screenshot left side the Sphere shows nodes for respective State. more chances of being 0 is on upper half and more 1 chance on bottom half. Structured the folders Also I worked on code Structure to keep all algos separated: To parse stateVectors Parse the frontend data to json circuit instructions Making all q sphere data from stateVectors parsing Code to export in Qiskit. more such functions too.. So yeah that was work I did, little more things is needed to build, after that project is done. Adding some multi qubit gates is next important thing now. I would be pushing on Github this Version and Vercel too now. Go check it out. Namaste!!!
Cirqmon Devlog #7 So, I am posting this Devlog after interval of Almost 20 days since last Posted. Why delay? During this time I learnt a Lot about Quantum computing. Infact, I was planning to ship the Project with Single qubit gates only, but after I joined Qiskit Global Summer School, then I realised that main game in Quantum computing is about entanglement, that comes with multi Qubit gates like CX, CZ, SWAP etc. The Media attached is Demo is of a GHZ circuit is made by combination of H gate and CNOT gates. Basically a GHZ state is larger version of Bell state. For N qubits, only two possible states shows Up with equal probability i.e 1/root2 (000…n + 111…n). So here is What I made Changes and How : 1) 2 Qubit Gates Implementation - So Earlier Version was for Only 1 Qubit Gates, and it used Tensor product. Where it used to tensor Each step and then Multiply each step to StateVector in successive manner. But for 2 Qubit gates, tensor method gets problematic because multi qubit gates need to have dependence on other qubits too, meanwhile tensor assumes every gate on that step is independent and it builds large matrix. This loses dependence and relation as demanded by multi qubit gates. So then I got to know of approach called Embedding or Inflation where we first create Temporary matrix of 2^n rows and 2^n Columns with each entry initially as 0, then we start looping through columns of that Matrix (which represent possibility, like iteration for 0 is actually 00 in binary) and then, matching it with rows and columns in Gate matrix, after that we force the bit in Temporary Matrix’s respective column and row to align with what Gate’s matrix bit has? Either 0 or 1. Finally we get Result of application in that Temporary matrix which we multiply with StateVector later on. That’s how This Inflation Approach works. 2) Applied Phase angle Indicator Now, Quantum State’s node’s color in Q sphere shows its phase Angle, which can be from PI to -PI, calculated using formula tan2a(y,x) , then we constraint it from 0 to 2PI, later convert to degrees, then feeding that value as HUE value in HSL colour format keeping lightness as 50% and Saturation 100% and then it corresponds to Phase Angle with color that degree, like 0deg is red, 90deg is green etc. So this was Major Changes I did along with some Style changes and Minor error fixing that appeared during changing the Simulator’s Approach. And to be very Honest at when I started to Write code for 2 qubit Gates, I earlier thought I would Do something that I dont have to change Simulator, but those were still just making me cry. So finally I gone to AI to learn and for almost 2 days new experiments were going out of head and that way almost I wasted Hours and then to experiment more and Stop Tracking Hackatime since I knew It would track more hours for Experiments too, So I coded in Cursor (Without Any AI, Just as Other Editor) Untracked. At the End it worked :) Now Finally Majority part is Done, after few More Edits, Will Ship it soon!
Cirqmon #Devlog 8 Actually I was telling my friend about project, and I realized that the Project should have better readme that tells about features, Examples, and Tour. Also added HSL wheel in Q sphere so People can Use it as a reference. Initially its faded, you hover it and it gets Visible. Also the Latest version is now Live with multi qubit gates.
Cirqmon #Devlog 9 This version is more of testing, I thought that I should write blogs and use examples using Cirqmon, So Written 2 blogs on Quantum computing for Beginners and Deutsch Joza algorithm. While writing it I thought I should Show them on Cirqmon Hompage too, earlier I thought I would replace blogs part in Homepage with Just a medium link of mine, but later when I read on internet that medium allows to see RSS version of Blogs so I parsed RSS to JSON and fetched Blogs related Quantum Computing. Along with it, made Qubits limits to 8 and steps to 24 and made a centralized Config file to control parameters from there. Added a Toggle so People can switch indentation of Qubit states either Big endian or Little Endian. Updated Homepage button with Pikachu Button I found while explore on UI verse, also added link to Readme guide. Now After writing Blogs I am getting surge of confidence inside that I understood Quantum Computing more Better. One of topics I am curious about is Cybersecurity and one of Algorithm that challenges classical Approaches like RSA is Shor’s Algorithm so next I am going to explore it, Also along with all these, I have updated Some images in readme too and going to Push updates, so do Share Feedbacks.
Cirqmon Devlog #10 Every time I think My project is ready to ship I find something missing and then it gets delayed. After I finished the blog on Deutsch Jozsa algorithm the project worked, as it needed only Single and Double qubit gate. When I started writing about Grover’s algorithm I realized the need of Three Qubit gate too as it needed CCZ gate to flip the phase to achieve 111 State. So I had to fix that. Here is what I did: Firstly as I told earlier I added the 3 Qubit gate feature, the underlying simulator code is working as old Inflating the Matrix approach, I only had to make it work for 3 Qubit gates. Secondly once I was on huddle where we were discussing about Boba bash, I presented the project to people and some said like ’it looks like too stuffed or some said it looked vibe coded. So I thought its a good feedback to work on. Then I improvised the Homepage so it feels like Apple like minimal theme while maintaining game feel. I also added the Background video instead of static image. Thirdly the blog page was pending so I made blog page with similar theme as I updated along with a option to search among the medium posts. So this was what I updated in this Version and now I needs that code review and matching the theme on Playground too. Just Hope I don’t get stuck this time and wrap it up. Thanks for Reading!
Cirqmon Devlog #11 So Guys, I have finally finalized the Cirqmon Playground UI. I replaced the old glassmorphism theme with a rougher, more irregular visual style. Earlier I got feedback that, the old layout felt cluttered because the quantum gates were spread far apart and Due to Space Background and glassmorphism, it looked like Vibe coded. I have now grouped all the gates together in one place to make the interface cleaner and easier to navigate. Here Is what I changed: Removed the Home button. Clicking the Cirqmon logo now takes gets back to the home page. Updated Playground icons with Animal GIFs to give it more lively and engaging appearance. As mentioned above, reduced the use of glassmorphism to due to flickering issues and implemented like hand drawn solid color based UI. Attaching a video Snapshot so you can see changes made. also, The README is the only major task left. Once that’s finished, I’ll be ready to ship the project!
Cirqmon Devlog #12 So I guess it’s final Devlog. Here firstly I updated Readme with new UI based snapshots. Made custom Alert box so it matches the theme instead of browser native alert box. Fixed bug in which earlier the gates were being added in circuit without checking if that Block is being used by other gate and its corresponding qubits. I hope if I don’t get a new problem to fix I will ship it;
Ships:
Cirqmon is a quantum computing circuit builder on web and It’s idea was like when I used to go on tools like IBM’s or other quantum circuit simulators they used to feel like so dry and academic, So I thought why don’t I make one that’s colorful, looks like game because I guess learning deep tech should not mean that you lose colors. Earlier I thought I would just build UI layer on top of Qiskit via Python API, then I thought what will I learn and from a quite a long time I wanted to build something that involves maths and physics so i thought I should build whole thing by myself. The whole thing was Actually a bit challenging on understanding how Q spheres or Tensors or how bitwise calculations work, aligning it will a Good UI theme, So I just learned and build. sometimes I thought How will i finish or how will I map that understanding into code But I guess AI as a Teacher helped me a lot. For Others to try it you should know about Quantum Gates, read the Readme once and I guess you will understand the project....
|
1793336151.211557
|
1793422551.211557
|
|
55034
|
WIEBZ-K1 by @zephano | Stardance
|
zephano
|
0
|
18.27
|
0
|
[]
|
[{"post_id": 71466, "ts": "202 [{"post_id": 71466, "ts": "2026-09-20T21:39:58Z", "hours": 2.8197, "text": "so after looking at the first case design…i felt it was kinda bad and bulky for no reason….so today i decided to redesing the case…..completely scraping the front case and only leaving the plate and bottom case….the i dea was to get that floating keys stuff…and also that will make the whole thing more compact"}, {"post_id": 70299, "ts": "2026-09-18T21:58:25Z", "hours": 3.9664, "text": "well ive been busy for a while and i couldnt continue the project but we are back now…..so yh i switched…..imma build my own keyboard…i call it wiebz-k1…so i started the case…i did the front case and the back case and fitted everything together…..my fusion kept crashing over and over again which go really annoying….well i cant really blame it, i was using about 97% of ram sooo…anyways whats remaning is just to add the screw holes to the back and front case and ill be done with that"}, {"post_id": 67334, "ts": "2026-09-13T12:25:23Z", "hours": 10.7519, "text": "So yh ive finished the pcb design….all the way from the schematics to the pcb design…i had a lot of issues but i overcame them…one of the problems was the switches footprints weren’t aligning so i use KLE (keyboard layout editor)….and i plugin on ki cad to places the footprints side by side in their respective areas… there are a lot to say and i broke all the challenges down in my github journal…. check it out"}, {"post_id": 59023, "ts": "2026-08-31T16:38:44Z", "hours": 0.73, "text": "So today i officially started my project (i hope i finish it before the deadline💀💀)…so i started with the pcb schematics ….i didnt finish it today so ill try to do that tommorow (or some time….[im very busy])"}]...
|
Title: WIEBZ-K1 by @zephano | Stardance
Devlogs:
Title: WIEBZ-K1 by @zephano | Stardance
Devlogs:
So today i officially started my project (i hope i finish it before the deadline💀💀)…so i started with the pcb schematics ….i didnt finish it today so ill try to do that tommorow (or some time….[im very busy])
So yh ive finished the pcb design….all the way from the schematics to the pcb design…i had a lot of issues but i overcame them…one of the problems was the switches footprints weren’t aligning so i use KLE (keyboard layout editor)….and i plugin on ki cad to places the footprints side by side in their respective areas… there are a lot to say and i broke all the challenges down in my github journal…. check it out
well ive been busy for a while and i couldnt continue the project but we are back now…..so yh i switched…..imma build my own keyboard…i call it wiebz-k1…so i started the case…i did the front case and the back case and fitted everything together…..my fusion kept crashing over and over again which go really annoying….well i cant really blame it, i was using about 97% of ram sooo…anyways whats remaning is just to add the screw holes to the back and front case and ill be done with that
so after looking at the first case design…i felt it was kinda bad and bulky for no reason….so today i decided to redesing the case…..completely scraping the front case and only leaving the plate and bottom case….the i dea was to get that floating keys stuff…and also that will make the whole thing more compact...
|
1793137708.0338523
|
1793742508.0338523
|
|
57713
|
Leaderboard for CyberMatch by @Tennis-Legend | Sta Leaderboard for CyberMatch by @Tennis-Legend | Stardance...
|
Tennis-Legend
|
1
|
7.28
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-16T08:00:35Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a leaderboard system for CyberMatch using HTML, CSS, Python and Flask. The project allows users to submit their details and time, then view the results on a separate leaderboard page that can be sorted in different ways. Along the way I added a dedicated leaderboard layout, a dark theme, hover effects, responsive design for phones and laptops, and links between the original page and the leaderboard page. One of the bigger challenges was getting the sorting system to work properly. At one point names with capital letters would sort differently to names with lowercase letters, which caused some entries to appear in the wrong order. I also had to make sure users could only enter appropriate values into each field so that invalid data wouldn’t affect the leaderboard. After making a few backend changes, the sorting became much more reliable and the input fields behaved as expected. I’m most proud of how the leaderboard ended up looking. The dark theme, green accents and rank highlighting make it feel much better than a plain table. When hovering over an entry, the row changes to a grey background and the text colour changes depending on position, with gold for first, silver for second, bronze for third and green for everyone else. To see the project, click the “Try project” button or go to https://cybermatch.onrender.com/leaderboard . To test it out, try adding a few entries with different names and times, then use the sorting options to make sure everything updates correctly. It is also worth testing on both a laptop and a phone, as the layout was adjusted to work properly on different screen sizes.", "repo": "https://github.com/tennis-legend1/Scoreboard-Sample-Project", "demo": "https://tennislegend.pythonanywhere.com/leaderboard"}]...
|
[{"post_id": 71468, "ts": "202 [{"post_id": 71468, "ts": "2026-09-20T21:45:15Z", "hours": 0.2842, "text": "Just wanted to address some feedback a shipwright gave me: some of the buttons not working on the site is an INTENTIONAL choice. Let me explain: me and two other friends made an original site where we ‘advertised’ our games as one bundle, but I have only included the pages that I made entirely myself. So the only two pages that should load is the Leaderboard page ( https://tennislegend.pythonanywhere.com/leaderboard ) and the Original i guess ‘general’ CyberMatch page ( https://tennislegend.pythonanywhere.cm/cybermatch ). I decided to keep the buttons, and make them seem like clickable by having the cursor change to a pointer, yet lead nowhere, as you can see in an examples pictured below. Every other functionality like entering a value in the leaderboard, the Easter Eggs (like the cat), etc, should work perfectly."}, {"post_id": 69032, "ts": "2026-09-16T07:54:06Z", "hours": 3.0478, "text": "Since exams picked up, I got the chance to add to this throughout the last few weeks, but didn’t get a chance to write a devlog as consistently as I wanted to, so I have decided to make one big one with each devlog that I would’ve liked to make below: Devlog 3 - 9/9/2026 I mainly worked on the CSS for the Leaderboard page. I gave it a dark theme, added a box around the table and added hover effects for each entry. When hovering over a row, the background changes from black to grey, and the text becomes gold for first place, silver for second, bronze for third and green for all other positions. One thing I had to watch out for was making sure the silver text was still easy to read against the grey background. I also made sure that the new styling didn’t interfere with any of the styling on the Original page. Devlog 4 - 10/9/2026 to 14/9/2026 I finished off most of the Leaderboard page. I added a background, more borders and boxes, and adjusted the styling so it matched the Original page more closely. I also improved the sorting system by stopping users from entering numbers into the name fields and letters into the time field. Another thing I fixed was the sorting of names, because capital letters were being sorted differently to lowercase ones, which meant names were sometimes appearing in the wrong order. After adjusting the backend code, names would sort properly regardless of how they were entered. I also added a link to the Leaderboard page from the Original page, removed old links that were no longer used, and made sure both pages displayed properly on phones as well as laptops."}, {"post_id": 64485, "ts": "2026-09-08T22:15:42Z", "hours": 3.175, "text": "Took me ages to combine the CSS into one file without any errors, but I finally did it :) [took like 1 1/2 hrs btw 😭] Oh, I added a sort function to it, as seen below in the image, and when you hover over an entry it changes the background colour to a bit more grey. Also the leaderboard is finally a table! :)"}, {"post_id": 61189, "ts": "2026-09-04T00:14:55Z", "hours": 1.0667, "text": "I started the Leaderboard’s back- and front-end, with the footer from my Original page added to the Leaderboard page. I also added a first and last name function, with placeholder text in the boxes too. Looking a bit dull right now, but will improve soon enough!"}]...
|
Title: Leaderboard for CyberMatch by @Tennis-Legen Title: Leaderboard for CyberMatch by @Tennis-Legend | Stardance
Devlogs:
I started the Leaderboard’s back- and front-end, with the footer from my Original page added to the Leaderboard page. I also added a first and last name function, with placeholder text in the boxes too. Looking a bit dull right now, but will improve soon enough!
Took me ages to combine the CSS into one file without any errors, but I finally did it :) [took like 1 1/2 hrs btw 😭] Oh, I added a sort function to it, as seen below in the image, and when you hover over an entry it changes the background colour to a bit more grey. Also the leaderboard is finally a table! :)
Since exams picked up, I got the chance to add to this throughout the last few weeks, but didn’t get a chance to write a devlog as consistently as I wanted to, so I have decided to make one big one with each devlog that I would’ve liked to make below: Devlog 3 - 9/9/2026 I mainly worked on the CSS for the Leaderboard page. I gave it a dark theme, added a box around the table and added hover effects for each entry. When hovering over a row, the background changes from black to grey, and the text becomes gold for first place, silver for second, bronze for third and green for all other positions. One thing I had to watch out for was making sure the silver text was still easy to read against the grey background. I also made sure that the new styling didn’t interfere with any of the styling on the Original page. Devlog 4 - 10/9/2026 to 14/9/2026 I finished off most of the Leaderboard page. I added a background, more borders and boxes, and adjusted the styling so it matched the Original page more closely. I also improved the sorting system by stopping users from entering numbers into the name fields and letters into the time field. Another thing I fixed was the sorting of names, because capital letters were being sorted differently to lowercase ones, which meant names were sometimes appearing in the wrong order. After adjusting the backend code, names would sort properly regardless of how they were entered. I also added a link to the Leaderboard page from the Original page, removed old links that were no longer used, and made sure both pages displayed properly on phones as well as laptops.
Just wanted to address some feedback a shipwright gave me: some of the buttons not working on the site is an INTENTIONAL choice. Let me explain: me and two other friends made an original site where we ‘advertised’ our games as one bundle, but I have only included the pages that I made entirely myself. So the only two pages that should load is the Leaderboard page ( https://tennislegend.pythonanywhere.com/leaderboard ) and the Original i guess ‘general’ CyberMatch page ( https://tennislegend.pythonanywhere.cm/cybermatch ). I decided to keep the buttons, and make them seem like clickable by having the cursor change to a pointer, yet lead nowhere, as you can see in an examples pictured below. Every other functionality like entering a value in the leaderboard, the Easter Eggs (like the cat), etc, should work perfectly.
Ships:
I made a leaderboard system for CyberMatch using HTML, CSS, Python and Flask. The project allows users to submit their details and time, then view the results on a separate leaderboard page that can be sorted in different ways. Along the way I added a dedicated leaderboard layout, a dark theme, hover effects, responsive design for phones and laptops, and links between the original page and the leaderboard page. One of the bigger challenges was getting the sorting system to work properly. At one point names with capital letters would sort differently to names with lowercase letters, which caused some entries to appear in the wrong order. I also had to make sure users could only enter appropriate values into each field so that invalid data wouldn’t affect the leaderboard. After making a few backend changes, the sorting became much more reliable and the input fields behaved as expected. I’m most proud of how the leaderboard ended up looking. The dark theme, green accents and rank highlighting make it feel much better than a plain table. When hovering over an entry, the row changes to a grey background and the text colour changes depending on position, with gold for first, silver for second, bronze for third and green for everyone else. To see the project, click the “Try project” button or go to https://cybermatch.onrender.com/leaderboard . To test it out, try adding a few entries with different names and times, then use the sorting options to make sure everything updates correctly. It is also worth testing on both a laptop and a phone, as the layout was adjusted to work properly on different screen sizes....
|
1793350220.0782456
|
1793436620.0782456
|
|
7876
|
myMacropad by @heian | Stardance
|
heian
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-11T23:09:18Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Custom Hackpad! My first time using QMK, so that was a learning curve. I’m proud of how it turned out.", "repo": "https://github.com/syntonos/myMacropad", "demo": ""}]...
|
[{"post_id": 7147, "ts": "2026 [{"post_id": 7147, "ts": "2026-06-11T22:43:34Z", "hours": 2.4367, "text": "Made a macropad! Did not expect to suffer so much. I genuinely think engineering is just a measure of how many small problems you can tolerate before you combust. This took wayy more than 2.5 hours I just did not know how to use either Lapse or Hackatime and I suffered quite a lot off camera. PCB wasn’t that bad. I still have no idea how KiCad does any sort of positioning (from where in the object is the position calculated?? why is it so different across objects?? why does align just never work???), and it’s also deeply wonky switching back and forth from KiCad to Altium for different projects. It’s really nice not having to worry about any complications (signal processing, hunting down or making 3D models, etc) with wiring for once. CAD went alright! I feel like you notice a lot of fun quality of life features that Fusion is missing when you start doing CAD for a bit. I’d love to be able to group objects or parts of a sketch and have them behave the same way. I’d love to have an easy way to find the midpoint or centers in a sketch. I’d love a way to align objects. oh well ! First time using QMK! Took a while to install and learn. I think I genuinely spent an hour scrolling through documentation. I imagine I’ll have to do some more wrangling when I flash it. Finally done! I can finally sleep."}]...
|
Title: myMacropad by @heian | Stardance
Devlogs:
Title: myMacropad by @heian | Stardance
Devlogs:
Made a macropad! Did not expect to suffer so much. I genuinely think engineering is just a measure of how many small problems you can tolerate before you combust. This took wayy more than 2.5 hours I just did not know how to use either Lapse or Hackatime and I suffered quite a lot off camera. PCB wasn’t that bad. I still have no idea how KiCad does any sort of positioning (from where in the object is the position calculated?? why is it so different across objects?? why does align just never work???), and it’s also deeply wonky switching back and forth from KiCad to Altium for different projects. It’s really nice not having to worry about any complications (signal processing, hunting down or making 3D models, etc) with wiring for once. CAD went alright! I feel like you notice a lot of fun quality of life features that Fusion is missing when you start doing CAD for a bit. I’d love to be able to group objects or parts of a sketch and have them behave the same way. I’d love to have an easy way to find the midpoint or centers in a sketch. I’d love a way to align objects. oh well ! First time using QMK! Took a while to install and learn. I think I genuinely spent an hour scrolling through documentation. I imagine I’ll have to do some more wrangling when I flash it. Finally done! I can finally sleep.
Ships:
Custom Hackpad! My first time using QMK, so that was a learning curve. I’m proud of how it turned out....
|
1792878654.6206846
|
1793742654.6206846
|
|
60692
|
BUGATTI Brouillard by @nejenabinupa | Stardance
|
nejenabinupa
|
0
|
56.33
|
0
|
[]
|
[{"post_id": 71474, "ts": "202 [{"post_id": 71474, "ts": "2026-09-20T21:51:25Z", "hours": 5.0192, "text": "I added the rims and sum more materials and textures"}, {"post_id": 70088, "ts": "2026-09-18T13:08:04Z", "hours": 8.1472, "text": "I added sum more details adjusted sum things and added textures and materials to the modle and I need to make the wheels and more stuff"}, {"post_id": 69239, "ts": "2026-09-16T17:16:41Z", "hours": 7.0464, "text": "i added the grills and sum parts and i cut the sections sparest the panels"}, {"post_id": 68812, "ts": "2026-09-15T19:51:20Z", "hours": 9.5989, "text": "i make the sum parts in the car like headlights and enging bay"}, {"post_id": 67475, "ts": "2026-09-13T16:21:51Z", "hours": 8.6361, "text": "I make the back of the car and added sum more parts to to it"}, {"post_id": 65933, "ts": "2026-09-11T12:29:22Z", "hours": 9.3583, "text": "I make the back and and the said skirt and the wing"}, {"post_id": 65415, "ts": "2026-09-10T15:19:23Z", "hours": 8.5261, "text": "I’m starting from front, making the hood and the front bumper And looking good so far"}]...
|
Title: BUGATTI Brouillard by @nejenabinupa | Stard Title: BUGATTI Brouillard by @nejenabinupa | Stardance
Devlogs:
I’m starting from front, making the hood and the front bumper And looking good so far
I make the back and and the said skirt and the wing
I make the back of the car and added sum more parts to to it
i make the sum parts in the car like headlights and enging bay
i added the grills and sum parts and i cut the sections sparest the panels
I added sum more details adjusted sum things and added textures and materials to the modle and I need to make the wheels and more stuff
I added the rims and sum more materials and textures...
|
1793036956.786102
|
1793641756.786102
|
|
27346
|
shadow less light by @flyingfish | Stardance
|
flyingfish
|
1
|
200.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T21:59:09Z", "hours": 200.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "this is a desk lamp inspired my surgery lights this is my first time ever doing a pcb or smd soldering i learned a ton it was super fun", "repo": "https://github.com/dinotiger01/shadowless-light", "demo": ""}]...
|
[{"post_id": 71477, "ts": "202 [{"post_id": 71477, "ts": "2026-09-20T21:56:22Z", "hours": 7.8586, "text": "https://youtu.be/H-r51vnOVfs everything is done i can ship now there wasnt a lot of stuff to say in the midle of development so the devlogs got kinda bad around the middle"}, {"post_id": 69984, "ts": "2026-09-18T05:47:32Z", "hours": 6.7189, "text": "i have the video on my phone but i dont have wifi rn so you can have this i assembed every thing and starded the covumantation"}, {"post_id": 68285, "ts": "2026-09-14T20:58:58Z", "hours": 7.6081, "text": "100% done with 3d modeling it just takes a long time to proint everything"}, {"post_id": 66330, "ts": "2026-09-12T03:15:51Z", "hours": 8.2417, "text": "um i have done almost everything besides the case servos were breaking everything so aparently even if you dont use a servo on pin 10 0r 9 the servo lobrary still disables it but i uses those for red and green so i will need to figure that out later all panels and the main board are soldered and wired controlls when you click on the rotary encoder it changes what value you are changeing white - white lights red - red lights green - green lights blue - blue lights yellow - servos (not working) purple - turns on uv on main pannel"}, {"post_id": 65764, "ts": "2026-09-11T03:41:50Z", "hours": 4.5517, "text": "i started soldering everything over to the mother board i was able to dim the lights but i broke also its like green idk but most of the fir ware is done"}, {"post_id": 65105, "ts": "2026-09-10T00:33:09Z", "hours": 2.18, "text": "i have finished most of the soldering the rest is just small stuff"}, {"post_id": 64596, "ts": "2026-09-09T03:20:50Z", "hours": 5.7506, "text": "i am at 7/9 sooo close"}, {"post_id": 64439, "ts": "2026-09-08T20:21:40Z", "hours": 2.9669, "text": "i just made a a panel i am at 5/8 i am going to try to finish the other 3 today also"}, {"post_id": 64073, "ts": "2026-09-08T07:05:34Z", "hours": 3.8169, "text": "i got the uv lights all soldered up and made another panel i have made 4/8 panels i was going to meanchen how i have posted 3 devlogs today but i just noticed it became tomorrow during my last recording"}, {"post_id": 63995, "ts": "2026-09-08T03:05:37Z", "hours": 7.0836, "text": "i did the big one and every single light acualy works this time my back is in extreme consent pain i am almost don with soldering though my eyes i have been staring in to these lights for like 7 hr"}, {"post_id": 63665, "ts": "2026-09-07T16:29:00Z", "hours": 2.4503, "text": "i am starting to get the hang of things i lowered my chair and now i dont have insane back pain"}, {"post_id": 63304, "ts": "2026-09-07T01:49:15Z", "hours": 2.8169, "text": "i got some new stuff for soldering um and my back hurts sooo bad"}, {"post_id": 63218, "ts": "2026-09-06T22:02:36Z", "hours": 5.0336, "text": "yooo"}, {"post_id": 62617, "ts": "2026-09-06T02:45:23Z", "hours": 5.6875, "text": "so like i think i poisoned my self or somthing i wasnt able to get mech work done i am like on the verge of passing out like constently ill do a lot more tomarow"}, {"post_id": 61747, "ts": "2026-09-04T20:03:13Z", "hours": 7.3389, "text": "it works"}, {"post_id": 36826, "ts": "2026-07-29T04:02:13Z", "hours": 6.045, "text": "3d modeling and i hate windows i have finish all the 3dmodling i need to do for now and am now just waiting foe the pcbs to ship in the mean tim i wall be here https://stardance.hackclub.com/projects/41354 clips i added clips on the bottom of the outer pieaces they wew to small on the first print so i made them bigger poles i did almost a com pleat overhaul on the poles i made them connect stronger by making them go deeper in logo * i added the loo to everything because it looks cool control i add a control panel it is at the base of the main light and just kinda sits there idea i have a another idea but i am way to tired to add it rn so i am not adding it till later the idea is to have a light conecten to a pole so i can pull it off to like press it up against things rn i also want to add a uv light to it so i can cure things better"}, {"post_id": 35555, "ts": "2026-07-27T02:13:05Z", "hours": 9.48, "text": "windows is soo slow i am making this because i have been modeling for 10hr and more then 10hr doesn’t log to star dance will make a longer devlog in a bit"}, {"post_id": 33887, "ts": "2026-07-24T05:20:04Z", "hours": 4.9367, "text": "alright i got the pcbs 100% done for real this time UV i fully implemented the UV lights IR i gave the option to attach a it receiver so i can do that in the futor if i want to logo i added the updated logo silkscreen i went through the silkscreen and fixed all there errors check i want through literately every since trace and footprint on these boards to make sure i am actually done designing thease"}, {"post_id": 33673, "ts": "2026-07-23T19:40:16Z", "hours": 5.7425, "text": "so turns out i was not done with the pcbs i redesigned the logo i gave it this outline and added a gear to the light bulb uv i had the idea to add uv light to the light for like idk i will probably never use it but its fun the best use i can think of is curing resen witch is really cool i added them in to the pcb redesign so while adding the uv i realized i didnt use the vertion of the foot print ment for hand a soldering so i made sure to fix that hopfully they are done for real this time"}, {"post_id": 32810, "ts": "2026-07-22T06:19:52Z", "hours": 9.4156, "text": "logo i got everything done to get the pcbs orderd Logo i made a logo so i could add it to the silkscreen for some extra style mother board the mother board is basically an Arduino what directly plugs in to 36 outputs so it can control all 9 boards controll to make the controller i have desided it is going to be comprised of 3 componest the indicator a rotary encoder and a switch indicator it is passively a relay small since wrgb controller so i can do a small display type out but it is also nice because i have extra of all the components so this will make them easy to use for other components jlc is goofy so if you have sevral break away bords in one they charge you for all of them witch is like a lot and the work around is if you split all of them in to there own file it only cost like $2 per board so instead of paying $20 for for board i paid $8 for the same amount this is what i split everything in to fin_right fin_left indicator mother_board main_light"}, {"post_id": 32122, "ts": "2026-07-21T02:09:02Z", "hours": 6.1692, "text": "uh i am so tired i did like 6hr of work while fighting to stay awake split i split the pcb in to 2 100mm sections becouse it is like a lot cheaper. i have no mony to connect between panels i come up with an idea that is rather guineas or it is going to be the biggest mistake in the entire project i put 5 pads on the sides of each board and i am planing to aline the boards then bridge the gap with solder this should electrically connect the 2 boards and hold them together at least a bit net i finished the net on the main pcb i finished the not on the fins flip just like yesterday i flipped the pcb so that the leds work"}, {"post_id": 31867, "ts": "2026-07-20T16:31:24Z", "hours": 7.3906, "text": "data sheet uh resistors i moved the resistors like 5mm apart because i have plenty of space and it will be like X400 easier so solder i am blind i was testing the led so i can make sure every thing works the led is like really small so i was leaning in so that i can see the pins so i can try and turn it on… so like it is super bright and i burned a little dot in my eye data sheet so when i was testing the led i noticed that you need to power it from the left side and i assumed that it was powered from the right side i was curious as to why i got it backwards because i reference the data sheet like all the time. so apparently the schematic counted clockwise. while everything else on the data sheet is counter-clockwise like look at pg 15 and you can see why i assumed the power went from right to left not left to right https://downloads.cree-led.com/files/ds/h/HB-CLW6A-TKW.pdf the flip so i needed to flip the entire pcb becouse the power is on the wrong side i would have just rotated it around but scene the resistors are specific to the pins that wouldn’t work and the leds would burn out i also learned that you cant mirror footprints on kicad so what i did was set the center of my pcb to (0,0) then went through and switch the sign on every x value on the pcb"}, {"post_id": 31021, "ts": "2026-07-19T02:34:27Z", "hours": 6.3408, "text": "i am making things small small i have decided to find some way to fit everything in to 100 mm pieces the old deign would have costed like $30 idk why but pcb manufacturers really like 100mm x 100mm and each only cost like 1 dollar"}, {"post_id": 30448, "ts": "2026-07-18T00:20:00Z", "hours": 4.9019, "text": "pcb are really time consuming i have found (expetaly if you have never used any kinda pcb editor) bigger trace the traces on my pcb before were a bit to small and there was a good chance they would but each light pulls 20mA witch is 0.02A there is 25 lights and each has 4 light in side because RGBW witch means this could potently run at 2 amps and the 0.2 mm traces can only handle like 0.5A(i forgot but it is a smaller number) so i mad most things bigger lets hope it doesn’t explode"}, {"post_id": 29907, "ts": "2026-07-17T02:32:06Z", "hours": 4.6172, "text": "pcbs are like really expenceve so turns out most pcb manufatuers only sell 5 panels at a time so i shrunk my design down to just 2 so i get 10 in total also all the components arrived from mouser because i assumed it would take waaaay longer for them to ship"}, {"post_id": 29262, "ts": "2026-07-16T02:11:59Z", "hours": 6.4558, "text": "i think i got scamed idk why but like a lot of my time just didnt get logged i am working on it fins are done i put the finishing toutches on the fin lights mainly changing out the mosfets and stuff net so i had no clue what net is and aparently i was sposed to be lableing what everything is sposed to canect to so it can auto check for shorts so i spent like 2 hrs individualy assining a value to all the pads on the pcb panalization i was doing a lot of stuff trying to figure out panzatoin its almost done i think"}, {"post_id": 28654, "ts": "2026-07-15T01:16:48Z", "hours": 10.5153, "text": "so i had to go to my grand parents over the week end so i want able to get much work done but i figured out how to use kicad on my laptop so it was funny in the car while we driving i was working and then kicad crashed before i saved and i had to restart and then after i had done it all a second time i saved and turns out my kicad was out of date so i had to restart all i did was sett up the main pcb that has the 25 lights as seen below the zig zag pattern is because all the lights need to be connected in parallel the really weird pattern in the middle right was because the light was too close to the side so i had to move things and that is that only way i could find that things fit new mosfets i just changed the mosfets for fun idk"}, {"post_id": 26330, "ts": "2026-07-11T01:59:42Z", "hours": 10.4356, "text": "i did a lot of work on the pcb and Um idk i burnt my hand RGBW to i decided i would have 10 per segment and 25 on the core 105 in total witch end up at 8 amps and 1050 lumins resistors i decided to giv every pin its own resistor witch ends up with 420 resistor is need to solder i have never hand solder a smd component this is going to be a learning expireence mostfets i think i was high earlier it is like realy easy to fin smd mosfets i added smd mosfets i have in idea regarding the stand i didnt like the crane becouse it was really bulky and i feel like it wont move how i want it to and i wanted like a standered desk lamp where it can me moved easy but it is too wide for that to work well so what if i take the same mechonisum as the desk arm and just mount it to the wall"}, {"post_id": 24530, "ts": "2026-07-08T04:31:37Z", "hours": 5.7922, "text": "so i have to delete all of the pcb work i had before . i learned that making white light with RGB sucks and causes eye strain and it wont be brite enough RGBW i switched to RGBW leds witch is the same but with a dedicated white led the white light fixes both problems the pure white light wont cause eye strain and they are about 4x brighter then the old ones however it took me like 3 hours to figure out how to add a footprint to my library"}, {"post_id": 23669, "ts": "2026-07-06T19:38:41Z", "hours": 4.6003, "text": "so i managed to not save and lost all my progress again pcb rgb so the rgb have common anode(+) witch means yo just need to power the one pin then short witch color you want to turn on i learned how to us the seconded layer in order to hook all the cathodes(-) together mosfet the plan is to use the mosfets to switch each color on using a arduino idk why i couldn’t find any smd mosfets so i added tht mosfets and put them in backward to i can add a heatsink with out it getting in the way of the light resistors idk man its a resistor its not that exiting"}, {"post_id": 23003, "ts": "2026-07-05T18:22:30Z", "hours": 4.7006, "text": "so uh i worked for a long time then a black out hit and i lost all of it"}, {"post_id": 21865, "ts": "2026-07-04T01:07:06Z", "hours": 4.8339, "text": "i finished the crane for the case matirials i decided to make part of the crane out of pvc pipe because idk i don’t know anything better *changeable i made a simple pole connector to hole the thing on so that the crane can hold any future projects if needed *motor i have been debating whether it is worth it to make it motorized at the moment it is set up to be but idk"}, {"post_id": 20491, "ts": "2026-07-02T02:58:40Z", "hours": 4.2003, "text": "so this is the first time i have ever used kicad there is not a lot to say here i just spent like 4 trying to make a pcb and nothing happend execpt things turned green every so often and idk why"}, {"post_id": 19714, "ts": "2026-07-01T03:18:51Z", "hours": 4.7839, "text": "i worked on the core model servo i made places for the servos to sit in the core *the servos will push and pull the control poles to tilt the segments *poles the poles i printed earlier finished and i though i could get away with just 2 servos but i am going to need 4 other then that is seems to work as expected for now *RGB *ngl i just think it would be funny to add RGB and it could help with very specific tasked i gouess *general so i feel kinda dumb but i realized i could add lights on the bottom of the core too so that is something i am working on now i did a lot of general changes to the design mainly getting rid of unneeded plastic witch makes it look cooler"}, {"post_id": 17315, "ts": "2026-06-28T01:16:37Z", "hours": 9.3347, "text": "so i want to make a desk lamp that works the same way that surgery lamps so there is no shadows constraints: bright: i want to be able to use it to see no shadows: i don’t want shadows alright this is the model so far: it has 8 segments : place to mount a pcb a hole with a pole that lets it swivel a second hole to have a pole that can control it moving in and out(see more farther down) each has 2 brackets that hold the swivel pole to the center control poles like the segments there are 8 of these each of them have a hole and a pole the idea is you thread the pole part thought the hole of another one till it comes all the way around then if one is pusher out it should push all of them out i am currently printing some small versions to see if the concept workes center it is curtly just a block with slits for the brackest i am sure there will be more on it latter"}]...
|
Title: shadow less light by @flyingfish | Stardanc Title: shadow less light by @flyingfish | Stardance
Devlogs:
so i want to make a desk lamp that works the same way that surgery lamps so there is no shadows constraints: bright: i want to be able to use it to see no shadows: i don’t want shadows alright this is the model so far: it has 8 segments : place to mount a pcb a hole with a pole that lets it swivel a second hole to have a pole that can control it moving in and out(see more farther down) each has 2 brackets that hold the swivel pole to the center control poles like the segments there are 8 of these each of them have a hole and a pole the idea is you thread the pole part thought the hole of another one till it comes all the way around then if one is pusher out it should push all of them out i am currently printing some small versions to see if the concept workes center it is curtly just a block with slits for the brackest i am sure there will be more on it latter
i worked on the core model servo i made places for the servos to sit in the core *the servos will push and pull the control poles to tilt the segments *poles the poles i printed earlier finished and i though i could get away with just 2 servos but i am going to need 4 other then that is seems to work as expected for now *RGB *ngl i just think it would be funny to add RGB and it could help with very specific tasked i gouess *general so i feel kinda dumb but i realized i could add lights on the bottom of the core too so that is something i am working on now i did a lot of general changes to the design mainly getting rid of unneeded plastic witch makes it look cooler
so this is the first time i have ever used kicad there is not a lot to say here i just spent like 4 trying to make a pcb and nothing happend execpt things turned green every so often and idk why
i finished the crane for the case matirials i decided to make part of the crane out of pvc pipe because idk i don’t know anything better *changeable i made a simple pole connector to hole the thing on so that the crane can hold any future projects if needed *motor i have been debating whether it is worth it to make it motorized at the moment it is set up to be but idk
so uh i worked for a long time then a black out hit and i lost all of it
so i managed to not save and lost all my progress again pcb rgb so the rgb have common anode(+) witch means yo just need to power the one pin then short witch color you want to turn on i learned how to us the seconded layer in order to hook all the cathodes(-) together mosfet the plan is to use the mosfets to switch each color on using a arduino idk why i couldn’t find any smd mosfets so i added tht mosfets and put them in backward to i can add a heatsink with out it getting in the way of the light resistors idk man its a resistor its not that exiting
so i have to delete all of the pcb work i had before . i learned that making white light with RGB sucks and causes eye strain and it wont be brite enough RGBW i switched to RGBW leds witch is the same but with a dedicated white led the white light fixes both problems the pure white light wont cause eye strain and they are about 4x brighter then the old ones however it took me like 3 hours to figure out how to add a footprint to my library
i did a lot of work on the pcb and Um idk i burnt my hand RGBW to i decided i would have 10 per segment and 25 on the core 105 in total witch end up at 8 amps and 1050 lumins resistors i decided to giv every pin its own resistor witch ends up with 420 resistor is need to solder i have never hand solder a smd component this is going to be a learning expireence mostfets i think i was high earlier it is like realy easy to fin smd mosfets i added smd mosfets i have in idea regarding the stand i didnt like the crane becouse it was really bulky and i feel like it wont move how i want it to and i wanted like a standered desk lamp where it can me moved easy but it is too wide for that to work well so what if i take the same mechonisum as the desk arm and just mount it to the wall
so i had to go to my grand parents over the week end so i want able to get much work done but i figured out how to use kicad on my laptop so it was funny in the car while we driving i was working and then kicad crashed before i saved and i had to restart and then after i had done it all a second time i saved and turns out my kicad was out of date so i had to restart all i did was sett up the main pcb that has the 25 lights as seen below the zig zag pattern is because all the lights need to be connected in parallel the really weird pattern in the middle right was because the light was too close to the side so i had to move things and that is that only way i could find that things fit new mosfets i just changed the mosfets for fun idk
i think i got scamed idk why but like a lot of my time just didnt get logged i am working on it fins are done i put the finishing toutches on the fin lights mainly changing out the mosfets and stuff net so i had no clue what net is and aparently i was sposed to be lableing what everything is sposed to canect to so it can auto check for shorts so i spent like 2 hrs individualy assining a value to all the pads on the pcb panalization i was doing a lot of stuff trying to figure out panzatoin its almost done i think
pcbs are like really expenceve so turns out most pcb manufatuers only sell 5 panels at a time so i shrunk my design down to just 2 so i get 10 in total also all the components arrived from mouser because i assumed it would take waaaay longer for them to ship
pcb are really time consuming i have found (expetaly if you have never used any kinda pcb editor) bigger trace the traces on my pcb before were a bit to small and there was a good chance they would but each light pulls 20mA witch is 0.02A there is 25 lights and each has 4 light in side because RGBW witch means this could potently run at 2 amps and the 0.2 mm traces can only handle like 0.5A(i forgot but it is a smaller number) so i mad most things bigger lets hope it doesn’t explode
i am making things small small i have decided to find some way to fit everything in to 100 mm pieces the old deign would have costed like $30 idk why but pcb manufacturers really like 100mm x 100mm and each only cost like 1 dollar
data sheet uh resistors i moved the resistors like 5mm apart because i have plenty of space and it will be like X400 easier so solder i am blind i was testing the led so i can make sure every thing works the led is like really small so i was leaning in so that i can see the pins so i can try and turn it on… so like it is super bright and i burned a little dot in my eye data sheet so when i was testing the led i noticed that you need to power it from the left side and i assumed that it was powered from the right side i was curious as to why i got it backwards because i reference the data sheet like all the time. so apparently the schematic counted clockwise. while everything else on the data sheet is counter-clockwise like look at pg 15 and you can see why i assumed the power went from right to left not left to right https://downloads.cree-led.com/files/ds/h/HB-CLW6A-TKW.pdf the flip so i needed to flip the entire pcb becouse the power is on the wrong side i would have just rotated it around but scene the resistors are specific to the pins that wouldn’t work and the leds would burn out i also learned that you cant mirror footprints on kicad so what i did was set the center of my pcb to (0,0) then went through and switch the sign on every x value on the pcb
uh i am so tired i did like 6hr of work while fighting to stay awake split i split the pcb in to 2 100mm sections becouse it is like a lot cheaper. i have no mony to connect between panels i come up with an idea that is rather guineas or it is going to be the biggest mistake in the entire project i put 5 pads on the sides of each board and i am planing to aline the boards then bridge the gap with solder this should electrically connect the 2 boards and hold them together at least a bit net i finished the net on the main pcb i finished the not on the fins flip just like yesterday i flipped the pcb so that the leds work
logo i got everything done to get the pcbs orderd Logo i made a logo so i could add it to the silkscreen for some extra style mother board the mother board is basically an Arduino what directly plugs in to 36 outputs so it can control all 9 boards controll to make the controller i have desided it is going to be comprised of 3 componest the indicator a rotary encoder and a switch indicator it is passively a relay small since wrgb controller so i can do a small display type out but it is also nice because i have extra of all the components so this will make them easy to use for other components jlc is goofy so if you have sevral break away bords in one they charge you for all of them witch is like a lot and the work around is if you split all of them in to there own file it only cost like $2 per board so instead of paying $20 for for board i paid $8 for the same amount this is what i split everything in to fin_right fin_left indicator mother_board main_light
so turns out i was not done with the pcbs i redesigned the logo i gave it this outline and added a gear to the light bulb uv i had the idea to add uv light to the light for like idk i will probably never use it but its fun the best use i can think of is curing resen witch is really cool i added them in to the pcb redesign so while adding the uv i realized i didnt use the vertion of the foot print ment for hand a soldering so i made sure to fix that hopfully they are done for real this time
alright i got the pcbs 100% done for real this time UV i fully implemented the UV lights IR i gave the option to attach a it receiver so i can do that in the futor if i want to logo i added the updated logo silkscreen i went through the silkscreen and fixed all there errors check i want through literately every since trace and footprint on these boards to make sure i am actually done designing thease
windows is soo slow i am making this because i have been modeling for 10hr and more then 10hr doesn’t log to star dance will make a longer devlog in a bit
3d modeling and i hate windows i have finish all the 3dmodling i need to do for now and am now just waiting foe the pcbs to ship in the mean tim i wall be here https://stardance.hackclub.com/projects/41354 clips i added clips on the bottom of the outer pieaces they wew to small on the first print so i made them bigger poles i did almost a com pleat overhaul on the poles i made them connect stronger by making them go deeper in logo * i added the loo to everything because it looks cool control i add a control panel it is at the base of the main light and just kinda sits there idea i have a another idea but i am way to tired to add it rn so i am not adding it till later the idea is to have a light conecten to a pole so i can pull it off to like press it up against things rn i also want to add a uv light to it so i can cure things better
it works
so like i think i poisoned my self or somthing i wasnt able to get mech work done i am like on the verge of passing out like constently ill do a lot more tomarow
yooo
i got some new stuff for soldering um and my back hurts sooo bad
i am starting to get the hang of things i lowered my chair and now i dont have insane back pain
i did the big one and every single light acualy works this time my back is in extreme consent pain i am almost don with soldering though my eyes i have been staring in to these lights for like 7 hr
i got the uv lights all soldered up and made another panel i have made 4/8 panels i was going to meanchen how i have posted 3 devlogs today but i just noticed it became tomorrow during my last recording
i just made a a panel i am at 5/8 i am going to try to finish the other 3 today also
i am at 7/9 sooo close
i have finished most of the soldering the rest is just small stuff
i started soldering everything over to the mother board i was able to dim the lights but i broke also its like green idk but most of the fir ware is done
um i have done almost everything besides the case servos were breaking everything so aparently even if you dont use a servo on pin 10 0r 9 the servo lobrary still disables it but i uses those for red and green so i will need to figure that out later all panels and the main board are soldered and wired controlls when you click on the rotary encoder it changes what value you are changeing white - white lights red - red lights green - green lights blue - blue lights yellow - servos (not working) purple - turns on uv on main pannel
100% done with 3d modeling it just takes a long time to proint everything
i have the video on my phone but i dont have wifi rn so you can have this i assembed every thing and starded the covumantation
https://youtu.be/H-r51vnOVfs everything is done i can ship now there wasnt a lot of stuff to say in the midle of development so the devlogs got kinda bad around the middle
Ships:
this is a desk lamp inspired my surgery lights this is my first time ever doing a pcb or smd soldering i learned a ton it was super fun...
|
1793350331.6793644
|
1793436731.6793644
|