|
30254
|
Echo - Hackathon Subbmission by @adamrcm | Stardan Echo - Hackathon Subbmission by @adamrcm | Stardance...
|
adamrcm
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-16T03:56:27Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Echo, this was used for AMDXlablab.ai using firework’s api in order to process any short clip video (30s-2m) and create multiple captions regarding such. Its fairly simple, didn’t spend much time. AI was only used for the back-end and debugging.", "repo": "https://github.com/adamrcm/Echo", "demo": "https://adamrcm.github.io/Echo/"}]...
|
[{"post_id": 28047, "ts": "202 [{"post_id": 28047, "ts": "2026-07-14T02:13:03Z", "hours": 2.4253, "text": "Final submission/showcase"}]...
|
Title: Echo - Hackathon Subbmission by @adamrcm | Title: Echo - Hackathon Subbmission by @adamrcm | Stardance
Devlogs:
Final submission/showcase
Ships:
Echo, this was used for AMDXlablab.ai using firework’s api in order to process any short clip video (30s-2m) and create multiple captions regarding such. Its fairly simple, didn’t spend much time. AI was only used for the back-end and debugging....
|
1793329023.6778731
|
1793415423.6778731
|
|
25465
|
WarioWare Game by @Potato | Stardance
|
Potato
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: WarioWare Game by @Potato | Stardance
|
1793329025.0131192
|
1793933825.0131192
|
|
20209
|
Untitled project by @Zac_Ni | Stardance
|
Zac_Ni
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @Zac_Ni | Stardance
|
1793329025.937434
|
1793933825.937434
|
|
24003
|
Arduino snake by @robopugo | Stardance
|
robopugo
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-08T17:25:04Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made the snake game with 9 game modes to play with on the Arduino r4, then copied the code over to an online emulator, so you can test it out.", "repo": "https://github.com/no10123/arduino-snake/", "demo": ""}]...
|
[{"post_id": 13823, "ts": "202 [{"post_id": 13823, "ts": "2026-06-22T17:23:52Z", "hours": 0.4211, "text": "added a cheese and a hotdog game mode, image has list of all the current game modes."}, {"post_id": 13787, "ts": "2026-06-22T16:26:36Z", "hours": 0.6239, "text": "Added gameodes, img shows a game mode with 5 apples instead of 1, can be custom amount of apples on screen now."}, {"post_id": 13738, "ts": "2026-06-22T15:05:14Z", "hours": 1.0442, "text": "Designed the basic snake function of my game, thinking of twists / gameodes to make it more unique"}]...
|
Title: Arduino snake by @robopugo | Stardance
Dev Title: Arduino snake by @robopugo | Stardance
Devlogs:
Designed the basic snake function of my game, thinking of twists / gameodes to make it more unique
Added gameodes, img shows a game mode with 5 apples instead of 1, can be custom amount of apples on screen now.
added a cheese and a hotdog game mode, image has list of all the current game modes.
Ships:
I made the snake game with 9 game modes to play with on the Arduino r4, then copied the code over to an online emulator, so you can test it out....
|
1793329026.8526115
|
1793415426.8526115
|
|
20943
|
Sheep Army by @yuwukuwuan | Stardance
|
yuwukuwuan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Sheep Army by @yuwukuwuan | Stardance
|
1793329028.0502577
|
1793933828.0502577
|
|
16612
|
Website about Games by @AmirBAttaz | Stardance
|
AmirBAttaz
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Website about Games by @AmirBAttaz | Starda Title: Website about Games by @AmirBAttaz | Stardance...
|
1793329029.0150764
|
1793933829.0150764
|
|
22691
|
Scratcher by @BetterClient | Stardance
|
BetterClient
|
1
|
188.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-25T19:05:06Z", "hours": 188.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Scratcher is a high level language that compiles to scratch. Some of Scratcher’s features: Lambdas Closures Function pointers Structs Arrays Lists Generics Sealed enums Pattern matching Compile time null safety Extension functions Operator overloading String interpolation Function returns Along with having support for all of these: Scratcher is memory safe Scratcher has 2 garbage collectors. Scratcher has a big optimizer pass, making your code very performant. Scratcher has very good documentation Scratcher can also safely interop with normal scratch code: You can expose your functions to normal scratch code using the export keyword, which makes normal scratch code able to safely call your code. You can use on GreenFlag {} or on KeyPressed(\"key\") {} to handle scratch events. Advanced loop control: Scratcher allows you to write expressive code like for(int i in list) Scratcher also has support for continue and break which is fully absent on scratch. What I’m proud of Return values: Normal scratch has no idea what a function call is, it only knows procedures(which don’t have returns)! The double GC: Scratcher comes with 2 garbage collectors, which can run at the same time, one is reference counting GC and the other one is a Tracing Mark and sweep GC. Lambdas: Scratcher allows you to use lambdas very expressively, allowing you to capture local variables from outside the lambda, use it, modify it while also keeping that modified instance in the original function, its just like kotlin’s lambdas(which I love) The expression control flow: Scratcher allows you to write if statements and when statements INSIDE other expressions, this lets you write very expressive code: func( if(something) { funcB() } else 5 ) Short circuits: Normal scratch executes the right side of an and / or block no matter what, scratcher doesn’t, if the left side of and is false, the right side won’t run. Very rich type system: The scratcher type system allows you to do a lot of things, I love sealed enums, they’re just like rust enums: sealed enum Result<T, E> { Success(T value), Error(E error) } Testing the compiler If you don’t wanna bother downloading the CLI and writing your own program, look at the example programs in this folder If you wanna use the CLI and maybe even write your own programs, check out the documentation: https://github.com/betterclient/Scratcher/blob/master/docs/hello_world.md", "repo": "https://github.com/betterclient/Scratcher", "demo": "https://github.com/betterclient/Scratcher/releases/tag/1.0"}]...
|
[{"post_id": 82740, "ts": "202 [{"post_id": 82740, "ts": "2026-10-25T18:27:59Z", "hours": 5.7203, "text": "Tests I added tests to scratcher, this makes sure the language is holding up to its promises before I press release. I currently only have very simple tests, but I’ve already fixed 4 bugs in the compiler. Other shit Added github workflows so it gets released automatically! Made the Compiler completely isolated, this means it can run multiple times without having the JVM restarted. Added compact float lists!"}, {"post_id": 81059, "ts": "2026-10-19T18:13:33Z", "hours": 5.56, "text": "CLI I did some small refactors and added a new CLI, built with Clikt It’s very simple to use: scratcher check file --options //check the file for any compilation errors without compiling scratcher compile file --options outFile //compile into a .sb3 file scratcher standard-library //print out the standard library Clikt also provides easy to use help menus I also added a sort function to the array and list libraries"}, {"post_id": 78430, "ts": "2026-10-10T19:47:24Z", "hours": 7.5478, "text": "PROPER ERRORS Errors are the one thing that I knew were terrible but I could never build up the courage to fix. So I just fixed them. Now all errors in the language are formatted nicely, show you exactly where the error happened and give you a nice description. Along with this, I made a new system for collecting errors, so now the compiler won’t stop at the first error and will continue going and give you all errors at once. This makes fixing code a lot easier. This also opens up the possibility of an LSP server later on (before and after in images)"}, {"post_id": 76716, "ts": "2026-10-04T12:20:48Z", "hours": 6.6447, "text": "More demos and QOL Try it out: https://scratch.mit.edu/projects/1387804691/ Demos Math lexer, parser and interpreter: New demo that lets you input math expressions (eg: 1 + 1 ) and get the result. 3d cube renderer: a spinning 3d cube and player controls QOL Smarter inlining cost calculation A math centered optimization for removing identities Get rid of PromoteToGlobals (temp) GC documentation Codegen fixes (receiver functions generate the same block, causing scratch to get confused) Stack size optimization (reuse stack slots of the same type) Fix crash when the garbage collector is disabled"}, {"post_id": 74467, "ts": "2026-09-27T13:15:50Z", "hours": 7.5128, "text": "Demo programs and general improvements I added demo programs to scratcher, these show the language actually being used Try one out! https://scratch.mit.edu/projects/1385339395/ General improvements Bug fixes Dummy sprite Make the type checker ignored in inlined functions Make topLevelInit smaller and remove unused functions from final compilation TurboWarp specific compilation mode with faster operations on strings/lists (not compatible with vanilla scratch if enabled)"}, {"post_id": 72783, "ts": "2026-09-23T18:48:59Z", "hours": 2.1378, "text": "Indexed repeat and general improvements Added a new indexed for and repeat statement which allows way easier index tracking: //Before: int index = 0; repeat(10) { ... index++; } //After: repeat(10) { index -> ... } I also made the PooledList get garbage collected with the refcount gc Did some really small refactors aswell"}, {"post_id": 71161, "ts": "2026-09-20T11:38:26Z", "hours": 2.5564, "text": "List pools Static lists are cool, but they are very limited expressiveness wise because they must be known at compile time Pools fix this by having a pool of static lists that the user code can allocate at any time PooledList a = allocate(); But because the pool is limited, the pooled list must be freed when not needed, the garbage collector will not handle it(yet) a.free(); Other than that, the PooledList behaves just like a List and can do almost anything a List does I also added proper documentation for Out of memory errors."}, {"post_id": 70752, "ts": "2026-09-19T18:17:22Z", "hours": 10.2792, "text": "QOL I added a shit ton of quality of life stuff: Tons of bug fixes Big array syntax: int[] myArray = [1, 2, 3, 4, 5, 6]; Safe casting for enums(previously a panic): Result.Success? a = res as? Result.Success; Out of memory detection: Scratch caps lists at 200k elements, after that it silently stops adding stuff to the list Compact int list: Store pretty much infinite integers without wasting heap space SHORT CIRCUITS: DONT EXECUTE RIGHT SIDE OF && or || if left side is false/true! If statements without braces: if(a) b++; CONTINUE AND BREAK: while(true) { if(a) break; if(b) continue; } STATIC LISTS: store data outside of the heap in scratch lists so that you dont run out of heap space: static str[] myList; This also allows for file reading: static str[] myList = \"hello.json\"; So you can properly store data(like ROMs) CASE SENSITIVE EQUALS: DID YOU KNOW THAT SCRATCH “=” BLOCK IS CASE INSENSITIVE??? And its pretty hard to make it case sensitive Now you can do “===” and its case sensitive: 'a' === 'A' RETURNS FALSE"}, {"post_id": 65445, "ts": "2026-09-10T16:08:38Z", "hours": 8.1706, "text": "DOCUMENTATION I do not want to touch any markdown ever again"}, {"post_id": 62828, "ts": "2026-09-06T11:04:43Z", "hours": 2.5681, "text": "Privates Added a “private” keyword, anything declared private cannot be accessed from outside the current file. This prevents the user from messing with internal states of libraries they are using For example, the list library from the standard library. Now you can’t directly mess with the list pointer triangles.ptr[5] = ...; This now results in an error because “ptr” is private! I also added some small optimizations for lambdas."}, {"post_id": 60869, "ts": "2026-09-03T14:48:30Z", "hours": 3.9831, "text": "Operator overloading Added operator overloading, now you can define overloads for specific operators so that code looks cleaner Just use the operator keyword with the correct signature and you’re done! You can overload the operators: +, -, /, *, %, [], []= For example: warp operator <T> void T[].set(int index, T item) { self::replace(this, item, index); } //use array[index] = item //compiler translates to set(array, index, item) I also realized that my previous refactor of arrays broke my nullability system: int[] a = Array(int, 5); say(a[3]); This would print null , which my type system missed I fixed this by moving arrays to a standard library module, the same array import works, but you have to change how you create the array: //before: int[] a = Array(int, 5); //doesn't need to be marked as null!!! int[] a = Array(int, 5); a[0] = ...; a[1] = ...; ... //after int?[] a = arrayOfNulls(5); //null filled int[] a = arrayOf(5, (int index) -> { return index * 5; //value of the array at that index });"}, {"post_id": 58837, "ts": "2026-08-31T12:49:12Z", "hours": 1.1706, "text": "Import some import names into unqualified co ntext Before: //import import list; //use list::List<str> myList = list::newList(); After: //import import list::*; //use List<str> myList = newList();"}, {"post_id": 58031, "ts": "2026-08-30T11:39:09Z", "hours": 1.2083, "text": "Pattern matching for sealed enums Previously if you wanted to check sealed enums types and use them, you had to do very ugly syntax for actually getting the variant instance: auto out = tryGet(); when(out) { Result.Success -> { auto suc = out as Result.Success; looks::say(\"Success! ${suc.out.x}\"); Now you don’t have to do all of this: when(tryGet()) { Result.Success suc -> { looks::say(\"Success! ${suc.out.x}\"); This is just syntax improvement, doesn’t change the generated code or anything, just helps the developer"}, {"post_id": 56767, "ts": "2026-08-28T17:36:33Z", "hours": 3.9356, "text": "ACTUAL ARRAYS!! Previously, scratcher “arrays” were just lists, you could add more items, it would dynamically resize, it was written in the kotlin DSL, so technically it was just a list. I removed the previous list code, reused some of it and added a new Array system Along with that, the normal lists got rewritten in 100% scratcher with no internal functions The new system is almost fully backwards compatible in source code, you just have to make a few changes The new implementation is more clear, more expressive and more like regular programming languages"}, {"post_id": 54379, "ts": "2026-08-25T10:59:05Z", "hours": 2.1919, "text": "I’m sorry For over 2 months, scratcher has had an “export” keyword, which was fully unused, until today: I implemented the export keyword on functions, which allows for code written in plain scratch to interact with scratcher code: export warp void myFunction() { ... } Export requires that your function arguments are all primitives and that the return is also a primitive, but other than that, it does not change anything, just exposes the function cleanly to regular scratch code. However, scratcher type checking still applies, so if the native scratch code passes in a string to a float argument, it will still cause a panic Even when you have obfuscation enabled, exports will stay and let native scratch use it with its original name"}, {"post_id": 52903, "ts": "2026-08-23T08:56:58Z", "hours": 3.9047, "text": "Sealed enums and faster GC I added a new type of object, sealed enums: sealed enum Animal { Cat(str name, int age, bool isMeowing), Dog(str name, int age), Unknown } They allow for storing data inside enums, they’re very similar to rust enums: sealed enum Result<T> { Success(T out), Failure } I also refactored lambdas to use a sealed enum instead of a big struct: //before struct LambdaCaptures(Lambda0Captures? c0, Lambda1Captures? c1, Lambda2Captures? c2); //after sealed enum LambdaCaptures { Lambda0Captures(Box$int capture0, ...), Lambda1Captures(Box$float capture0, ...) } Sealed enums only store a tag and a pointer, so if you use a lot of lambdas, this will save a TON of heap space Faster garbage collector! I made the marking phase of the mark and sweep collector faster by using an epoch based cleanup approach Now, instead of clearing and re-populating the marked list, we don’t ever clear it and we invalidate it by just increasing the epoch. This makes the isMarked check go from O(n) to O(1) while also improving marking speed because scratch doesn’t have to resize our list"}, {"post_id": 51327, "ts": "2026-08-20T22:21:05Z", "hours": 5.0097, "text": "MORE FUCKING ABSTRACTIONS!!! I added receiver/extension functions. These allow you to write code that takes in a type as a special argument You define them just like how it works in kotlin: warp <T, R> R T.let((T) -> R action) { return action(this); } It just compiles to a regular function warp <T, R> R let(T this, (T) -> R action) { return action(this); } But the compiler lets you call it with the special argument: thing.let((int a) -> ...); I also added a very big standard library module (written in scratcher!) with a ton of these functions built-in, they allow you to write more expressive code: triangles .filterNotNull() .filter((Triangle<float> t) -> t.x1 > 150) .filter((Triangle<float> t) -> t.y1 < 150) .forEach((Triangle<float> tri) -> ...) I also rewrote the entirety of string lib during this, now you have to use the extensions library to use strings, but its way more powerful (and written in scratcher)! I also added a new “char” type, which stores a single character (wow really???) I also added “safe dot calls” that allow you to use stuff as if they’re not null: triangles.forEach((Triangle<float>? t) -> { t?.x1?.let((float x1) -> { looks::say(\"x1: ${x1}\"); }); }); This only calls the let function if t?.x1 is not null There is a big problem with all this powerful new code though… the garbage collector can no longer keep up, a single mark and sweep takes over 1 second! Which is especially bad because the garbage collector needs the entire application to stop in order to run. You do not want your code to completely stop for a whole second(maybe you do? weirdo), so I have to fix this in my next few devlogs…"}, {"post_id": 49925, "ts": "2026-08-18T21:52:59Z", "hours": 6.2256, "text": "Lambdas I added lambdas to Scratcher! They allow you to write more expressive code like map(list, a -> a + 1) , which literally adds 1 to every element of list I also allow using outer variables within lambdas int a = ...; map(list, b -> { a++; b + a }); I allow this through boxing, the local variables become boxes and the lambdas get the local variable’s box, this makes lambdas more powerful than most languages as this allows for variables to be shared mutable state across lambdas, this also allows the local variables to get garbage collected. Of course, scratch doesn’t support this natively, so lambdas are 100% compiler sugar and just lowers to regular functions and uses function references(which is also 100% compiler sugar). void lambda::defunc@lambad@0(LambdaCaptures c, args...) { ... }"}, {"post_id": 46470, "ts": "2026-08-13T18:15:50Z", "hours": 1.7033, "text": "Fixed the garbage collector… turns out I broke it accidentally while cleaning up code in my last devlog, 3 line change but took a long time to find Made it so the stack allocator doesn’t do redundant operations like 1+1 and inlines them as 2 instead"}, {"post_id": 46037, "ts": "2026-08-12T23:23:02Z", "hours": 1.3453, "text": "100 hours! Evil hack part 4: Death of evil hack So I was using a really terrible hack to implement stuff like FunctionInlining, Safe dot and the elvis expression, the hack is basically (ab)using the when expression to do stuff like run code inside expressions and use local variables inside expressions. So to stop this from becoming a hack, I added it directly to the AST as StatementExpression(not to be confused with ExpressionStatement), which can be used to contain statements inside expressions. All of my evil hacks have been replaced by StatementExpression. I also added some small optimizations for StatementExpressions!"}, {"post_id": 45987, "ts": "2026-08-12T20:32:56Z", "hours": 5.7503, "text": "General language improvements Elvis expressions: If a value is nullable, it is not usable by anything that only accepts non-null values, to solve this, I added the elvis expression, which allows you to give a fallback for null values(compilation in image 2): //int doesn't have to be nullable because we have a fallback value! int x = functionThatReturnsNull()?: 5; String boxing and nullable primitives Previously, scratcher only supported having structs, enums and function references as nullable, now it also supports having primitive types as nullable: str? x = functionThatReturnsNullableString(); //distinguish between literal null and string null if(x == null) looks::say(\"null!\"); if(x == \"null\") looks::say(\"null as string!\"); //the compiler achieves this by boxing the string return with a struct: //struct StringBox(str value) //the actual type behind the scenes is: //StringBox? x = ...; Safe dot traversal If a struct instance is nullable, you cannot use regular struct.member because that may result in a NullPointerException, to solve this I added ?. which allows for null safe traversal(compilation in image 1): //if nullableTriangle == null, return null //if nullableTriangle != null, return nullableTriangle.x1 int? x1 = nullableTriangle?.x1; Deepseek fix I noticed that FunctionInlining completely ignored execution order, so I asked deepseek to solve it(this happened after I added string boxing). But I found a better solution to the same problem later on, so I reverted deepseek’s fix and wrote my own, which is 260 lines compared to deepseek’s 360 lines, over 100 lines shorter!"}, {"post_id": 42848, "ts": "2026-08-07T19:46:20Z", "hours": 7.4364, "text": "Second garbage collector! Added a second garbage collector! If your app does not contain any cyclic objects and needs high performance, you can now enable the ARC collector! This garbage collector works by automatically detecting when objects go out of scope and decrementing their reference count, if an object’s reference count goes to 0, it is freed. This is more performant than the mark and sweep collector because the objects are freed at the moment they are unused instead of stopping the entire program to collect garbage. This works for all cases, except for cases where there is a cyclic object. Because the cyclic object owns itself, so its reference count is always at 1."}, {"post_id": 32011, "ts": "2026-07-20T21:29:16Z", "hours": 4.2214, "text": "Even more abstractions please Added generics support, which allows the user to define generic functions/structs that apply with every type, for example: warp <T> void forEach(T[] a, (T) -> void action) { for(T t in a) { action(t); } } Depending on what type you used to call this, a new version of forEach gets generated, if you called it with an integer: warp void forEach@int(int[] a, (int) -> void action) { for(int t in a) { action(t); } } Of course I also allow this on structs: struct Triangle<Num>(Num x1, Num y1, Num x2, Num y2, Num x3, Num y3); Also did some small changes: Added an FPS counter to my test code Better optimizations that actually detect not(not(x)) Optimized triangle::fill even more (+2 fps) Made DynamicDispatchHandler actually use the apply return properly (it was always returning true)"}, {"post_id": 27929, "ts": "2026-07-13T21:08:14Z", "hours": 2.6361, "text": "More abstractions please! Added dynamic function dispatch which allows for functions to take in other functions as arguments, of course, this isn’t possible at all in normal scratch, so actually FunctionLiteral gets turned into an integer and a custom dispatch function gets created for every function literal’s signature which allows for a binary search to call the actual function Also made HeapConversion reuse stack slots instead of allocating one for every variable(mostly by AI)"}, {"post_id": 27608, "ts": "2026-07-13T10:50:48Z", "hours": 1.5486, "text": "Refactored the entire type system to use a sealed interface instead of an unsafe single class Nothing much to say, this doesn’t affect the input code or the output project, I did just cleanup"}, {"post_id": 27567, "ts": "2026-07-13T08:35:21Z", "hours": 0.8472, "text": "Did more syntax improvements Added ++ and – support: index++; Added type inference support: auto a = Triangle(5, 15, 60, -120, 240, 67); //type automatically becomes Triangle auto a = func(); //type automatically becomes the return type of func"}, {"post_id": 27415, "ts": "2026-07-12T23:35:13Z", "hours": 2.3778, "text": "Scratcher is at 100 commits! (Now 104 cause all of these refactors are different commits) Completely refactored all translation steps to use the ASTVisitor. Also did type resolving cleanup. Function Reachability : Went from 117 to 32 lines Function expression lowering : Went from 439 to 293 lines Re Parse Local Variables : Went from 34 to 27 lines Remove Empty Allocations : Went from 97 to 79 lines ConvertToHeapAccess : Biggest refactor of this whole devlog, went from 500 lines to 418, split into 5 files"}, {"post_id": 26200, "ts": "2026-07-10T21:13:19Z", "hours": 3.26, "text": "Fixed a lot of bugs with when expressions, also got deepseek to fix some of them Added If expressions, which allow using if statements inside other expressions, for example, here is some previously invalid code that is now valid: int max = if (a > b) a else b; str message = if (score >= 90) { looks::say(\"something\"); \"You win!\" } else { looks::say(\"something\"); \"You lose :(\" } triangles[15] = Triangle( utils::random(-240, 240), utils::random(-180, 180), utils::random(-240, 240), utils::random(-180, 180), utils::random(-240, 240), if(mode == TriangleRenderMode.OFF) { 5 } else { triangles[14].y3 } ); These still get lowered properly and just look like normal if statements in the final scratch code"}, {"post_id": 25224, "ts": "2026-07-09T10:42:23Z", "hours": 3.3289, "text": "Added more syntax improvements! Else if : Added support for else if, which replaces big blocks //Before: if(triangles[14].y1 >= 15) { looks::say(\">=15\"); } else { if(triangles[14].y2 >= 155) { looks::say(\"<=15\"); } else { looks::say(\"Both false!\"); } } //After: if(triangles[14].y1 >= 15) { looks::say(\">=15\"); } else if(triangles[14].y2 >= 155) { looks::say(\"<=15\"); } else { looks::say(\"Both false!\"); } Compound assignment : Added support for compound assignment //Before: triangles[15].y3 = triangles[15].y3 + 5; //After: triangles[15].y3 += 5; Enums : Added support for enums, which are just fancy integer wrappers enum TriangleRenderMode(OFF, RENDER, ITHINK); TriangleRenderMode mode = TriangleRenderMode.OFF; When : Added support for when expressions/statements that allow for matching a subject: //Before: if(answer == \"off\") { mode = TriangleRenderMode.OFF; } else if(answer == \"render\") { mode = TriangleRenderMode.RENDER; } else { mode = TriangleRenderMode.ITHINK; looks::say(\"If thinking is your power, what are you without it?\"); return; } //After: TriangleRenderMode mode = when(answer) { \"off\" -> TriangleRenderMode.OFF \"render\" -> TriangleRenderMode.RENDER else -> { looks::say(\"If thinking is your power, what are you without it?\"); TriangleRenderMode.ITHINK; } };"}, {"post_id": 24407, "ts": "2026-07-07T22:53:21Z", "hours": 2.6547, "text": "Tried to do turbowarp only return optimization, wasn’t able to make it very good… reverted it Improved the structure of CompilationConstants Added string::split and string::substring Made some of the list functions inlined (itemAt, clear, length)"}, {"post_id": 22179, "ts": "2026-07-04T14:42:02Z", "hours": 1.2922, "text": "Made the garbage collector treat top level variables as roots, this prevents top level variables from getting freed I added 2 modes to this Reflect: This uses a hacked block to read the variables by name and reduce script size if theres a lot of variables(this doesn’t render properly inside the editor but it works) NoReflect: Get all the top level variables at compile time and mark them one by one"}, {"post_id": 22122, "ts": "2026-07-04T12:41:23Z", "hours": 7.6808, "text": "Garbage collection Added a mark and sweep garbage collector to my language, it walks the roots, marks every used object, then frees all unused objects! Most impressive part of this(in my opinion) is that most of the garbage collector is actually written in my language Misc The garbage collector gets called automatically every 1 second, but you can turn it off (CompilationConstants.AUTOMATIC_GC) If you want to manage memory manually, you can turn off the garbage collector entirely (CompilationConstants.MANUAL_MEMORY)"}, {"post_id": 19412, "ts": "2026-06-30T18:41:23Z", "hours": 1.5931, "text": "Added a name parameter to alloc which acts as runtime type metadata, soon to be used."}, {"post_id": 18732, "ts": "2026-06-29T22:21:59Z", "hours": 0.6683, "text": "Added more compiler sugar for lists: list[index] replaces list::itemAt(list, index) list[index] = ...; replaces list::replace(list, item, index) for(type name in list) {} replaces int len = list::length(list); int i = 0; while (i < len) { type name = list::itemAt(list, i); i = i + 1; } (i am not proud of the shitcode that was used to get for(type name in list) working)"}, {"post_id": 18693, "ts": "2026-06-29T21:37:55Z", "hours": 3.1528, "text": "Added list support! A very barebones implementation that allows the user to create, add to, read from and delete items from lists!"}, {"post_id": 18194, "ts": "2026-06-29T08:15:19Z", "hours": 1.2822, "text": "Made “PromoteToGlobals” which is a more powerful version of OptimizeToGlobals which allows for recursive functions to have their locals turned into globals aswell This is something called liveness analysis, the compiler looks at the code paths and decides at which points a variable is “live”, which means it can’t get overwritten by a recursive call Example: warp int fib(int n) { return 0 if n <= 0; return 1 if n == 1; if (n == 2) { int b = n * 2; return otherFunc(b); } return fib(n - 1) + fib(n - 2); } In this function the “b” variable can be turned into a global because it cannot get overwritten by a recursive call, its used too early for that to happen"}, {"post_id": 17754, "ts": "2026-06-28T17:51:46Z", "hours": 1.5667, "text": "Did some compiler testing Fixed function inlining bugs Fixed a single use assignment bug Created a triangle library that allows for triangle rendering using the pen"}, {"post_id": 17603, "ts": "2026-06-28T13:52:43Z", "hours": 1.7214, "text": "Borrowed the “return expr if(cond)” syntax from ruby Implemented Tail call optimization which optimizes away recursion on tail calls Example: Before: str count(int amount) { return \"Done!\" if amount == 1; return count(amount - 1); } After: str count(int amount) { int tco@argument@amount = amount; while (true) { if (tco@argument@amount == 1) return \"Done !\"; tco@argument@amount = tco@argument@amount - 1; } }"}, {"post_id": 17283, "ts": "2026-06-28T00:21:23Z", "hours": 5.7767, "text": "Source code of the image: on GreenFlag { if(a() == 5) { looks::say(\"yo!\"); } int index = 0; index = index + 1; rgb(index, 5, 5); index = 5; while(true) { pen::eraseAll(); render(); } } The image is of the entire flow working perfectly: The index variable had their value propagated to “1” by the Sequential constant propagation optimization The variable got its uses removed by Inline single-use assignments Then the variable got fully removed by Dead store elimination The rgb function got inlined. Then while it was inlined, because the rgb function’s return wasn’t being used, it got fully removed(the inlining preserves side effects while removing its return value, but because it didn’t have any side effects it got fully removed) Same with the a() function: It got inlined Then the if statement became if(5 == 5) { looks::say(\"yo!\"); } Then Constant folding turned 5 == 5 into true Then Dead code elimination turned if(true) into just the then block I know most optimizations look like they aren’t that powerful, but when combined with other optimizations and ran in a loop, they can pile up and actually optimize code Optimizations Simplify boolean equality : Simplifies x == true to x , simplifies x == false to !x Simplify double negation : Simplifies !!x to x , simplifies --x to x Constant folding : Simplifies true == true to true , simplifies 5 + 5 to 10 Repeat to While : Converts repeat(amount) to a while loop Dead code elimination : Removes provably unreachable code blocks, eg: if(true) { ... } else { .. } turns into ... , removing the if and the else block entirely Now the big ones Sequential constant propagation : Analyzes the control flow of your program, removing useless variable assignments and inlining their expressions Inline single use assignment : Self explanatory Dead store elimination : Removes useless “set variable to x” blocks that don’t get used afterwards Function inlining : The compiler evaluates a cost for every function call is inside a function, if that total cost is less than 10,000, it gets inlined inside that function, removing call overhead and allowing for further optimization Other misc stuff: Fixed the while bug (if you called a function inside a while statement, it would only get called once) Made function lowering not allocate a stack slot if we’re ignoring return Made the OptimizeToGlobals optimization be called last to allow variable optimizations to happen first"}, {"post_id": 16526, "ts": "2026-06-26T21:46:14Z", "hours": 2.3836, "text": "Optimizations OptimizeToGlobals : If the compiler can prove that a function is not recursive and runs atomically(single threaded), it gets rid of the function’s primitive local variables, which improves performance as scratch’s list operations are more expensive than local variables InlineSingleUseVariables : Pretty self explanatory, if a variable is only used once, it will be inlined ConvertToHeapAccess : I did optimizations on the normal heap converter so that it doesn’t allocate a stack pointer for functions that don’t need one Images don’t show the OptimizeToGlobals optimization cause the testing function I have for that is too long Before and after on the RGB function"}, {"post_id": 16206, "ts": "2026-06-26T10:29:30Z", "hours": 1.5267, "text": "Created Motion and Pen library Added support for top level variables Made an optimization to get rid of useless “replace with -1” blocks(image 1 is before, image 2 is after), this greatly reduces the code size(images are only one example, it was being put everywhere)"}, {"post_id": 15894, "ts": "2026-06-25T20:34:04Z", "hours": 1.4264, "text": "Did warning cleanup Added a nullability “system”, I allow the ? to be put on struct fields, and you can put null as the argument on those fields, then you have to check if they are null and do !! to use them"}, {"post_id": 15790, "ts": "2026-06-25T17:47:54Z", "hours": 3.6944, "text": "Did a lot of refactors Created SensingLib and CalendarLib Made a system to allow standard libraries to be inlined into your code to reduce file size Added support for structs, Right now you have to manually free your structs"}, {"post_id": 15329, "ts": "2026-06-24T22:06:11Z", "hours": 1.2928, "text": "Created a library for casting primitives to other primitives Expanded the math library a lot Added duplicate function and struct detection(yes I forgot before) Added code to prioritize function(int) over function(float) if calling with an int Added “warp” and “export” modifiers to function declarations, the warp modifier maps to the “Run without screen refresh” field, and export is currently unused, but later it will be used to export a function so that its properly usable from normal scratch code"}, {"post_id": 15271, "ts": "2026-06-24T20:05:11Z", "hours": 1.885, "text": "Did general bug fixes Added more standard library functions Added runtime type checking and exceptions"}, {"post_id": 15169, "ts": "2026-06-24T17:20:15Z", "hours": 2.2017, "text": "Did a small refactor on obfuscation Created a type safe(kinda) kotlin DSL for making standard library functions way more readable and simpler to create I rewrote the Memory library with the kotlin DSL Image 1: Before Image 2: After"}, {"post_id": 15063, "ts": "2026-06-24T14:04:20Z", "hours": 1.6278, "text": "I added an event system, making it so your code can actually run on GreenFlag { main(); } on KeyPressed(W) { looks::say(\"W was pressed!\"); } These events are translated into functions and the compiler generates scratch events that call these on KeyPressed(W) { compiler@eventlistener@F(); } void compiler@eventlistener@F() { looks::say(\"W was pressed!\"); } The compiler also generates a initializer green flag block which clears the heap and reserves an index for every other entrypoint(image 2)"}, {"post_id": 14757, "ts": "2026-06-23T23:45:31Z", "hours": 8.0742, "text": "I finished the pipeline from my language’s AST to scratch, it was pretty mind numbing Stage 1: The code does reachability, from the source file(where the compilation started) and finds all functions that we can call from the source Stage 2: Using those functions, we lower call expressions to statements and returns to heap accesses, here’s how that looks in code: Before : void main() { looks::say(fib(5)); } After : void main() { int fibReturn = -1; fib(5, &fibReturn); looks::say(fibReturn); } Notice how the nested call turned into a seperate statement. Why do we need this? Because scratch does not support returning stuff from functions, only arguments. Stage 3: We re-parse all locals on the reachable functions because the last stage added more locals Stage 4: We add a parameter to all functions named “stack” Stage 5: We add free(stack) calls at the end or before the return statement, this frees our stack automatically. We also add alloc before function calls so that we have a stack to pass to the function Here’s how that looks like in code: Before : void main() { int fibReturn = -1; fib(5, &fibReturn); looks::say(fibReturn); } After : void main(int stack) { int fibReturn = -1; int fibStack = -1; alloc(UNKNOWN, &fibStack); //allocate a stack for fib fib(fibStack, 5, &fibReturn); looks::say(fibReturn); free(stack, UNKNOWN); //free our stack } Notice how we have UNKNOWN in place for a number in the allocation and freeing, this is because we just added more locals for the allocations and we can’t know how many slots we need. Standard library functions are already compiled to scratch statements so they don’t need a stack allocated for them Stage 6: We re-parse local variables so we have a count. Stage 7: We count the re-parsed locals for every function and figure out which local variables can be reached in every function Stage 8: We convert all local variables to heap slots We traverse all statements and expressions, replacing all variable accesses with heap[stack + variableIndex]. While in this process we also convert the unknowns into the actual sizes since we just counted the locals in stage 7 Here’s how this entire stage looks like in code: Before : void main(int stack) { int fibReturn = -1; int fibStack = -1; alloc(UNKNOWN, &fibStack); fib(fibStack, 5, &fibReturn); looks::say(fibReturn); free(stack, UNKNOWN); } After : void main(int stack) { heap[stack] = -1; heap[stack + 1] = -1; alloc(3, stack + 1); //we just pass the index here since alloc will write to that index fib(heap[stack + 1], 5, stack); looks::say(heap[stack]); free(stack, 2); //We have 2 locals } By using a stack we get access to a lot of things like returning, recursion and local variables. Scratch doesn’t even support local variables, so we have to hack it with a global list. Notice how we don’t free the allocation? That’s because all functions are compiled by the same compiler and that compiler added free() to all functions with a stack. Stage 9: If a function doesn’t have any local variables, this is where we delete their allocations and free’s so that they don’t mess up the heap For example : alloc(0, index); and the target function for this allocation will have its free(stack, 0) call removed. Stage 10: Finally we create dummy scratch functions for our very lowered AST And finally in stage 11 we create the code blocks for the scratch functions and write to disk And it successfully calculates fib(9) as 34"}, {"post_id": 13952, "ts": "2026-06-22T22:02:44Z", "hours": 2.9797, "text": "I made a wrapper for the raw opcode classes that make valid code easier to make, then I did a ton of bug fixes and did a small refactor"}, {"post_id": 13260, "ts": "2026-06-21T18:26:43Z", "hours": 0.5228, "text": "Did a refactor, and intellij decided to corrupt some of the files, so I had to fix it"}, {"post_id": 13207, "ts": "2026-06-21T17:10:57Z", "hours": 3.1617, "text": "Implemented 90% of scratch’s blocks in the wrapper"}, {"post_id": 13095, "ts": "2026-06-21T12:57:42Z", "hours": 2.4425, "text": "Worked on a very basic scratch wrapper, it can generate a recursive function, gonna add more scratch blocks so that actual logic can be generated in this wrapper"}, {"post_id": 12772, "ts": "2026-06-20T21:38:46Z", "hours": 0.7953, "text": "Added static type checking, which makes sure the correct types are used everywhere. It prevents the user from using a number in an if statement’s condition. It also prevents you from assigning a string to an integer field"}, {"post_id": 12746, "ts": "2026-06-20T20:50:32Z", "hours": 2.8928, "text": "I added the AST parsing, which is able to parse the ANTLR parse tree into an AST (sorry the image is bad, its all I can show)"}, {"post_id": 12579, "ts": "2026-06-20T15:22:11Z", "hours": 3.0503, "text": "Worked on the first stage of AST parsing: Only parse top level elements (imports, structs, variables) and don’t parse the insides of functions"}]...
|
Title: Scratcher by @BetterClient | Stardance
Dev Title: Scratcher by @BetterClient | Stardance
Devlogs:
Worked on the first stage of AST parsing: Only parse top level elements (imports, structs, variables) and don’t parse the insides of functions
I added the AST parsing, which is able to parse the ANTLR parse tree into an AST (sorry the image is bad, its all I can show)
Added static type checking, which makes sure the correct types are used everywhere. It prevents the user from using a number in an if statement’s condition. It also prevents you from assigning a string to an integer field
Worked on a very basic scratch wrapper, it can generate a recursive function, gonna add more scratch blocks so that actual logic can be generated in this wrapper
Implemented 90% of scratch’s blocks in the wrapper
Did a refactor, and intellij decided to corrupt some of the files, so I had to fix it
I made a wrapper for the raw opcode classes that make valid code easier to make, then I did a ton of bug fixes and did a small refactor
I finished the pipeline from my language’s AST to scratch, it was pretty mind numbing Stage 1: The code does reachability, from the source file(where the compilation started) and finds all functions that we can call from the source Stage 2: Using those functions, we lower call expressions to statements and returns to heap accesses, here’s how that looks in code: Before : void main() { looks::say(fib(5)); } After : void main() { int fibReturn = -1; fib(5, &fibReturn); looks::say(fibReturn); } Notice how the nested call turned into a seperate statement. Why do we need this? Because scratch does not support returning stuff from functions, only arguments. Stage 3: We re-parse all locals on the reachable functions because the last stage added more locals Stage 4: We add a parameter to all functions named “stack” Stage 5: We add free(stack) calls at the end or before the return statement, this frees our stack automatically. We also add alloc before function calls so that we have a stack to pass to the function Here’s how that looks like in code: Before : void main() { int fibReturn = -1; fib(5, &fibReturn); looks::say(fibReturn); } After : void main(int stack) { int fibReturn = -1; int fibStack = -1; alloc(UNKNOWN, &fibStack); //allocate a stack for fib fib(fibStack, 5, &fibReturn); looks::say(fibReturn); free(stack, UNKNOWN); //free our stack } Notice how we have UNKNOWN in place for a number in the allocation and freeing, this is because we just added more locals for the allocations and we can’t know how many slots we need. Standard library functions are already compiled to scratch statements so they don’t need a stack allocated for them Stage 6: We re-parse local variables so we have a count. Stage 7: We count the re-parsed locals for every function and figure out which local variables can be reached in every function Stage 8: We convert all local variables to heap slots We traverse all statements and expressions, replacing all variable accesses with heap[stack + variableIndex]. While in this process we also convert the unknowns into the actual sizes since we just counted the locals in stage 7 Here’s how this entire stage looks like in code: Before : void main(int stack) { int fibReturn = -1; int fibStack = -1; alloc(UNKNOWN, &fibStack); fib(fibStack, 5, &fibReturn); looks::say(fibReturn); free(stack, UNKNOWN); } After : void main(int stack) { heap[stack] = -1; heap[stack + 1] = -1; alloc(3, stack + 1); //we just pass the index here since alloc will write to that index fib(heap[stack + 1], 5, stack); looks::say(heap[stack]); free(stack, 2); //We have 2 locals } By using a stack we get access to a lot of things like returning, recursion and local variables. Scratch doesn’t even support local variables, so we have to hack it with a global list. Notice how we don’t free the allocation? That’s because all functions are compiled by the same compiler and that compiler added free() to all functions with a stack. Stage 9: If a function doesn’t have any local variables, this is where we delete their allocations and free’s so that they don’t mess up the heap For example : alloc(0, index); and the target function for this allocation will have its free(stack, 0) call removed. Stage 10: Finally we create dummy scratch functions for our very lowered AST And finally in stage 11 we create the code blocks for the scratch functions and write to disk And it successfully calculates fib(9) as 34
I added an event system, making it so your code can actually run on GreenFlag { main(); } on KeyPressed(W) { looks::say("W was pressed!"); } These events are translated into functions and the compiler generates scratch events that call these on KeyPressed(W) { compiler@eventlistener@F(); } void compiler@eventlistener@F() { looks::say("W was pressed!"); } The compiler also generates a initializer green flag block which clears the heap and reserves an index for every other entrypoint(image 2)
Did a small refactor on obfuscation Created a type safe(kinda) kotlin DSL for making standard library functions way more readable and simpler to create I rewrote the Memory library with the kotlin DSL Image 1: Before Image 2: After
Did general bug fixes Added more standard library functions Added runtime type checking and exceptions
Created a library for casting primitives to other primitives Expanded the math library a lot Added duplicate function and struct detection(yes I forgot before) Added code to prioritize function(int) over function(float) if calling with an int Added “warp” and “export” modifiers to function declarations, the warp modifier maps to the “Run without screen refresh” field, and export is currently unused, but later it will be used to export a function so that its properly usable from normal scratch code
Did a lot of refactors Created SensingLib and CalendarLib Made a system to allow standard libraries to be inlined into your code to reduce file size Added support for structs, Right now you have to manually free your structs
Did warning cleanup Added a nullability “system”, I allow the ? to be put on struct fields, and you can put null as the argument on those fields, then you have to check if they are null and do !! to use them
Created Motion and Pen library Added support for top level variables Made an optimization to get rid of useless “replace with -1” blocks(image 1 is before, image 2 is after), this greatly reduces the code size(images are only one example, it was being put everywhere)
Optimizations OptimizeToGlobals : If the compiler can prove that a function is not recursive and runs atomically(single threaded), it gets rid of the function’s primitive local variables, which improves performance as scratch’s list operations are more expensive than local variables InlineSingleUseVariables : Pretty self explanatory, if a variable is only used once, it will be inlined ConvertToHeapAccess : I did optimizations on the normal heap converter so that it doesn’t allocate a stack pointer for functions that don’t need one Images don’t show the OptimizeToGlobals optimization cause the testing function I have for that is too long Before and after on the RGB function
Source code of the image: on GreenFlag { if(a() == 5) { looks::say("yo!"); } int index = 0; index = index + 1; rgb(index, 5, 5); index = 5; while(true) { pen::eraseAll(); render(); } } The image is of the entire flow working perfectly: The index variable had their value propagated to “1” by the Sequential constant propagation optimization The variable got its uses removed by Inline single-use assignments Then the variable got fully removed by Dead store elimination The rgb function got inlined. Then while it was inlined, because the rgb function’s return wasn’t being used, it got fully removed(the inlining preserves side effects while removing its return value, but because it didn’t have any side effects it got fully removed) Same with the a() function: It got inlined Then the if statement became if(5 == 5) { looks::say("yo!"); } Then Constant folding turned 5 == 5 into true Then Dead code elimination turned if(true) into just the then block I know most optimizations look like they aren’t that powerful, but when combined with other optimizations and ran in a loop, they can pile up and actually optimize code Optimizations Simplify boolean equality : Simplifies x == true to x , simplifies x == false to !x Simplify double negation : Simplifies !!x to x , simplifies --x to x Constant folding : Simplifies true == true to true , simplifies 5 + 5 to 10 Repeat to While : Converts repeat(amount) to a while loop Dead code elimination : Removes provably unreachable code blocks, eg: if(true) { ... } else { .. } turns into ... , removing the if and the else block entirely Now the big ones Sequential constant propagation : Analyzes the control flow of your program, removing useless variable assignments and inlining their expressions Inline single use assignment : Self explanatory Dead store elimination : Removes useless “set variable to x” blocks that don’t get used afterwards Function inlining : The compiler evaluates a cost for every function call is inside a function, if that total cost is less than 10,000, it gets inlined inside that function, removing call overhead and allowing for further optimization Other misc stuff: Fixed the while bug (if you called a function inside a while statement, it would only get called once) Made function lowering not allocate a stack slot if we’re ignoring return Made the OptimizeToGlobals optimization be called last to allow variable optimizations to happen first
Borrowed the “return expr if(cond)” syntax from ruby Implemented Tail call optimization which optimizes away recursion on tail calls Example: Before: str count(int amount) { return "Done!" if amount == 1; return count(amount - 1); } After: str count(int amount) { int tco@argument@amount = amount; while (true) { if (tco@argument@amount == 1) return "Done !"; tco@argument@amount = tco@argument@amount - 1; } }
Did some compiler testing Fixed function inlining bugs Fixed a single use assignment bug Created a triangle library that allows for triangle rendering using the pen
Made “PromoteToGlobals” which is a more powerful version of OptimizeToGlobals which allows for recursive functions to have their locals turned into globals aswell This is something called liveness analysis, the compiler looks at the code paths and decides at which points a variable is “live”, which means it can’t get overwritten by a recursive call Example: warp int fib(int n) { return 0 if n <= 0; return 1 if n == 1; if (n == 2) { int b = n * 2; return otherFunc(b); } return fib(n - 1) + fib(n - 2); } In this function the “b” variable can be turned into a global because it cannot get overwritten by a recursive call, its used too early for that to happen
Added list support! A very barebones implementation that allows the user to create, add to, read from and delete items from lists!
Added more compiler sugar for lists: list[index] replaces list::itemAt(list, index) list[index] = ...; replaces list::replace(list, item, index) for(type name in list) {} replaces int len = list::length(list); int i = 0; while (i < len) { type name = list::itemAt(list, i); i = i + 1; } (i am not proud of the shitcode that was used to get for(type name in list) working)
Added a name parameter to alloc which acts as runtime type metadata, soon to be used.
Garbage collection Added a mark and sweep garbage collector to my language, it walks the roots, marks every used object, then frees all unused objects! Most impressive part of this(in my opinion) is that most of the garbage collector is actually written in my language Misc The garbage collector gets called automatically every 1 second, but you can turn it off (CompilationConstants.AUTOMATIC_GC) If you want to manage memory manually, you can turn off the garbage collector entirely (CompilationConstants.MANUAL_MEMORY)
Made the garbage collector treat top level variables as roots, this prevents top level variables from getting freed I added 2 modes to this Reflect: This uses a hacked block to read the variables by name and reduce script size if theres a lot of variables(this doesn’t render properly inside the editor but it works) NoReflect: Get all the top level variables at compile time and mark them one by one
Tried to do turbowarp only return optimization, wasn’t able to make it very good… reverted it Improved the structure of CompilationConstants Added string::split and string::substring Made some of the list functions inlined (itemAt, clear, length)
Added more syntax improvements! Else if : Added support for else if, which replaces big blocks //Before: if(triangles[14].y1 >= 15) { looks::say(">=15"); } else { if(triangles[14].y2 >= 155) { looks::say("<=15"); } else { looks::say("Both false!"); } } //After: if(triangles[14].y1 >= 15) { looks::say(">=15"); } else if(triangles[14].y2 >= 155) { looks::say("<=15"); } else { looks::say("Both false!"); } Compound assignment : Added support for compound assignment //Before: triangles[15].y3 = triangles[15].y3 + 5; //After: triangles[15].y3 += 5; Enums : Added support for enums, which are just fancy integer wrappers enum TriangleRenderMode(OFF, RENDER, ITHINK); TriangleRenderMode mode = TriangleRenderMode.OFF; When : Added support for when expressions/statements that allow for matching a subject: //Before: if(answer == "off") { mode = TriangleRenderMode.OFF; } else if(answer == "render") { mode = TriangleRenderMode.RENDER; } else { mode = TriangleRenderMode.ITHINK; looks::say("If thinking is your power, what are you without it?"); return; } //After: TriangleRenderMode mode = when(answer) { "off" -> TriangleRenderMode.OFF "render" -> TriangleRenderMode.RENDER else -> { looks::say("If thinking is your power, what are you without it?"); TriangleRenderMode.ITHINK; } };
Fixed a lot of bugs with when expressions, also got deepseek to fix some of them Added If expressions, which allow using if statements inside other expressions, for example, here is some previously invalid code that is now valid: int max = if (a > b) a else b; str message = if (score >= 90) { looks::say("something"); "You win!" } else { looks::say("something"); "You lose :(" } triangles[15] = Triangle( utils::random(-240, 240), utils::random(-180, 180), utils::random(-240, 240), utils::random(-180, 180), utils::random(-240, 240), if(mode == TriangleRenderMode.OFF) { 5 } else { triangles[14].y3 } ); These still get lowered properly and just look like normal if statements in the final scratch code
Scratcher is at 100 commits! (Now 104 cause all of these refactors are different commits) Completely refactored all translation steps to use the ASTVisitor. Also did type resolving cleanup. Function Reachability : Went from 117 to 32 lines Function expression lowering : Went from 439 to 293 lines Re Parse Local Variables : Went from 34 to 27 lines Remove Empty Allocations : Went from 97 to 79 lines ConvertToHeapAccess : Biggest refactor of this whole devlog, went from 500 lines to 418, split into 5 files
Did more syntax improvements Added ++ and – support: index++; Added type inference support: auto a = Triangle(5, 15, 60, -120, 240, 67); //type automatically becomes Triangle auto a = func(); //type automatically becomes the return type of func
Refactored the entire type system to use a sealed interface instead of an unsafe single class Nothing much to say, this doesn’t affect the input code or the output project, I did just cleanup
More abstractions please! Added dynamic function dispatch which allows for functions to take in other functions as arguments, of course, this isn’t possible at all in normal scratch, so actually FunctionLiteral gets turned into an integer and a custom dispatch function gets created for every function literal’s signature which allows for a binary search to call the actual function Also made HeapConversion reuse stack slots instead of allocating one for every variable(mostly by AI)
Even more abstractions please Added generics support, which allows the user to define generic functions/structs that apply with every type, for example: warp <T> void forEach(T[] a, (T) -> void action) { for(T t in a) { action(t); } } Depending on what type you used to call this, a new version of forEach gets generated, if you called it with an integer: warp void forEach@int(int[] a, (int) -> void action) { for(int t in a) { action(t); } } Of course I also allow this on structs: struct Triangle<Num>(Num x1, Num y1, Num x2, Num y2, Num x3, Num y3); Also did some small changes: Added an FPS counter to my test code Better optimizations that actually detect not(not(x)) Optimized triangle::fill even more (+2 fps) Made DynamicDispatchHandler actually use the apply return properly (it was always returning true)
Second garbage collector! Added a second garbage collector! If your app does not contain any cyclic objects and needs high performance, you can now enable the ARC collector! This garbage collector works by automatically detecting when objects go out of scope and decrementing their reference count, if an object’s reference count goes to 0, it is freed. This is more performant than the mark and sweep collector because the objects are freed at the moment they are unused instead of stopping the entire program to collect garbage. This works for all cases, except for cases where there is a cyclic object. Because the cyclic object owns itself, so its reference count is always at 1.
General language improvements Elvis expressions: If a value is nullable, it is not usable by anything that only accepts non-null values, to solve this, I added the elvis expression, which allows you to give a fallback for null values(compilation in image 2): //int doesn't have to be nullable because we have a fallback value! int x = functionThatReturnsNull()?: 5; String boxing and nullable primitives Previously, scratcher only supported having structs, enums and function references as nullable, now it also supports having primitive types as nullable: str? x = functionThatReturnsNullableString(); //distinguish between literal null and string null if(x == null) looks::say("null!"); if(x == "null") looks::say("null as string!"); //the compiler achieves this by boxing the string return with a struct: //struct StringBox(str value) //the actual type behind the scenes is: //StringBox? x = ...; Safe dot traversal If a struct instance is nullable, you cannot use regular struct.member because that may result in a NullPointerException, to solve this I added ?. which allows for null safe traversal(compilation in image 1): //if nullableTriangle == null, return null //if nullableTriangle != null, return nullableTriangle.x1 int? x1 = nullableTriangle?.x1; Deepseek fix I noticed that FunctionInlining completely ignored execution order, so I asked deepseek to solve it(this happened after I added string boxing). But I found a better solution to the same problem later on, so I reverted deepseek’s fix and wrote my own, which is 260 lines compared to deepseek’s 360 lines, over 100 lines shorter!
100 hours! Evil hack part 4: Death of evil hack So I was using a really terrible hack to implement stuff like FunctionInlining, Safe dot and the elvis expression, the hack is basically (ab)using the when expression to do stuff like run code inside expressions and use local variables inside expressions. So to stop this from becoming a hack, I added it directly to the AST as StatementExpression(not to be confused with ExpressionStatement), which can be used to contain statements inside expressions. All of my evil hacks have been replaced by StatementExpression. I also added some small optimizations for StatementExpressions!
Fixed the garbage collector… turns out I broke it accidentally while cleaning up code in my last devlog, 3 line change but took a long time to find Made it so the stack allocator doesn’t do redundant operations like 1+1 and inlines them as 2 instead
Lambdas I added lambdas to Scratcher! They allow you to write more expressive code like map(list, a -> a + 1) , which literally adds 1 to every element of list I also allow using outer variables within lambdas int a = ...; map(list, b -> { a++; b + a }); I allow this through boxing, the local variables become boxes and the lambdas get the local variable’s box, this makes lambdas more powerful than most languages as this allows for variables to be shared mutable state across lambdas, this also allows the local variables to get garbage collected. Of course, scratch doesn’t support this natively, so lambdas are 100% compiler sugar and just lowers to regular functions and uses function references(which is also 100% compiler sugar). void lambda::defunc@lambad@0(LambdaCaptures c, args...) { ... }
MORE FUCKING ABSTRACTIONS!!! I added receiver/extension functions. These allow you to write code that takes in a type as a special argument You define them just like how it works in kotlin: warp <T, R> R T.let((T) -> R action) { return action(this); } It just compiles to a regular function warp <T, R> R let(T this, (T) -> R action) { return action(this); } But the compiler lets you call it with the special argument: thing.let((int a) -> ...); I also added a very big standard library module (written in scratcher!) with a ton of these functions built-in, they allow you to write more expressive code: triangles .filterNotNull() .filter((Triangle<float> t) -> t.x1 > 150) .filter((Triangle<float> t) -> t.y1 < 150) .forEach((Triangle<float> tri) -> ...) I also rewrote the entirety of string lib during this, now you have to use the extensions library to use strings, but its way more powerful (and written in scratcher)! I also added a new “char” type, which stores a single character (wow really???) I also added “safe dot calls” that allow you to use stuff as if they’re not null: triangles.forEach((Triangle<float>? t) -> { t?.x1?.let((float x1) -> { looks::say("x1: ${x1}"); }); }); This only calls the let function if t?.x1 is not null There is a big problem with all this powerful new code though… the garbage collector can no longer keep up, a single mark and sweep takes over 1 second! Which is especially bad because the garbage collector needs the entire application to stop in order to run. You do not want your code to completely stop for a whole second(maybe you do? weirdo), so I have to fix this in my next few devlogs…
Sealed enums and faster GC I added a new type of object, sealed enums: sealed enum Animal { Cat(str name, int age, bool isMeowing), Dog(str name, int age), Unknown } They allow for storing data inside enums, they’re very similar to rust enums: sealed enum Result<T> { Success(T out), Failure } I also refactored lambdas to use a sealed enum instead of a big struct: //before struct LambdaCaptures(Lambda0Captures? c0, Lambda1Captures? c1, Lambda2Captures? c2); //after sealed enum LambdaCaptures { Lambda0Captures(Box$int capture0, ...), Lambda1Captures(Box$float capture0, ...) } Sealed enums only store a tag and a pointer, so if you use a lot of lambdas, this will save a TON of heap space Faster garbage collector! I made the marking phase of the mark and sweep collector faster by using an epoch based cleanup approach Now, instead of clearing and re-populating the marked list, we don’t ever clear it and we invalidate it by just increasing the epoch. This makes the isMarked check go from O(n) to O(1) while also improving marking speed because scratch doesn’t have to resize our list
I’m sorry For over 2 months, scratcher has had an “export” keyword, which was fully unused, until today: I implemented the export keyword on functions, which allows for code written in plain scratch to interact with scratcher code: export warp void myFunction() { ... } Export requires that your function arguments are all primitives and that the return is also a primitive, but other than that, it does not change anything, just exposes the function cleanly to regular scratch code. However, scratcher type checking still applies, so if the native scratch code passes in a string to a float argument, it will still cause a panic Even when you have obfuscation enabled, exports will stay and let native scratch use it with its original name
ACTUAL ARRAYS!! Previously, scratcher “arrays” were just lists, you could add more items, it would dynamically resize, it was written in the kotlin DSL, so technically it was just a list. I removed the previous list code, reused some of it and added a new Array system Along with that, the normal lists got rewritten in 100% scratcher with no internal functions The new system is almost fully backwards compatible in source code, you just have to make a few changes The new implementation is more clear, more expressive and more like regular programming languages
Pattern matching for sealed enums Previously if you wanted to check sealed enums types and use them, you had to do very ugly syntax for actually getting the variant instance: auto out = tryGet(); when(out) { Result.Success -> { auto suc = out as Result.Success; looks::say("Success! ${suc.out.x}"); Now you don’t have to do all of this: when(tryGet()) { Result.Success suc -> { looks::say("Success! ${suc.out.x}"); This is just syntax improvement, doesn’t change the generated code or anything, just helps the developer
Import some import names into unqualified co ntext Before: //import import list; //use list::List<str> myList = list::newList(); After: //import import list::*; //use List<str> myList = newList();
Operator overloading Added operator overloading, now you can define overloads for specific operators so that code looks cleaner Just use the operator keyword with the correct signature and you’re done! You can overload the operators: +, -, /, *, %, [], []= For example: warp operator <T> void T[].set(int index, T item) { self::replace(this, item, index); } //use array[index] = item //compiler translates to set(array, index, item) I also realized that my previous refactor of arrays broke my nullability system: int[] a = Array(int, 5); say(a[3]); This would print null , which my type system missed I fixed this by moving arrays to a standard library module, the same array import works, but you have to change how you create the array: //before: int[] a = Array(int, 5); //doesn't need to be marked as null!!! int[] a = Array(int, 5); a[0] = ...; a[1] = ...; ... //after int?[] a = arrayOfNulls(5); //null filled int[] a = arrayOf(5, (int index) -> { return index * 5; //value of the array at that index });
Privates Added a “private” keyword, anything declared private cannot be accessed from outside the current file. This prevents the user from messing with internal states of libraries they are using For example, the list library from the standard library. Now you can’t directly mess with the list pointer triangles.ptr[5] = ...; This now results in an error because “ptr” is private! I also added some small optimizations for lambdas.
DOCUMENTATION I do not want to touch any markdown ever again
QOL I added a shit ton of quality of life stuff: Tons of bug fixes Big array syntax: int[] myArray = [1, 2, 3, 4, 5, 6]; Safe casting for enums(previously a panic): Result.Success? a = res as? Result.Success; Out of memory detection: Scratch caps lists at 200k elements, after that it silently stops adding stuff to the list Compact int list: Store pretty much infinite integers without wasting heap space SHORT CIRCUITS: DONT EXECUTE RIGHT SIDE OF && or || if left side is false/true! If statements without braces: if(a) b++; CONTINUE AND BREAK: while(true) { if(a) break; if(b) continue; } STATIC LISTS: store data outside of the heap in scratch lists so that you dont run out of heap space: static str[] myList; This also allows for file reading: static str[] myList = "hello.json"; So you can properly store data(like ROMs) CASE SENSITIVE EQUALS: DID YOU KNOW THAT SCRATCH “=” BLOCK IS CASE INSENSITIVE??? And its pretty hard to make it case sensitive Now you can do “===” and its case sensitive: 'a' === 'A' RETURNS FALSE
List pools Static lists are cool, but they are very limited expressiveness wise because they must be known at compile time Pools fix this by having a pool of static lists that the user code can allocate at any time PooledList a = allocate(); But because the pool is limited, the pooled list must be freed when not needed, the garbage collector will not handle it(yet) a.free(); Other than that, the PooledList behaves just like a List and can do almost anything a List does I also added proper documentation for Out of memory errors.
Indexed repeat and general improvements Added a new indexed for and repeat statement which allows way easier index tracking: //Before: int index = 0; repeat(10) { ... index++; } //After: repeat(10) { index -> ... } I also made the PooledList get garbage collected with the refcount gc Did some really small refactors aswell
Demo programs and general improvements I added demo programs to scratcher, these show the language actually being used Try one out! https://scratch.mit.edu/projects/1385339395/ General improvements Bug fixes Dummy sprite Make the type checker ignored in inlined functions Make topLevelInit smaller and remove unused functions from final compilation TurboWarp specific compilation mode with faster operations on strings/lists (not compatible with vanilla scratch if enabled)
More demos and QOL Try it out: https://scratch.mit.edu/projects/1387804691/ Demos Math lexer, parser and interpreter: New demo that lets you input math expressions (eg: 1 + 1 ) and get the result. 3d cube renderer: a spinning 3d cube and player controls QOL Smarter inlining cost calculation A math centered optimization for removing identities Get rid of PromoteToGlobals (temp) GC documentation Codegen fixes (receiver functions generate the same block, causing scratch to get confused) Stack size optimization (reuse stack slots of the same type) Fix crash when the garbage collector is disabled
PROPER ERRORS Errors are the one thing that I knew were terrible but I could never build up the courage to fix. So I just fixed them. Now all errors in the language are formatted nicely, show you exactly where the error happened and give you a nice description. Along with this, I made a new system for collecting errors, so now the compiler won’t stop at the first error and will continue going and give you all errors at once. This makes fixing code a lot easier. This also opens up the possibility of an LSP server later on (before and after in images)
CLI I did some small refactors and added a new CLI, built with Clikt It’s very simple to use: scratcher check file --options //check the file for any compilation errors without compiling scratcher compile file --options outFile //compile into a .sb3 file scratcher standard-library //print out the standard library Clikt also provides easy to use help menus I also added a sort function to the array and list libraries
Tests I added tests to scratcher, this makes sure the language is holding up to its promises before I press release. I currently only have very simple tests, but I’ve already fixed 4 bugs in the compiler. Other shit Added github workflows so it gets released automatically! Made the Compiler completely isolated, this means it can run multiple times without having the JVM restarted. Added compact float lists!
Ships:
Scratcher is a high level language that compiles to scratch. Some of Scratcher’s features: Lambdas Closures Function pointers Structs Arrays Lists Generics Sealed enums Pattern matching Compile time null safety Extension functions Operator overloading String interpolation Function returns Along with having support for all of these: Scratcher is memory safe Scratcher has 2 garbage collectors. Scratcher has a big optimizer pass, making your code very performant. Scratcher has very good documentation Scratcher can also safely interop with normal scratch code: You can expose your functions to normal scratch code using the export keyword, which makes normal scratch code able to safely call your code. You can use on GreenFlag {} or on KeyPressed("key") {} to handle scratch events. Advanced loop control: Scratcher allows you to write expressive code like for(int i in list) Scratcher also has support for continue and break which is fully absent on scratch. What I’m proud of Return values: Normal scratch has no idea what a function call is, it only knows procedures(which don’t have returns)! The double GC: Scratcher comes with 2 garbage collectors, which can run at the same time, one is reference counting GC and the other one is a Tracing Mark and sweep GC. Lambdas: Scratcher allows you to use lambdas very expressively, allowing you to capture local variables from outside the lambda, use it, modify it while also keeping that modified instance in the original function, its just like kotlin’s lambdas(which I love) The expression control flow: Scratcher allows you to write if statements and when statements INSIDE other expressions, this lets you write very expressive code: func( if(something) { funcB() } else 5 ) Short circuits: Normal scratch executes the right side of an and / or block no matter what, scratcher doesn’t, if the left side of and is false, the right side won’t run. Very rich type system: The scratcher type system allows you to do a lot of things, I love sealed enums, they’re just like rust enums: sealed enum Result<T, E> { Success(T value), Error(E error) } Testing the compiler If you don’t wanna bother downloading the CLI and writing your own program, look at the example programs in this folder If you wanna use the CLI and maybe even write your own programs, check out the documentation: https://github.com/betterclient/Scratcher/blob/master/docs/hello_world.md...
|
1793329029.9486382
|
1793415429.9486382
|
|
45352
|
My awesome macropad! by @dysonc2010 | Stardance
|
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @dysonc2010 | Stard Title: My awesome macropad! by @dysonc2010 | Stardance...
|
1793329031.608554
|
1793933831.608554
|
|
45353
|
oMNIeNGINE by @flame-why-primate | Stardance
|
flame-why-primate
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: oMNIeNGINE by @flame-why-primate | Stardanc Title: oMNIeNGINE by @flame-why-primate | Stardance...
|
1793329032.5463905
|
1793933832.5463905
|
|
23352
|
My first slack bot! by @sandeep | Stardance
|
sandeep
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-22T03:36:24Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built a feature-packed upgrade to the Slack Bot (Slacky Wacky) featuring: SQLite Conversational Memory for multi-turn chats. Slack Block Kit UI elements for interactive responses. A beautiful, minimal live web dashboard on Nest displaying API latency, uptime, database size, command usage, and system logs. Multimodal vision support (Groq Llama 3.2 11B Vision) to automatically analyze images uploaded to the channel. What was challenging: Correctly escaping client-side template literals embedded inside server-side backticks so they render correctly in the browser. What I’m proud of: Delivering a extremely clean, professional dashboard without typical AI dashboard hype.", "repo": "https://github.com/sandeepkurma9876-del/slacky-wacky", "demo": "https://hackclub.slack.com/archives/C0P5NE354"}]...
|
[{"post_id": 13396, "ts": "202 [{"post_id": 13396, "ts": "2026-06-21T22:45:52Z", "hours": 0.8242, "text": "I successfully built and deployed a massive upgrade to Slacky Wacky, adding four powerful new features! Here is exactly how I implemented them: Conversational Memory : I used better-sqlite3 to set up a lightweight database. When a user asks a question, the bot retrieves their last 10 messages so the Groq API has multi-turn context: const db = new Database ( ' chat_history.db ' ); db . exec ( \\ ` CREATE TABLE IF NOT EXISTS messages ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id TEXT, role TEXT, content TEXT ) \\` ); function getHistory(userId) { return db.prepare('SELECT role, content FROM messages WHERE user_id = ? ORDER BY id DESC LIMIT 10').all(userId).reverse(); } Block Kit UI : I refactored all responses into structured Slack Block Kit elements for a much cleaner look: await respond ({ blocks : [ { type : \" section \" , text : { type : \" mrkdwn \" , text : \\ `*Answer:* \\\\ n \\$ {groqAnswer} \\` } } ] }); Live Web Dashboard & Reverse Proxy : I integrated an Express server into index.js to log system metrics and API latency in real time. I then configured a custom reverse proxy domain ( sandeepkurma.hackclub.app ) inside the dashboard pointing to target port 3000 : app . get ( ' / ' , ( req , res ) => { res . send ( \\ `<h1>Slack Bot Live Dashboard</h1><p>Latest Latency: \\$ {latestLatency} ms</p> \\` ); }); Multimodal Image Support : I added logic to check for image file extensions (jpg, png, etc.) in the user’s message. If found, the bot automatically switches the model to ` llama-3.2-11b-vision-preview ` and formats the request content structure: const modelToUse = containsImage ? ' llama-3.2-11b-vision-preview ' : ' llama-3.3-70b-versatile ' ; Everything is fully verified, tested, and running 24/7 on my container!"}, {"post_id": 13352, "ts": "2026-06-21T21:24:37Z", "hours": 0.6667, "text": "I rigorously tested the active slash commands in Slack. All of them are running successfully on Nest 24/7!Tested:- /slacky-wacky-help -> Lists the commands and their usage successfully.- /slacky-wacky-fact -> Returns a random mind-blowing fun fact.The bot handles everything asynchronously using Socket Mode, and the responses are extremely fast! Everything is ready and fully verified."}, {"post_id": 13319, "ts": "2026-06-21T20:15:58Z", "hours": 1.1031, "text": "I built Slacky-Wacky, a fully custom Slack bot powered by the Llama 3.3 model from Groq! The bot handles interactive Slash commands through Socket Mode including:- /slacky-wacky-ask - An AI Q&A assistant to query Llama 3.3.- /slacky-wacky-status - Check system/bot status.- /slacky-wacky-help - Provide clear usage directions.- /slacky-wacky-joke - Tell funny developer jokes.- /slacky-wacky-fact - Share mind-blowing science & history facts.- /slacky-wacky-define - An interactive dictionary command.I resolved integration quirks like Bolt channel requirements, configured SSH keys for Nest, and successfully logged over 1 hour of development time to Hackatime!"}]...
|
Title: My first slack bot! by @sandeep | Stardance Title: My first slack bot! by @sandeep | Stardance
Devlogs:
I built Slacky-Wacky, a fully custom Slack bot powered by the Llama 3.3 model from Groq! The bot handles interactive Slash commands through Socket Mode including:- /slacky-wacky-ask - An AI Q&A assistant to query Llama 3.3.- /slacky-wacky-status - Check system/bot status.- /slacky-wacky-help - Provide clear usage directions.- /slacky-wacky-joke - Tell funny developer jokes.- /slacky-wacky-fact - Share mind-blowing science & history facts.- /slacky-wacky-define - An interactive dictionary command.I resolved integration quirks like Bolt channel requirements, configured SSH keys for Nest, and successfully logged over 1 hour of development time to Hackatime!
I rigorously tested the active slash commands in Slack. All of them are running successfully on Nest 24/7!Tested:- /slacky-wacky-help -> Lists the commands and their usage successfully.- /slacky-wacky-fact -> Returns a random mind-blowing fun fact.The bot handles everything asynchronously using Socket Mode, and the responses are extremely fast! Everything is ready and fully verified.
I successfully built and deployed a massive upgrade to Slacky Wacky, adding four powerful new features! Here is exactly how I implemented them: Conversational Memory : I used better-sqlite3 to set up a lightweight database. When a user asks a question, the bot retrieves their last 10 messages so the Groq API has multi-turn context: const db = new Database ( ' chat_history.db ' ); db . exec ( \ ` CREATE TABLE IF NOT EXISTS messages ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id TEXT, role TEXT, content TEXT ) \` ); function getHistory(userId) { return db.prepare('SELECT role, content FROM messages WHERE user_id = ? ORDER BY id DESC LIMIT 10').all(userId).reverse(); } Block Kit UI : I refactored all responses into structured Slack Block Kit elements for a much cleaner look: await respond ({ blocks : [ { type : " section " , text : { type : " mrkdwn " , text : \ `*Answer:* \\ n \$ {groqAnswer} \` } } ] }); Live Web Dashboard & Reverse Proxy : I integrated an Express server into index.js to log system metrics and API latency in real time. I then configured a custom reverse proxy domain ( sandeepkurma.hackclub.app ) inside the dashboard pointing to target port 3000 : app . get ( ' / ' , ( req , res ) => { res . send ( \ `<h1>Slack Bot Live Dashboard</h1><p>Latest Latency: \$ {latestLatency} ms</p> \` ); }); Multimodal Image Support : I added logic to check for image file extensions (jpg, png, etc.) in the user’s message. If found, the bot automatically switches the model to ` llama-3.2-11b-vision-preview ` and formats the request content structure: const modelToUse = containsImage ? ' llama-3.2-11b-vision-preview ' : ' llama-3.3-70b-versatile ' ; Everything is fully verified, tested, and running 24/7 on my container!
Ships:
I built a feature-packed upgrade to the Slack Bot (Slacky Wacky) featuring: SQLite Conversational Memory for multi-turn chats. Slack Block Kit UI elements for interactive responses. A beautiful, minimal live web dashboard on Nest displaying API latency, uptime, database size, command usage, and system logs. Multimodal vision support (Groq Llama 3.2 11B Vision) to automatically analyze images uploaded to the channel. What was challenging: Correctly escaping client-side template literals embedded inside server-side backticks so they render correctly in the browser. What I’m proud of: Delivering a extremely clean, professional dashboard without typical AI dashboard hype....
|
1793329033.468682
|
1793415433.468682
|
|
45354
|
Tv Led contrôler works with iPad by @dysonc2010 | Tv Led contrôler works with iPad by @dysonc2010 | Stardance...
|
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Tv Led contrôler works with iPad by @dysonc Title: Tv Led contrôler works with iPad by @dysonc2010 | Stardance...
|
1793329035.5699406
|
1793933835.5699406
|
|
45355
|
My awesome macropad! by @Vicente | Stardance
|
Vicente
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Vicente | Stardanc Title: My awesome macropad! by @Vicente | Stardance...
|
1793329038.1375196
|
1793933838.1375196
|
|
28297
|
Website by @lynop81 | Stardance
|
lynop81
|
1
|
13.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-04T08:39:52Z", "hours": 13.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "this doesnt work on mobile yet sorry lol", "repo": "https://github.com/ruilyn/my-website", "demo": "https://ruilyn.github.io/my-website/index.html"}]...
|
[{"post_id": 22017, "ts": "202 [{"post_id": 22017, "ts": "2026-07-04T08:05:15Z", "hours": 1.9478, "text": "final devlog before i attempt to deploy and ship, made a proper menu + added placeholder pages to link buttons and navi to"}, {"post_id": 21914, "ts": "2026-07-04T02:59:09Z", "hours": 0.5733, "text": "page is coming together but theres still a lot more work to do"}, {"post_id": 21675, "ts": "2026-07-03T19:14:12Z", "hours": 0.9561, "text": "messed with layout more and added buttons"}, {"post_id": 21320, "ts": "2026-07-03T05:55:04Z", "hours": 0.4436, "text": "cortisol so high rn"}, {"post_id": 21279, "ts": "2026-07-03T03:53:28Z", "hours": 0.3369, "text": "scrolly text weeeee"}, {"post_id": 21226, "ts": "2026-07-03T01:55:19Z", "hours": 5.1689, "text": "added textures"}, {"post_id": 20530, "ts": "2026-07-02T04:34:34Z", "hours": 0.8697, "text": "made logo, next is the drawing for hero section (site layout is vertical but i mashed top and bottom into one photo so it’s viewable here)"}, {"post_id": 20403, "ts": "2026-07-02T00:08:49Z", "hours": 1.2178, "text": "big things are happening"}, {"post_id": 20362, "ts": "2026-07-01T22:51:05Z", "hours": 0.6981, "text": "did a lot of conceptualizing on paper before deciding on structure, made a quick skeleton to visualize stuff and play with space before i get real"}, {"post_id": 19805, "ts": "2026-07-01T06:08:01Z", "hours": 0.6764, "text": "probably going to spend a bulk of this project outside of vsc making assets and planning layout so i wont log much time but Whatever Maybe the real startdust were the friends we made along the way."}, {"post_id": 19686, "ts": "2026-07-01T02:25:36Z", "hours": 0.5397, "text": "website exists now"}]...
|
Title: Website by @lynop81 | Stardance
Devlogs:
w Title: Website by @lynop81 | Stardance
Devlogs:
website exists now
probably going to spend a bulk of this project outside of vsc making assets and planning layout so i wont log much time but Whatever Maybe the real startdust were the friends we made along the way.
did a lot of conceptualizing on paper before deciding on structure, made a quick skeleton to visualize stuff and play with space before i get real
big things are happening
made logo, next is the drawing for hero section (site layout is vertical but i mashed top and bottom into one photo so it’s viewable here)
added textures
scrolly text weeeee
cortisol so high rn
messed with layout more and added buttons
page is coming together but theres still a lot more work to do
final devlog before i attempt to deploy and ship, made a proper menu + added placeholder pages to link buttons and navi to
Ships:
this doesnt work on mobile yet sorry lol...
|
1793329041.063109
|
1793415441.063109
|
|
45356
|
Hydrogen Song by @mathur_hridhaan2010 | Stardance
|
mathur_hridhaan2010
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Hydrogen Song by @mathur_hridhaan2010 | Sta Title: Hydrogen Song by @mathur_hridhaan2010 | Stardance...
|
1793329043.6450827
|
1793933843.6450827
|
|
45357
|
Music Player by @tanishah | Stardance
|
tanishah
|
0
|
5.96
|
0
|
[]
|
[{"post_id": 63363, "ts": "202 [{"post_id": 63363, "ts": "2026-09-07T04:25:59Z", "hours": 1.5097, "text": "just added in all the graphics and most of the functions but i still have to get the javascript working. other than that its going pretty well"}, {"post_id": 60611, "ts": "2026-09-03T02:09:12Z", "hours": 4.4467, "text": "I started learning HTML, CSS, and Javascript and this is my first project using it. It’s a simple music player that goes through some songs. I’m hoping to add a feature where you can upload files into the music player that way you don’t need to do it through the code. I also want to fix the shuffle button but for now it works pretty well."}]...
|
Title: Music Player by @tanishah | Stardance
Devl Title: Music Player by @tanishah | Stardance
Devlogs:
I started learning HTML, CSS, and Javascript and this is my first project using it. It’s a simple music player that goes through some songs. I’m hoping to add a feature where you can upload files into the music player that way you don’t need to do it through the code. I also want to fix the shuffle button but for now it works pretty well.
just added in all the graphics and most of the functions but i still have to get the javascript working. other than that its going pretty well...
|
1793329044.5290048
|
1793933844.5290048
|
|
45360
|
JoyPad by @Ishan_ | Stardance
|
Ishan_
|
0
|
8.86
|
0
|
[]
|
[{"post_id": 55395, "ts": "202 [{"post_id": 55395, "ts": "2026-08-27T06:13:24Z", "hours": 3.2333, "text": "Major Improvements to the Cad Design!"}, {"post_id": 54231, "ts": "2026-08-25T03:54:03Z", "hours": 2.645, "text": "Started the Cad Design for the JoyPad!"}, {"post_id": 43687, "ts": "2026-08-09T02:56:21Z", "hours": 1.7333, "text": "Creating the PCB for the JoyPad!"}, {"post_id": 43408, "ts": "2026-08-08T17:06:55Z", "hours": 1.2531, "text": "Creating the Schematic for the JoyPad!"}]...
|
Title: JoyPad by @Ishan_ | Stardance
Devlogs:
Cre Title: JoyPad by @Ishan_ | Stardance
Devlogs:
Creating the Schematic for the JoyPad!
Creating the PCB for the JoyPad!
Started the Cad Design for the JoyPad!
Major Improvements to the Cad Design!...
|
1793329045.5004683
|
1793933845.5004683
|
|
10158
|
EdMod by @Sucrivore | Stardance
|
Sucrivore
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-06T21:08:25Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I have make a modded client for EcoleDirect, permitting to add plugins to the ENT’s mobile apps. The difficult part was injecting sufficiently versatile code into the application to make all the plugins work.", "repo": "https://gitlab.com/edmod/bundle", "demo": "https://gitlab.com/edmod/patcher/-/releases"}]...
|
[{"post_id": 3785, "ts": "2026 [{"post_id": 3785, "ts": "2026-06-06T20:47:28Z", "hours": 0.3658, "text": "Added caching to plugins loading"}]...
|
Title: EdMod by @Sucrivore | Stardance
Devlogs:
A Title: EdMod by @Sucrivore | Stardance
Devlogs:
Added caching to plugins loading
Ships:
I have make a modded client for EcoleDirect, permitting to add plugins to the ENT’s mobile apps. The difficult part was injecting sufficiently versatile code into the application to make all the plugins work....
|
1793329046.5345373
|
1793415446.5345373
|
|
45361
|
The Great Catsby by @24revati | Stardance
|
24revati
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: The Great Catsby by @24revati | Stardance
|
1793329047.75555
|
1793933847.75555
|
|
45363
|
WarioWare Game by @lethal141 | Stardance
|
lethal141
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: WarioWare Game by @lethal141 | Stardance
|
1793329048.627219
|
1793933848.627219
|
|
45365
|
My very own WebOS by @Bireyy | Stardance
|
Bireyy
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @Bireyy | Stardance
|
1793329049.5745435
|
1793933849.5745435
|
|
45367
|
Culturas by @malakzain1101 | Stardance
|
malakzain1101
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Culturas by @malakzain1101 | Stardance
|
1793329050.4887695
|
1793933850.4887695
|
|
45368
|
My school club website by @TanMingJing | Stardance
|
TanMingJing
|
0
|
5.54
|
0
|
[]
|
[{"post_id": 43045, "ts": "202 [{"post_id": 43045, "ts": "2026-08-08T03:09:41Z", "hours": 5.5369, "text": "Building the Website for my school computer club"}]...
|
Title: My school club website by @TanMingJing | St Title: My school club website by @TanMingJing | Stardance
Devlogs:
Building the Website for my school computer club...
|
1793329051.3884864
|
1793933851.3884864
|
|
25457
|
{Scratch so it doesnt count}Flappy Dragon Game by {Scratch so it doesnt count}Flappy Dragon Game by @ClairePoehner | Stardance...
|
ClairePoehner
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-26T16:59:49Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a game where you have to navigate a dragon up and down to avoid hitting spires to collect score points. I am proud that you can use both space bar and clicking the screen as now it works on mobile as well as computer. I am also glad that I could program a “flapping” animation to the dragon when you click the screen or press space bar.", "repo": "https://github.com/clairepoehner-dot/Flappy---Dragon", "demo": "https://scratch.mit.edu/projects/1335387292"}]...
|
[{"post_id": 15940, "ts": "202 [{"post_id": 15940, "ts": "2026-06-25T21:59:48Z", "hours": 0.3731, "text": "Game Over now plays a sound (Faint Courage by Toby Fox) when it shows up and Game Over is also now displayed when you hit the bottom of the screen and not just when you hit the spires :)"}, {"post_id": 15930, "ts": "2026-06-25T21:32:53Z", "hours": 0.6211, "text": "I made the basic mechanics for the game and it all works, now it is time for the fine tuning."}]...
|
Title: {Scratch so it doesnt count}Flappy Dragon G Title: {Scratch so it doesnt count}Flappy Dragon Game by @ClairePoehner | Stardance
Devlogs:
I made the basic mechanics for the game and it all works, now it is time for the fine tuning.
Game Over now plays a sound (Faint Courage by Toby Fox) when it shows up and Game Over is also now displayed when you hit the bottom of the screen and not just when you hit the spires :)
Ships:
I made a game where you have to navigate a dragon up and down to avoid hitting spires to collect score points. I am proud that you can use both space bar and clicking the screen as now it works on mobile as well as computer. I am also glad that I could program a “flapping” animation to the dragon when you click the screen or press space bar....
|
1793329052.3317828
|
1793415452.3317828
|
|
45369
|
flathead by @michaelsumin78 | Stardance
|
michaelsumin78
|
0
|
4.19
|
0
|
[]
|
[{"post_id": 53212, "ts": "202 [{"post_id": 53212, "ts": "2026-08-23T17:32:06Z", "hours": 2.2403, "text": "Remade leg structure with improved femur and tibia lengths, while improving the general shape and details to make it more like the Flathead Robot from the game"}, {"post_id": 50592, "ts": "2026-08-19T20:10:22Z", "hours": 1.9486, "text": "This is the first part to the start of my leg design is more of a rough draft. You can see that the design is mainly based off of using metal servo horns. In my experience plastic ones do not last very long and I wanted to be more careful considering the motors I will be using are mg996rs."}]...
|
Title: flathead by @michaelsumin78 | Stardance
De Title: flathead by @michaelsumin78 | Stardance
Devlogs:
This is the first part to the start of my leg design is more of a rough draft. You can see that the design is mainly based off of using metal servo horns. In my experience plastic ones do not last very long and I wanted to be more careful considering the motors I will be using are mg996rs.
Remade leg structure with improved femur and tibia lengths, while improving the general shape and details to make it more like the Flathead Robot from the game...
|
1793329053.514339
|
1793933853.514339
|
|
45371
|
Ulug'bek Sodiqov by @married-barn-veto | Stard Ulug'bek Sodiqov by @married-barn-veto | Stardance...
|
married-barn-veto
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Ulug'bek Sodiqov by @married-barn-veto Title: Ulug'bek Sodiqov by @married-barn-veto | Stardance...
|
1793329054.6849804
|
1793933854.6849804
|
|
25369
|
Oasis-Scan by @Drake | Stardance
|
Drake
|
1
|
6.0
|
31
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-24T18:58:17Z", "hours": 6.0, "multiplier": 4.96, "payout": 31, "blessing": "neutral", "text": "Oasis scan is a program that automatically detects all simple CVE’s on your computer (linux only). This was a local hackathon project I competed in so all my time is bunched up into one dev post and I’m sorry for that, for our demo link we include a custom .tech domain we used, feel free to try it out while it’s still up!", "repo": "https://github.com/duckmxx/oasis-scan/", "demo": "https://scanoasis.tech/"}]...
|
[{"post_id": 15234, "ts": "202 [{"post_id": 15234, "ts": "2026-06-24T18:55:45Z", "hours": 6.2792, "text": "Made Oasis-Scan for a hackathon projected so all my time is bunched up into one bit, what Oasis-Scan does is scan your computer for all existing CVE’s and shows you how you can be hacked and what issues exist within your computer"}]...
|
Title: Oasis-Scan by @Drake | Stardance
Devlogs:
Title: Oasis-Scan by @Drake | Stardance
Devlogs:
Made Oasis-Scan for a hackathon projected so all my time is bunched up into one bit, what Oasis-Scan does is scan your computer for all existing CVE’s and shows you how you can be hacked and what issues exist within your computer
Ships:
Oasis scan is a program that automatically detects all simple CVE’s on your computer (linux only). This was a local hackathon project I competed in so all my time is bunched up into one dev post and I’m sorry for that, for our demo link we include a custom .tech domain we used, feel free to try it out while it’s still up!...
|
1793329055.588253
|
1793415455.588253
|
|
45372
|
HelixCore by @Sitorabonu | Stardance
|
Sitorabonu
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: HelixCore by @Sitorabonu | Stardance
|
1793329059.206176
|
1793933859.206176
|
|
45373
|
My own site! by @Parin_bhatt | Stardance
|
Parin_bhatt
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @Parin_bhatt | Stardance
|
1793329060.1758218
|
1793933860.1758218
|
|
28005
|
Candy box by @flyingfish | Stardance
|
flyingfish
|
1
|
13.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-30T04:03:16Z", "hours": 13.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i only got about half way though this project before i realized i spent way to much time on it so i am just shipping what i have this is a smartie dispenser that shocks you if you try to get another one before waiting 1 hour", "repo": "https://github.com/dinotiger01/electric-candy-box", "demo": ""}]...
|
[{"post_id": 18943, "ts": "202 [{"post_id": 18943, "ts": "2026-06-30T03:50:27Z", "hours": 6.5839, "text": "so i was working on this and burned out 2 Arduinos and realized that i will never actually use this and i have put too much time in to it so i am just shipping what i currently have"}, {"post_id": 18118, "ts": "2026-06-29T04:01:12Z", "hours": 6.6525, "text": "i want the free sticker i am making a quick 2 day project to get the free sticker if you ship by Monday i have a really bad addiction to smarties so the plan is to make a box that dispenses smarties but then shocks you if you try to eat another one with out waiting fun design things: i gave it 2 buttons so it shocks tough your chest intend of your finger and hurts a lot more -i made a spring on the inside that stops smarties from just falling out -i made it print in 2 half’s to make printing easier"}]...
|
Title: Candy box by @flyingfish | Stardance
Devlo Title: Candy box by @flyingfish | Stardance
Devlogs:
i want the free sticker i am making a quick 2 day project to get the free sticker if you ship by Monday i have a really bad addiction to smarties so the plan is to make a box that dispenses smarties but then shocks you if you try to eat another one with out waiting fun design things: i gave it 2 buttons so it shocks tough your chest intend of your finger and hurts a lot more -i made a spring on the inside that stops smarties from just falling out -i made it print in 2 half’s to make printing easier
so i was working on this and burned out 2 Arduinos and realized that i will never actually use this and i have put too much time in to it so i am just shipping what i currently have
Ships:
i only got about half way though this project before i realized i spent way to much time on it so i am just shipping what i have this is a smartie dispenser that shocks you if you try to get another one before waiting 1 hour...
|
1793329061.0809786
|
1793415461.0809786
|
|
45374
|
AuraFlow by @Anvar | Stardance
|
Anvar
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: AuraFlow by @Anvar | Stardance
|
1793329062.2216535
|
1793933862.2216535
|
|
45375
|
CortexEngine by @hurt-bobtail-class | Stardance
|
hurt-bobtail-class
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: CortexEngine by @hurt-bobtail-class | Stard Title: CortexEngine by @hurt-bobtail-class | Stardance...
|
1793329063.1567767
|
1793933863.1567767
|
|
45376
|
HyperGrid by @lent-fresh-number | Stardance
|
lent-fresh-number
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: HyperGrid by @lent-fresh-number | Stardance
|
1793329064.0589945
|
1793933864.0589945
|
|
11152
|
Smooth Upscaler by @DubbsPi | Stardance
|
DubbsPi
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-23T21:02:28Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This took a while for me to figure out how to do. My goal to start was create a super simple sdf for a scene and solve it analytically, but that was being quite a pain. After a while, I found some nice values to put in that game a really nice result. Sadly, when I was coding it, I couldn’t figure out how to not have to reconstruct the entire scene for each pixel, because in theory I could cheat and only make nearby pixels. However, since it is a one step raymarch (or just an instant solve), the overhead of remaking every thing ended being quite negligible, and since the code is all branchless, it didn’t really care about doing that many ops.", "repo": "https://github.com/DubbsPi/Smooth-Upscaling-With-Smoothmin", "demo": "https://github.com/DubbsPi/Smooth-Upscaling-With-Smoothmin/blob/main/README.md"}]...
|
[{"post_id": 14097, "ts": "202 [{"post_id": 14097, "ts": "2026-06-23T02:34:01Z", "hours": 0.2861, "text": "Somehow got it to work. Literally no clue how"}, {"post_id": 14085, "ts": "2026-06-23T02:10:41Z", "hours": 0.8639, "text": "Currently trying to get it to work properly. Gotta love shaders since this is the output for some reason"}]...
|
Title: Smooth Upscaler by @DubbsPi | Stardance
De Title: Smooth Upscaler by @DubbsPi | Stardance
Devlogs:
Currently trying to get it to work properly. Gotta love shaders since this is the output for some reason
Somehow got it to work. Literally no clue how
Ships:
This took a while for me to figure out how to do. My goal to start was create a super simple sdf for a scene and solve it analytically, but that was being quite a pain. After a while, I found some nice values to put in that game a really nice result. Sadly, when I was coding it, I couldn’t figure out how to not have to reconstruct the entire scene for each pixel, because in theory I could cheat and only make nearby pixels. However, since it is a one step raymarch (or just an instant solve), the overhead of remaking every thing ended being quite negligible, and since the code is all branchless, it didn’t really care about doing that many ops....
|
1793329064.9491098
|
1793415464.9491098
|
|
45378
|
Zulxumor Islomva's AetherMind by @nag-drown-st Zulxumor Islomva's AetherMind by @nag-drown-stoning | Stardance...
|
nag-drown-stoning
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zulxumor Islomva's AetherMind by @nag-d Title: Zulxumor Islomva's AetherMind by @nag-drown-stoning | Stardance...
|
1793329066.217057
|
1793933866.217057
|
|
45379
|
VectorStack by @alive-clay-entrap | Stardance
|
alive-clay-entrap
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: VectorStack by @alive-clay-entrap | Stardan Title: VectorStack by @alive-clay-entrap | Stardance...
|
1793329067.1035304
|
1793933867.1035304
|
|
7511
|
teto by @subhansh | Stardance
|
|
1
|
1.58
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-05T17:40:51Z", "hours": 1.0, "multiplier": 1.19, "payout": 1, "blessing": "neutral", "text": "made a slack bot with 25 commands!", "repo": "https://github.com/subhansh-dev/slack-bot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0B8W5WP5M5"}]...
|
[{"post_id": 5633, "ts": "2026 [{"post_id": 5633, "ts": "2026-06-09T14:39:48Z", "hours": 0.5764, "text": "okaaa shes completet and now responding fine !!!"}, {"post_id": 2421, "ts": "2026-06-04T21:54:00Z", "hours": 0.6633, "text": "wawawa created my first slack-bot meow"}]...
|
Title: teto by @subhansh | Stardance
Devlogs:
waw Title: teto by @subhansh | Stardance
Devlogs:
wawawa created my first slack-bot meow
okaaa shes completet and now responding fine !!!
Ships:
made a slack bot with 25 commands!...
|
1793329068.0106304
|
1793415468.0106304
|
|
45380
|
SynthCraft by @spent-grating-cape | Stardance
|
spent-grating-cape
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: SynthCraft by @spent-grating-cape | Stardan Title: SynthCraft by @spent-grating-cape | Stardance...
|
1793329069.1818783
|
1793933869.1818783
|
|
45381
|
OmniLogic by @pound-tummy-why | Stardance
|
pound-tummy-why
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: OmniLogic by @pound-tummy-why | Stardance
|
1793329070.0817413
|
1793933870.0817413
|
|
17318
|
RemOS (WebOS) by @pksmkwe26 | Stardance
|
pksmkwe26
|
1
|
3.0
|
18
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T09:12:14Z", "hours": 3.0, "multiplier": 5.99, "payout": 18, "blessing": "neutral", "text": "I made an WebOS (RemOS). I used shadcn_flutter package for ease UI library and Windows Function with the Snap-in Functionality As well, I’ve also used Flutter InAppWebView for the IFrame Support in Apps.", "repo": "https://github.com/kwe26/remos", "demo": "https://kwe26.github.io/remos/"}]...
|
[{"post_id": 9818, "ts": "2026 [{"post_id": 9818, "ts": "2026-06-16T08:13:06Z", "hours": 2.4719, "text": "Devlog #2 . I’ve added Startup Sound . Also Calculator App and Some WebView Apps such as Paint, Wikipedia and YouTube. . And an Top Bar just like in GNOME and such . And Also Clock Widget on Home Screen as well . Thanks"}, {"post_id": 7520, "ts": "2026-06-12T15:45:33Z", "hours": 0.5039, "text": "Devlog #1 RemOS an WebOS named after Rem from Re:Zero . . Using shadcn_flutter + Flutter for Window Widgets and it even supports Windows 11’s Snap-In like Feature. . Working on Other Elements Soon! . Thanks ;;3"}]...
|
Title: RemOS (WebOS) by @pksmkwe26 | Stardance
De Title: RemOS (WebOS) by @pksmkwe26 | Stardance
Devlogs:
Devlog #1 RemOS an WebOS named after Rem from Re:Zero . . Using shadcn_flutter + Flutter for Window Widgets and it even supports Windows 11’s Snap-In like Feature. . Working on Other Elements Soon! . Thanks ;;3
Devlog #2 . I’ve added Startup Sound . Also Calculator App and Some WebView Apps such as Paint, Wikipedia and YouTube. . And an Top Bar just like in GNOME and such . And Also Clock Widget on Home Screen as well . Thanks
Ships:
I made an WebOS (RemOS). I used shadcn_flutter package for ease UI library and Windows Function with the Snap-in Functionality As well, I’ve also used Flutter InAppWebView for the IFrame Support in Apps....
|
1793329071.026554
|
1793415471.026554
|
|
45383
|
Prismatrix by @amuck-whole-frozen | Stardance
|
amuck-whole-frozen
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Prismatrix by @amuck-whole-frozen | Stardan Title: Prismatrix by @amuck-whole-frozen | Stardance...
|
1793329073.9454677
|
1793933873.9454677
|
|
45384
|
NovaFlow by @proud-slot-scandal | Stardance
|
proud-slot-scandal
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: NovaFlow by @proud-slot-scandal | Stardance
|
1793329076.5358822
|
1793933876.5358822
|
|
192
|
Website by @aaradhyarya_srivastava | Stardance
|
aaradhyarya_srivastava
|
1
|
20.0
|
332
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-16T15:17:01Z", "hours": 20.0, "multiplier": 16.83, "payout": 332, "blessing": "neutral", "text": "This is my own portfolio website made using three.js :D I obviously followed a tutorial but I also added a bunch of my own elements and customised the site to my own liking :D I made the music as well :) Overall I spent like 15 hours on this website and im really proud of it I will make changes over time but this seems like a good starting point NOTE: I spent 15 hours and not 20 hours on this for some reason time tracking seems to add another 5 hours to this", "repo": "https://github.com/lemonzwastaken/PortfolioWebsite", "demo": "https://portfolio-website-blush-seven-78.vercel.app/"}]...
|
[{"post_id": 48173, "ts": "202 [{"post_id": 48173, "ts": "2026-08-16T13:54:37Z", "hours": 0.9389, "text": "DEPLOYED IT Also made some small changes like changing the scroll bar, adding small transition animation, some levels of optimisation etc. Also fixed some errors that caused it to not deploy BUT Here’s the website if you are interested https://portfolio-website-blush-seven-78.vercel.app/"}, {"post_id": 47711, "ts": "2026-08-15T20:06:34Z", "hours": 2.7339, "text": "Almost finished with this website :D Here’s the changes made in this recent devlog Added animations to the entire website Added music and it remembers if you wanna play music or not (also i made the music 🆒 ) Small tweaks and bug fixes for better website experience :p (sorry for the bad audio quality obs was tweaking out)"}, {"post_id": 47432, "ts": "2026-08-15T11:18:18Z", "hours": 2.5728, "text": "Worked on mobile compatability for the website. Fixed the Here’s the list of changes done Main Page: Scaled the model, put the icons on the side and added labels Projects: Removed the 3D model so projects are visible clearly About me and Contact me: Scaled the text size so it fits mobile"}, {"post_id": 46836, "ts": "2026-08-14T11:15:42Z", "hours": 2.2803, "text": "A ton of changes made and stuff added Added Stuff: Added the contact me page and linked it with mailjs so contacting me can be done directly via mail Added another model to the front page Changes: Again changed the front page model basically removing the city cuz it looked bad Changed opacity of all images from 100 to 50 Changed the render model to include some more stuff like intensity giving me better control over lighting Changed the model behavior in about me page as well as the lighting Yeah well thats about it"}, {"post_id": 46591, "ts": "2026-08-13T22:40:24Z", "hours": 2.2661, "text": "Finished the about me page(atleast the layout) and added a home button to every page. On top of that I made some QOL changes like backgrounds are completely visible etc. gonna work on contact me page next and more animations"}, {"post_id": 45629, "ts": "2026-08-12T07:46:02Z", "hours": 8.9256, "text": "Finished the Main Page as well as the projects page for my portfolio website :D. The time logged is a little off, its actually supposed to be 5 hours ish but my time was logged into an archived project so . Anyways next im gonna work on About me page and QOL stuff"}]...
|
Title: Website by @aaradhyarya_srivastava | Starda Title: Website by @aaradhyarya_srivastava | Stardance
Devlogs:
Finished the Main Page as well as the projects page for my portfolio website :D. The time logged is a little off, its actually supposed to be 5 hours ish but my time was logged into an archived project so . Anyways next im gonna work on About me page and QOL stuff
Finished the about me page(atleast the layout) and added a home button to every page. On top of that I made some QOL changes like backgrounds are completely visible etc. gonna work on contact me page next and more animations
A ton of changes made and stuff added Added Stuff: Added the contact me page and linked it with mailjs so contacting me can be done directly via mail Added another model to the front page Changes: Again changed the front page model basically removing the city cuz it looked bad Changed opacity of all images from 100 to 50 Changed the render model to include some more stuff like intensity giving me better control over lighting Changed the model behavior in about me page as well as the lighting Yeah well thats about it
Worked on mobile compatability for the website. Fixed the Here’s the list of changes done Main Page: Scaled the model, put the icons on the side and added labels Projects: Removed the 3D model so projects are visible clearly About me and Contact me: Scaled the text size so it fits mobile
Almost finished with this website :D Here’s the changes made in this recent devlog Added animations to the entire website Added music and it remembers if you wanna play music or not (also i made the music 🆒 ) Small tweaks and bug fixes for better website experience :p (sorry for the bad audio quality obs was tweaking out)
DEPLOYED IT Also made some small changes like changing the scroll bar, adding small transition animation, some levels of optimisation etc. Also fixed some errors that caused it to not deploy BUT Here’s the website if you are interested https://portfolio-website-blush-seven-78.vercel.app/
Ships:
This is my own portfolio website made using three.js :D I obviously followed a tutorial but I also added a bunch of my own elements and customised the site to my own liking :D I made the music as well :) Overall I spent like 15 hours on this website and im really proud of it I will make changes over time but this seems like a good starting point NOTE: I spent 15 hours and not 20 hours on this for some reason time tracking seems to add another 5 hours to this...
|
1793329077.5661197
|
1793415477.5661197
|
|
45385
|
Earthquake alert by @exan | Stardance
|
exan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Earthquake alert by @exan | Stardance
|
1793329079.2749743
|
1793933879.2749743
|
|
45387
|
MUSCLE CRAMP RELIVER by @darsh_sehgal | Stardance
|
darsh_sehgal
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: MUSCLE CRAMP RELIVER by @darsh_sehgal | Sta Title: MUSCLE CRAMP RELIVER by @darsh_sehgal | Stardance...
|
1793329080.2673018
|
1793933880.2673018
|
|
349
|
Stardance Orbit by @keerthi | Stardance
|
keerthi
|
1
|
26.0
|
423
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T14:40:40Z", "hours": 26.0, "multiplier": 16.65, "payout": 423, "blessing": "neutral", "text": "This is a extention that improves the overall UI/UX of the stardance site to make it more easy for users to access. I had to learn scrapping a lottt before writing this.. but was pretty fun ngl.", "repo": "https://github.com/keerthi-officials/stardance-orbit", "demo": "https://github.com/keerthi-officials/stardance-orbit/releases/"}]...
|
[{"post_id": 4214, "ts": "2026 [{"post_id": 4214, "ts": "2026-06-07T13:30:26Z", "hours": 1.06, "text": "added tabs in home page to switch between following people’s devlogs, my devlogs and everyone devlogs"}, {"post_id": 4106, "ts": "2026-06-07T09:26:47Z", "hours": 0.8575, "text": "added readme file with all the features i have added in this extension & installation guide along with sm notes for better understanding of the extension"}, {"post_id": 4065, "ts": "2026-06-07T07:47:45Z", "hours": 0.4497, "text": "make the styles work for every light theme. previously the styles only worked for the catppuccin-latte light theme.. now the styles work for every light theme. added option to show light mode styles in custom themes depends on user!"}, {"post_id": 4023, "ts": "2026-06-07T06:12:21Z", "hours": 0.4872, "text": "added rearrangeable items in wishlist. also increase the quantity of each item (max 30)"}, {"post_id": 3675, "ts": "2026-06-06T18:42:18Z", "hours": 1.8106, "text": "added custom themes and fonts in the popup now you can customize what theme you want the stardance site to look like and what choose font u would like to use from 20+ fonts added 4 new themes too:- dark-plus, pastel, neon & high-contrast. also added auto saving drafts so that even if u reload the tab. what you have typed wont go away!"}, {"post_id": 3588, "ts": "2026-06-06T16:16:18Z", "hours": 1.1703, "text": "added quick-search, using Ctrl+K open a command menu where u can open pages/your projects with ease. you can also search up any project, any person and any post in the whole stardance site!"}, {"post_id": 3535, "ts": "2026-06-06T14:54:05Z", "hours": 0.2894, "text": "added overlay for shortcuts.."}, {"post_id": 3512, "ts": "2026-06-06T14:20:43Z", "hours": 1.3831, "text": "added the following shortcuts Home - alt + h Rate - alt + v Missions - alt + m Shop - alt + d Resources - alt + e Projects - alt + p Project 1 (what ever is the first project that comes in A-Z order) - alt + 1 Project 2 - alt + 2"}, {"post_id": 3442, "ts": "2026-06-06T11:50:35Z", "hours": 0.905, "text": "options to customize projects tab: grid and list alignment sort by: last updated, most devlogs, most hours, a-z"}, {"post_id": 3407, "ts": "2026-06-06T10:09:22Z", "hours": 0.7833, "text": "added number of words count and estimated time to read devlog. added collapse devlog option where user can collapse devlog so they can scroll thru feed section faster."}, {"post_id": 3384, "ts": "2026-06-06T08:56:05Z", "hours": 0.4122, "text": "added focus mode, which disables everything that might be distracting so u can write all ur ideas into the devlog!"}, {"post_id": 3215, "ts": "2026-06-06T01:20:25Z", "hours": 0.6861, "text": "what i added: pre-made devlog templates to type faster.. templates added: how it works: click on the dropdown that is placed above the post button and you will have 5 options to chose from. note: this devlog was also written with the help of a template"}, {"post_id": 2816, "ts": "2026-06-05T17:17:41Z", "hours": 0.8397, "text": "fixed sm bugs: in shop when u close a wishlisted item the shop item card still is activated. couldn’t figure it out first but it seems the problem was cuz i didnt update localstorage.. matched both the states now it works properly. also did sm button color fixes"}, {"post_id": 2780, "ts": "2026-06-05T16:10:55Z", "hours": 0.4817, "text": "added inline edit devlogs instead of redirecting to another page. heavily inspired by stardance-utils!"}, {"post_id": 2740, "ts": "2026-06-05T14:39:00Z", "hours": 1.3256, "text": "added light theme.. for who ever crazy enough to deal with that level of brightness.."}, {"post_id": 2695, "ts": "2026-06-05T12:04:47Z", "hours": 1.49, "text": "added a new theme called rose-pine.. also option to change between themes. changes applies almost instantly"}, {"post_id": 2056, "ts": "2026-06-04T11:02:30Z", "hours": 0.4669, "text": "improved time for extention to load and fixed looping issue. also added readme for better understanding of the extension"}, {"post_id": 2036, "ts": "2026-06-04T10:07:03Z", "hours": 0.7872, "text": "made the card ui better by disabling button if u dont get enough coins.. also removed that weird white color and replaced it with similar color to the bg"}, {"post_id": 2008, "ts": "2026-06-04T09:04:59Z", "hours": 0.8219, "text": "added the stardust prediction feature to the goals section in shop. also added cumulative and individual tabs for better understanding.."}, {"post_id": 1927, "ts": "2026-06-04T05:05:52Z", "hours": 1.5578, "text": "added stardust prediction to every project show page"}, {"post_id": 1465, "ts": "2026-06-03T14:53:01Z", "hours": 0.5347, "text": "in the shop page when ever you try to remove a wishlisted item by clicking on the x option it redirects to another page “/wishlist/:id”. i removed the redirecting and made the page only reload to show the change. i also added proper staring logic so that the wishlist gets updated in real-time i also added nice animation to turn the star yellow if its wishlisted and black if it isnt wishlisted"}, {"post_id": 1438, "ts": "2026-06-03T14:03:55Z", "hours": 1.3244, "text": "added goal items to shop page now by clicking on the star option you can see the progress u made to buy the item. todo: add predicting depending on how many hours done."}, {"post_id": 1367, "ts": "2026-06-03T11:12:58Z", "hours": 0.6736, "text": "added a progress bar to track how much more coins u need for that specific item. added this to all the shop items.. will update automatically when u get stardust"}, {"post_id": 743, "ts": "2026-06-02T11:32:32Z", "hours": 0.7617, "text": "added devlog inline… doesn’t work atm just a placeholder"}, {"post_id": 663, "ts": "2026-06-02T06:27:29Z", "hours": 1.5389, "text": "remove buttons and moved ship button. also by depending on turbo the changes made by this extention will apply way faster."}, {"post_id": 233, "ts": "2026-06-01T11:09:15Z", "hours": 0.5172, "text": "added better ui for the categories section in shop page…"}, {"post_id": 223, "ts": "2026-06-01T10:22:48Z", "hours": 2.1542, "text": "Created a basic extension using plasma. After experimenting a lot i made the shop page better. here are all the updates: i changed the layout of the shop updates orders and waitlist. moved them downwards to make it look better. updated the cards of shop items.. it was a test i made with ai, il update it soon and bring it back to normal.. i have also fixed the arrow keys in the new section of the shop page. made a button called order to redirect to a different page"}]...
|
Title: Stardance Orbit by @keerthi | Stardance
De Title: Stardance Orbit by @keerthi | Stardance
Devlogs:
Created a basic extension using plasma. After experimenting a lot i made the shop page better. here are all the updates: i changed the layout of the shop updates orders and waitlist. moved them downwards to make it look better. updated the cards of shop items.. it was a test i made with ai, il update it soon and bring it back to normal.. i have also fixed the arrow keys in the new section of the shop page. made a button called order to redirect to a different page
added better ui for the categories section in shop page…
remove buttons and moved ship button. also by depending on turbo the changes made by this extention will apply way faster.
added devlog inline… doesn’t work atm just a placeholder
added a progress bar to track how much more coins u need for that specific item. added this to all the shop items.. will update automatically when u get stardust
added goal items to shop page now by clicking on the star option you can see the progress u made to buy the item. todo: add predicting depending on how many hours done.
in the shop page when ever you try to remove a wishlisted item by clicking on the x option it redirects to another page “/wishlist/:id”. i removed the redirecting and made the page only reload to show the change. i also added proper staring logic so that the wishlist gets updated in real-time i also added nice animation to turn the star yellow if its wishlisted and black if it isnt wishlisted
added stardust prediction to every project show page
added the stardust prediction feature to the goals section in shop. also added cumulative and individual tabs for better understanding..
made the card ui better by disabling button if u dont get enough coins.. also removed that weird white color and replaced it with similar color to the bg
improved time for extention to load and fixed looping issue. also added readme for better understanding of the extension
added a new theme called rose-pine.. also option to change between themes. changes applies almost instantly
added light theme.. for who ever crazy enough to deal with that level of brightness..
added inline edit devlogs instead of redirecting to another page. heavily inspired by stardance-utils!
fixed sm bugs: in shop when u close a wishlisted item the shop item card still is activated. couldn’t figure it out first but it seems the problem was cuz i didnt update localstorage.. matched both the states now it works properly. also did sm button color fixes
what i added: pre-made devlog templates to type faster.. templates added: how it works: click on the dropdown that is placed above the post button and you will have 5 options to chose from. note: this devlog was also written with the help of a template
added focus mode, which disables everything that might be distracting so u can write all ur ideas into the devlog!
added number of words count and estimated time to read devlog. added collapse devlog option where user can collapse devlog so they can scroll thru feed section faster.
options to customize projects tab: grid and list alignment sort by: last updated, most devlogs, most hours, a-z
added the following shortcuts Home - alt + h Rate - alt + v Missions - alt + m Shop - alt + d Resources - alt + e Projects - alt + p Project 1 (what ever is the first project that comes in A-Z order) - alt + 1 Project 2 - alt + 2
added overlay for shortcuts..
added quick-search, using Ctrl+K open a command menu where u can open pages/your projects with ease. you can also search up any project, any person and any post in the whole stardance site!
added custom themes and fonts in the popup now you can customize what theme you want the stardance site to look like and what choose font u would like to use from 20+ fonts added 4 new themes too:- dark-plus, pastel, neon & high-contrast. also added auto saving drafts so that even if u reload the tab. what you have typed wont go away!
added rearrangeable items in wishlist. also increase the quantity of each item (max 30)
make the styles work for every light theme. previously the styles only worked for the catppuccin-latte light theme.. now the styles work for every light theme. added option to show light mode styles in custom themes depends on user!
added readme file with all the features i have added in this extension & installation guide along with sm notes for better understanding of the extension
added tabs in home page to switch between following people’s devlogs, my devlogs and everyone devlogs
Ships:
This is a extention that improves the overall UI/UX of the stardance site to make it more easy for users to access. I had to learn scrapping a lottt before writing this.. but was pretty fun ngl....
|
1793329081.1925924
|
1793415481.1925924
|
|
45388
|
My awesome macropad! by @wwwawus | Stardance
|
wwwawus
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @wwwawus | Stardanc Title: My awesome macropad! by @wwwawus | Stardance...
|
1793329082.4713793
|
1793933882.4713793
|
|
45391
|
Trainnn by @manishr0889 | Stardance
|
manishr0889
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Trainnn by @manishr0889 | Stardance
|
1793329083.3762972
|
1793933883.3762972
|
|
45392
|
Pokemon Black & White Graphics Test by @Praia Pokemon Black & White Graphics Test by @Praia | Stardance...
|
Praia
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Pokemon Black & White Graphics Test by Title: Pokemon Black & White Graphics Test by @Praia | Stardance...
|
1793329084.3061683
|
1793933884.3061683
|
|
45393
|
Spatial-OS by @OjasSingh | Stardance
|
OjasSingh
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Spatial-OS by @OjasSingh | Stardance
|
1793329085.1852822
|
1793933885.1852822
|
|
45395
|
Nasa by @Amilcar14zamora | Stardance
|
Amilcar14zamora
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Nasa by @Amilcar14zamora | Stardance
|
1793329086.0738556
|
1793933886.0738556
|