|
6901
|
Untitled by @Zebrak | Stardance
|
Zebrak
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Zebrak | Stardance
|
1792803008.230902
|
1793407808.230902
|
|
6902
|
My awesome macropad! by @Bond | Stardance
|
Bond
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Bond | Stardance
|
1793170384.1326358
|
1793775184.1326358
|
|
6903
|
My awesome macropad! by @rushjain198 | Stardance
|
rushjain198
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @rushjain198 | Star Title: My awesome macropad! by @rushjain198 | Stardance...
|
1793242044.2237003
|
1793846844.2237003
|
|
6904
|
My awesome macropad! by @richard_dutchman28dematha My awesome macropad! by @richard_dutchman28dematha | Stardance...
|
richard_dutchman28dematha
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @richard_dutchman28 Title: My awesome macropad! by @richard_dutchman28dematha | Stardance...
|
1793350333.0805783
|
1793955133.0805783
|
|
6905
|
procedural planet sim by @kanishkv99 | Stardance
|
kanishkv99
|
0
|
0.32
|
0
|
[]
|
[{"post_id": 1820, "ts": "2026 [{"post_id": 1820, "ts": "2026-06-04T01:22:03Z", "hours": 0.3189, "text": "Scafolded the project with some ai help, now to actually code"}]...
|
Title: procedural planet sim by @kanishkv99 | Star Title: procedural planet sim by @kanishkv99 | Stardance
Devlogs:
Scafolded the project with some ai help, now to actually code...
|
1793368331.4573586
|
1793973131.4573586
|
|
6906
|
Ball Machine by @rushjain198 | Stardance
|
rushjain198
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Ball Machine by @rushjain198 | Stardance
|
1793213766.700402
|
1793818566.700402
|
|
6907
|
Roblox Game Progress by @Rehankhatri | Stardance
|
Rehankhatri
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Roblox Game Progress by @Rehankhatri | Star Title: Roblox Game Progress by @Rehankhatri | Stardance...
|
1793328940.3097703
|
1793933740.3097703
|
|
6908
|
Flight computer by @Nolan | Stardance
|
Nolan
|
0
|
8.69
|
0
|
[]
|
[{"post_id": 3478, "ts": "2026 [{"post_id": 3478, "ts": "2026-06-06T13:04:33Z", "hours": 5.0833, "text": "Devlog #2 Added sensor and radio components to the schematic which came with some difficulties. Some of these were deciding if I should have multiple power converters, which out of safety I ended up having multiple, and understanding if I should be connecting these power converters to the main power line (3.3V). I then started work on designing the PCB and finished placing all the component footprints. Next, I plan on routing the traces of the PCB and, after checking for errors and double-checking things, ordering the PCB and components."}, {"post_id": 2377, "ts": "2026-06-04T20:38:55Z", "hours": 3.6106, "text": "Completed the schematic for the main “Brain” of the flight computer and finished assigning footprints to all the components. This was a bit tedious because of the large range of resistor and capacitor values that I had to search through to make sure I selected the correct values and package sizes. Another issue that I ran into was that I could not find the Micro USB that is used in the documentation, so I had to find an alternative that would work for my project. After this, I plan on adding the data collecting devices to the schematic so I can be ready for PCB design."}]...
|
Title: Flight computer by @Nolan | Stardance
Devl Title: Flight computer by @Nolan | Stardance
Devlogs:
Completed the schematic for the main “Brain” of the flight computer and finished assigning footprints to all the components. This was a bit tedious because of the large range of resistor and capacitor values that I had to search through to make sure I selected the correct values and package sizes. Another issue that I ran into was that I could not find the Micro USB that is used in the documentation, so I had to find an alternative that would work for my project. After this, I plan on adding the data collecting devices to the schematic so I can be ready for PCB design.
Devlog #2 Added sensor and radio components to the schematic which came with some difficulties. Some of these were deciding if I should have multiple power converters, which out of safety I ended up having multiple, and understanding if I should be connecting these power converters to the main power line (3.3V). I then started work on designing the PCB and finished placing all the component footprints. Next, I plan on routing the traces of the PCB and, after checking for errors and double-checking things, ordering the PCB and components....
|
1793173970.4461384
|
1793778770.4461384
|
|
6909
|
Untitled by @youssef_chater | Stardance
|
youssef_chater
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @youssef_chater | Stardance
|
1793141274.3543153
|
1793746074.3543153
|
|
6910
|
AstatineOS (x86 custom OS + kernel) by @atomtables AstatineOS (x86 custom OS + kernel) by @atomtables | Stardance...
|
atomtables
|
0
|
53.53
|
0
|
[]
|
[{"post_id": 28077, "ts": "202 [{"post_id": 28077, "ts": "2026-07-14T03:22:50Z", "hours": 6.1403, "text": "so it’s been a while, just barely 6h7m (676767676767676767). again… coding just gets me in the feels you know? you feel the breeze in the wind, the sun in the sky, the butterflies that release and change eddy currents to cause bit flips in a disc platter… just me? alright. i added children traversal to the vfs. this was because I wanted my vfs to print out the output of all the items that got pushed through it. this also adds another feature that i took from Linux, which is that a given directory is connected to its children via a doubly linked list. I actually took a feature from the Linux kernel: struct list_item . It’s a structure that has prev and next , which point to the addresses of struct list_item inside existing structures. So, for example struct my_item { struct list_item children; struct list_item siblings; } would hold a prev and next pointer for each item. children would point to the first sibling, while the beginning of siblings would point to the original parent directory. obviously though, my_item->children.next would hold a pointer to struct list_item, not struct my_item. this is where Linux’s container_of macro comes in (which i shamelessly copied word for word). it calculates the offset to subtract from different structures, given the structure and the name of the struct list_item. this provides efficiency, since siblings and children are connected in a linked list that allows O(1) insertion and removal in a list where there’s likely to be a lot of removals. my hashmap is also working pretty well!!! HASHMAP I WOULD USE A HASHMAP (if you get the reference LMFAO)."}, {"post_id": 25717, "ts": "2026-07-10T04:37:06Z", "hours": 6.7314, "text": "how much fun we shall have so you may be wondering… where the hell was I for the past 6 hours. I was putting together the foundation for my VFS, with a ton of struggles. what so in my last devlog, I came up with all the storage structures and measurements for how the filesystem works on Astatine. But I was yet to implement a single function. So i started basic, and that still somehow screwed up too bad 1. Splitting paths by forward slashes this seems really simple, but I messed it up somewhat bad. Since I don’t have a C library or strtok, I implemented my own string splitting thing using dynamic arrays (that I implemented) and a buffer. The unfortunate thing is that my dynamic arrays return a pointer to the value you save to it. Since I’m saving a pointer to a string, which in turn is a pointer of characters, I have to cast everything to a char** , while the default return types are all void* , so when I freed the strings, I forgot to dereference them (and the compiler didn’t complain), resulting in a kernel panic screen. 2. macro hell (in expansion of hashmap) next, I need to implement a VFS global cache. when you access a path, it’s better to save the data in ram so that the next time you visit that path we aren’t traversing the directory again. unfortunately, i’m dumb and don’t know how to implement a hashmap, so I found this interesting tutorial from a decade ago and used that. I also thought, at this point in time, that it would make sense to add thread safety to the vfs code so that it doesn’t completely crash due to race conditions, and I introduced macros for these. However, I realised that non-atomic writes are still not thread safe, and had to dig in with compiler builtins (since I’m using freestanding code, I can’t use <stdatomic.h>). While putting together these macros with atomic, I had some weird behaviour where I kept hanging and hanging and hanging, and turns out it was because my macros were made improperly, and the formatting of the code meant that the while statements I was using to loop over code didn’t actually cover the entire loop body, resulting in a permanent hang. 3. malloc vs calloc this is my fault, I forgot to use calloc to get zeroed memory, since my code seems to have failed to initialise all the required sections, it resulted in a page fault. 4. well this is embarassing about at least 25 times, i kept a debug statement that dereferenced a null pointer, causing a crash. this was so sad because it taught me to remember: i’m stupid. so does it work? yea. thank my 2012 macbook air’s horribly patched version of qemu for the slowdown in the next clip. (i also included the crash so you can see the cool ntos-like crash screen)"}, {"post_id": 23907, "ts": "2026-07-07T03:34:11Z", "hours": 1.2019, "text": "after some deliberation i have some specifics as to the implementation of the virtual file system. ive decided that i’m not smarter than engineers in the 50s, and am adopting a very similar idea to what the Unix kernel has: the i-node system (although i’m not calling them inodes that’s such an ugly name). the kernel keeps track of 3 structures: fs_entry (the central identifier of the file, source of truth), fs_entid (what keeps track of the file name, parent directory, and what filesystem it belongs to), and fs_file (which is what processes interact with to read, write, mmap, etc. to disk). we’ll then have a huge list of filesystem operations that use these 3 structures (as well as f_props to get properties of a file, dir_props to get directory information, sec_props, etc. etc.) to completely interact with the disk. This will allow us to make our own filesystem drivers and have interaction with physical media beyond fat32, something my operating system DESPERATELY needs. ps. Maybe I’ll create my own read/write file system later."}, {"post_id": 23677, "ts": "2026-07-06T19:48:59Z", "hours": 0.9425, "text": "well this was embarassing. turns out I forgot to clean the project, and stale files with the wrong idea of data had corrupt structures that made the kernel randomly crash. This was confusing for a couple reasons. from the below screenshot, you can see that the kernel panic occurred inconsistently. the PCI device would register and memory would be allocated, but in other cases size was set to zero and stuff wasn’t very well allocated. It turns out that my kmalloc function is bugged, and panics if you call it with zero (since it doesn’t do a precondition check and the loop always compares length with a min valid of 1) Page faults were happening as well, which made me think a deeper memory corruption issue was happening. On top of changing the device structure to use an attributes pointer struct rather than an extension of the device itself, i allocated memory to copy that structure over, so I thought that early allocations were frying existing code. all in all there’s a lot to learn from forgetting to clean stale files. now we can get back to the disk structure on hand!!!"}, {"post_id": 23253, "ts": "2026-07-06T03:06:23Z", "hours": 7.5797, "text": "I am utterly lost in space right now. So I wrote the syscall structure and now realised that I don’t really have a robust way of getting files. I’m using a stub and some random fat32 embedded driver online, which is certainly no “operating system”-like way to load files. I started working on my disk abstraction. So now, I’m horribly lost. Well first, I made a couple of changes, all of which broke something random. I disabled optimisation for debugging purposes, and that changed the location of the entrypoint for some reason. I changed the way the bootloader is loaded up, and that broke the main partition for some reason. Something or the other keeps breaking. After adding the abstraction code, I cycle between 3 errors. Either the code pagefaults while registering device, the malloc runs out of memory, or (a more random one) the disk driver fails to run. i’m taking a break."}, {"post_id": 19744, "ts": "2026-07-01T04:09:49Z", "hours": 5.8486, "text": "it may not seem like much, but i’ve gotten to completely rewriting my syscall structure. how you may ask? when it comes to system design, I want to separate Astatine from Unix’s own malpractices. Rather than going with the “everything is a file” paradigm, a concept that just squishes everything rather than make a decent api, I separated device and file nodes. You open with file_open and device_open . On top of this, I added some better handling of flags, switches, and made some decisions that I thought would be better. Of course, I’m not going to throw out the 75-year-old works of Unix engineers, but I do want some creativity involved and Astatine-Is-Not-Unix (ainu?). System design is probably the worst part out of any OS design: it feels so much better to start implementing, but sometimes, you need both DIRECTION and MAGNITUDE vector reference to work on code you’ll actually use. The almost 20 hours of research isn’t lost on me though. I hope I don’t have to take a Unix class in college."}, {"post_id": 17319, "ts": "2026-06-28T01:26:24Z", "hours": 4.9325, "text": "oh my god the last 2 days have been like living in another hell. i wouldn’t wish this debugging session on my worst enemy. so i wanted to implement an option on boot to choose how you want to display graphics on the screen (upcoming feature to give applications direct access to the framebuffer?). i made the smallest mistake of putting my strings in between the code, rather than all at the end. Because of this, nasm started doing random shenanigans that I still don’t know what happened and asked for help on the OSDev forums . After like 5 hours on GDB and Hex Fiend and nasm and trying to get Gemini to do anything but hallucinate (hilariously so may I add), I figured out the issue was not putting all the program strings at the bottom of the code. Now, I also have a configuration struct that allows stuff like boot-args, graphics config, and etc. to be configured as below. It looks decent as well"}, {"post_id": 16514, "ts": "2026-06-26T21:22:33Z", "hours": 2.6797, "text": "so i finally achieved the entire point of adding this second teletype driver. an important consideration to make in ANY computer is that you’re going to be working with different screens, different sizes, and different types of interfaces. My old teletype code was only really optimised for VGA bios (even now, it can only render 16-color bios colors). But now, to change displays, all I need is to: change the loaded driver from textmode.adv to bitmaptext.adv change the loaded display device to VGA_BITMAP… rather than VGA_TEXT change the boot program to initialise the display as 320x200 I plan on making only the 3rd option required through the boot program, the 1st and 2nd steps (should) hopefully happen automatically. And since we’re only dealing with ISA(80s)-compatible VGA cards, keeping the display device as an ISA device shouldn’t be that big of a problem (at least until we implement PCI discovery)"}, {"post_id": 15442, "ts": "2026-06-25T03:05:06Z", "hours": 1.2914, "text": "so i did try to hook up the bitmap into the new code but 1. i did hardcode 80x25 into the code so I have to fix that and 2. i did not implement a couple of functions and a couple of areas where it relies on quirks only available on text mode. you can see the result of relying on those quirks below in the poorly rendered and hardcoded error dialogue… more work will happen tomorrow."}, {"post_id": 15380, "ts": "2026-06-25T00:32:53Z", "hours": 2.0828, "text": "i got all of the characters + a little bit of color handling code to complete the drawing. this will be part of the second teletype driver I write, although I still am not the biggest fan of this. my next step will be to write a bitmap driver arrangement that the teletype will then be bolted onto, since the current teletype ordeal with this will be just ad-hoc writes to memory without mounting to a specific display, it could possibly corrupt memory if loaded incorrectly (like the vga text mode driver). anyway ill git commit here so you can see"}, {"post_id": 14836, "ts": "2026-06-24T03:02:13Z", "hours": 1.6375, "text": "previously i was using a 7x7 font that worked, but it looks really ugly, looks bolded, and doesn’t really have a good lower-case variant. of course I could try to make one but I’m a god awful designer. instead i stole this 5x7 character set from online specifically meant for bitmapped fonts on low resolution displays. 5x7 means that it won’t quite align perfectly, we do have a 53.6x25 display now (since its 6x8 with padding) but i just ignored the excess pixels and went along anyway. this looks much better, and I really do plan to use 640x480 since 320x200 is only usable for dos games and such. i spent most of this 1h38m just putting in the character set into the character array, which I must say is quite relaxing."}, {"post_id": 14630, "ts": "2026-06-23T20:12:55Z", "hours": 1.3428, "text": "continuing to work on the bitmapped character list, so far I have an A and a B imported from some random thing online. Unfortunately I can’t find an image online for lowercase 7x7 test, so I might have to design that myself, along with the rest of the special characters. At the very least, this foray is just to experiment with how my OS would interact with a bitmapped screen, I plan to use 640x480 basically as soon as possible (only reason I didn’t now is because its planar when set up via VGA, so I have to learn VESA)"}, {"post_id": 14108, "ts": "2026-06-23T02:46:47Z", "hours": 0.7917, "text": "Right now, I’m working on a bitmap display. I decided to go with a really basic starting point, just a 320x200 256-colors, and I’m programming the 256 colors as a 3-3-2 colormap. It took like an hour just to understand how this stuff works, I don’t like VGA a ton now."}, {"post_id": 14008, "ts": "2026-06-22T23:54:15Z", "hours": 5.7836, "text": "holy crap there was so much debugging that had to happen. so the memory allocator pretty much fell apart. I realised that (with the help of gemini) that having a buddy allocator for physical frames was irrelevant, considering that physical memory could be remapped however necessary. as far as I know, there is no need for continuous physical memory except for legacy hardware, which i guess can be its own function later then. so I just made a bitmap allocator. physical memory is extremely irrelevant, we don’t care about anything other than the virtual memory it’s paired to. now I can finally start work on a bitmap display somehow."}, {"post_id": 2136, "ts": "2026-06-04T13:50:08Z", "hours": 0.8058, "text": "I managed to fix the bug, the issue was that I uninitialised a variable that needed to be initialised (which was the address of the code that told the OS where memory was valid). I fixed that and now I’m working on adding a buddy allocator to the frames."}, {"post_id": 1826, "ts": "2026-06-04T01:27:30Z", "hours": 3.7422, "text": "I’m being ragebait by the compiler. There is 100% enough memory to allocate more memory but it says there isn’t. It’s been way too long for this issue to still be happening, all I did was write one unused subroutine in the memory allocation function. I’ll be back when I finish writing it."}]...
|
Title: AstatineOS (x86 custom OS + kernel) by @ato Title: AstatineOS (x86 custom OS + kernel) by @atomtables | Stardance
Devlogs:
I’m being ragebait by the compiler. There is 100% enough memory to allocate more memory but it says there isn’t. It’s been way too long for this issue to still be happening, all I did was write one unused subroutine in the memory allocation function. I’ll be back when I finish writing it.
I managed to fix the bug, the issue was that I uninitialised a variable that needed to be initialised (which was the address of the code that told the OS where memory was valid). I fixed that and now I’m working on adding a buddy allocator to the frames.
holy crap there was so much debugging that had to happen. so the memory allocator pretty much fell apart. I realised that (with the help of gemini) that having a buddy allocator for physical frames was irrelevant, considering that physical memory could be remapped however necessary. as far as I know, there is no need for continuous physical memory except for legacy hardware, which i guess can be its own function later then. so I just made a bitmap allocator. physical memory is extremely irrelevant, we don’t care about anything other than the virtual memory it’s paired to. now I can finally start work on a bitmap display somehow.
Right now, I’m working on a bitmap display. I decided to go with a really basic starting point, just a 320x200 256-colors, and I’m programming the 256 colors as a 3-3-2 colormap. It took like an hour just to understand how this stuff works, I don’t like VGA a ton now.
continuing to work on the bitmapped character list, so far I have an A and a B imported from some random thing online. Unfortunately I can’t find an image online for lowercase 7x7 test, so I might have to design that myself, along with the rest of the special characters. At the very least, this foray is just to experiment with how my OS would interact with a bitmapped screen, I plan to use 640x480 basically as soon as possible (only reason I didn’t now is because its planar when set up via VGA, so I have to learn VESA)
previously i was using a 7x7 font that worked, but it looks really ugly, looks bolded, and doesn’t really have a good lower-case variant. of course I could try to make one but I’m a god awful designer. instead i stole this 5x7 character set from online specifically meant for bitmapped fonts on low resolution displays. 5x7 means that it won’t quite align perfectly, we do have a 53.6x25 display now (since its 6x8 with padding) but i just ignored the excess pixels and went along anyway. this looks much better, and I really do plan to use 640x480 since 320x200 is only usable for dos games and such. i spent most of this 1h38m just putting in the character set into the character array, which I must say is quite relaxing.
i got all of the characters + a little bit of color handling code to complete the drawing. this will be part of the second teletype driver I write, although I still am not the biggest fan of this. my next step will be to write a bitmap driver arrangement that the teletype will then be bolted onto, since the current teletype ordeal with this will be just ad-hoc writes to memory without mounting to a specific display, it could possibly corrupt memory if loaded incorrectly (like the vga text mode driver). anyway ill git commit here so you can see
so i did try to hook up the bitmap into the new code but 1. i did hardcode 80x25 into the code so I have to fix that and 2. i did not implement a couple of functions and a couple of areas where it relies on quirks only available on text mode. you can see the result of relying on those quirks below in the poorly rendered and hardcoded error dialogue… more work will happen tomorrow.
so i finally achieved the entire point of adding this second teletype driver. an important consideration to make in ANY computer is that you’re going to be working with different screens, different sizes, and different types of interfaces. My old teletype code was only really optimised for VGA bios (even now, it can only render 16-color bios colors). But now, to change displays, all I need is to: change the loaded driver from textmode.adv to bitmaptext.adv change the loaded display device to VGA_BITMAP… rather than VGA_TEXT change the boot program to initialise the display as 320x200 I plan on making only the 3rd option required through the boot program, the 1st and 2nd steps (should) hopefully happen automatically. And since we’re only dealing with ISA(80s)-compatible VGA cards, keeping the display device as an ISA device shouldn’t be that big of a problem (at least until we implement PCI discovery)
oh my god the last 2 days have been like living in another hell. i wouldn’t wish this debugging session on my worst enemy. so i wanted to implement an option on boot to choose how you want to display graphics on the screen (upcoming feature to give applications direct access to the framebuffer?). i made the smallest mistake of putting my strings in between the code, rather than all at the end. Because of this, nasm started doing random shenanigans that I still don’t know what happened and asked for help on the OSDev forums . After like 5 hours on GDB and Hex Fiend and nasm and trying to get Gemini to do anything but hallucinate (hilariously so may I add), I figured out the issue was not putting all the program strings at the bottom of the code. Now, I also have a configuration struct that allows stuff like boot-args, graphics config, and etc. to be configured as below. It looks decent as well
it may not seem like much, but i’ve gotten to completely rewriting my syscall structure. how you may ask? when it comes to system design, I want to separate Astatine from Unix’s own malpractices. Rather than going with the “everything is a file” paradigm, a concept that just squishes everything rather than make a decent api, I separated device and file nodes. You open with file_open and device_open . On top of this, I added some better handling of flags, switches, and made some decisions that I thought would be better. Of course, I’m not going to throw out the 75-year-old works of Unix engineers, but I do want some creativity involved and Astatine-Is-Not-Unix (ainu?). System design is probably the worst part out of any OS design: it feels so much better to start implementing, but sometimes, you need both DIRECTION and MAGNITUDE vector reference to work on code you’ll actually use. The almost 20 hours of research isn’t lost on me though. I hope I don’t have to take a Unix class in college.
I am utterly lost in space right now. So I wrote the syscall structure and now realised that I don’t really have a robust way of getting files. I’m using a stub and some random fat32 embedded driver online, which is certainly no “operating system”-like way to load files. I started working on my disk abstraction. So now, I’m horribly lost. Well first, I made a couple of changes, all of which broke something random. I disabled optimisation for debugging purposes, and that changed the location of the entrypoint for some reason. I changed the way the bootloader is loaded up, and that broke the main partition for some reason. Something or the other keeps breaking. After adding the abstraction code, I cycle between 3 errors. Either the code pagefaults while registering device, the malloc runs out of memory, or (a more random one) the disk driver fails to run. i’m taking a break.
well this was embarassing. turns out I forgot to clean the project, and stale files with the wrong idea of data had corrupt structures that made the kernel randomly crash. This was confusing for a couple reasons. from the below screenshot, you can see that the kernel panic occurred inconsistently. the PCI device would register and memory would be allocated, but in other cases size was set to zero and stuff wasn’t very well allocated. It turns out that my kmalloc function is bugged, and panics if you call it with zero (since it doesn’t do a precondition check and the loop always compares length with a min valid of 1) Page faults were happening as well, which made me think a deeper memory corruption issue was happening. On top of changing the device structure to use an attributes pointer struct rather than an extension of the device itself, i allocated memory to copy that structure over, so I thought that early allocations were frying existing code. all in all there’s a lot to learn from forgetting to clean stale files. now we can get back to the disk structure on hand!!!
after some deliberation i have some specifics as to the implementation of the virtual file system. ive decided that i’m not smarter than engineers in the 50s, and am adopting a very similar idea to what the Unix kernel has: the i-node system (although i’m not calling them inodes that’s such an ugly name). the kernel keeps track of 3 structures: fs_entry (the central identifier of the file, source of truth), fs_entid (what keeps track of the file name, parent directory, and what filesystem it belongs to), and fs_file (which is what processes interact with to read, write, mmap, etc. to disk). we’ll then have a huge list of filesystem operations that use these 3 structures (as well as f_props to get properties of a file, dir_props to get directory information, sec_props, etc. etc.) to completely interact with the disk. This will allow us to make our own filesystem drivers and have interaction with physical media beyond fat32, something my operating system DESPERATELY needs. ps. Maybe I’ll create my own read/write file system later.
how much fun we shall have so you may be wondering… where the hell was I for the past 6 hours. I was putting together the foundation for my VFS, with a ton of struggles. what so in my last devlog, I came up with all the storage structures and measurements for how the filesystem works on Astatine. But I was yet to implement a single function. So i started basic, and that still somehow screwed up too bad 1. Splitting paths by forward slashes this seems really simple, but I messed it up somewhat bad. Since I don’t have a C library or strtok, I implemented my own string splitting thing using dynamic arrays (that I implemented) and a buffer. The unfortunate thing is that my dynamic arrays return a pointer to the value you save to it. Since I’m saving a pointer to a string, which in turn is a pointer of characters, I have to cast everything to a char** , while the default return types are all void* , so when I freed the strings, I forgot to dereference them (and the compiler didn’t complain), resulting in a kernel panic screen. 2. macro hell (in expansion of hashmap) next, I need to implement a VFS global cache. when you access a path, it’s better to save the data in ram so that the next time you visit that path we aren’t traversing the directory again. unfortunately, i’m dumb and don’t know how to implement a hashmap, so I found this interesting tutorial from a decade ago and used that. I also thought, at this point in time, that it would make sense to add thread safety to the vfs code so that it doesn’t completely crash due to race conditions, and I introduced macros for these. However, I realised that non-atomic writes are still not thread safe, and had to dig in with compiler builtins (since I’m using freestanding code, I can’t use <stdatomic.h>). While putting together these macros with atomic, I had some weird behaviour where I kept hanging and hanging and hanging, and turns out it was because my macros were made improperly, and the formatting of the code meant that the while statements I was using to loop over code didn’t actually cover the entire loop body, resulting in a permanent hang. 3. malloc vs calloc this is my fault, I forgot to use calloc to get zeroed memory, since my code seems to have failed to initialise all the required sections, it resulted in a page fault. 4. well this is embarassing about at least 25 times, i kept a debug statement that dereferenced a null pointer, causing a crash. this was so sad because it taught me to remember: i’m stupid. so does it work? yea. thank my 2012 macbook air’s horribly patched version of qemu for the slowdown in the next clip. (i also included the crash so you can see the cool ntos-like crash screen)
so it’s been a while, just barely 6h7m (676767676767676767). again… coding just gets me in the feels you know? you feel the breeze in the wind, the sun in the sky, the butterflies that release and change eddy currents to cause bit flips in a disc platter… just me? alright. i added children traversal to the vfs. this was because I wanted my vfs to print out the output of all the items that got pushed through it. this also adds another feature that i took from Linux, which is that a given directory is connected to its children via a doubly linked list. I actually took a feature from the Linux kernel: struct list_item . It’s a structure that has prev and next , which point to the addresses of struct list_item inside existing structures. So, for example struct my_item { struct list_item children; struct list_item siblings; } would hold a prev and next pointer for each item. children would point to the first sibling, while the beginning of siblings would point to the original parent directory. obviously though, my_item->children.next would hold a pointer to struct list_item, not struct my_item. this is where Linux’s container_of macro comes in (which i shamelessly copied word for word). it calculates the offset to subtract from different structures, given the structure and the name of the struct list_item. this provides efficiency, since siblings and children are connected in a linked list that allows O(1) insertion and removal in a list where there’s likely to be a lot of removals. my hashmap is also working pretty well!!! HASHMAP I WOULD USE A HASHMAP (if you get the reference LMFAO)....
|
1793188516.80366
|
1793793316.80366
|
|
6911
|
Owlly by @baxthus | Stardance
|
baxthus
|
0
|
2.74
|
0
|
[]
|
[{"post_id": 2272, "ts": "2026 [{"post_id": 2272, "ts": "2026-06-04T17:46:22Z", "hours": 1.9719, "text": "Changelog New commands: help (dynamically generated!) cat cep-search Others: Use pino for logging Slack Block Kit is so cool! A lot better than Discord’s Components V2"}, {"post_id": 1856, "ts": "2026-06-04T02:09:51Z", "hours": 0.7664, "text": "Bot created! Load commands dynamically"}]...
|
Title: Owlly by @baxthus | Stardance
Devlogs:
Bot Title: Owlly by @baxthus | Stardance
Devlogs:
Bot created! Load commands dynamically
Changelog New commands: help (dynamically generated!) cat cep-search Others: Use pino for logging Slack Block Kit is so cool! A lot better than Discord’s Components V2...
|
1793195658.5428362
|
1793800458.5428362
|
|
6912
|
My first slack bot! by @sans114114 | Stardance
|
sans114114
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @sans114114 | Starda Title: My first slack bot! by @sans114114 | Stardance...
|
1793141563.567603
|
1793746363.567603
|
|
6913
|
Calculator Project by @MH | Stardance
|
MH
|
0
|
0.35
|
0
|
[]
|
[{"post_id": 1831, "ts": "2026 [{"post_id": 1831, "ts": "2026-06-04T01:32:17Z", "hours": 0.3503, "text": "Still getting used to the javascript but trying"}]...
|
Title: Calculator Project by @MH | Stardance
Devl Title: Calculator Project by @MH | Stardance
Devlogs:
Still getting used to the javascript but trying...
|
1793328603.822387
|
1793933403.822387
|
|
6914
|
My awesome macropad! by @Aylin30 | Stardance
|
Aylin30
|
0
|
2.04
|
0
|
[]
|
[{"post_id": 23294, "ts": "202 [{"post_id": 23294, "ts": "2026-07-06T05:06:57Z", "hours": 2.0353, "text": "Just started my journey into hardware design :D Today I began designing my first mechanical using the Hackpad. I’m working the keyboard case in Fusion 360 and worked on the PCB schematic in KiCad. Still a complete beginner, but super excited to keep learning:D."}]...
|
Title: My awesome macropad! by @Aylin30 | Stardanc Title: My awesome macropad! by @Aylin30 | Stardance
Devlogs:
Just started my journey into hardware design :D Today I began designing my first mechanical using the Hackpad. I’m working the keyboard case in Fusion 360 and worked on the PCB schematic in KiCad. Still a complete beginner, but super excited to keep learning:D....
|
1793152608.5861611
|
1793757408.5861611
|
|
6915
|
Om Daily by @aahish_abbani | Stardance
|
aahish_abbani
|
1
|
22.0
|
194
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-02T19:12:17Z", "hours": 22.0, "multiplier": 10.27, "payout": 194, "blessing": "neutral", "text": "I made Om daily, a way to understand hindusim through little games, like duolingo but for religion. But its not jsut learning there are daily quotes of the Bhagavad Gita, a famous book of hinduism, and all 700 verses in the backend. This was my first ever mobile app make in react native with the expo framework and it was a challenge getting started, I didnt really understand how most of it worked like devlopement servers, stuff like that. But over time I learned a lot about how to actualyl code and use a backend. another thing, this was my first ever project with a backend so I used supabase as my backend and I learned how to do Oauth, store users information safely. The app itself is packed with so many features and going forward I really want to improve on it more and more!", "repo": "https://github.com/kinghightech/om-daily", "demo": "https://apps.apple.com/app/om-daily/id6778643150"}]...
|
[{"post_id": 20878, "ts": "202 [{"post_id": 20878, "ts": "2026-07-02T16:26:24Z", "hours": 13.0297, "text": "So I to be honest was so locked in on working on this i lowkey forgot ot keep up with the devlogs which is something going forward i need to fix! But good news i have got it up and running on the app store!!! so u can download it actually and test it out. it does require a sign up/sign unfortunately to save ur progress if you are fine with that I spent so much time and effort into this app and it would be great if i can get some good feedback!"}, {"post_id": 2536, "ts": "2026-06-05T02:20:43Z", "hours": 9.0192, "text": "I’m building Om Daily, a mobile app that helps people learn Hinduism through daily Bhagavad Gita verses, prayers, meanings, and simple lessons. It makes spiritual learning easy, beautiful, and consistent with features like verse saving, prayer translations, widgets, and daily wisdom reminders. Hey, I’m working on om Daily. Dharma Daily is an app. We used Expo, React Native, and a lot of TypeScript to make the app. I really wanted to focus on the app, making it feel premium. today i added another prayer to the app and designed the splash screen with canva!"}]...
|
Title: Om Daily by @aahish_abbani | Stardance
Dev Title: Om Daily by @aahish_abbani | Stardance
Devlogs:
I’m building Om Daily, a mobile app that helps people learn Hinduism through daily Bhagavad Gita verses, prayers, meanings, and simple lessons. It makes spiritual learning easy, beautiful, and consistent with features like verse saving, prayer translations, widgets, and daily wisdom reminders. Hey, I’m working on om Daily. Dharma Daily is an app. We used Expo, React Native, and a lot of TypeScript to make the app. I really wanted to focus on the app, making it feel premium. today i added another prayer to the app and designed the splash screen with canva!
So I to be honest was so locked in on working on this i lowkey forgot ot keep up with the devlogs which is something going forward i need to fix! But good news i have got it up and running on the app store!!! so u can download it actually and test it out. it does require a sign up/sign unfortunately to save ur progress if you are fine with that I spent so much time and effort into this app and it would be great if i can get some good feedback!
Ships:
I made Om daily, a way to understand hindusim through little games, like duolingo but for religion. But its not jsut learning there are daily quotes of the Bhagavad Gita, a famous book of hinduism, and all 700 verses in the backend. This was my first ever mobile app make in react native with the expo framework and it was a challenge getting started, I didnt really understand how most of it worked like devlopement servers, stuff like that. But over time I learned a lot about how to actualyl code and use a backend. another thing, this was my first ever project with a backend so I used supabase as my backend and I learned how to do Oauth, store users information safely. The app itself is packed with so many features and going forward I really want to improve on it more and more!...
|
1792882113.3175633
|
1793746113.3175633
|
|
6916
|
Potatpheus by @SunnyBoiX | Stardance
|
SunnyBoiX
|
0
|
2.76
|
0
|
[]
|
[{"post_id": 8345, "ts": "2026 [{"post_id": 8345, "ts": "2026-06-13T21:26:23Z", "hours": 0.7156, "text": "I spent this session going through lots of trouble. I did get my bot working on nest 24/7 but, since I was not complete the bot, I had to continue working on it. I don’t know how but, I completely had forgotten how Nest had worked and spent my time testing the bot locally. When I first tested the bot, running the /pass command gave a frustrating error saying the app did not respond. Looking at the code, I found out the biggest mistake was on the very first line of the /pass block. I wrote await ack; instead of calling it as a function with parentheses like await ack(); . Because of this, the bot never sent that quick acknowledgement back to slack, Slack waited for three seconds and gave up. Right after that, I fixed a bug where the code tried to clean up the command text without checking if a user actually tagged anyone. When someone typed just /pass by itself, the text was blank, causing a fatal crash that broke the whole game loop. I added a safety check to use an empty string if no text is found. I also noticed my success message used regular quotes instead of backticks, which broke the user tag formatting, and fixed a simple typo in my error handling that was causing secondary crashes. I finally remembered to log in to my SSH, pull the code from Github, and update .env file with MY SECRET TOKENS >:) and setup a systemd file to keep the script running in the background. Soon, I will go back to in to completely finish and polish the /pass command in order to get rid of the timeout errors once and for all. After doing that, I will make it 24/7 and test if the game works. In the end, I will make a leaderboard system to track everyone’s stats on slack!!!"}, {"post_id": 2443, "ts": "2026-06-04T22:50:04Z", "hours": 1.2639, "text": "Bot Purpose & Code I finally got an idea on what to make my custom Slack bot based on. I decided to make a hot potato slack bot called Potatpheus. Hot potato + Orpheus = Potatopheus. I set up global variables like gameState and friedLeaderboard to track the game data. I built a function called getRandomSeconds to handle the fuse timing, which works directly into my main explodePotato function to reset the game and log the loss when someone blows up. I added the slash command on the Slack APi called /drop-potato to begin the game. During testing, I encountered a problem which was if someone decided to start a new game while one is already going on. In order to resolve this issue, I used a conditional if statement to check a boolean flag inside my global gameState dictionary and then exited early using a return statement. Specifically, inside the /drop-potato command handler, I set up a restriction that checks if (gameState.isActive). If that boolean evaluates to true, the code uses Slack’s respond function to send a message back to the user (“A game is already active!”), and then directs itself to the return statement to stop itself. This stops the rest of the execution from reaching the setTimeout, ensuring no duplicate timers get created. I will work on the leaderboards and the pass function now."}, {"post_id": 1843, "ts": "2026-06-04T01:49:04Z", "hours": 0.7772, "text": "Setup & Code - Slack Bot I followed the tutorial where it teaches you how to make a Slack Bot. I completed the setup and prerequisites before completing the code which were to create the application on Slack. Following all the instructions that were given such as generating tokens. Then, moved onto the code. I copied the code that was provided and replaced the parts I was supposed to. Made a github repository as well and track this with hackatime. This bot currently has no theme and has the same exact commands given in the tutorial. I will give it a specific theme and more commands to make it more fun!"}]...
|
Title: Potatpheus by @SunnyBoiX | Stardance
Devlo Title: Potatpheus by @SunnyBoiX | Stardance
Devlogs:
Setup & Code - Slack Bot I followed the tutorial where it teaches you how to make a Slack Bot. I completed the setup and prerequisites before completing the code which were to create the application on Slack. Following all the instructions that were given such as generating tokens. Then, moved onto the code. I copied the code that was provided and replaced the parts I was supposed to. Made a github repository as well and track this with hackatime. This bot currently has no theme and has the same exact commands given in the tutorial. I will give it a specific theme and more commands to make it more fun!
Bot Purpose & Code I finally got an idea on what to make my custom Slack bot based on. I decided to make a hot potato slack bot called Potatpheus. Hot potato + Orpheus = Potatopheus. I set up global variables like gameState and friedLeaderboard to track the game data. I built a function called getRandomSeconds to handle the fuse timing, which works directly into my main explodePotato function to reset the game and log the loss when someone blows up. I added the slash command on the Slack APi called /drop-potato to begin the game. During testing, I encountered a problem which was if someone decided to start a new game while one is already going on. In order to resolve this issue, I used a conditional if statement to check a boolean flag inside my global gameState dictionary and then exited early using a return statement. Specifically, inside the /drop-potato command handler, I set up a restriction that checks if (gameState.isActive). If that boolean evaluates to true, the code uses Slack’s respond function to send a message back to the user (“A game is already active!”), and then directs itself to the return statement to stop itself. This stops the rest of the execution from reaching the setTimeout, ensuring no duplicate timers get created. I will work on the leaderboards and the pass function now.
I spent this session going through lots of trouble. I did get my bot working on nest 24/7 but, since I was not complete the bot, I had to continue working on it. I don’t know how but, I completely had forgotten how Nest had worked and spent my time testing the bot locally. When I first tested the bot, running the /pass command gave a frustrating error saying the app did not respond. Looking at the code, I found out the biggest mistake was on the very first line of the /pass block. I wrote await ack; instead of calling it as a function with parentheses like await ack(); . Because of this, the bot never sent that quick acknowledgement back to slack, Slack waited for three seconds and gave up. Right after that, I fixed a bug where the code tried to clean up the command text without checking if a user actually tagged anyone. When someone typed just /pass by itself, the text was blank, causing a fatal crash that broke the whole game loop. I added a safety check to use an empty string if no text is found. I also noticed my success message used regular quotes instead of backticks, which broke the user tag formatting, and fixed a simple typo in my error handling that was causing secondary crashes. I finally remembered to log in to my SSH, pull the code from Github, and update .env file with MY SECRET TOKENS >:) and setup a systemd file to keep the script running in the background. Soon, I will go back to in to completely finish and polish the /pass command in order to get rid of the timeout errors once and for all. After doing that, I will make it 24/7 and test if the game works. In the end, I will make a leaderboard system to track everyone’s stats on slack!!!...
|
1792745450.0607212
|
1793350250.0607212
|
|
6917
|
Untitled project by @teeG | Stardance
|
teeG
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @teeG | Stardance
|
1793170189.4481623
|
1793774989.4481623
|
|
6918
|
My awesome macropad! by @bvwhite29 | Stardance
|
bvwhite29
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @bvwhite29 | Starda Title: My awesome macropad! by @bvwhite29 | Stardance...
|
1792806672.9136076
|
1793411472.9136076
|
|
6919
|
Number Guessing Game by @Jadon | Stardance
|
Jadon
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Number Guessing Game by @Jadon | Stardance
|
1793321418.0696964
|
1793926218.0696964
|
|
6920
|
Kastral by @aahish_abbani | Stardance
|
aahish_abbani
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Kastral by @aahish_abbani | Stardance
|
1792950727.1432438
|
1793814727.1432438
|
|
6921
|
still thinking by @eliza | Stardance
|
eliza
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: still thinking by @eliza | Stardance
|
1793231477.665428
|
1793836277.665428
|
|
6922
|
My awesome macropad! by @Ashlyn | Stardance
|
Ashlyn
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Ashlyn | Stardance
|
1793296251.4264977
|
1793901051.4264977
|
|
6923
|
My awesome macropad! by @rgjava | Stardance
|
rgjava
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @rgjava | Stardance
|
1793267392.1561718
|
1793872192.1561718
|
|
6924
|
Untitled project by @Biologicmaster | Stardance
|
Biologicmaster
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @Biologicmaster | Stard Title: Untitled project by @Biologicmaster | Stardance...
|
1793303340.324388
|
1793908140.324388
|
|
6925
|
Student Dashboard by @Abdul | Stardance
|
Abdul
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Student Dashboard by @Abdul | Stardance
|
1793170313.332909
|
1793775113.332909
|
|
6926
|
My first slack bot! by @Dishsoap | Stardance
|
Dishsoap
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @Dishsoap | Stardanc Title: My first slack bot! by @Dishsoap | Stardance...
|
1793332448.1811244
|
1793937248.1811244
|
|
6927
|
My first slack bot! by @adamgti | Stardance
|
adamgti
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @adamgti | Stardance
|
1792687678.190687
|
1793292478.190687
|
|
6928
|
Untitled by @Dishsoap | Stardance
|
Dishsoap
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Dishsoap | Stardance
|
1792749199.9570622
|
1793353999.9570622
|
|
6929
|
SOCCER WEBSITE by @ABYLOVESCATS | Stardance
|
ABYLOVESCATS
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: SOCCER WEBSITE by @ABYLOVESCATS | Stardance
|
1792778060.3825288
|
1793382860.3825288
|
|
6930
|
Untitled by @sans114114 | Stardance
|
sans114114
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @sans114114 | Stardance
|
1792695016.382142
|
1793299816.382142
|
|
6931
|
My first slack bot! by @freakliter | Stardance
|
freakliter
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @freakliter | Starda Title: My first slack bot! by @freakliter | Stardance...
|
1793274772.6874125
|
1793879572.6874125
|
|
6932
|
KEITH by @EEDAC | Stardance
|
EEDAC
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: KEITH by @EEDAC | Stardance
|
1793199395.204957
|
1793804195.204957
|
|
6933
|
My awesome macropad! by @KnowScratcher | Stardance
|
KnowScratcher
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @KnowScratcher | St Title: My awesome macropad! by @KnowScratcher | Stardance...
|
1793191806.2408922
|
1793796606.2408922
|
|
6934
|
My first slack bot! by @Kyan | Stardance
|
Kyan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @Kyan | Stardance
|
1793278342.4752915
|
1793883142.4752915
|
|
6935
|
My first slack bot! by @Dipo_Alfatih | Stardance
|
Dipo_Alfatih
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @Dipo_Alfatih | Star Title: My first slack bot! by @Dipo_Alfatih | Stardance...
|
1793159429.865451
|
1793764229.865451
|
|
6936
|
Untitled by @babyyodarules75 | Stardance
|
babyyodarules75
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @babyyodarules75 | Stardance
|
1793271020.1285267
|
1793875820.1285267
|
|
6937
|
Knicks Light Switch Case by @LoginlikeLogan | Star Knicks Light Switch Case by @LoginlikeLogan | Stardance...
|
LoginlikeLogan
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T18:43:40Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a super fun knicks case that is fully 3d printable or if it works(idk), lasercuttable!", "repo": "https://github.com/Logdegret/Knicks-Light-Switch-Case", "demo": ""}]...
|
[{"post_id": 5238, "ts": "2026 [{"post_id": 5238, "ts": "2026-06-08T23:01:54Z", "hours": 2.8164, "text": "Finished building and 3d modleing the all star knicks light switch case!"}]...
|
Title: Knicks Light Switch Case by @LoginlikeLogan Title: Knicks Light Switch Case by @LoginlikeLogan | Stardance
Devlogs:
Finished building and 3d modleing the all star knicks light switch case!
Ships:
I made a super fun knicks case that is fully 3d printable or if it works(idk), lasercuttable!...
|
1792878477.8290584
|
1793742477.8290584
|
|
6938
|
InterATOM Website by @Lemion | Stardance
|
Lemion
|
0
|
15.52
|
0
|
[]
|
[{"post_id": 17550, "ts": "202 [{"post_id": 17550, "ts": "2026-06-28T11:40:38Z", "hours": 4.5886, "text": "Finally started on the “Folder View” to actually list out folders so you can view contents of said folders and added icons for sort ascending, descending, folder icons open and close, expand icons + and -, skip next previous buttons in blue (for active) and checkboxes, as well as fixing minor styling issues (background and border on the number input for pagination and for # of items to show, and the background when a column is sorted by)"}, {"post_id": 2705, "ts": "2026-06-05T12:40:15Z", "hours": 3.7297, "text": "Rewrote the entire library page and it’s now called the (Web-Based) Document Search System only table sorting and pagination works right now since I used a react table library"}, {"post_id": 2186, "ts": "2026-06-04T15:29:30Z", "hours": 2.0256, "text": "FINALLY Added the index page with the news tiles and power statistics Site is now visible on https://interatom.site except for the library page which i’ll work on tomorrow i am too tired"}, {"post_id": 2083, "ts": "2026-06-04T12:29:16Z", "hours": 2.3003, "text": "Added the static about, sustainability, and safety pages (was pretty simple, they all share the same CSS) and news now loads off Contentful, gets displayed, and you can now read each article with the magic of some cursed routing"}, {"post_id": 1994, "ts": "2026-06-04T08:08:55Z", "hours": 2.8742, "text": "Got the navbar footer and cookies moved over I keep forgetting it’s className={styles.class} rather than class=“class” and it’s really messing with me"}]...
|
Title: InterATOM Website by @Lemion | Stardance
D Title: InterATOM Website by @Lemion | Stardance
Devlogs:
Got the navbar footer and cookies moved over I keep forgetting it’s className={styles.class} rather than class=“class” and it’s really messing with me
Added the static about, sustainability, and safety pages (was pretty simple, they all share the same CSS) and news now loads off Contentful, gets displayed, and you can now read each article with the magic of some cursed routing
FINALLY Added the index page with the news tiles and power statistics Site is now visible on https://interatom.site except for the library page which i’ll work on tomorrow i am too tired
Rewrote the entire library page and it’s now called the (Web-Based) Document Search System only table sorting and pagination works right now since I used a react table library
Finally started on the “Folder View” to actually list out folders so you can view contents of said folders and added icons for sort ascending, descending, folder icons open and close, expand icons + and -, skip next previous buttons in blue (for active) and checkboxes, as well as fixing minor styling issues (background and border on the number input for pagination and for # of items to show, and the background when a column is sorted by)...
|
1792792078.8557687
|
1793396878.8557687
|
|
6939
|
My awesome macropad! by @ihsan-droid | Stardance
|
ihsan-droid
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @ihsan-droid | Star Title: My awesome macropad! by @ihsan-droid | Stardance...
|
1792752634.6588137
|
1793357434.6588137
|
|
6940
|
Untitled project by @ananya-_- | Stardance
|
ananya-_-
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @ananya-_- | Stardance
|
1792759664.6656485
|
1793364464.6656485
|
|
6941
|
Untitled by @rgjava | Stardance
|
rgjava
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @rgjava | Stardance
|
1792731242.1239414
|
1793336042.1239414
|
|
6942
|
My awesome macropad! by @edpackard62 | Stardance
|
edpackard62
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @edpackard62 | Star Title: My awesome macropad! by @edpackard62 | Stardance...
|
1793364708.999958
|
1793969508.999958
|
|
6943
|
TubeReplacer by @Preloading | Stardance
|
Preloading
|
0
|
211.44
|
0
|
[]
|
[{"post_id": 83283, "ts": "202 [{"post_id": 83283, "ts": "2026-10-27T16:35:25Z", "hours": 1.7792, "text": "Apparently everything goes wrong in the last few days! I implemented something that may help fix some of the errors which have been encountered when using the HD stuff. This is going to be a pain to debug, esp since like all issues, it doesn’t happen to me , also botguard dying on the person’s device that got this error. Joy!"}, {"post_id": 83033, "ts": "2026-10-26T17:01:58Z", "hours": 5.0364, "text": "I finally fixed all the memory leaks! (at least in 1.3.0). I had found using this tool called flex that there were apparently 3 megabytes worth of NSNumbers that were being leaked (after having a video play for 4 hours). Also got TRSabrStream deallocating :D"}, {"post_id": 81837, "ts": "2026-10-22T17:56:16Z", "hours": 7.4014, "text": "Alright, two things. Most of the time was spent doing lame tracing of memory leaks. I fixed one, but the primary leak is still leaking :( I’ve also been working on setting up the demo, and I got it running on my server enviroment! It’s a little wrong right now, I think I accidently put my capture card in a USB 2.0 port, so everything of that is broken, but that works! I also still need to strip tubereplacer to remove any feature of YT thats… undesirable? Primarly, microphone & casting, and making it delete all user data on open."}, {"post_id": 79718, "ts": "2026-10-15T06:35:36Z", "hours": 1.0169, "text": "To the demo, I added a time limit & a restart app option in case it breaks and the app has to be restarted."}, {"post_id": 79710, "ts": "2026-10-15T05:23:07Z", "hours": 11.7986, "text": "Cooking up the demo, I’ve basically setup a remote control system on this phone, which should hopefully run over the internet! Giving randos complete control of this phone… what could possibly go wrong???? I still need to do some stuff to lock down the system it runs in, and also patch the problems with tubereplacer that came up recently."}, {"post_id": 74763, "ts": "2026-09-28T05:27:24Z", "hours": 2.1983, "text": "Alright, so the results are in. From what it seems, it mostly went well, however there are some issues that came up, primarly due to me not having enough time to test (I released this the day before stardance was extended for another month…. a bit of extra time would have been nice to iron out the few bugs on release, and also time to diagnose the playback errors people encounted). I did a quick 2.0.1 release to fix some of the bigger issues… 5 days after the initial. i’m tired ok?"}, {"post_id": 72543, "ts": "2026-09-23T05:25:42Z", "hours": 3.6169, "text": "Oh dear, publishing it to the world! I’ve decided to say “fuck it, its good enough”. There are some issues which has popped up, like some versions crashing, and the SABR stream never starting issue. I’m praying that it’s not just that bad. Made a reddit post about it :3 https://www.reddit.com/r/LegacyJailbreak/comments/1wnh4il/ Hopefully this doesn’t go catastrophic! I also have to setup a demo. Right now, the big issue is how to. Just a video is kinda… lame? So I want to do somehow make it an interactable demo. However, there is not an emulator for appstore apps for any iOS version between 5-10. This makes things rather tough. I do have some spare phones I can acquire to run it. However, getting the screen out is uhh….. challenging. The version of AirPlay on iOS is too old for the open source projects, and even the closed source, execpt for one, AirServer (which is 20$ per computer). The 30pin -> HDMI adapter -> capture card is extraordinarily unreliable, and keeps disconnecting when I try to use it, and is a pain in the ass to get working. There’s Veency, but it goes black when playing a video, and is unusable slow. And after all that, I have to send it to a server to stream to a web browser, I have to take input, I have to manage launching the correct app, preventing escaping the app, handle crashing, queuing (its one phone so people will have to wait), etc. All in 7 days. oh dear."}, {"post_id": 71634, "ts": "2026-09-21T06:27:35Z", "hours": 2.2925, "text": "Did some stuff to make the challenge solver/nsig/potoken restart when needed. Also reorganized it a lot of that file."}, {"post_id": 70324, "ts": "2026-09-18T22:56:01Z", "hours": 2.3042, "text": "So, it randomly decided to break for many videos, and only for some people. It appears that YT is doing extra things to detect adblockers on web, and something I’m doing is triggering the adblock detection. This is uhh bad :) I get to figure out what I’m missing and implement it properly. Now for bugfixes I made fixed a signin crash on 1.0.1 & 1.1.0 due to a missing cflag fixed the video date failing to load on iOS 5 added proper backoff to SABR"}, {"post_id": 68463, "ts": "2026-09-15T04:46:50Z", "hours": 2.7594, "text": "Bugfixes! fixed a bug where playlist videos fail to play on channel playlists fixed the open source licesnses page crashing on 2.0.0 fixed a bug where closed videos in 2.0.0 continue to play after closing, locking the phone, then unlocking fixed a crashing bug when not connected to internet when fetching profile"}, {"post_id": 67668, "ts": "2026-09-13T20:35:14Z", "hours": 0.9072, "text": "Made it zip the network log stuff for sending over email, as text files generally have a really good compression ratio, (the file is actually 2mb), and email has really low limits."}, {"post_id": 66921, "ts": "2026-09-12T21:55:08Z", "hours": 2.8417, "text": "I managed to get N/Sig deciphering working with HLS streams, meaning you can now watch livestreams, if you change up some settings & it’s buggy. I’m not intending on shipping proper stream support right now, so this will do for release."}, {"post_id": 65754, "ts": "2026-09-11T03:18:56Z", "hours": 5.4256, "text": "Bugfixes! I’ve decided it’s probably good enuff to “feature lock” and just get it ready for release (also cuz stardance ends soon, yet the streak thingy to a plushie continues. as its ending. why. i wanna take a break!) Not much images but Fix an issue with my trimming stuff not working on 1.4.0 Managed to cleanup the stream when switching video on 2.0.0 Some missing thing on the thumbnail speedup thing My failing to do requestProfileForIdentity correctly."}, {"post_id": 64350, "ts": "2026-09-08T17:29:24Z", "hours": 4.5636, "text": "I did a bunch of things, none of which felt that interesting to make a log for, so here’s one big one. The quality selector now works You can now toggle video stats (logging in history) on or off. Some error handling and trimming stuff to save on ram"}, {"post_id": 62657, "ts": "2026-09-06T03:55:15Z", "hours": 2.315, "text": "Did a small hack to add the tweak’s version to the crash reports"}, {"post_id": 61946, "ts": "2026-09-05T03:58:53Z", "hours": 5.835, "text": "So this one is small, but I’ve done an optimzation for the process of getting that little thumbnail. The older youtube clients did indivisual, very small requests for the specific channel, incl the thumbnail. I already have this data with the video requests, and getting the channel data is rather wasteful of the network and slow. I’ve replaced it with just using the avatar from the feed. Speeds things up a decent chunk!"}, {"post_id": 60937, "ts": "2026-09-03T16:40:57Z", "hours": 1.4744, "text": "Some minor sabr tweaks, and also a fix to the channel id failing to load for certain feeds"}, {"post_id": 60505, "ts": "2026-09-02T21:45:45Z", "hours": 2.1469, "text": "I made some of the settings work, and also made it hide the comments count which I don’t have a way of getting a precise number right now. Ignore the playback error."}, {"post_id": 59350, "ts": "2026-09-01T02:54:44Z", "hours": 4.4475, "text": "i did a bunch of misc fixes which aren’t interesting. iOS 5 preference fix some reloading of video changes with SABR cleanup of a bunch of things a fix to the item count (cuz 32bit limit aaaaaaa) memory things some crash bugs with SABR"}, {"post_id": 57701, "ts": "2026-08-29T22:55:46Z", "hours": 5.6717, "text": "A bunch of signin fixes, I fixed the channel id finder failing for different accounts, and I fixed an issue where one of the requests I did on 2.0.0 is synchronous and would not let the app start until it completed."}, {"post_id": 55413, "ts": "2026-08-27T07:02:08Z", "hours": 3.3828, "text": "2.0.0 support! and actually 1.4.0 support this time (oops, i think i clicked the wrong version…). I really hacked my way to 2.0.0 support, as it adds all the stream data to a protobuf container thingy which is never actually generated as protobuf. The protobuf also isn’t a normal function, and I couldn’t figure out how to recreate it, not that it would really work if it does do some protobuf shenanigans. So I did what probably every programmer does, hack it in poorly. When it starts trying to play the video, after the protobuf section, and where i still have access to the legacy GData streams, and I just shove it in there, and it manages to work! Also had to do some extra things to include valid authentication to the SABR stuff so it can play private videos and such. But now 2.0.0 works!"}, {"post_id": 54270, "ts": "2026-08-25T05:15:09Z", "hours": 1.5956, "text": "I managed to get 1.4.0 support working! They started kinda doing what I implemented myself…. which causes issues, but it works! 2.0.0 is going to be hard tho…"}, {"post_id": 53575, "ts": "2026-08-24T05:23:41Z", "hours": 3.7281, "text": "Managed to get videos to count towards your history! Also some kinda boring optimization things (start parsing even while we are still downloading, because net neutrality doesn’t exist for some reason, and someone got 22 seconds for a 2mb file)"}, {"post_id": 51988, "ts": "2026-08-22T00:14:33Z", "hours": 1.3206, "text": "i managed to get private videos to work, however they still don’t show up in the “Uploads” tab."}, {"post_id": 51417, "ts": "2026-08-21T03:27:49Z", "hours": 1.5033, "text": "A bunch of smaller bugfixes, and now it runs on iOS 5. There was some small differences since polyfils, and it doesn’t work with a proxy on (since it proxies localhost). The left device is iOS 5."}, {"post_id": 51306, "ts": "2026-08-20T21:39:31Z", "hours": 2.2778, "text": "I spent a bit of time fixing up the settings menu to properly have the HD options. Unsure how much of this is going to stay like this, but right now both of the HQ ones work, the 360p (Android) plays with SABR for a bit, then it stops as we don’t have proper attestation (our POTokens only work on web based clients). Probably going to have to forbid using sabr on ANDROID. Unsure yet about Android VR or visionOS. They both need a visitorData, which I still have to get. VisionOS has the nice perk of giving a completely unprotected HLS stream, which this can use. Android VR is traditionally unprotected, but I think they kinda ruined that. I also did a tiny bit of work to get closed captions working, which is basically prefixing https://www.youtube.com to the URL if it begins with a slash"}, {"post_id": 50822, "ts": "2026-08-20T08:01:40Z", "hours": 2.6489, "text": "I fixed the support in 1.0.0-1.3.0, 1.4.0 and above, they started changing a bunch of player things which I still have to figure out…."}, {"post_id": 50056, "ts": "2026-08-19T02:53:41Z", "hours": 5.1094, "text": "I managed to fix most of the RAM issues, excluding the one inside the youtube app which my stuff amplifies. I’ve done some stuff to allow you to change apps, lock the phone, etc, and have the stream recover. It’s not perfect, but it works well enough."}, {"post_id": 49349, "ts": "2026-08-18T03:49:07Z", "hours": 3.9958, "text": "It kinda somewhat maybe works! you can make it through a video, however scrubbing thru the video takes forever (some request never finishes), and theres some random stutter in the video. RAM usage is still a problem, and private videos don’t play. To get here, I did things how the HTTP server wanted so other requests can come in while i’m waiting for a segment, and allows this to play fully, however I do still need to fix the buffering issues."}, {"post_id": 48759, "ts": "2026-08-17T09:09:04Z", "hours": 1.1469, "text": "Shockingly, now that I have most of the TS stuff already in place for video, audio is shockingly painless! It was only just like the previous thing, and ADTS headers, https://wiki.multimedia.cx/index.php/ADTS . Time to try it on device!"}, {"post_id": 48723, "ts": "2026-08-17T07:48:03Z", "hours": 1.5411, "text": "OK, so this was quite annoying, It was really hard to find any docs on how esds is decoded, but I got there in the end, these are some of the parts I need to make the ADTS header ( https://wiki.multimedia.cx/index.php/ADTS ). The decoder is quite bad, and just ignores some cases, but hopefully it will work :)"}, {"post_id": 47913, "ts": "2026-08-16T05:50:14Z", "hours": 2.8556, "text": "Figuring out why the player view was never getting freed was taking too long, so uhh audio! yes! I have managed to grab the header out of the app after having to patch wayyy too many bugs with the header parsing, some of which could crash the app if your network is bad. Tiem to parse dis audio header!"}, {"post_id": 46687, "ts": "2026-08-14T03:54:25Z", "hours": 5.185, "text": "I managed to make the buffering system a little more robust, it can complete a video & even seek if your careful to let it play out. I also fixed some of the memory leaks, you can get much farther, but it does still only climbs, at the end of this 25 minute video it got up to 189mbs of ram used, which means we basically leaked 100mb of ram. This is quite unacceptable still, and I get to do more of figuring out why, yay!"}, {"post_id": 46124, "ts": "2026-08-13T04:10:25Z", "hours": 8.5864, "text": "srry for audio, i am in a discord call, but i managed to get more than like 20 seconds to work, however it currently gobbles RAM, and has wayyyy too many crash bugs. I fixed a bunch of the crash bugs, and broken stream bugs, but there’s still some crashing, esp. on video end."}, {"post_id": 45278, "ts": "2026-08-11T17:04:13Z", "hours": 1.8236, "text": "IT PLAYS!!!!!!!!!!!!!!!!!!!!!! YES!!!!!!!!!!!!!! that took wayyy too much debugging (and i also used ai assistance to tell why it wouldn’t play). I got it first working with VLC & other media players, but the iOS 6 player was especially stubborn. It only plays a couple seconds since I only do one request, but it plays. Did i mention it plays? I might try forcing it to use 1080p since 144p is a little… lacking in quality and SABR is defaulting to it, i guess i’ll figure that out later."}, {"post_id": 44998, "ts": "2026-08-11T04:04:30Z", "hours": 5.6678, "text": "Unsure how much of a win this is, but at least FFplay can play the video! However, VLC, built in media players on windows, and more importantly, the video player within iOS 6 cannot play it :( I’ve forced it to use 144p for a while now for a small file size, but it should be able to go quite up in size. Bigger issue is getting it to play, however I think I will wait on that, and work on having it serve the files on the phone so I can debug this a bit easier, and have the player actually like play the files without my syslog stuff. Hopefully I can get the video to play tho :)"}, {"post_id": 44430, "ts": "2026-08-10T05:47:54Z", "hours": 1.2339, "text": "Quite boring when all that exists in these devlogs is random hex eh? Hopefully this should be the last hex blob before actually getting some kinda of video to play! (maybe, miiiight have to do one more as I hook the TS file up with the HTTP server). I managed to packetize the data into PES packets. The next thing for video (no audio) should be packing it all up in one nice TS file. And then if we get lucky, we will get like 4 seconds of a video :D, maybe even up to like 10 since then the buffer runs out, and second requests to SABR aren’t implemented yet."}, {"post_id": 44396, "ts": "2026-08-10T03:25:28Z", "hours": 2.2244, "text": "I now grab h264 samples, and convert them into annex b samples. I think the next part might be actually building the TS file! wow! This means creating packets of the data, and then making packets out of those packets (why…)"}, {"post_id": 43064, "ts": "2026-08-08T03:57:14Z", "hours": 1.8175, "text": "I decided compiling FFmpeg was going to take forever, uhh doesn’t really give good stardance hours, and this is does more stardance hours ig… I did tfdt, tfhd, and trun parsing. I think this is all the parsing I need to do on the video side and the fragment size… i hope. Here’s a screenshot of me just printing the sample size to syslog."}, {"post_id": 42485, "ts": "2026-08-07T07:55:25Z", "hours": 2.5286, "text": "I did some extra work trying to parse MP4, but like… this is going to be a lot of effort to do, and just for the video, not even looking at audio yet. For this reason, I would like to bundle parts off FFMPeg with it, but compiling it is being terrible… I got arm64 after a while, but armv7 just does not want to go :("}, {"post_id": 41141, "ts": "2026-08-05T04:55:53Z", "hours": 6.0775, "text": "POTokens actually work! current protection status being 1 means the session is approved and good to continue throughout the entire stream! I basically implemented the PR at https://github.com/LuanRT/BgUtils/pull/44 , and did some user agent fixes… and my fuckup mis-spelling something I literally said in comments I might of 😭 . And now I get SPS of 1! :D :D :D It only took… like 3 months…. for potokens… 😔 I also figured out that Web offers an HLS stream if you specify an iOS useragent… uhhhhh i pretend not to see (for now), I’m sunk cost right now, and such. I wanna commit video container crimes!"}, {"post_id": 40546, "ts": "2026-08-04T05:23:46Z", "hours": 5.7383, "text": "Actually doing something with the media data we get from SABR now. I have decided that probably the best way to implement this is to convert it into an HLS stream. I came to this decision after fully looking at what SABR outputs, a fragmented MP4 intended for DASH, which the phone cannot play. However, SABR splits up the files based on the header first, then a bunch of fMP4 fragments. With a lot of work, I should be able to manually change the container from fMP4, to MPEG-TS, the format used by HLS, and have it streamed. It does have some hickups, changing stream to a lower or higher quality while streaming would likely be difficult (more concerning with it being a server adaptive bit rate system). Also MPEG-TS looks kinda… janky? This may also bring me some trouble if I chose to add Opus audio, since much of the audio streams are Opus based. Anyways, I now parse the first MP4 stream we get per format (audio & video), specifically the initialization section, and create an HLS manifest out of it! My next step is probably to have the phone itself host an HTTP server to grab the stream from, as it only supports getting videos from URLs. Audio is also in MP4 format, so this should work for it too :D"}, {"post_id": 39802, "ts": "2026-08-03T01:12:06Z", "hours": 2.3247, "text": "Working on some SABR parsing stuff, I got StreamProtectionStatus & NextRequestPolicy, along with the extraction stuff to get the segment from SABR. Doing this kinda of debugging on airplane wifi is rather hard, as the response is quite big, containing video segments."}, {"post_id": 39281, "ts": "2026-08-02T04:46:10Z", "hours": 4.9647, "text": "OK, a couple fun things. I finally got an output from SABR yay! The bug was really stupid, and it took me wayyy to long to figure out. I get the ustreamerconfig as base64, HOWEVER, this isn’t standard base64, it’s URL safe base64… for some reason. To send it in SABR, I have to turn it into bytes, specifically an NSData. These old iOS versions don’t have a standard base64 library, so I import one. The base64 library does not accept the - & _ type, and instead of like throwing any sort of error or even a log, it just… ignores them! So the error was actually accurate, it was a malformed config, specifically ustreamer config. I also did some stuff on POTokens. It appears that youtube did an update, and the POToken engine does more checks to see if it’s on youtube.com, or something like that. It seems it now specifically refuses POTokens were minted on not youtube.com, and only for the video id case, and only sometimes, specifically if fexp in the URL is 51973818, if it’s 51973819 it works. Also for some reason on my end using the visitorData works, which it doesn’t for other people in the youtube.js discord. Oh I should mention it also affects the library BgUtils, which my thing (and yt-dlp, and literally everything) is based on/uses. For now, i’m going to ignore the POToken issue, since I’m honestly not that great at debugging the youtube’s JS (i spent like a couple hours trying, if you search for function Vr in the base.js you’ll find something in the POToken minter as of right now). However according to Luan (the author of the BgUtils thingy), nothing changed in the player code, so idk, Idk how I could really debug the potoken engine. Oh also, something… interesting, someone else in the BgUtils discord decided to uhh fork my thing and using the power of AI, implement POToken gen using QuickJS. I initally tried this for POToken gen but got stuck with me missing polyfills. I’m considering taking parts of the forked code (specifically the polyfills), and some of my older QuickJS code and having two POToken systems you can switch between in case one breaks (ES6 issues for example), but idk if I should. I guess for now, I get to go actually write an implementation reading SABR data/UMP now. Maybe i’ll be doing this on a plane again :D (return flight)"}, {"post_id": 34375, "ts": "2026-07-25T01:13:15Z", "hours": 7.5297, "text": "I’ve been doing a lot of work on getting SABR playback working. I think i’ve got sending “preferred” audio & video formats, client info stuff and probably some other things too. Currently the only response I have is sabr.malformed_config (2c1d0a15 73616272 2e6d616c 666f726d 65645f63 6f6e6669 6710021a 022006). Most of these 7h 30m were done on the ground, but i’m working on this at 37 000ft in the air. Had to do some hacks & scripting to get this to connect to the internet, which needs you to watch an ad every 30 minutes."}, {"post_id": 32689, "ts": "2026-07-22T00:21:33Z", "hours": 2.3422, "text": "I did a bunch of integration stuff, and cleanup, but now it plays 360p from the mweb client! I had to add an extra way to decipher n/sig to it (since youtube is yes), but it seems decently reliable, execpt for me not having POToken generation checks to see if it’s ready. Hopefully shouldn’t be too hard :)"}, {"post_id": 32532, "ts": "2026-07-21T19:26:46Z", "hours": 0.4147, "text": "iOS 5 now works with the botguard stuff! It was pretty simple, I just had it load the cloudflare version of polyfill.io and copied the JS it gave (since it’s based on UA)"}, {"post_id": 32499, "ts": "2026-07-21T18:34:50Z", "hours": 1.1594, "text": "I did some minor optimization of the POToken stuff, so it doesn’t block the main (UI) thread for too long, turning 2478.5ms -> 8.8ms by adding a 0 second settimeout when starting the botguard VM. I also went to go check on iOS 5. When there, I noticed my analytics temp file was failing to write, meaning it sent a “installed” event every launch. This is well… bad. It means my analytics are bad yay! I added a small check to see if I can actually write this file before sending it off, i’ll diagnose it later."}, {"post_id": 32158, "ts": "2026-07-21T03:56:13Z", "hours": 0.7561, "text": "And finally, I DID IT!!!!!!!!!!!!!!! YESS!!!!! This URL was generated on the phone, from a URL from the mobile client, meaning I can now get signed in videos. This was months and have ruined the speed of startup… BUT IT WORKS!!!!! I also have to actually make it like use the n/sig function, and do other tweaks since I used a proxy to manually implant the URL. It also means I can finally start making a SABR client inside this. I am very happy 😭"}, {"post_id": 32127, "ts": "2026-07-21T02:27:00Z", "hours": 3.8428, "text": "YESSS I HAVE A N/SIG SOLVED WITH JS CHALLENGE. I am yet to test if it’s valid though, here’s hoping lol."}, {"post_id": 31906, "ts": "2026-07-20T17:49:16Z", "hours": 1.3297, "text": "In an effort to keep it on device, I tried switching to tree-sitter. I got it all compiled for iOS, and I did get it to just parse the javascript on device! However, it took 40 seconds to parse. Along with this, RAM usage went from 58MB -> 220MB. The 3GS (one of the current targets) only has 256MB, and if I ever even try on the 3G, that only has 128MBs of ram. This is very bad. As much as it pains me, I think the best solution would likely be to have a server pick out the n/sig function, and have the device pull a json file or something which has the functions it needs. Kinda does ruin the “no server is involved” stuff with this, but that kinda does seem like the sacrifice I have to make unfortunately. Sadge :("}, {"post_id": 31547, "ts": "2026-07-20T01:21:56Z", "hours": 2.8094, "text": "So I decided to look at n/sig, as that’s what I need next. N/Sig is basically two steps Find the function for n/sig Run that function. The n/sig function is located somewhere in https://www.youtube.com/s/player/882a803a/player_es6.vflset/en_US/base.js (the link changes as new players come out, so it’s dynamic). If you look at it for a bit, you may notice it’s quite big. 2.4mb. Every other tool puts it into something called meryiah, a JS parser. https://meriyah.github.io/meriyah/ . If you try to put that script into that site, you will notice the output is extremely long. It’s long enough that you cannot select all of it. It’s also long enough to cause memory exhaustion. This is a problem. I cannot run this on my device without causing an out of memory crash. I’m unsure right now how I should get around this, but we will see I also did some integrating the POToken stuff with the rest of that app, but that was relatively minor execpt for the bad memory management I do biting me in the ass. I think this may have also destroyed launch preformance, but i guess we have to see."}, {"post_id": 31466, "ts": "2026-07-19T20:51:47Z", "hours": 1.5017, "text": "I quickly did coldstart token generation. This is intended for when the POToken engine is starting up/unavailable. It’s used to allow for instant playback on actual youtube, and here too I hope. There’s a few things I need to do to make sure this works alright. Right now, if there’s no network on startup, the engine will just be perpetually broken, and that’s not great, so I need to handle that, along with actually integrating it with the rest of the tweak."}, {"post_id": 31112, "ts": "2026-07-19T07:51:46Z", "hours": 2.9272, "text": "i did it! i now have a POToken on device. God that took far too long lol. Now I actually have to like… use them. im going to bed."}, {"post_id": 31024, "ts": "2026-07-19T02:36:09Z", "hours": 5.005, "text": "Probably had some other things, but I got the botguard response in the youtube app instead of the YT Capture app. This was shockingly annoying, since idk why, but the GTMHTTPFetcher just… doesn’t work on the youtube app? Since at least for now this is iOS 5+, I just switched to an equivalent function in the NS stuff. Right now this does botguard responses only, but I need POToken generation, so here I go i guess….. (isn’t this just riveting?)"}, {"post_id": 21806, "ts": "2026-07-03T22:44:25Z", "hours": 4.5053, "text": "I decided that QuickJS was just not working out, and decided to switch over to a hidden webview. I had a few hiccups due to the fact that it’s an ancient webview, and thus missing functions like await, async, and Symbol. The latter was required by the botguard’s iframe, which caused issues trying to polyfill it, but I got there in the end. And now I have a fresh botguard token! Now it’s time for POTokens, and then the needed tokens for uploading videos!"}, {"post_id": 21213, "ts": "2026-07-03T01:08:14Z", "hours": 3.8242, "text": "I fixed an issue where videos with a view count over the 32bit integer limit (2.14B) go into the negatives. This was relatively annoying since the issue was the app turning the int64 into an int when passing it to a function to display the video, meaning I had to RE & recreate the functions for displaying video info three times! (1.2.1 & 1.3.0 had different versions for iPad, and 2.0.0) Also did a small fix to the dislikes where viewing a video where more dislikes than likes (baby shark) would make the likes & dislikes 50/50."}, {"post_id": 18845, "ts": "2026-06-30T01:30:09Z", "hours": 5.8875, "text": "Took a break from PO stuff still, but now you can select a specific channel, though i’ve hidden my other one bcuz privacy."}, {"post_id": 9060, "ts": "2026-06-15T04:01:08Z", "hours": 0.3219, "text": "Since I keep seeing crash reports from people not reading “Known Issues”, i’ve added one for this, and iPad on iOS 9 incompatibilities. Hopefully I will stop seeing all this :)"}, {"post_id": 9053, "ts": "2026-06-15T03:35:25Z", "hours": 5.7428, "text": "I am taking a break from POToken for now, since they are legitimately hell, and it’s kinda gotten in a state where too much is broken and I must do a patch to fix these issues. I’ve managed to fix most of the issues which include Sentence based instead of word based captions not being handled “Viewer Discretion” videos not playing due to some missing flags RYTDL now uses ratio stuff with the from youtube like count instead of relying on just sometimes broken data from RYTDL Homepage length being broken Playlist content (trending, categories, playlists (duh), favourites, watch later) no longer appearing Removing the now broken “Adaptive” option (rip)"}, {"post_id": 7077, "ts": "2026-06-11T21:03:53Z", "hours": 3.9622, "text": "I’m getting somewhere but it’s still quite wrong. I managed to “pass” initalization, but generating a botguard response is just flat out broken. This should look very different. I changed out some bits on how setTimeout & setInterval to get it to initalize, but I don’t know if something there is wrong or what is happening :("}, {"post_id": 1889, "ts": "2026-06-04T03:24:22Z", "hours": 2.4694, "text": "Sooo uhh suffering :D I do not know everything in this 2h 26m, but I spent a bunch of time rewriting some of my requesting stuff to have auth for challenges, and debugging why the challenge response I got was junk. Turns out, I’m bad at javascript and didn’t properly await -_-. Now I can actually get a completed challenge! but only currently in the browser… Time to try it on device!"}]...
|
Title: TubeReplacer by @Preloading | Stardance
De Title: TubeReplacer by @Preloading | Stardance
Devlogs:
Sooo uhh suffering :D I do not know everything in this 2h 26m, but I spent a bunch of time rewriting some of my requesting stuff to have auth for challenges, and debugging why the challenge response I got was junk. Turns out, I’m bad at javascript and didn’t properly await -_-. Now I can actually get a completed challenge! but only currently in the browser… Time to try it on device!
I’m getting somewhere but it’s still quite wrong. I managed to “pass” initalization, but generating a botguard response is just flat out broken. This should look very different. I changed out some bits on how setTimeout & setInterval to get it to initalize, but I don’t know if something there is wrong or what is happening :(
I am taking a break from POToken for now, since they are legitimately hell, and it’s kinda gotten in a state where too much is broken and I must do a patch to fix these issues. I’ve managed to fix most of the issues which include Sentence based instead of word based captions not being handled “Viewer Discretion” videos not playing due to some missing flags RYTDL now uses ratio stuff with the from youtube like count instead of relying on just sometimes broken data from RYTDL Homepage length being broken Playlist content (trending, categories, playlists (duh), favourites, watch later) no longer appearing Removing the now broken “Adaptive” option (rip)
Since I keep seeing crash reports from people not reading “Known Issues”, i’ve added one for this, and iPad on iOS 9 incompatibilities. Hopefully I will stop seeing all this :)
Took a break from PO stuff still, but now you can select a specific channel, though i’ve hidden my other one bcuz privacy.
I fixed an issue where videos with a view count over the 32bit integer limit (2.14B) go into the negatives. This was relatively annoying since the issue was the app turning the int64 into an int when passing it to a function to display the video, meaning I had to RE & recreate the functions for displaying video info three times! (1.2.1 & 1.3.0 had different versions for iPad, and 2.0.0) Also did a small fix to the dislikes where viewing a video where more dislikes than likes (baby shark) would make the likes & dislikes 50/50.
I decided that QuickJS was just not working out, and decided to switch over to a hidden webview. I had a few hiccups due to the fact that it’s an ancient webview, and thus missing functions like await, async, and Symbol. The latter was required by the botguard’s iframe, which caused issues trying to polyfill it, but I got there in the end. And now I have a fresh botguard token! Now it’s time for POTokens, and then the needed tokens for uploading videos!
Probably had some other things, but I got the botguard response in the youtube app instead of the YT Capture app. This was shockingly annoying, since idk why, but the GTMHTTPFetcher just… doesn’t work on the youtube app? Since at least for now this is iOS 5+, I just switched to an equivalent function in the NS stuff. Right now this does botguard responses only, but I need POToken generation, so here I go i guess….. (isn’t this just riveting?)
i did it! i now have a POToken on device. God that took far too long lol. Now I actually have to like… use them. im going to bed.
I quickly did coldstart token generation. This is intended for when the POToken engine is starting up/unavailable. It’s used to allow for instant playback on actual youtube, and here too I hope. There’s a few things I need to do to make sure this works alright. Right now, if there’s no network on startup, the engine will just be perpetually broken, and that’s not great, so I need to handle that, along with actually integrating it with the rest of the tweak.
So I decided to look at n/sig, as that’s what I need next. N/Sig is basically two steps Find the function for n/sig Run that function. The n/sig function is located somewhere in https://www.youtube.com/s/player/882a803a/player_es6.vflset/en_US/base.js (the link changes as new players come out, so it’s dynamic). If you look at it for a bit, you may notice it’s quite big. 2.4mb. Every other tool puts it into something called meryiah, a JS parser. https://meriyah.github.io/meriyah/ . If you try to put that script into that site, you will notice the output is extremely long. It’s long enough that you cannot select all of it. It’s also long enough to cause memory exhaustion. This is a problem. I cannot run this on my device without causing an out of memory crash. I’m unsure right now how I should get around this, but we will see I also did some integrating the POToken stuff with the rest of that app, but that was relatively minor execpt for the bad memory management I do biting me in the ass. I think this may have also destroyed launch preformance, but i guess we have to see.
In an effort to keep it on device, I tried switching to tree-sitter. I got it all compiled for iOS, and I did get it to just parse the javascript on device! However, it took 40 seconds to parse. Along with this, RAM usage went from 58MB -> 220MB. The 3GS (one of the current targets) only has 256MB, and if I ever even try on the 3G, that only has 128MBs of ram. This is very bad. As much as it pains me, I think the best solution would likely be to have a server pick out the n/sig function, and have the device pull a json file or something which has the functions it needs. Kinda does ruin the “no server is involved” stuff with this, but that kinda does seem like the sacrifice I have to make unfortunately. Sadge :(
YESSS I HAVE A N/SIG SOLVED WITH JS CHALLENGE. I am yet to test if it’s valid though, here’s hoping lol.
And finally, I DID IT!!!!!!!!!!!!!!! YESS!!!!! This URL was generated on the phone, from a URL from the mobile client, meaning I can now get signed in videos. This was months and have ruined the speed of startup… BUT IT WORKS!!!!! I also have to actually make it like use the n/sig function, and do other tweaks since I used a proxy to manually implant the URL. It also means I can finally start making a SABR client inside this. I am very happy 😭
I did some minor optimization of the POToken stuff, so it doesn’t block the main (UI) thread for too long, turning 2478.5ms -> 8.8ms by adding a 0 second settimeout when starting the botguard VM. I also went to go check on iOS 5. When there, I noticed my analytics temp file was failing to write, meaning it sent a “installed” event every launch. This is well… bad. It means my analytics are bad yay! I added a small check to see if I can actually write this file before sending it off, i’ll diagnose it later.
iOS 5 now works with the botguard stuff! It was pretty simple, I just had it load the cloudflare version of polyfill.io and copied the JS it gave (since it’s based on UA)
I did a bunch of integration stuff, and cleanup, but now it plays 360p from the mweb client! I had to add an extra way to decipher n/sig to it (since youtube is yes), but it seems decently reliable, execpt for me not having POToken generation checks to see if it’s ready. Hopefully shouldn’t be too hard :)
I’ve been doing a lot of work on getting SABR playback working. I think i’ve got sending “preferred” audio & video formats, client info stuff and probably some other things too. Currently the only response I have is sabr.malformed_config (2c1d0a15 73616272 2e6d616c 666f726d 65645f63 6f6e6669 6710021a 022006). Most of these 7h 30m were done on the ground, but i’m working on this at 37 000ft in the air. Had to do some hacks & scripting to get this to connect to the internet, which needs you to watch an ad every 30 minutes.
OK, a couple fun things. I finally got an output from SABR yay! The bug was really stupid, and it took me wayyy to long to figure out. I get the ustreamerconfig as base64, HOWEVER, this isn’t standard base64, it’s URL safe base64… for some reason. To send it in SABR, I have to turn it into bytes, specifically an NSData. These old iOS versions don’t have a standard base64 library, so I import one. The base64 library does not accept the - & _ type, and instead of like throwing any sort of error or even a log, it just… ignores them! So the error was actually accurate, it was a malformed config, specifically ustreamer config. I also did some stuff on POTokens. It appears that youtube did an update, and the POToken engine does more checks to see if it’s on youtube.com, or something like that. It seems it now specifically refuses POTokens were minted on not youtube.com, and only for the video id case, and only sometimes, specifically if fexp in the URL is 51973818, if it’s 51973819 it works. Also for some reason on my end using the visitorData works, which it doesn’t for other people in the youtube.js discord. Oh I should mention it also affects the library BgUtils, which my thing (and yt-dlp, and literally everything) is based on/uses. For now, i’m going to ignore the POToken issue, since I’m honestly not that great at debugging the youtube’s JS (i spent like a couple hours trying, if you search for function Vr in the base.js you’ll find something in the POToken minter as of right now). However according to Luan (the author of the BgUtils thingy), nothing changed in the player code, so idk, Idk how I could really debug the potoken engine. Oh also, something… interesting, someone else in the BgUtils discord decided to uhh fork my thing and using the power of AI, implement POToken gen using QuickJS. I initally tried this for POToken gen but got stuck with me missing polyfills. I’m considering taking parts of the forked code (specifically the polyfills), and some of my older QuickJS code and having two POToken systems you can switch between in case one breaks (ES6 issues for example), but idk if I should. I guess for now, I get to go actually write an implementation reading SABR data/UMP now. Maybe i’ll be doing this on a plane again :D (return flight)
Working on some SABR parsing stuff, I got StreamProtectionStatus & NextRequestPolicy, along with the extraction stuff to get the segment from SABR. Doing this kinda of debugging on airplane wifi is rather hard, as the response is quite big, containing video segments.
Actually doing something with the media data we get from SABR now. I have decided that probably the best way to implement this is to convert it into an HLS stream. I came to this decision after fully looking at what SABR outputs, a fragmented MP4 intended for DASH, which the phone cannot play. However, SABR splits up the files based on the header first, then a bunch of fMP4 fragments. With a lot of work, I should be able to manually change the container from fMP4, to MPEG-TS, the format used by HLS, and have it streamed. It does have some hickups, changing stream to a lower or higher quality while streaming would likely be difficult (more concerning with it being a server adaptive bit rate system). Also MPEG-TS looks kinda… janky? This may also bring me some trouble if I chose to add Opus audio, since much of the audio streams are Opus based. Anyways, I now parse the first MP4 stream we get per format (audio & video), specifically the initialization section, and create an HLS manifest out of it! My next step is probably to have the phone itself host an HTTP server to grab the stream from, as it only supports getting videos from URLs. Audio is also in MP4 format, so this should work for it too :D
POTokens actually work! current protection status being 1 means the session is approved and good to continue throughout the entire stream! I basically implemented the PR at https://github.com/LuanRT/BgUtils/pull/44 , and did some user agent fixes… and my fuckup mis-spelling something I literally said in comments I might of 😭 . And now I get SPS of 1! :D :D :D It only took… like 3 months…. for potokens… 😔 I also figured out that Web offers an HLS stream if you specify an iOS useragent… uhhhhh i pretend not to see (for now), I’m sunk cost right now, and such. I wanna commit video container crimes!
I did some extra work trying to parse MP4, but like… this is going to be a lot of effort to do, and just for the video, not even looking at audio yet. For this reason, I would like to bundle parts off FFMPeg with it, but compiling it is being terrible… I got arm64 after a while, but armv7 just does not want to go :(
I decided compiling FFmpeg was going to take forever, uhh doesn’t really give good stardance hours, and this is does more stardance hours ig… I did tfdt, tfhd, and trun parsing. I think this is all the parsing I need to do on the video side and the fragment size… i hope. Here’s a screenshot of me just printing the sample size to syslog.
I now grab h264 samples, and convert them into annex b samples. I think the next part might be actually building the TS file! wow! This means creating packets of the data, and then making packets out of those packets (why…)
Quite boring when all that exists in these devlogs is random hex eh? Hopefully this should be the last hex blob before actually getting some kinda of video to play! (maybe, miiiight have to do one more as I hook the TS file up with the HTTP server). I managed to packetize the data into PES packets. The next thing for video (no audio) should be packing it all up in one nice TS file. And then if we get lucky, we will get like 4 seconds of a video :D, maybe even up to like 10 since then the buffer runs out, and second requests to SABR aren’t implemented yet.
Unsure how much of a win this is, but at least FFplay can play the video! However, VLC, built in media players on windows, and more importantly, the video player within iOS 6 cannot play it :( I’ve forced it to use 144p for a while now for a small file size, but it should be able to go quite up in size. Bigger issue is getting it to play, however I think I will wait on that, and work on having it serve the files on the phone so I can debug this a bit easier, and have the player actually like play the files without my syslog stuff. Hopefully I can get the video to play tho :)
IT PLAYS!!!!!!!!!!!!!!!!!!!!!! YES!!!!!!!!!!!!!! that took wayyy too much debugging (and i also used ai assistance to tell why it wouldn’t play). I got it first working with VLC & other media players, but the iOS 6 player was especially stubborn. It only plays a couple seconds since I only do one request, but it plays. Did i mention it plays? I might try forcing it to use 1080p since 144p is a little… lacking in quality and SABR is defaulting to it, i guess i’ll figure that out later.
srry for audio, i am in a discord call, but i managed to get more than like 20 seconds to work, however it currently gobbles RAM, and has wayyyy too many crash bugs. I fixed a bunch of the crash bugs, and broken stream bugs, but there’s still some crashing, esp. on video end.
I managed to make the buffering system a little more robust, it can complete a video & even seek if your careful to let it play out. I also fixed some of the memory leaks, you can get much farther, but it does still only climbs, at the end of this 25 minute video it got up to 189mbs of ram used, which means we basically leaked 100mb of ram. This is quite unacceptable still, and I get to do more of figuring out why, yay!
Figuring out why the player view was never getting freed was taking too long, so uhh audio! yes! I have managed to grab the header out of the app after having to patch wayyy too many bugs with the header parsing, some of which could crash the app if your network is bad. Tiem to parse dis audio header!
OK, so this was quite annoying, It was really hard to find any docs on how esds is decoded, but I got there in the end, these are some of the parts I need to make the ADTS header ( https://wiki.multimedia.cx/index.php/ADTS ). The decoder is quite bad, and just ignores some cases, but hopefully it will work :)
Shockingly, now that I have most of the TS stuff already in place for video, audio is shockingly painless! It was only just like the previous thing, and ADTS headers, https://wiki.multimedia.cx/index.php/ADTS . Time to try it on device!
It kinda somewhat maybe works! you can make it through a video, however scrubbing thru the video takes forever (some request never finishes), and theres some random stutter in the video. RAM usage is still a problem, and private videos don’t play. To get here, I did things how the HTTP server wanted so other requests can come in while i’m waiting for a segment, and allows this to play fully, however I do still need to fix the buffering issues.
I managed to fix most of the RAM issues, excluding the one inside the youtube app which my stuff amplifies. I’ve done some stuff to allow you to change apps, lock the phone, etc, and have the stream recover. It’s not perfect, but it works well enough.
I fixed the support in 1.0.0-1.3.0, 1.4.0 and above, they started changing a bunch of player things which I still have to figure out….
I spent a bit of time fixing up the settings menu to properly have the HD options. Unsure how much of this is going to stay like this, but right now both of the HQ ones work, the 360p (Android) plays with SABR for a bit, then it stops as we don’t have proper attestation (our POTokens only work on web based clients). Probably going to have to forbid using sabr on ANDROID. Unsure yet about Android VR or visionOS. They both need a visitorData, which I still have to get. VisionOS has the nice perk of giving a completely unprotected HLS stream, which this can use. Android VR is traditionally unprotected, but I think they kinda ruined that. I also did a tiny bit of work to get closed captions working, which is basically prefixing https://www.youtube.com to the URL if it begins with a slash
A bunch of smaller bugfixes, and now it runs on iOS 5. There was some small differences since polyfils, and it doesn’t work with a proxy on (since it proxies localhost). The left device is iOS 5.
i managed to get private videos to work, however they still don’t show up in the “Uploads” tab.
Managed to get videos to count towards your history! Also some kinda boring optimization things (start parsing even while we are still downloading, because net neutrality doesn’t exist for some reason, and someone got 22 seconds for a 2mb file)
I managed to get 1.4.0 support working! They started kinda doing what I implemented myself…. which causes issues, but it works! 2.0.0 is going to be hard tho…
2.0.0 support! and actually 1.4.0 support this time (oops, i think i clicked the wrong version…). I really hacked my way to 2.0.0 support, as it adds all the stream data to a protobuf container thingy which is never actually generated as protobuf. The protobuf also isn’t a normal function, and I couldn’t figure out how to recreate it, not that it would really work if it does do some protobuf shenanigans. So I did what probably every programmer does, hack it in poorly. When it starts trying to play the video, after the protobuf section, and where i still have access to the legacy GData streams, and I just shove it in there, and it manages to work! Also had to do some extra things to include valid authentication to the SABR stuff so it can play private videos and such. But now 2.0.0 works!
A bunch of signin fixes, I fixed the channel id finder failing for different accounts, and I fixed an issue where one of the requests I did on 2.0.0 is synchronous and would not let the app start until it completed.
i did a bunch of misc fixes which aren’t interesting. iOS 5 preference fix some reloading of video changes with SABR cleanup of a bunch of things a fix to the item count (cuz 32bit limit aaaaaaa) memory things some crash bugs with SABR
I made some of the settings work, and also made it hide the comments count which I don’t have a way of getting a precise number right now. Ignore the playback error.
Some minor sabr tweaks, and also a fix to the channel id failing to load for certain feeds
So this one is small, but I’ve done an optimzation for the process of getting that little thumbnail. The older youtube clients did indivisual, very small requests for the specific channel, incl the thumbnail. I already have this data with the video requests, and getting the channel data is rather wasteful of the network and slow. I’ve replaced it with just using the avatar from the feed. Speeds things up a decent chunk!
Did a small hack to add the tweak’s version to the crash reports
I did a bunch of things, none of which felt that interesting to make a log for, so here’s one big one. The quality selector now works You can now toggle video stats (logging in history) on or off. Some error handling and trimming stuff to save on ram
Bugfixes! I’ve decided it’s probably good enuff to “feature lock” and just get it ready for release (also cuz stardance ends soon, yet the streak thingy to a plushie continues. as its ending. why. i wanna take a break!) Not much images but Fix an issue with my trimming stuff not working on 1.4.0 Managed to cleanup the stream when switching video on 2.0.0 Some missing thing on the thumbnail speedup thing My failing to do requestProfileForIdentity correctly.
I managed to get N/Sig deciphering working with HLS streams, meaning you can now watch livestreams, if you change up some settings & it’s buggy. I’m not intending on shipping proper stream support right now, so this will do for release.
Made it zip the network log stuff for sending over email, as text files generally have a really good compression ratio, (the file is actually 2mb), and email has really low limits.
Bugfixes! fixed a bug where playlist videos fail to play on channel playlists fixed the open source licesnses page crashing on 2.0.0 fixed a bug where closed videos in 2.0.0 continue to play after closing, locking the phone, then unlocking fixed a crashing bug when not connected to internet when fetching profile
So, it randomly decided to break for many videos, and only for some people. It appears that YT is doing extra things to detect adblockers on web, and something I’m doing is triggering the adblock detection. This is uhh bad :) I get to figure out what I’m missing and implement it properly. Now for bugfixes I made fixed a signin crash on 1.0.1 & 1.1.0 due to a missing cflag fixed the video date failing to load on iOS 5 added proper backoff to SABR
Did some stuff to make the challenge solver/nsig/potoken restart when needed. Also reorganized it a lot of that file.
Oh dear, publishing it to the world! I’ve decided to say “fuck it, its good enough”. There are some issues which has popped up, like some versions crashing, and the SABR stream never starting issue. I’m praying that it’s not just that bad. Made a reddit post about it :3 https://www.reddit.com/r/LegacyJailbreak/comments/1wnh4il/ Hopefully this doesn’t go catastrophic! I also have to setup a demo. Right now, the big issue is how to. Just a video is kinda… lame? So I want to do somehow make it an interactable demo. However, there is not an emulator for appstore apps for any iOS version between 5-10. This makes things rather tough. I do have some spare phones I can acquire to run it. However, getting the screen out is uhh….. challenging. The version of AirPlay on iOS is too old for the open source projects, and even the closed source, execpt for one, AirServer (which is 20$ per computer). The 30pin -> HDMI adapter -> capture card is extraordinarily unreliable, and keeps disconnecting when I try to use it, and is a pain in the ass to get working. There’s Veency, but it goes black when playing a video, and is unusable slow. And after all that, I have to send it to a server to stream to a web browser, I have to take input, I have to manage launching the correct app, preventing escaping the app, handle crashing, queuing (its one phone so people will have to wait), etc. All in 7 days. oh dear.
Alright, so the results are in. From what it seems, it mostly went well, however there are some issues that came up, primarly due to me not having enough time to test (I released this the day before stardance was extended for another month…. a bit of extra time would have been nice to iron out the few bugs on release, and also time to diagnose the playback errors people encounted). I did a quick 2.0.1 release to fix some of the bigger issues… 5 days after the initial. i’m tired ok?
Cooking up the demo, I’ve basically setup a remote control system on this phone, which should hopefully run over the internet! Giving randos complete control of this phone… what could possibly go wrong???? I still need to do some stuff to lock down the system it runs in, and also patch the problems with tubereplacer that came up recently.
To the demo, I added a time limit & a restart app option in case it breaks and the app has to be restarted.
Alright, two things. Most of the time was spent doing lame tracing of memory leaks. I fixed one, but the primary leak is still leaking :( I’ve also been working on setting up the demo, and I got it running on my server enviroment! It’s a little wrong right now, I think I accidently put my capture card in a USB 2.0 port, so everything of that is broken, but that works! I also still need to strip tubereplacer to remove any feature of YT thats… undesirable? Primarly, microphone & casting, and making it delete all user data on open.
I finally fixed all the memory leaks! (at least in 1.3.0). I had found using this tool called flex that there were apparently 3 megabytes worth of NSNumbers that were being leaked (after having a video play for 4 hours). Also got TRSabrStream deallocating :D
Apparently everything goes wrong in the last few days! I implemented something that may help fix some of the errors which have been encountered when using the HD stuff. This is going to be a pain to debug, esp since like all issues, it doesn’t happen to me , also botguard dying on the person’s device that got this error. Joy!...
|
1793195599.4156942
|
1793800399.4156942
|
|
6944
|
Untitled project by @petero | Stardance
|
petero
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @petero | Stardance
|
1792810110.5448997
|
1793414910.5448997
|
|
6945
|
My first slack bot! by @Mk1A | Stardance
|
Mk1A
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @Mk1A | Stardance
|
1792911216.2933395
|
1793775216.2933395
|
|
6946
|
My awesome macropad! by @gourkrishna | Stardance
|
gourkrishna
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @gourkrishna | Star Title: My awesome macropad! by @gourkrishna | Stardance...
|
1792781266.0518262
|
1793386066.0518262
|
|
6947
|
Slack Bot by @EthanCubes | Stardance
|
EthanCubes
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Slack Bot by @EthanCubes | Stardance
|
1792889244.9078553
|
1793753244.9078553
|
|
6948
|
Needoh Factory by @Oscar_da_best | Stardance
|
Oscar_da_best
|
2
|
46.0
|
399
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-12T09:36:31Z", "hours": 6.0, "multiplier": 8.4, "payout": 54, "blessing": "neutral", "text": "I added a obby island to the project and made the game run a little better in general less bugs now and i am working on ading all the coming soon features", "repo": "https://github.com/Duder-coolman/needoh-tycoon", "demo": "https://www.roblox.com/games/85070662876748/Needoh-Factory"}, {"ship_num": 2, "ts": "2026-09-15T02:11:55Z", "hours": 40.0, "multiplier": 8.67, "payout": 345, "blessing": "neutral", "text": "I made a game called Needoh Factory where you buy needohs and merge them to get cooler needohs that make more money. This was a challanging project because I challenged myself to step away from AI an really test what I could do as well as basiclly learing Luau for the first time. I am proud of how far I have come on this journey and proud of the effort I put into this game. anyone who wats to test my project can test it as long as they make a roblox account!", "repo": "https://github.com/Duder-coolman/needoh-tycoon", "demo": "https://www.roblox.com/games/85070662876748/Needoh-Factory"}]...
|
[{"post_id": 78999, "ts": "202 [{"post_id": 78999, "ts": "2026-10-12T09:34:08Z", "hours": 1.1264, "text": "I made a new gem curency and fixed some more bugs that were pretty game breaking like things getting out of the droppers"}, {"post_id": 78019, "ts": "2026-10-09T07:03:58Z", "hours": 2.2419, "text": "I added a parkour island as somthing to do while you passivly make money and the parkour will reward a new currency called gems which will be very useful in the future."}, {"post_id": 77759, "ts": "2026-10-08T05:48:11Z", "hours": 3.0975, "text": "I replaced my script with a Module script allowing me to use the function in other parts of my game like when the player joins or amy other time I need to update the GUI. Mainly jut doing bug fixes right now before I add any more big features to the game and I dont really remember everything I did. :P"}, {"post_id": 68404, "ts": "2026-09-15T02:07:23Z", "hours": 2.4011, "text": "Finished up the game early, a lot is not done but there will be an update hopefully before stardance ends"}, {"post_id": 66425, "ts": "2026-09-12T07:50:55Z", "hours": 5.7147, "text": "There are three pictures I really dislike UI but I am pushing through it and had some fun making the map more decorated. made a working teleport system. Next I will make a shop for the ingame currency and I will add background music as well as making the purchases work. I’m really enjoying this project and hoping to finish in the next week!! :)"}, {"post_id": 65184, "ts": "2026-09-10T04:05:22Z", "hours": 5.5197, "text": "I finisshed the conversion sysstem that allows the player to convert thier needohs into monye finally completeing the core loop of the game. it is not playable and I will be debugging and decorating for the next 10-15 hours🥳🥳 then I can finally ship it I also completed a startup script so that all the UI can update when A player joins the game to display the correct prices and I watched a tutorial on how to make numbers with suffixes after them to make the pricees easier to read."}, {"post_id": 55382, "ts": "2026-08-27T05:38:59Z", "hours": 5.3786, "text": "i added coded the dropper models into the tower and now you can buy them and merge three to get the next level up. they also drop mini and simplified versions of themselves that the player can pick up for a currency that will then be turned into coins im super happy that this project is coming along and am looking forward to shiping it soon."}, {"post_id": 52062, "ts": "2026-08-22T03:48:39Z", "hours": 4.2428, "text": "I made the second row this time. give me some feedback please i like any critisizm just keep in mind I litteraly just started learning. the first row is in my last post. happy to begin working on the main loop of the game soon."}, {"post_id": 48697, "ts": "2026-08-17T06:30:55Z", "hours": 3.6744, "text": "Made a whole pack of runic symbols that I will sell on roblox’s marketplace for $0.99 and made 10 models for my game planning on finishing the other 10 tommorow."}, {"post_id": 47227, "ts": "2026-08-15T00:29:49Z", "hours": 2.0911, "text": "Made the buttons more appealing and rewrote the button purchasing script to make it less repetetive."}, {"post_id": 43160, "ts": "2026-08-08T08:30:52Z", "hours": 5.4481, "text": "Made a save data storage script and a script to buy droppers I cannot figure out how to add code blocks so these terrible pictures will have to do"}, {"post_id": 5630, "ts": "2026-06-09T14:38:25Z", "hours": 2.2406, "text": "I added the main element of the game and made a plot system that gives the player a plot when they load in. (lighting looks bad because it is not textured yet)"}, {"post_id": 4036, "ts": "2026-06-07T06:49:08Z", "hours": 1.775, "text": "Added pathways and portals for obstacle courses, its so hard to make pathways… planning on making a lot of progress tommorow and waiting to finishing building so I can start scripting 🙏"}, {"post_id": 3341, "ts": "2026-06-06T07:05:12Z", "hours": 0.5228, "text": "Added water around the islands and bridges connecting them. planning on locking in tomorrow"}, {"post_id": 2599, "ts": "2026-06-05T06:43:34Z", "hours": 0.3025, "text": "Currently very busy finishing up school but I was able to make a measured out map."}, {"post_id": 1982, "ts": "2026-06-04T07:40:57Z", "hours": 0.5017, "text": "Basic Hover effect for button along with other basic thing I like to set up when I start a project"}]...
|
Title: Needoh Factory by @Oscar_da_best | Stardanc Title: Needoh Factory by @Oscar_da_best | Stardance
Devlogs:
Basic Hover effect for button along with other basic thing I like to set up when I start a project
Currently very busy finishing up school but I was able to make a measured out map.
Added water around the islands and bridges connecting them. planning on locking in tomorrow
Added pathways and portals for obstacle courses, its so hard to make pathways… planning on making a lot of progress tommorow and waiting to finishing building so I can start scripting 🙏
I added the main element of the game and made a plot system that gives the player a plot when they load in. (lighting looks bad because it is not textured yet)
Made a save data storage script and a script to buy droppers I cannot figure out how to add code blocks so these terrible pictures will have to do
Made the buttons more appealing and rewrote the button purchasing script to make it less repetetive.
Made a whole pack of runic symbols that I will sell on roblox’s marketplace for $0.99 and made 10 models for my game planning on finishing the other 10 tommorow.
I made the second row this time. give me some feedback please i like any critisizm just keep in mind I litteraly just started learning. the first row is in my last post. happy to begin working on the main loop of the game soon.
i added coded the dropper models into the tower and now you can buy them and merge three to get the next level up. they also drop mini and simplified versions of themselves that the player can pick up for a currency that will then be turned into coins im super happy that this project is coming along and am looking forward to shiping it soon.
I finisshed the conversion sysstem that allows the player to convert thier needohs into monye finally completeing the core loop of the game. it is not playable and I will be debugging and decorating for the next 10-15 hours🥳🥳 then I can finally ship it I also completed a startup script so that all the UI can update when A player joins the game to display the correct prices and I watched a tutorial on how to make numbers with suffixes after them to make the pricees easier to read.
There are three pictures I really dislike UI but I am pushing through it and had some fun making the map more decorated. made a working teleport system. Next I will make a shop for the ingame currency and I will add background music as well as making the purchases work. I’m really enjoying this project and hoping to finish in the next week!! :)
Finished up the game early, a lot is not done but there will be an update hopefully before stardance ends
I replaced my script with a Module script allowing me to use the function in other parts of my game like when the player joins or amy other time I need to update the GUI. Mainly jut doing bug fixes right now before I add any more big features to the game and I dont really remember everything I did. :P
I added a parkour island as somthing to do while you passivly make money and the parkour will reward a new currency called gems which will be very useful in the future.
I made a new gem curency and fixed some more bugs that were pretty game breaking like things getting out of the droppers
Ships:
I made a game called Needoh Factory where you buy needohs and merge them to get cooler needohs that make more money. This was a challanging project because I challenged myself to step away from AI an really test what I could do as well as basiclly learing Luau for the first time. I am proud of how far I have come on this journey and proud of the effort I put into this game. anyone who wats to test my project can test it as long as they make a roblox account!
I added a obby island to the project and made the game run a little better in general less bugs now and i am working on ading all the coming soon features...
|
1793346460.5117466
|
1793432860.5117466
|
|
6949
|
My awesome macropad! by @Kanika_Tahiliani | Starda My awesome macropad! by @Kanika_Tahiliani | Stardance...
|
Kanika_Tahiliani
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Kanika_Tahiliani | Title: My awesome macropad! by @Kanika_Tahiliani | Stardance...
|
1793238757.4593132
|
1793843557.4593132
|
|
6950
|
Pulse by @ishaangulati | Stardance
|
ishaangulati
|
1
|
7.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T18:16:15Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Pulse is a social paper trading app built specifically for teens. The problem is simple: most people under 18 legally can’t open a brokerage account, and even for those who can, throwing real money at stocks before you understand what you’re doing is a terrible idea. But the existing alternatives, paper trading apps and stock simulators, are all built for adults and feel like spreadsheets. There’s no social element, no reason to come back, no one to compete with. Pulse fixes that by combining real-time paper trading with a social layer designed around how teens actually use apps. You get a virtual portfolio seeded with fake money and you trade real stocks at live market prices. Every buy, every sell, every position is tracked exactly like it would be in a real brokerage. You build intuition for how markets move, what volatility actually feels like, and how hard it is to time an exit, without ever risking a dollar. This update shipped the social infrastructure that makes all of that actually fun. You can follow other traders and watch their moves appear in your feed in real time. You can create a group with your friends, see eachother on a shared leaderboard, and compete on portfolio returns over time. You can put a face to your handle with a profile picture. And the whole UI got rebuilt from the ground up to feel faster and cleaner. The most challenging part was the social feed. The naive approach of re-fetching on every action felt laggy and broke the illusion that anything was live. So the feed runs on Firestore real-time listeners, meaning updates push to every client the moment they’re written. That introduced a new problem: follow and unfollow actions felt slow because they waited on the server before updating the UI. I switched to optimistic updates, where the UI changes immediately and then syncs in the background, with rollback logic if the write fails. Getting that rollback to behave correctly in edge cases, like a user rapidly tapping follow/unfollow, took way more debugging than I expected. The leaderboard had its own set of problems. Calculating portfolio returns client-side worked fine with two or three users in a group but got noticeably slow as groups got bigger. I moved the PnL calculation server-side and trigger a recalculation on every trade write instead. The client just reads the result. Much faster and the rankings update in real time without anyone doing math on their phone. Profile pictures had a sneaky issue too: users were uploading full-resolution photos straight from their camera roll and Firebase Storage costs scale with bytes stored and transferred. I added client-side image compression before the upload and hard cap everything at 200 KB. The quality is still totally fine and the cost difference is significant. What I’m most proud of is that this is a real shipped iOS app on the App Store with over 100 users that actual teenagers are using to learn investing. It’s not a demo, it’s not a prototype running on localhost. The live market data is real, the social features work, and the leaderboard updates when your friend makes a trade from across the country. Building something that functions at that level while also being genuinely fun to use is what I set out to do. To test it, download Pulse from the App Store on an iPhone, create an account, and you’ll start with a virtual portfolio. Place a few trades on any stock you recognize, then find another user to follow and watch their activity show up in your feed. If you want to test the group leaderboard, create a group and share the code. Check it out at tinyurl.com/pulseofficial", "repo": "https://github.com/ishaan-gulati/pulse_official", "demo": "https://apps.apple.com/us/app/pulse-social-paper-trading/id6760734269"}]...
|
[{"post_id": 11407, "ts": "202 [{"post_id": 11407, "ts": "2026-06-18T17:52:13Z", "hours": 6.8383, "text": "Pulse devlog, v1.1. Pulse just got a social layer. The big focus this update was making the app actually feel alive. Paper trading in isolation is fine for learning, but competing and building with friends is what makes it stick, so I spent this session wiring up the core social infrastructure. Friends & Following lets you find and follow other traders and see their activity in your feed in real time. Follow relationships are stored in Firestore with live listeners so updates come through instantly without polling. Groups lets you create a crew and compete on portfolio returns. Leaderboard rankings are calculated server-side on write so the client never has to do heavy math. Profile Pictures mean you can finally put a face to the handle. Images get compressed under 200 KB on the client before uploading to keep storage costs reasonable. UI Improvements include a full app redesign, a contrast pass across every screen, and a spacing system refactor that brought load time down around 18%. Up next: DMs, trade reactions, push notifications for follower activity, and a proper onboarding flow for new users. Check it out at tinyurl.com/pulseofficial"}]...
|
Title: Pulse by @ishaangulati | Stardance
Devlogs Title: Pulse by @ishaangulati | Stardance
Devlogs:
Pulse devlog, v1.1. Pulse just got a social layer. The big focus this update was making the app actually feel alive. Paper trading in isolation is fine for learning, but competing and building with friends is what makes it stick, so I spent this session wiring up the core social infrastructure. Friends & Following lets you find and follow other traders and see their activity in your feed in real time. Follow relationships are stored in Firestore with live listeners so updates come through instantly without polling. Groups lets you create a crew and compete on portfolio returns. Leaderboard rankings are calculated server-side on write so the client never has to do heavy math. Profile Pictures mean you can finally put a face to the handle. Images get compressed under 200 KB on the client before uploading to keep storage costs reasonable. UI Improvements include a full app redesign, a contrast pass across every screen, and a spacing system refactor that brought load time down around 18%. Up next: DMs, trade reactions, push notifications for follower activity, and a proper onboarding flow for new users. Check it out at tinyurl.com/pulseofficial
Ships:
Pulse is a social paper trading app built specifically for teens. The problem is simple: most people under 18 legally can’t open a brokerage account, and even for those who can, throwing real money at stocks before you understand what you’re doing is a terrible idea. But the existing alternatives, paper trading apps and stock simulators, are all built for adults and feel like spreadsheets. There’s no social element, no reason to come back, no one to compete with. Pulse fixes that by combining real-time paper trading with a social layer designed around how teens actually use apps. You get a virtual portfolio seeded with fake money and you trade real stocks at live market prices. Every buy, every sell, every position is tracked exactly like it would be in a real brokerage. You build intuition for how markets move, what volatility actually feels like, and how hard it is to time an exit, without ever risking a dollar. This update shipped the social infrastructure that makes all of that actually fun. You can follow other traders and watch their moves appear in your feed in real time. You can create a group with your friends, see eachother on a shared leaderboard, and compete on portfolio returns over time. You can put a face to your handle with a profile picture. And the whole UI got rebuilt from the ground up to feel faster and cleaner. The most challenging part was the social feed. The naive approach of re-fetching on every action felt laggy and broke the illusion that anything was live. So the feed runs on Firestore real-time listeners, meaning updates push to every client the moment they’re written. That introduced a new problem: follow and unfollow actions felt slow because they waited on the server before updating the UI. I switched to optimistic updates, where the UI changes immediately and then syncs in the background, with rollback logic if the write fails. Getting that rollback to behave correctly in edge cases, like a user rapidly tapping follow/unfollow, took way more debugging than I expected. The leaderboard had its own set of problems. Calculating portfolio returns client-side worked fine with two or three users in a group but got noticeably slow as groups got bigger. I moved the PnL calculation server-side and trigger a recalculation on every trade write instead. The client just reads the result. Much faster and the rankings update in real time without anyone doing math on their phone. Profile pictures had a sneaky issue too: users were uploading full-resolution photos straight from their camera roll and Firebase Storage costs scale with bytes stored and transferred. I added client-side image compression before the upload and hard cap everything at 200 KB. The quality is still totally fine and the cost difference is significant. What I’m most proud of is that this is a real shipped iOS app on the App Store with over 100 users that actual teenagers are using to learn investing. It’s not a demo, it’s not a prototype running on localhost. The live market data is real, the social features work, and the leaderboard updates when your friend makes a trade from across the country. Building something that functions at that level while also being genuinely fun to use is what I set out to do. To test it, download Pulse from the App Store on an iPhone, create an account, and you’ll start with a virtual portfolio. Place a few trades on any stock you recognize, then find another user to follow and watch their activity show up in your feed. If you want to test the group leaderboard, create a group and share the code. Check it out at tinyurl.com/pulseofficial...
|
1793303551.2027125
|
1793389951.2027125
|