|
8351
|
Android SMS OTP extractor by @jss | Stardance
|
jss
|
1
|
6.0
|
66
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-06T20:47:38Z", "hours": 6.0, "multiplier": 10.69, "payout": 66, "blessing": "neutral", "text": "I made a local 2FA code extractor. It listens to incoming SMS messages for OTP’s, extracts them and copies them to clipboard automatically. I got this idea from being annoyed at Google’s implementation, which doesnt automatically copy them, like Apple does on iOS. Also with it auto copying 2fa codes, i dont need to grab my phone to get them always :) The documentation was the hardest part of this project, since I used AI to build the code. (which is pretty amazing now that i think about it). Procrastinating for this evening if I should ship this was also a challenge, but cant quit now (sunk cost fallacy). Thats also what i’m the most proud of myself for, actually shippin’ something. To test it, you can download one of the APKs on GitHub. I recommend the lite version for the best compatibility. Thank you!", "repo": "https://github.com/jssfi/sms-otp-extractor", "demo": "https://github.com/jssfi/sms-otp-extractor/releases/tag/1.5"}]...
|
[{"post_id": 3774, "ts": "2026 [{"post_id": 3774, "ts": "2026-06-06T20:28:58Z", "hours": 0.6581, "text": "Finishing touches for the repo, added some screnshots of the app and a rundown on setup and how quick it is ⚡⚡⚡"}, {"post_id": 3685, "ts": "2026-06-06T18:51:10Z", "hours": 3.3531, "text": "A busy day today! Big changelog with a bunch of changes to make the app better, faster, and more lightweight. Changelog: Revamped the app UI Added onboarding for permissions, plus a small demo animation SMS history now updates in real time, instead of needing an app restart Replaced the “OTP copied” notification with a toast Cleaned up the repo by removing the old test app and moving the real app to the repo root Added two app versions: Normal: same behavior as before, with model support Lite: heuristics-only, bringing the APK down to just 1.03 MB :O Added GitHub Actions for release APK builds and learnt about GitHub environments Drastically improved the kinds of messages codes can be extracted from, including some other languages than english Improved scoring accuracy"}, {"post_id": 2907, "ts": "2026-06-05T20:12:52Z", "hours": 2.2475, "text": "This evening has been spent on; Planning what to build and then deciding a SMS OTP extractor is what I want after having to take out my phone for no reason just to find the code there that I needed. Testing what could work, cause AICore apparently isn’t fully available (Prompt API) on that many devices (for example my S25 Ultra doesn’t have it) so i had to pivot to LiteRM-LM Building the test app to see if its fast enough to actually work, which it was, even with the LiteRM-LM model Building the actual SMS reading app that can actually find the OTP in some simple cases atleast. (this fast cause i use Codex for code, but manual debugging was needed :D) Now to find edge cases, UI improvements and overall consistency."}]...
|
Title: Android SMS OTP extractor by @jss | Stardan Title: Android SMS OTP extractor by @jss | Stardance
Devlogs:
This evening has been spent on; Planning what to build and then deciding a SMS OTP extractor is what I want after having to take out my phone for no reason just to find the code there that I needed. Testing what could work, cause AICore apparently isn’t fully available (Prompt API) on that many devices (for example my S25 Ultra doesn’t have it) so i had to pivot to LiteRM-LM Building the test app to see if its fast enough to actually work, which it was, even with the LiteRM-LM model Building the actual SMS reading app that can actually find the OTP in some simple cases atleast. (this fast cause i use Codex for code, but manual debugging was needed :D) Now to find edge cases, UI improvements and overall consistency.
A busy day today! Big changelog with a bunch of changes to make the app better, faster, and more lightweight. Changelog: Revamped the app UI Added onboarding for permissions, plus a small demo animation SMS history now updates in real time, instead of needing an app restart Replaced the “OTP copied” notification with a toast Cleaned up the repo by removing the old test app and moving the real app to the repo root Added two app versions: Normal: same behavior as before, with model support Lite: heuristics-only, bringing the APK down to just 1.03 MB :O Added GitHub Actions for release APK builds and learnt about GitHub environments Drastically improved the kinds of messages codes can be extracted from, including some other languages than english Improved scoring accuracy
Finishing touches for the repo, added some screnshots of the app and a rundown on setup and how quick it is ⚡⚡⚡
Ships:
I made a local 2FA code extractor. It listens to incoming SMS messages for OTP’s, extracts them and copies them to clipboard automatically. I got this idea from being annoyed at Google’s implementation, which doesnt automatically copy them, like Apple does on iOS. Also with it auto copying 2fa codes, i dont need to grab my phone to get them always :) The documentation was the hardest part of this project, since I used AI to build the code. (which is pretty amazing now that i think about it). Procrastinating for this evening if I should ship this was also a challenge, but cant quit now (sunk cost fallacy). Thats also what i’m the most proud of myself for, actually shippin’ something. To test it, you can download one of the APKs on GitHub. I recommend the lite version for the best compatibility. Thank you!...
|
1793436721.7246037
|
1793523121.7246037
|
|
8352
|
Untitled project by @Suyograjput | Stardance
|
Suyograjput
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @Suyograjput | Stardanc Title: Untitled project by @Suyograjput | Stardance...
|
1793245923.6113746
|
1793850723.6113746
|
|
8353
|
WPF-OS by @MineWin2008 | Stardance
|
MineWin2008
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: WPF-OS by @MineWin2008 | Stardance
|
1792727673.2662542
|
1793332473.2662542
|
|
8354
|
Untitled project by @noahnovak31 | Stardance
|
noahnovak31
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @noahnovak31 | Stardanc Title: Untitled project by @noahnovak31 | Stardance...
|
1792738329.1500137
|
1793343129.1500137
|
|
8355
|
My awesome macropad! by @bhavyachowdary | Stardanc My awesome macropad! by @bhavyachowdary | Stardance...
|
bhavyachowdary
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @bhavyachowdary | S Title: My awesome macropad! by @bhavyachowdary | Stardance...
|
1792749216.7688067
|
1793354016.7688067
|
|
8356
|
LiveStudio by @Zaxpris | Stardance
|
Zaxpris
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: LiveStudio by @Zaxpris | Stardance
|
1792724075.6194942
|
1793328875.6194942
|
|
8357
|
Untitled by @Mio | Stardance
|
Mio
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Mio | Stardance
|
1792745395.0285163
|
1793350195.0285163
|
|
8358
|
My first slack bot! by @siddh | Stardance
|
siddh
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @siddh | Stardance
|
1793433290.652561
|
1794038090.652561
|
|
8359
|
My awesome macropad! by @SavageSzym | Stardance
|
SavageSzym
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @SavageSzym | Stard Title: My awesome macropad! by @SavageSzym | Stardance...
|
1793148904.2324684
|
1793753704.2324684
|
|
8360
|
Untitled project by @kingm_m | Stardance
|
kingm_m
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @kingm_m | Stardance
|
1792785197.2069182
|
1793389997.2069182
|
|
8361
|
CLOVER by @taokyle | Stardance
|
taokyle
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: CLOVER by @taokyle | Stardance
|
1792770755.1270974
|
1793375555.1270974
|
|
8362
|
My first slack bot! by @didacropi | Stardance
|
didacropi
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @didacropi | Stardan Title: My first slack bot! by @didacropi | Stardance...
|
1793411266.6788218
|
1794016066.6788218
|
|
8363
|
My awesome macropad! by @seinlinn | Stardance
|
seinlinn
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @seinlinn | Stardan Title: My awesome macropad! by @seinlinn | Stardance...
|
1793393294.2292092
|
1793998094.2292092
|
|
8364
|
Instagram Recipe Lister by @tigane_guelloul | Star Instagram Recipe Lister by @tigane_guelloul | Stardance...
|
tigane_guelloul
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Instagram Recipe Lister by @tigane_guelloul Title: Instagram Recipe Lister by @tigane_guelloul | Stardance...
|
1793184500.0877764
|
1793789300.0877764
|
|
8365
|
app by @pratyushtheplatypus | Stardance
|
pratyushtheplatypus
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: app by @pratyushtheplatypus | Stardance
|
1793404064.5690267
|
1794008864.5690267
|
|
8366
|
Python Sandbox Automater by @Maglev | Stardance
|
Maglev
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Python Sandbox Automater by @Maglev | Stard Title: Python Sandbox Automater by @Maglev | Stardance...
|
1792781268.617877
|
1793386068.617877
|
|
8367
|
Snowfall M6 by @linqfy | Stardance
|
linqfy
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Snowfall M6 by @linqfy | Stardance
|
1793299944.664824
|
1793904744.664824
|
|
8368
|
WinRar by @dolphinvladik | Stardance
|
dolphinvladik
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: WinRar by @dolphinvladik | Stardance
|
1793256582.7483242
|
1793861382.7483242
|
|
8369
|
My awesome macropad! by @flummoxed | Stardance
|
flummoxed
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @flummoxed | Starda Title: My awesome macropad! by @flummoxed | Stardance...
|
1793353722.4240103
|
1793958522.4240103
|
|
8370
|
Untitled by @Aatif_Fairoz | Stardance
|
Aatif_Fairoz
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Aatif_Fairoz | Stardance
|
1792752785.2742581
|
1793357585.2742581
|
|
8371
|
My first slack bot! by @leonid0087123 | Stardance
|
leonid0087123
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @leonid0087123 | Sta Title: My first slack bot! by @leonid0087123 | Stardance...
|
1793245669.2495158
|
1793850469.2495158
|
|
8372
|
Printer Vendo by @rul3zero | Stardance
|
rul3zero
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Printer Vendo by @rul3zero | Stardance
|
1792731040.6249046
|
1793335840.6249046
|
|
8373
|
Untitled project by @luca_mariani | Stardance
|
luca_mariani
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @luca_mariani | Stardan Title: Untitled project by @luca_mariani | Stardance...
|
1793177447.7283018
|
1793782247.7283018
|
|
8374
|
My awesome macropad! by @m435 | Stardance
|
m435
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @m435 | Stardance
|
1792803054.8698795
|
1793407854.8698795
|
|
8375
|
My first slack bot! by @zydsonek123 | Stardance
|
zydsonek123
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @zydsonek123 | Stard Title: My first slack bot! by @zydsonek123 | Stardance...
|
1792734660.008953
|
1793339460.008953
|
|
8376
|
My first slack bot! by @flummoxed | Stardance
|
flummoxed
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @flummoxed | Stardan Title: My first slack bot! by @flummoxed | Stardance...
|
1793346948.9067307
|
1793951748.9067307
|
|
8377
|
Nautica API by @xellu | Stardance
|
xellu
|
1
|
26.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T18:37:11Z", "hours": 26.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I’ve updated the Service Manager, including the dependency resolver. These changes include: New lifecycle hook “onSetup”, intended for setting up databases, etc. I’ve mostly added this to split “start servers” and “setup things” all being in onStart. This way the separation between those 2 tasks is clear and helps to eliminate certain race conditions. Toggle switches are now generated automatically Before you had to manually declare a key in a config in onInstall, and then read it in isEnabled, which was just extra boilerplate. So I automated the process in the Service class. “?”, “:after” and “:after?” parameters for dependencies Before this, the boot order was still fragile even with dependencies defined, because the ability to define a dependency, and make it start only AFTER your dependency is initialized wasn’t a thing. Now you can do this by simply appending “:after” to the dependency name. “?” at the end also makes the dependency optional. Few fixes relating to dependency resolution and boot orders HTTP API Got a decently big update as well.. The performance is now up ~70% from previous versions, finally surpassing FastAPI, I’ve achieved this adding an option to disable unnecessary messages from being logged. Which only goes to show how heavy the logging manager I use is, but I doubt I’ll be rewriting it, since the way it is now helps with DX. Response validation using “@HTTP.Responses(…)” and ReplyModels: Before you were able to only validate what’s coming in, but not what’s going out. The validator has a strict mode, which when enabled adds an extra layer of “security”. If strict mode is disabled, the responses are only used for OpenAPI docs generation. Tho the framework may still complain if you’re sending invalid responses. Nested object validation and Require.ListOf Static methods in Reply Since the framework is built on Starlette, you may need to use Starlette’s responses in some cases. OpenAPI Docs generation This was kinda a big thing on my list ever since I realized that I can automatically generate SDKs instead of having to write request calls manually. I also wanted to add a way to expose the docs with an endpoint, but I’m holding off on that. The Package registry & manager were introduced as well. The package registry it itself built on Nautica, and works with the package manager integrated into the Nautica’s CLI. Likewise I’ve started work on the Landing page & docs website for the framework, but I’m putting it off for a bit, because of finals. I’ve also fixed countless bugs, refactored things, and over all made many QoL changes, which helped to make the framework feel more polished. This might be a strange project, since I’m somewhat “reinventing the wheel”, but I really didn’t like the way FastAPI, Flask and other Python HTTP frameworks work. It basically handles ONLY the http part, which is fine, but in bigger projects YOU have to manage everything else around it. When I was building small apps it wasn’t that big of an issue, but it became pretty apparent in bigger projects. The complexity and boilerplate that comes with large projects isn’t something I can handle well, while also having to enforce my own conventions. I made Nautica to fix these issues, and I’d say I succeeded. The boilerplate that’s needed per route is minimal, compared to other frameworks; The package manager adds an intuitive way to add plugins (services, packages), and the service system itself does a lot of the heavy lifting for you, by automatically deciding on the boot order instead of you having to write do it explicitly using imports, etc. In conclusion, Nautica takes away some freedom and in exchange gives you structure, less boilerplate and tools to debug your code, which makes shipping apps easier and faster.", "repo": "https://github.com/xellu/nautica-api", "demo": "https://napm.xellu.xyz/"}]...
|
[{"post_id": 9382, "ts": "2026 [{"post_id": 9382, "ts": "2026-06-15T18:35:53Z", "hours": 0.2822, "text": "A showcase of what Nautica can actually do ~20% faster than FastAPI ( https://github.com/xellu/nautica-api/wiki/Performance-Benchmark ) See Nautica in action: https://napm.xellu.xyz/ ( https://github.com/xellu/nautica-package-manager ) A video demonstration:"}, {"post_id": 9251, "ts": "2026-06-15T15:12:52Z", "hours": 3.4914, "text": "I’ve released v3.2.2, the new things there include: OpenAPI Docs generator Changed expression for nested requirements from nested(...) to {...} Request schemas in errors can be hidden now Added descriptions for commands in help Renamed Reply.IsList() into .asList() Added import aliases for Requirement s in napi These are mostly QoL changes, I made formatting of certain things so it’d be easier to read, use, or to make sense linguistically. I also made it a little bit more secure by giving other developers an option to hide their request schemas in error messages. I’ve also included the new benchmark numbers in the README. OpenAPI Docs generator mostly works now, but it doesn’t expose the docs to /nautica:docs yet, I’m also considering making the endpoint the developer’s concern, and not the framework’s. Surprisingly it wasn’t as hard as i expected it to be, but some weird edge cases were definitely annoying to deal with. Anyways, alongside the updates to the framework itself, I’ve also now documented the new changes made since version 3.0.2 , so they’re now up to date with the latest release (that being 3.2.2). I know it took a while but i was more focused on releasing fixes and updates first. https://github.com/xellu/nautica-api/wiki https://github.com/xellu/nautica-api/compare/3.2.0...3.2.2"}, {"post_id": 7424, "ts": "2026-06-12T11:29:02Z", "hours": 2.5219, "text": "I’ve started work on OpenAPI Docs generator, I’d imagine it’ll take me a while to complete. Anyways I’ve released v3.2, see below for new changes Changelog Improved speed and latency New onSetup hook for services Auto Switch registration for services New Require.ListOf validator Validator support for nested objects Better dependency resolver More on these changes here: post 1 , post 2 And new, undocumented changes include: 7. Moving typeToString into models, from http api (didn’t really make sense to have it there) 8. Added static methods into Reply for starlette responses, these include: Reply.plainText , Reply.html , Reply.stream , Reply.file , Reply.redirect . Known Issues v3.2.0 ’s dependency resolver incorrectly handles the :after parameter, a fix is already available in the branch for version 3.2.1"}, {"post_id": 5590, "ts": "2026-06-09T13:20:22Z", "hours": 3.5031, "text": "I’ve added a few QoL features, those being: Reply Models Before, you could only verify whats coming IN, but not whats coming OUT of the server. Now, you can do that easily: from napi.http import HTTP , Reply , Require , ReplyModel , Error @HTTP.GET () @HTTP.Responses ( ReplyModel ( 200 , str ), ReplyModel ( 400 , Error ), strict = True ) @HTTP.Require () async def hello ( ctx ): if ctx . body . get ( \" hello \" ): raise Error ( 400 , \" No hello \" ) return \" Hello World! \" In this case, the request will go through without an issue, but if, for example, you returned anything other than a string: return 0 The request will fail automatically. This will also be useful for when I add OpenAPI generation, as the generator will have access to the responses. This behavior can be disabled, by setting strict to False. Nested object validation @HTTP.Require(body = {\"hello\": {\"world\": str}) <- This code used to be invalid before. I since added support for nested objects (no depth limit). Automatic Toggle Switch Registration Plugins used to register their own keys in the config, and then setup isEnabled method that would determine if the service should be started or not. To reduce the headache and boilerplate of this approach, Nautica now automatically creates a key with your service’s name under services in config.n3 . If you want your own logic in isEnabled , you can do so by overwriting the method. By doing so you’ll disable the automatic registration and the framework gives you the freedom to do it your way. If you want custom logic AND automatic registration, it can simply be combined by using super().isEnabled() . Require.ListOf(…) I’d say this is a highly useful addition. It does exactly what it sounds like: It checks if all the items in a list match a certain schema. Require . ListOf ( str ) List of just strings Require . ListOf ({ \" hello \" : str }) List of dictionaries Requrie . ListOf ( Require . AnyTypeOf ( str , int )) List of strings and integers"}, {"post_id": 5477, "ts": "2026-06-09T08:37:59Z", "hours": 2.5575, "text": "I’ve been optimizing the framework today, here’s what changed: 1. Massive performance boosts I managed to go from 2279 requests/sec to 3929 , which is 72% increase . After running new benchmarks, I’ve also surpassed FastAPI by ~24% (recorded 3154 requests/sec). I did this by minimizing the amount of logging that is done per request (can be configured). Because my log manager is fairly heavy, this helped a lot. 2. Better dependency resolver The dependency resolver I had for services was okay, but it lacked 2 important features: Optional dependencies and explicit order. The old system was simply: Service.Export(MyPlugin, depends_on=[\"HTTPRouter\"]) Which is fine for simple plugins, but you start doing more complex work, you’ll hit the limits fast. The new system now handles: ? at the end makes the dependency optional :after tells the dependency to start AFTER your plugin, not before. Essentially adds your plugin as the target’s dependency. 3. Split onStart Before, onStart handled both starting database and HTTP servers, bots. Because of this, I’ve decided to split the setup logic and startup logic into 2: onSetup and onStart 4. Other changes I also removed some legacy aliases for methods."}, {"post_id": 4899, "ts": "2026-06-08T14:01:14Z", "hours": 4.65, "text": "Spent almost 5 hours on a navbar, finally figured it out though. The open/close logic on hovering was a nightmare to do. In the end i settled for IDs and an event listener for mouseover . It’s probably one of the worse solutions, but I’m not gonna touch it since it works finally. I also changed the background to something that fits better."}, {"post_id": 4426, "ts": "2026-06-07T19:03:56Z", "hours": 3.8883, "text": "I’ve started work on a web for the framework. For now I only managed to set up the project and make the hero on the landing page, for which I took inspiration from payloadcms and rig.ai The landing page itself was hard to make, since I had to figure out how to structure the grid, and even now it’s not up to my standards."}, {"post_id": 4114, "ts": "2026-06-07T09:41:14Z", "hours": 2.2639, "text": "Nautica Package Registry is Live! napi install mongodb now downloads the package into project plugins and installs any PyPI dependencies automatically. 2 Packages are up already: MongoDB: Adapter for pymongo NAuth: A simple session manager (using Mongo) The registry itself runs on Nautica, with both packages installed https://github.com/xellu/nautica-package-manager https://napm.xellu.xyz/"}, {"post_id": 3635, "ts": "2026-06-06T17:32:12Z", "hours": 2.7833, "text": "Hello y’all. I’m making a framework for backend development, called Nautica. I’m also bundling a package manager, similar to npm/PyPI, to allow people to share their plugins. I’ve started working on this project before Stardance, but this sounds like a good opportunity to get feedback on it. Today’s update notes (v3.1.3): Fixed shell sleeping while in systemd mode Fixed file reading during http requests Fixed package manager connection issues Added commands to list http and websocket endpoints For anyone interested in the specifics, the HTTP part of the API is built on top Starlette. Unlike FastAPI, I made my own request validation system that gives you more freedom, though it may perform worse under load. From the benchmarks I’ve ran, my framework seems to be just a little faster than FastAPI (which is also based on Starlette): FastAPI: 2259 requests/second Nautica: 2271 requests/second ~0.53% faster Though these numbers are a bit dated, and may be off. I’m still working on the package manager, but I’ll post a showcase of that soon. For now, here’s a showcase of how Nautica itself works:"}]...
|
Title: Nautica API by @xellu | Stardance
Devlogs: Title: Nautica API by @xellu | Stardance
Devlogs:
Hello y’all. I’m making a framework for backend development, called Nautica. I’m also bundling a package manager, similar to npm/PyPI, to allow people to share their plugins. I’ve started working on this project before Stardance, but this sounds like a good opportunity to get feedback on it. Today’s update notes (v3.1.3): Fixed shell sleeping while in systemd mode Fixed file reading during http requests Fixed package manager connection issues Added commands to list http and websocket endpoints For anyone interested in the specifics, the HTTP part of the API is built on top Starlette. Unlike FastAPI, I made my own request validation system that gives you more freedom, though it may perform worse under load. From the benchmarks I’ve ran, my framework seems to be just a little faster than FastAPI (which is also based on Starlette): FastAPI: 2259 requests/second Nautica: 2271 requests/second ~0.53% faster Though these numbers are a bit dated, and may be off. I’m still working on the package manager, but I’ll post a showcase of that soon. For now, here’s a showcase of how Nautica itself works:
Nautica Package Registry is Live! napi install mongodb now downloads the package into project plugins and installs any PyPI dependencies automatically. 2 Packages are up already: MongoDB: Adapter for pymongo NAuth: A simple session manager (using Mongo) The registry itself runs on Nautica, with both packages installed https://github.com/xellu/nautica-package-manager https://napm.xellu.xyz/
I’ve started work on a web for the framework. For now I only managed to set up the project and make the hero on the landing page, for which I took inspiration from payloadcms and rig.ai The landing page itself was hard to make, since I had to figure out how to structure the grid, and even now it’s not up to my standards.
Spent almost 5 hours on a navbar, finally figured it out though. The open/close logic on hovering was a nightmare to do. In the end i settled for IDs and an event listener for mouseover . It’s probably one of the worse solutions, but I’m not gonna touch it since it works finally. I also changed the background to something that fits better.
I’ve been optimizing the framework today, here’s what changed: 1. Massive performance boosts I managed to go from 2279 requests/sec to 3929 , which is 72% increase . After running new benchmarks, I’ve also surpassed FastAPI by ~24% (recorded 3154 requests/sec). I did this by minimizing the amount of logging that is done per request (can be configured). Because my log manager is fairly heavy, this helped a lot. 2. Better dependency resolver The dependency resolver I had for services was okay, but it lacked 2 important features: Optional dependencies and explicit order. The old system was simply: Service.Export(MyPlugin, depends_on=["HTTPRouter"]) Which is fine for simple plugins, but you start doing more complex work, you’ll hit the limits fast. The new system now handles: ? at the end makes the dependency optional :after tells the dependency to start AFTER your plugin, not before. Essentially adds your plugin as the target’s dependency. 3. Split onStart Before, onStart handled both starting database and HTTP servers, bots. Because of this, I’ve decided to split the setup logic and startup logic into 2: onSetup and onStart 4. Other changes I also removed some legacy aliases for methods.
I’ve added a few QoL features, those being: Reply Models Before, you could only verify whats coming IN, but not whats coming OUT of the server. Now, you can do that easily: from napi.http import HTTP , Reply , Require , ReplyModel , Error @HTTP.GET () @HTTP.Responses ( ReplyModel ( 200 , str ), ReplyModel ( 400 , Error ), strict = True ) @HTTP.Require () async def hello ( ctx ): if ctx . body . get ( " hello " ): raise Error ( 400 , " No hello " ) return " Hello World! " In this case, the request will go through without an issue, but if, for example, you returned anything other than a string: return 0 The request will fail automatically. This will also be useful for when I add OpenAPI generation, as the generator will have access to the responses. This behavior can be disabled, by setting strict to False. Nested object validation @HTTP.Require(body = {"hello": {"world": str}) <- This code used to be invalid before. I since added support for nested objects (no depth limit). Automatic Toggle Switch Registration Plugins used to register their own keys in the config, and then setup isEnabled method that would determine if the service should be started or not. To reduce the headache and boilerplate of this approach, Nautica now automatically creates a key with your service’s name under services in config.n3 . If you want your own logic in isEnabled , you can do so by overwriting the method. By doing so you’ll disable the automatic registration and the framework gives you the freedom to do it your way. If you want custom logic AND automatic registration, it can simply be combined by using super().isEnabled() . Require.ListOf(…) I’d say this is a highly useful addition. It does exactly what it sounds like: It checks if all the items in a list match a certain schema. Require . ListOf ( str ) List of just strings Require . ListOf ({ " hello " : str }) List of dictionaries Requrie . ListOf ( Require . AnyTypeOf ( str , int )) List of strings and integers
I’ve started work on OpenAPI Docs generator, I’d imagine it’ll take me a while to complete. Anyways I’ve released v3.2, see below for new changes Changelog Improved speed and latency New onSetup hook for services Auto Switch registration for services New Require.ListOf validator Validator support for nested objects Better dependency resolver More on these changes here: post 1 , post 2 And new, undocumented changes include: 7. Moving typeToString into models, from http api (didn’t really make sense to have it there) 8. Added static methods into Reply for starlette responses, these include: Reply.plainText , Reply.html , Reply.stream , Reply.file , Reply.redirect . Known Issues v3.2.0 ’s dependency resolver incorrectly handles the :after parameter, a fix is already available in the branch for version 3.2.1
I’ve released v3.2.2, the new things there include: OpenAPI Docs generator Changed expression for nested requirements from nested(...) to {...} Request schemas in errors can be hidden now Added descriptions for commands in help Renamed Reply.IsList() into .asList() Added import aliases for Requirement s in napi These are mostly QoL changes, I made formatting of certain things so it’d be easier to read, use, or to make sense linguistically. I also made it a little bit more secure by giving other developers an option to hide their request schemas in error messages. I’ve also included the new benchmark numbers in the README. OpenAPI Docs generator mostly works now, but it doesn’t expose the docs to /nautica:docs yet, I’m also considering making the endpoint the developer’s concern, and not the framework’s. Surprisingly it wasn’t as hard as i expected it to be, but some weird edge cases were definitely annoying to deal with. Anyways, alongside the updates to the framework itself, I’ve also now documented the new changes made since version 3.0.2 , so they’re now up to date with the latest release (that being 3.2.2). I know it took a while but i was more focused on releasing fixes and updates first. https://github.com/xellu/nautica-api/wiki https://github.com/xellu/nautica-api/compare/3.2.0...3.2.2
A showcase of what Nautica can actually do ~20% faster than FastAPI ( https://github.com/xellu/nautica-api/wiki/Performance-Benchmark ) See Nautica in action: https://napm.xellu.xyz/ ( https://github.com/xellu/nautica-package-manager ) A video demonstration:
Ships:
I’ve updated the Service Manager, including the dependency resolver. These changes include: New lifecycle hook “onSetup”, intended for setting up databases, etc. I’ve mostly added this to split “start servers” and “setup things” all being in onStart. This way the separation between those 2 tasks is clear and helps to eliminate certain race conditions. Toggle switches are now generated automatically Before you had to manually declare a key in a config in onInstall, and then read it in isEnabled, which was just extra boilerplate. So I automated the process in the Service class. “?”, “:after” and “:after?” parameters for dependencies Before this, the boot order was still fragile even with dependencies defined, because the ability to define a dependency, and make it start only AFTER your dependency is initialized wasn’t a thing. Now you can do this by simply appending “:after” to the dependency name. “?” at the end also makes the dependency optional. Few fixes relating to dependency resolution and boot orders HTTP API Got a decently big update as well.. The performance is now up ~70% from previous versions, finally surpassing FastAPI, I’ve achieved this adding an option to disable unnecessary messages from being logged. Which only goes to show how heavy the logging manager I use is, but I doubt I’ll be rewriting it, since the way it is now helps with DX. Response validation using “@HTTP.Responses(…)” and ReplyModels: Before you were able to only validate what’s coming in, but not what’s going out. The validator has a strict mode, which when enabled adds an extra layer of “security”. If strict mode is disabled, the responses are only used for OpenAPI docs generation. Tho the framework may still complain if you’re sending invalid responses. Nested object validation and Require.ListOf Static methods in Reply Since the framework is built on Starlette, you may need to use Starlette’s responses in some cases. OpenAPI Docs generation This was kinda a big thing on my list ever since I realized that I can automatically generate SDKs instead of having to write request calls manually. I also wanted to add a way to expose the docs with an endpoint, but I’m holding off on that. The Package registry & manager were introduced as well. The package registry it itself built on Nautica, and works with the package manager integrated into the Nautica’s CLI. Likewise I’ve started work on the Landing page & docs website for the framework, but I’m putting it off for a bit, because of finals. I’ve also fixed countless bugs, refactored things, and over all made many QoL changes, which helped to make the framework feel more polished. This might be a strange project, since I’m somewhat “reinventing the wheel”, but I really didn’t like the way FastAPI, Flask and other Python HTTP frameworks work. It basically handles ONLY the http part, which is fine, but in bigger projects YOU have to manage everything else around it. When I was building small apps it wasn’t that big of an issue, but it became pretty apparent in bigger projects. The complexity and boilerplate that comes with large projects isn’t something I can handle well, while also having to enforce my own conventions. I made Nautica to fix these issues, and I’d say I succeeded. The boilerplate that’s needed per route is minimal, compared to other frameworks; The package manager adds an intuitive way to add plugins (services, packages), and the service system itself does a lot of the heavy lifting for you, by automatically deciding on the boot order instead of you having to write do it explicitly using imports, etc. In conclusion, Nautica takes away some freedom and in exchange gives you structure, less boilerplate and tools to debug your code, which makes shipping apps easier and faster....
|
1793310709.9574006
|
1793397109.9574006
|
|
8378
|
My first slack bot! by @KoolVamp | Stardance
|
KoolVamp
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @KoolVamp | Stardanc Title: My first slack bot! by @KoolVamp | Stardance...
|
1792741868.208713
|
1793346668.208713
|
|
8379
|
Untitled project by @kavix | Stardance
|
kavix
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @kavix | Stardance
|
1793350282.767055
|
1793955082.767055
|
|
8380
|
squareBoy by @Leo-mas | Stardance
|
Leo-mas
|
1
|
8.15
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-08T16:18:34Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "made a macropad! called niripad for my niri keybinds, however i dont have the parts :(", "repo": "https://github.com/LeoMaskell/macropad", "demo": ""}]...
|
[{"post_id": 11929, "ts": "202 [{"post_id": 11929, "ts": "2026-06-19T13:41:31Z", "hours": 3.8442, "text": "redesigned the case :)"}, {"post_id": 8861, "ts": "2026-06-14T19:09:55Z", "hours": 2.0489, "text": "rewired and cut the PCB! added fillets to edge.cuts added a silkscreen fixed switch spacing"}, {"post_id": 5697, "ts": "2026-06-09T16:15:09Z", "hours": 2.2558, "text": "finnished the final PCB!"}, {"post_id": 3666, "ts": "2026-06-06T18:25:25Z", "hours": 0.3911, "text": "made the basic starter project in cad will now redesign with all the other components"}]...
|
Title: squareBoy by @Leo-mas | Stardance
Devlogs: Title: squareBoy by @Leo-mas | Stardance
Devlogs:
made the basic starter project in cad will now redesign with all the other components
finnished the final PCB!
rewired and cut the PCB! added fillets to edge.cuts added a silkscreen fixed switch spacing
redesigned the case :)
Ships:
made a macropad! called niripad for my niri keybinds, however i dont have the parts :(...
|
1793274811.080111
|
1793361211.080111
|
|
8381
|
Untitled project by @quankiugl | Stardance
|
quankiugl
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @quankiugl | Stardance
|
1793321345.193542
|
1793926145.193542
|
|
8382
|
My awesome macropad! by @2400090005_9497 | Stardan My awesome macropad! by @2400090005_9497 | Stardance...
|
2400090005_9497
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @2400090005_9497 | Title: My awesome macropad! by @2400090005_9497 | Stardance...
|
1793418826.4098053
|
1794023626.4098053
|
|
8383
|
Asd by @f20250299 | Stardance
|
f20250299
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Asd by @f20250299 | Stardance
|
1793195595.840619
|
1793800395.840619
|
|
8384
|
My awesome macropad! by @araizahmad93 | Stardance
|
araizahmad93
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @araizahmad93 | Sta Title: My awesome macropad! by @araizahmad93 | Stardance...
|
1793342853.5395591
|
1793947653.5395591
|
|
8385
|
My first slack bot! by @AdaChan | Stardance
|
AdaChan
|
2
|
21.0
|
75
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T17:54:11Z", "hours": 17.0, "multiplier": 4.36, "payout": 75, "blessing": "neutral", "text": "I made Koizinho, a Slack bot with several fun and useful commands. Some of my favorite commands are /koi-user, which generates a card with information about a selected user, /koi-sound, which lets you choose and listen to animal sounds, and /koi-tts, which converts text into spoken audio. The most challenging part was definitely /koi-user. I wanted the bot to generate a custom image with information about a user, but working with Canvas in JavaScript was much harder than I expected. I ran into a lot of errors, especially with positioning and generating the image correctly. I also experimented with Python and JavaScript communicating with each other before eventually deciding to keep the image generation in JavaScript. There were many moments where fixing one error somehow created another one. 😭 I’m proud that I managed to keep working on the project even when some parts became really frustrating. I learned a lot about Slack commands, modals, APIs, image generation, audio, and organizing a larger JavaScript project. /koi-user was especially satisfying because it went from being a huge mess of errors to actually working.", "repo": "https://github.com/Hallow303/MySlackBot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BJ6DKPT36"}, {"ship_num": 2, "ts": "2026-07-14T22:21:44Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created a Slack bot using JavaScript. My bot features nine commands, including /koi-ping, which replies with “Pong!” to check if the bot is online; /koi-apod, which uses the NASA API to send the Astronomy Picture of the Day; commands like /koi-cat, /koi-dog, /koi-fox, and /koi-duck, which use APIs to send random animal images; /koi-sound, which sends MP3 animal sounds; /koi-say, which repeats the user’s message; and /koi-tts, which converts text to speech using Microsoft Edge TTS. To develop the project, I used various APIs, primarily to fetch images from NASA and of animals. I also worked with audio files to implement the commands related to sounds and text-to-speech conversion. The biggest challenge during development was dealing with file paths. Honestly… who decided it had to work that way? 😭 I spent a long time trying to figure out why the files weren’t being found before I managed to organize everything correctly.", "repo": "https://github.com/Hallow303/MySlackBot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BJ6DKPT36"}]...
|
[{"post_id": 63069, "ts": "202 [{"post_id": 63069, "ts": "2026-09-06T17:41:50Z", "hours": 3.6686, "text": "DevLog #22 I finally got it working. I discovered the error was in how the commands were being loaded, since they were all being loaded from a “commands” folder via index.js , they were taking too long to respond; because of the response time limit, an error kept popping up. I managed to fix it, though, and now it works =) I also fixed some bugs in other commands."}, {"post_id": 62211, "ts": "2026-09-05T14:00:46Z", "hours": 0.6558, "text": "DevLog #21 I made some adjustments, I think I’ll rewrite some of the bot’s commands, I fixed some existing errors (and created others =( unfortunately). But I think it’s getting better now."}, {"post_id": 61188, "ts": "2026-09-04T00:12:53Z", "hours": 0.4742, "text": "DevLog #20 I updated the project’s README; it remains quite simple because the bot is also simple, haha. I gave up on the /koi-user command for now, it was giving me too many headaches, so I’ll leave it for later."}, {"post_id": 59935, "ts": "2026-09-02T00:06:33Z", "hours": 0.4239, "text": "DevLog #19 I created a command called /koi-help that lists all the bot’s available commands. This will be useful since we already have quite a few commands; I plan to replace that wall of text with a menu where the user can choose a category (general, animals, utilities, games), and the bot will respond with the commands for that category to avoid cluttering the chat."}, {"post_id": 59929, "ts": "2026-09-01T23:27:35Z", "hours": 1.2503, "text": "DevLog #18 So… this command is really frustrating me; every time I fix something, another error pops up, and I don’t know what to do. At least most of it is already done. I hope I can sort this out soon."}, {"post_id": 58183, "ts": "2026-08-30T15:18:53Z", "hours": 1.08, "text": "DevLog #17 Still struggling with this command ( /koi-user ), it was supposed to be ‘easy,’ but I just ended up complicating the code even further. Well, I’m still trying to organize the elements in the image and fix an error that prevents the bot from sending the card to the user, it’s getting really annoying (why does JS have to be like this?). I hope to finish this command soon; maybe DevLog 18 will be about that, but for now, I’ll keep working on it 🥀🙏"}, {"post_id": 51363, "ts": "2026-08-20T23:57:09Z", "hours": 0.3933, "text": "DevLog #16 Fixing bugs again. I gave up on using Python + JavaScript; honestly, it was getting too difficult. Now I need to sort out the positioning, because when I was porting the code from Python to JS, the elements ended up out of place. I’m not sure if Python and JS handle image pixels differently."}, {"post_id": 50302, "ts": "2026-08-19T13:47:19Z", "hours": 0.5353, "text": "DevLog #15 I’m reviewing some commands I’ve already implemented and fixing a few issues. Strangely, the bot is taking a while to respond; it keeps displaying the message /koi-calc failed because the app did not respond... repeatedly, yet a few seconds later, the bot actually executes the command which is really odd."}, {"post_id": 49987, "ts": "2026-08-19T00:40:21Z", "hours": 0.8622, "text": "DevLog #14 Today I added two more simple commands /koi-rps and /koi-calc . /koi-calc actually already existed, but I had ended up deleting it. /koi-rps is a small Rock, Paper, Scissors game. The user chooses rock, paper, or scissors, and Koizinho makes a random choice. Then, the bot compares the two choices and announces whether the player won, lost, or tied."}, {"post_id": 46635, "ts": "2026-08-14T01:05:51Z", "hours": 1.1544, "text": "DevLogs #13 I didn’t implement any new features today; I just fixed some bugs that were cropping up in Koizinho’s commands."}, {"post_id": 44304, "ts": "2026-08-09T23:34:58Z", "hours": 0.4442, "text": "DevLog #12 I discovered that it’s possible to make .py and .js interact with each other. Now I’m learning how this communication works and trying not to explode in the process. XD"}, {"post_id": 44012, "ts": "2026-08-09T14:39:57Z", "hours": 1.5331, "text": "DevLog #11 Well, I finally finished the Easy-PIL part in Python! The card is ready now. I also set up the system so that data is automatically populated based on a JSON file. When someone uses the /koi-user command, it generates a JSON file with the selected user’s information, and then the Python script uses that data to create the card. I designed the card myself in Canva. I spent way too much time on something so simple XD, but I really liked the result!"}, {"post_id": 43630, "ts": "2026-08-09T00:23:13Z", "hours": 2.215, "text": "DevLog #10 I’m changing the user info card. I’m now using Python to generate the images. Honestly, using the JS Canvas is a real pain, and Python’s Easy-PIL turns out to be much easier. Now, the tricky part will be handling the communication between the .js and .py files."}, {"post_id": 41051, "ts": "2026-08-05T00:23:54Z", "hours": 1.3928, "text": "DevLog #9 I’m developing a new command called /koi-user . It displays information about the user you choose. Since the arguments of slash commands in Slack aren’t very organized (in the sense of having defined types), I had to work around the problem. In Discord, for example, you can define an argument as user_mention , so Discord itself understands that it’s a user. In Slack, it doesn’t work that way. You can’t even pass a mention as an argument to the command, lol. So the solution I found was to create a modal. When you use the command, a window opens with all the users in the workspace, and you can search by name or choose one from the list. After sending, the bot generates an image with some user information and sends the result to you. (Some text is still in Portuguese because I haven’t translated everything into English yet. ;-;)"}, {"post_id": 38937, "ts": "2026-08-01T15:28:57Z", "hours": 1.1856, "text": "DevLog #8 I decided to continue developing the bot, so here’s what I’ve done since the last update: 1. Code organization I improved the project’s organization by separating command groups into different files. Now, each file has a specific responsibility: animals → animal-related commands, such as /koi-duck , /koi-cat , /koi-dog , and others. space → space-related commands, such as /koi-apod . I plan to add more commands in this category later. utility → general commands, such as /koi-say and /koi-tts . This has made the code much easier to maintain and allows for easier addition of new features. 2. Loading system for responses One thing that really bothered me was when a command took a while to respond. On Discord, when a bot is processing something, a “Bot is thinking…” message appears while it works. I couldn’t find an exact equivalent on Slack, so I decided to create my own system. Now, some commands send a loading message first—for example: 🦆 Looking for a duck… Once the command finishes, that message is updated with the final response. This makes for a much better experience; before, it used to look like the bot had stopped working lol. 3. Direct messages with the bot I finally managed to enable DMs for the bot! Now you can chat directly with Koizinho in private. It can already respond to simple messages, for example: User: Hi! Koizinho: Hello! I still want to improve this part. Maybe I’ll add some form of AI or a smarter conversation system in the future."}, {"post_id": 28574, "ts": "2026-07-14T22:13:38Z", "hours": 0.2719, "text": "DevLog #7 The bot is finally online! 🚀 I deployed it to Hack Club Nest, so now it runs 24/7."}, {"post_id": 27993, "ts": "2026-07-13T23:19:54Z", "hours": 0.6744, "text": "DevLog #6 Okay… I finally finished the project’s README! 🎉 I think it turned out pretty cool; it’s not super professional yet, but I think it does a good job of showing what the bot can do. I might improve it in the future whenever I can shake off the laziness, haha. I also realized I used Axios quite a bit in this project. Most of the new commands rely on external APIs. There isn’t much else to add to this devlog; at least I’m happy it’s not just a bot that replies “pong” 😆"}, {"post_id": 27958, "ts": "2026-07-13T22:02:39Z", "hours": 0.6086, "text": "DevLog #5 New command, wow!! 🎉🎉🎉🎉 Person: “Wait… isn’t that just /koi-say ?” Well… sort of. It’s basically an improved /koi-say . Meet the new command: /koi-tts . As the name suggests, TTS stands for Text to Speech . The bot takes the text you send, uses Microsoft Edge’s TTS voices to turn it into an MP3, and then sends the audio back to you. Pretty cool. =) (I hate path 😭)"}, {"post_id": 27928, "ts": "2026-07-13T21:07:14Z", "hours": 0.2622, "text": "DevLog #4 Today I added a very simple command: /koi-say . It does exactly what the name suggests: the bot repeats the message you type. Nothing spectacular, but it’s a classic, useful command for testing interactions. If you don’t type anything, the bot replies by letting you know that text is required. The message might seem a bit blunt… but remember: it’s just a koizinho . 😭 By the way, I was thinking about how to explain the bot’s name in English. I think the closest equivalent would be something like “little koi” . In Portuguese, we use the suffix -zinho to form a diminutive that often conveys affection or cuteness. So, koizinho would be something like a “little koi” or an affectionate way to refer to the bot."}, {"post_id": 27912, "ts": "2026-07-13T20:43:58Z", "hours": 0.6733, "text": "DevLog #3 So… continuing the animal saga, I present to you: /koi-sound . 🐾 This command makes the bot send a humble animal selection menu. Then, you just pick one (there are still only a few, hahaha), and the bot replies with an .mp3 file containing the chosen animal’s sound. The list of animals is still small, but I plan to add many more in future devlogs. And a quick rant: I hate path . 😭 Who decided that handling file paths had to be done this way?"}, {"post_id": 27881, "ts": "2026-07-13T19:50:39Z", "hours": 0.7331, "text": "DevLog #2 Today I added 4 new commands to the bot. To be honest, it wasn’t very difficult. It was basically copying the code from the first command, changing the API, and adapting it to the particularities of each one. (Seriously… who decided that each API would return the data in a different way? 😭 I just wanted to grab a humble image.) The new commands are: 🦆 /koi-duck — shows a picture of a random duck. 🐱 /koi-cat — shows a picture of a random cat. 🐶 /koi-dog — shows a picture of a random dog. 🦊 /koi-fox — shows a picture of a random fox. It was a short devlog, but at least now the bot is becoming more fun."}, {"post_id": 27406, "ts": "2026-07-12T23:10:13Z", "hours": 1.0067, "text": "DevLog #1 For this fresh start, I’ve added two commands: /koi-ping — a command that makes the bot reply with “🏓 Pong!”. /koi-apod — fetches NASA’s Astronomy Picture of the Day (APOD) and sends the image along with its description. Well… I think that’s it for this devlog."}]...
|
Title: My first slack bot! by @AdaChan | Stardance Title: My first slack bot! by @AdaChan | Stardance
Devlogs:
DevLog #1 For this fresh start, I’ve added two commands: /koi-ping — a command that makes the bot reply with “🏓 Pong!”. /koi-apod — fetches NASA’s Astronomy Picture of the Day (APOD) and sends the image along with its description. Well… I think that’s it for this devlog.
DevLog #2 Today I added 4 new commands to the bot. To be honest, it wasn’t very difficult. It was basically copying the code from the first command, changing the API, and adapting it to the particularities of each one. (Seriously… who decided that each API would return the data in a different way? 😭 I just wanted to grab a humble image.) The new commands are: 🦆 /koi-duck — shows a picture of a random duck. 🐱 /koi-cat — shows a picture of a random cat. 🐶 /koi-dog — shows a picture of a random dog. 🦊 /koi-fox — shows a picture of a random fox. It was a short devlog, but at least now the bot is becoming more fun.
DevLog #3 So… continuing the animal saga, I present to you: /koi-sound . 🐾 This command makes the bot send a humble animal selection menu. Then, you just pick one (there are still only a few, hahaha), and the bot replies with an .mp3 file containing the chosen animal’s sound. The list of animals is still small, but I plan to add many more in future devlogs. And a quick rant: I hate path . 😭 Who decided that handling file paths had to be done this way?
DevLog #4 Today I added a very simple command: /koi-say . It does exactly what the name suggests: the bot repeats the message you type. Nothing spectacular, but it’s a classic, useful command for testing interactions. If you don’t type anything, the bot replies by letting you know that text is required. The message might seem a bit blunt… but remember: it’s just a koizinho . 😭 By the way, I was thinking about how to explain the bot’s name in English. I think the closest equivalent would be something like “little koi” . In Portuguese, we use the suffix -zinho to form a diminutive that often conveys affection or cuteness. So, koizinho would be something like a “little koi” or an affectionate way to refer to the bot.
DevLog #5 New command, wow!! 🎉🎉🎉🎉 Person: “Wait… isn’t that just /koi-say ?” Well… sort of. It’s basically an improved /koi-say . Meet the new command: /koi-tts . As the name suggests, TTS stands for Text to Speech . The bot takes the text you send, uses Microsoft Edge’s TTS voices to turn it into an MP3, and then sends the audio back to you. Pretty cool. =) (I hate path 😭)
DevLog #6 Okay… I finally finished the project’s README! 🎉 I think it turned out pretty cool; it’s not super professional yet, but I think it does a good job of showing what the bot can do. I might improve it in the future whenever I can shake off the laziness, haha. I also realized I used Axios quite a bit in this project. Most of the new commands rely on external APIs. There isn’t much else to add to this devlog; at least I’m happy it’s not just a bot that replies “pong” 😆
DevLog #7 The bot is finally online! 🚀 I deployed it to Hack Club Nest, so now it runs 24/7.
DevLog #8 I decided to continue developing the bot, so here’s what I’ve done since the last update: 1. Code organization I improved the project’s organization by separating command groups into different files. Now, each file has a specific responsibility: animals → animal-related commands, such as /koi-duck , /koi-cat , /koi-dog , and others. space → space-related commands, such as /koi-apod . I plan to add more commands in this category later. utility → general commands, such as /koi-say and /koi-tts . This has made the code much easier to maintain and allows for easier addition of new features. 2. Loading system for responses One thing that really bothered me was when a command took a while to respond. On Discord, when a bot is processing something, a “Bot is thinking…” message appears while it works. I couldn’t find an exact equivalent on Slack, so I decided to create my own system. Now, some commands send a loading message first—for example: 🦆 Looking for a duck… Once the command finishes, that message is updated with the final response. This makes for a much better experience; before, it used to look like the bot had stopped working lol. 3. Direct messages with the bot I finally managed to enable DMs for the bot! Now you can chat directly with Koizinho in private. It can already respond to simple messages, for example: User: Hi! Koizinho: Hello! I still want to improve this part. Maybe I’ll add some form of AI or a smarter conversation system in the future.
DevLog #9 I’m developing a new command called /koi-user . It displays information about the user you choose. Since the arguments of slash commands in Slack aren’t very organized (in the sense of having defined types), I had to work around the problem. In Discord, for example, you can define an argument as user_mention , so Discord itself understands that it’s a user. In Slack, it doesn’t work that way. You can’t even pass a mention as an argument to the command, lol. So the solution I found was to create a modal. When you use the command, a window opens with all the users in the workspace, and you can search by name or choose one from the list. After sending, the bot generates an image with some user information and sends the result to you. (Some text is still in Portuguese because I haven’t translated everything into English yet. ;-;)
DevLog #10 I’m changing the user info card. I’m now using Python to generate the images. Honestly, using the JS Canvas is a real pain, and Python’s Easy-PIL turns out to be much easier. Now, the tricky part will be handling the communication between the .js and .py files.
DevLog #11 Well, I finally finished the Easy-PIL part in Python! The card is ready now. I also set up the system so that data is automatically populated based on a JSON file. When someone uses the /koi-user command, it generates a JSON file with the selected user’s information, and then the Python script uses that data to create the card. I designed the card myself in Canva. I spent way too much time on something so simple XD, but I really liked the result!
DevLog #12 I discovered that it’s possible to make .py and .js interact with each other. Now I’m learning how this communication works and trying not to explode in the process. XD
DevLogs #13 I didn’t implement any new features today; I just fixed some bugs that were cropping up in Koizinho’s commands.
DevLog #14 Today I added two more simple commands /koi-rps and /koi-calc . /koi-calc actually already existed, but I had ended up deleting it. /koi-rps is a small Rock, Paper, Scissors game. The user chooses rock, paper, or scissors, and Koizinho makes a random choice. Then, the bot compares the two choices and announces whether the player won, lost, or tied.
DevLog #15 I’m reviewing some commands I’ve already implemented and fixing a few issues. Strangely, the bot is taking a while to respond; it keeps displaying the message /koi-calc failed because the app did not respond... repeatedly, yet a few seconds later, the bot actually executes the command which is really odd.
DevLog #16 Fixing bugs again. I gave up on using Python + JavaScript; honestly, it was getting too difficult. Now I need to sort out the positioning, because when I was porting the code from Python to JS, the elements ended up out of place. I’m not sure if Python and JS handle image pixels differently.
DevLog #17 Still struggling with this command ( /koi-user ), it was supposed to be ‘easy,’ but I just ended up complicating the code even further. Well, I’m still trying to organize the elements in the image and fix an error that prevents the bot from sending the card to the user, it’s getting really annoying (why does JS have to be like this?). I hope to finish this command soon; maybe DevLog 18 will be about that, but for now, I’ll keep working on it 🥀🙏
DevLog #18 So… this command is really frustrating me; every time I fix something, another error pops up, and I don’t know what to do. At least most of it is already done. I hope I can sort this out soon.
DevLog #19 I created a command called /koi-help that lists all the bot’s available commands. This will be useful since we already have quite a few commands; I plan to replace that wall of text with a menu where the user can choose a category (general, animals, utilities, games), and the bot will respond with the commands for that category to avoid cluttering the chat.
DevLog #20 I updated the project’s README; it remains quite simple because the bot is also simple, haha. I gave up on the /koi-user command for now, it was giving me too many headaches, so I’ll leave it for later.
DevLog #21 I made some adjustments, I think I’ll rewrite some of the bot’s commands, I fixed some existing errors (and created others =( unfortunately). But I think it’s getting better now.
DevLog #22 I finally got it working. I discovered the error was in how the commands were being loaded, since they were all being loaded from a “commands” folder via index.js , they were taking too long to respond; because of the response time limit, an error kept popping up. I managed to fix it, though, and now it works =) I also fixed some bugs in other commands.
Ships:
I created a Slack bot using JavaScript. My bot features nine commands, including /koi-ping, which replies with “Pong!” to check if the bot is online; /koi-apod, which uses the NASA API to send the Astronomy Picture of the Day; commands like /koi-cat, /koi-dog, /koi-fox, and /koi-duck, which use APIs to send random animal images; /koi-sound, which sends MP3 animal sounds; /koi-say, which repeats the user’s message; and /koi-tts, which converts text to speech using Microsoft Edge TTS. To develop the project, I used various APIs, primarily to fetch images from NASA and of animals. I also worked with audio files to implement the commands related to sounds and text-to-speech conversion. The biggest challenge during development was dealing with file paths. Honestly… who decided it had to work that way? 😭 I spent a long time trying to figure out why the files weren’t being found before I managed to organize everything correctly.
I made Koizinho, a Slack bot with several fun and useful commands. Some of my favorite commands are /koi-user, which generates a card with information about a selected user, /koi-sound, which lets you choose and listen to animal sounds, and /koi-tts, which converts text into spoken audio. The most challenging part was definitely /koi-user. I wanted the bot to generate a custom image with information about a user, but working with Canvas in JavaScript was much harder than I expected. I ran into a lot of errors, especially with positioning and generating the image correctly. I also experimented with Python and JavaScript communicating with each other before eventually deciding to keep the image generation in JavaScript. There were many moments where fixing one error somehow created another one. 😭 I’m proud that I managed to keep working on the project even when some parts became really frustrating. I learned a lot about Slack commands, modals, APIs, image generation, audio, and organizing a larger JavaScript project. /koi-user was especially satisfying because it went from being a huge mess of errors to actually working....
|
1793311033.4078848
|
1793397433.4078848
|
|
8386
|
My first slack bot! by @Sahil | Stardance
|
Sahil
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @Sahil | Stardance
|
1792914870.9386673
|
1793778870.9386673
|
|
8387
|
Untitled project by @orb09 | Stardance
|
orb09
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @orb09 | Stardance
|
1793181253.1719131
|
1793786053.1719131
|
|
8388
|
My first slack bot! by @girisushil | Stardance
|
girisushil
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @girisushil | Starda Title: My first slack bot! by @girisushil | Stardance...
|
1792742105.7098897
|
1793346905.7098897
|
|
8389
|
My awesome macropad! by @shafin | Stardance
|
shafin
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @shafin | Stardance
|
1792788902.288099
|
1793393702.288099
|
|
8390
|
Untitled project by @sduaghskudh | Stardance
|
sduaghskudh
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @sduaghskudh | Stardanc Title: Untitled project by @sduaghskudh | Stardance...
|
1793149018.4880483
|
1793753818.4880483
|
|
8391
|
My awesome macropad! by @Ridham | Stardance
|
Ridham
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Ridham | Stardance
|
1793436574.34524
|
1794041374.34524
|
|
8392
|
Prism by @gl_aarav | Stardance
|
gl_aarav
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Prism by @gl_aarav | Stardance
|
1793321616.625168
|
1793926416.625168
|
|
8393
|
My first slack bot! by @fossie | Stardance
|
fossie
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @fossie | Stardance
|
1793433378.0818517
|
1794038178.0818517
|
|
8394
|
My awesome macropad! by @ruter | Stardance
|
ruter
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @ruter | Stardance
|
1793281910.32003
|
1793886710.32003
|
|
8395
|
My awesome macropad! by @smarth_computercoder | St My awesome macropad! by @smarth_computercoder | Stardance...
|
smarth_computercoder
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @smarth_computercod Title: My awesome macropad! by @smarth_computercoder | Stardance...
|
1793246045.310168
|
1793850845.310168
|
|
8396
|
Temperia by @Ahmad_Bulbul | Stardance
|
Ahmad_Bulbul
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Temperia by @Ahmad_Bulbul | Stardance
|
1793310881.088004
|
1793915681.088004
|
|
8397
|
SideKick by @shivam9661446 | Stardance
|
shivam9661446
|
0
|
6.78
|
0
|
[]
|
[{"post_id": 60240, "ts": "202 [{"post_id": 60240, "ts": "2026-09-02T14:15:33Z", "hours": 1.95, "text": "Completed with the pcb routing for sidekick"}, {"post_id": 38947, "ts": "2026-08-01T15:43:31Z", "hours": 0.6172, "text": "fixed pad clearances fixed solder masks causing shorts next: Routing and case design"}, {"post_id": 4878, "ts": "2026-06-08T13:16:41Z", "hours": 4.2108, "text": "Created the schematic and pcb of HackPad"}]...
|
Title: SideKick by @shivam9661446 | Stardance
Dev Title: SideKick by @shivam9661446 | Stardance
Devlogs:
Created the schematic and pcb of HackPad
fixed pad clearances fixed solder masks causing shorts next: Routing and case design
Completed with the pcb routing for sidekick...
|
1793228060.0041707
|
1793832860.0041707
|
|
8398
|
centaur by @chiron_dev8 | Stardance
|
chiron_dev8
|
1
|
17.12
|
28
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-05T17:05:56Z", "hours": 4.0, "multiplier": 6.73, "payout": 28, "blessing": "neutral", "text": "I have worked on the project for a while before Stardance started. Probably around 95% of my hours are unlogged. I have made a package manager for UNIX based systems (specifically for my custom Linux based operating system, ChironOS). It can install, uninstall and update packages, manage dependencies, sync install files to the latest versions and automatically remove all unused packages. My favourite part of the project was finally seeing all the functions working together. I will still be working on this for a long long time as there is a lot I can improve on. My next goal will be to make package scripts for the whole of Linux From Scratch and Beyond LFS as this will prove the reliability of my package manager. If you want to test this please make sure you are using Linux (It will probably work on BSD but I haven’t tested it. It probably won’t work on mac and it DEFINITELY WILL NOT WORK ON WINDOWS). Make sure to read the wiki for installation and usage instructions. peace", "repo": "https://github.com/Chiron8/centaur", "demo": "https://github.com/Chiron8/centaur/wiki/2.-Install"}]...
|
[{"post_id": 82609, "ts": "202 [{"post_id": 82609, "ts": "2026-10-25T12:29:51Z", "hours": 13.1214, "text": "During the last three months, I significantly improved Centaur’s package-management infrastructure. I streamlined package source handling by adding automatic tarball downloads, extraction, and checksum verification. I also redesigned installation around a bubblewrap sandbox, staging directories, and manifests, which replaces the insecure system() function and makes package installation and remova safer. Alongside these changes, I improved uninstall usability, added x86-64 binaries, maintained the beta release workflow, and shipped versions 1.1.1 through 1.3.1."}, {"post_id": 22953, "ts": "2026-07-05T16:59:24Z", "hours": 3.9061, "text": "Centaur v1.1 Release Notes In this release, I focused on improving the .centaur package format and fixing several usability issues from v1.0. What I changed 1. I redesigned the .centaur syntax into 3 clear sections I changed .centaur files so package data is now split into: [meta] [install] [uninstall] This replaces the old mixed format where metadata, install steps, and uninstall script generation were all blended together. 2. I made metadata explicit and easier to parse In v1.0, package metadata and dependency handling relied on ad-hoc placement (for example, dependency lines and markers like === ADD DEPENDENCIES ABOVE THIS LINE === ). In v1.1, I moved this into a structured metadata block, for example: name = \"writedoc\" version = \"2.3-p1\" dependencies = \"example\" This makes package definitions cleaner and far more consistent. 3. I separated install and uninstall logic I moved installation commands into [install] and uninstall commands into [uninstall] . Previously, uninstall behavior was created indirectly during install by writing uninstall commands into another file. Now I define uninstall behavior directly in the package script itself, which is simpler and easier to maintain. 4. I fixed parser/runtime snags from v1.0 I resolved several pain points in .centaur files, including: line length limit issues newline/formatting sensitivity (such as needing blank lines between commands) general script parsing/execution reliability issues Result With v1.1, I made .centaur scripts more structured, more readable, and more reliable. The new format is easier for me (and others) to write, maintain, and parse going forward."}, {"post_id": 2848, "ts": "2026-06-05T18:08:43Z", "hours": 0.2842, "text": "I’m currently working on improving how I go about parsing package metadata. Previously, package dependencies were declared at the top of the file, however this soon limited adding extra metadata such as “preservation” type which I will implement later. I will now be using [meta] tags with variables inside them to allow for more advanced configuration!"}]...
|
Title: centaur by @chiron_dev8 | Stardance
Devlog Title: centaur by @chiron_dev8 | Stardance
Devlogs:
I’m currently working on improving how I go about parsing package metadata. Previously, package dependencies were declared at the top of the file, however this soon limited adding extra metadata such as “preservation” type which I will implement later. I will now be using [meta] tags with variables inside them to allow for more advanced configuration!
Centaur v1.1 Release Notes In this release, I focused on improving the .centaur package format and fixing several usability issues from v1.0. What I changed 1. I redesigned the .centaur syntax into 3 clear sections I changed .centaur files so package data is now split into: [meta] [install] [uninstall] This replaces the old mixed format where metadata, install steps, and uninstall script generation were all blended together. 2. I made metadata explicit and easier to parse In v1.0, package metadata and dependency handling relied on ad-hoc placement (for example, dependency lines and markers like === ADD DEPENDENCIES ABOVE THIS LINE === ). In v1.1, I moved this into a structured metadata block, for example: name = "writedoc" version = "2.3-p1" dependencies = "example" This makes package definitions cleaner and far more consistent. 3. I separated install and uninstall logic I moved installation commands into [install] and uninstall commands into [uninstall] . Previously, uninstall behavior was created indirectly during install by writing uninstall commands into another file. Now I define uninstall behavior directly in the package script itself, which is simpler and easier to maintain. 4. I fixed parser/runtime snags from v1.0 I resolved several pain points in .centaur files, including: line length limit issues newline/formatting sensitivity (such as needing blank lines between commands) general script parsing/execution reliability issues Result With v1.1, I made .centaur scripts more structured, more readable, and more reliable. The new format is easier for me (and others) to write, maintain, and parse going forward.
During the last three months, I significantly improved Centaur’s package-management infrastructure. I streamlined package source handling by adding automatic tarball downloads, extraction, and checksum verification. I also redesigned installation around a bubblewrap sandbox, staging directories, and manifests, which replaces the insecure system() function and makes package installation and remova safer. Alongside these changes, I improved uninstall usability, added x86-64 binaries, maintained the beta release workflow, and shipped versions 1.1.1 through 1.3.1.
Ships:
I have worked on the project for a while before Stardance started. Probably around 95% of my hours are unlogged. I have made a package manager for UNIX based systems (specifically for my custom Linux based operating system, ChironOS). It can install, uninstall and update packages, manage dependencies, sync install files to the latest versions and automatically remove all unused packages. My favourite part of the project was finally seeing all the functions working together. I will still be working on this for a long long time as there is a lot I can improve on. My next goal will be to make package scripts for the whole of Linux From Scratch and Beyond LFS as this will prove the reliability of my package manager. If you want to test this please make sure you are using Linux (It will probably work on BSD but I haven’t tested it. It probably won’t work on mac and it DEFINITELY WILL NOT WORK ON WINDOWS). Make sure to read the wiki for installation and usage instructions. peace...
|
1793278270.1939125
|
1793364670.1939125
|
|
8399
|
My awesome macropad! by @florian_lindauer09 | Star My awesome macropad! by @florian_lindauer09 | Stardance...
|
florian_lindauer09
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @florian_lindauer09 Title: My awesome macropad! by @florian_lindauer09 | Stardance...
|
1792921953.3702767
|
1793785953.3702767
|
|
8400
|
My awesome macropad! by @somenassim | Stardance
|
somenassim
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @somenassim | Stard Title: My awesome macropad! by @somenassim | Stardance...
|
1793400983.0215974
|
1794005783.0215974
|