|
48877
|
slack.ai by @Shashwat_Ganapathi_T_S | Stardance
|
Shashwat_Ganapathi_T_S
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slack.ai by @Shashwat_Ganapathi_T_S | Stard Title: slack.ai by @Shashwat_Ganapathi_T_S | Stardance...
|
1793249674.4634943
|
1793854474.4634943
|
|
15431
|
slack.hackclub.com by @larry | Stardance
|
larry
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slack.hackclub.com by @larry | Stardance
|
1792742037.5531197
|
1793346837.5531197
|
|
58695
|
slack1 by @khwaa | Stardance
|
khwaa
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slack1 by @khwaa | Stardance
|
1792760061.2441034
|
1793364861.2441034
|
|
58696
|
slack1 by @khwaa | Stardance
|
khwaa
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slack1 by @khwaa | Stardance
|
1792760062.9239566
|
1793364862.9239566
|
|
43889
|
slackBot by @ | Stardance
|
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slackBot by @ | Stardance
|
1793242293.1321154
|
1793847093.1321154
|
|
42295
|
slack_agent by @vrajsanghavi | Stardance
|
vrajsanghavi
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T13:08:47Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "finally,my slack bot named v-tash is completed…. it has included many commands like this v-tash commands /v-tash-ping — is the bot alive /v-tash-roast [@name] — roast someone /v-tash-standup — fake standup generator /v-tash-vibe [topic] — vibe check poll /v-tash-quote — random dev quote /v-tash-decide A | B | C — pick for me /v-tash-ship [thing] — announce a ship use /v-tash-help for first time to get this… the hardest part of making this bot was nest ,seriously it takes much time to approve but anyways i got it….", "repo": "https://github.com/vraj2011/slack_agent", "demo": "https://app.slack.com/client/E09V59WQY1E/C083WK4RY2D"}]...
|
[{"post_id": 53032, "ts": "202 [{"post_id": 53032, "ts": "2026-08-23T12:51:25Z", "hours": 0.4367, "text": "finally,we have authenticated with nest ,now it works 24/7 ,test it out by typing /v-tash-help"}, {"post_id": 38394, "ts": "2026-07-31T19:00:31Z", "hours": 0.5997, "text": "we have done a slack bot..-1st achievement.."}]...
|
Title: slack_agent by @vrajsanghavi | Stardance
D Title: slack_agent by @vrajsanghavi | Stardance
Devlogs:
we have done a slack bot..-1st achievement..
finally,we have authenticated with nest ,now it works 24/7 ,test it out by typing /v-tash-help
Ships:
finally,my slack bot named v-tash is completed…. it has included many commands like this v-tash commands /v-tash-ping — is the bot alive /v-tash-roast [@name] — roast someone /v-tash-standup — fake standup generator /v-tash-vibe [topic] — vibe check poll /v-tash-quote — random dev quote /v-tash-decide A | B | C — pick for me /v-tash-ship [thing] — announce a ship use /v-tash-help for first time to get this… the hardest part of making this bot was nest ,seriously it takes much time to approve but anyways i got it…....
|
1792878786.3702478
|
1793742786.3702478
|
|
56498
|
slackbot by @benjaminproba | Stardance
|
benjaminproba
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slackbot by @benjaminproba | Stardance
|
1792666082.937427
|
1793270882.937427
|
|
10984
|
slackbot by @fabianbuthere | Stardance
|
fabianbuthere
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-07T16:38:52Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "The product is not nearly as exciting as the code for it. I had to work with WebSockets, Slack’s (confusing (at least for me)) API and remote deployment (on Railway), including Docker. All in all a fun little project! And in Rust. I love Rust.", "repo": "https://github.com/Fabian2611/slackbot/", "demo": "https://hackclub.enterprise.slack.com/archives/C0BHJU4LEFJ"}]...
|
[{"post_id": 4328, "ts": "2026 [{"post_id": 4328, "ts": "2026-06-07T16:31:36Z", "hours": 0.6353, "text": "Cat commands are here! yayyy :3"}, {"post_id": 4295, "ts": "2026-06-07T15:40:05Z", "hours": 0.6217, "text": "The bot is running! I first set up shuttle, and only realised it was discontinued a few months ago when I tried to deploy. Now I use railway, and it works!"}, {"post_id": 4257, "ts": "2026-06-07T14:40:35Z", "hours": 2.0675, "text": "The bot is running! Getting the WebSocket to work was rather easy, the Slack API is really hard to navigate though. Not sure if I can host it on Nest (or similar services) if it is not NodeJS, that’s my next stop."}]...
|
Title: slackbot by @fabianbuthere | Stardance
Dev Title: slackbot by @fabianbuthere | Stardance
Devlogs:
The bot is running! Getting the WebSocket to work was rather easy, the Slack API is really hard to navigate though. Not sure if I can host it on Nest (or similar services) if it is not NodeJS, that’s my next stop.
The bot is running! I first set up shuttle, and only realised it was discontinued a few months ago when I tried to deploy. Now I use railway, and it works!
Cat commands are here! yayyy :3
Ships:
The product is not nearly as exciting as the code for it. I had to work with WebSockets, Slack’s (confusing (at least for me)) API and remote deployment (on Railway), including Docker. All in all a fun little project! And in Rust. I love Rust....
|
1793325267.5934012
|
1793411667.5934012
|
|
70475
|
slackbot by @furgenramen | Stardance
|
furgenramen
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slackbot by @furgenramen | Stardance
|
1793015268.7920105
|
1793879268.7920105
|
|
71161
|
slackbot-glitchless by @allenmandapath | Stardance
|
allenmandapath
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slackbot-glitchless by @allenmandapath | St Title: slackbot-glitchless by @allenmandapath | Stardance...
|
1792842439.194164
|
1793447239.194164
|
|
57917
|
slackbothub by @RabiaAnwaar | Stardance
|
RabiaAnwaar
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slackbothub by @RabiaAnwaar | Stardance
|
1792730888.4704838
|
1793335688.4704838
|
|
29789
|
slackernot by @miminstrels | Stardance
|
miminstrels
|
1
|
5.42
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-25T09:59:56Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hello! I made a slackbot named Slackernot and frankly it’s really random. There are a few commands you can try out on the channel: /slackernot-ping (checks bot latency) /slackernot-catfact (for a cat fact) /slackernot-dadjoke (for a dad joke) /slackernot-joke - (for a random regular joke) /slackernot-duck - (gets a random duck image) /slackernot-fox - (gets a random fox image) This was only for jokes and giggles so don’t expect too much. But I’m really glad the random image command works yaeyyy.", "repo": "https://github.com/miminstrels/slackernot", "demo": "https://hackclub.enterprise.slack.com/archives/C0CBHD51QBH"}]...
|
[{"post_id": 84350, "ts": "202 [{"post_id": 84350, "ts": "2026-10-29T14:31:57Z", "hours": 2.4208, "text": "after hours of debugging cus i’m still learning, it finally worked huzzah🥹🥹"}, {"post_id": 82577, "ts": "2026-10-25T09:15:30Z", "hours": 0.7603, "text": "replaced a command with a random fox image one, the request on the former was a lil confusing"}, {"post_id": 71691, "ts": "2026-09-21T10:02:41Z", "hours": 0.3972, "text": "fixed this command.. cus i realised that image commands are different."}, {"post_id": 70514, "ts": "2026-09-19T09:39:09Z", "hours": 0.4058, "text": "uploaded on github cus now it kinda works ddhsfa"}, {"post_id": 56660, "ts": "2026-08-28T14:46:30Z", "hours": 0.9728, "text": "added some api commands but apparently the app is having problems so.."}, {"post_id": 36965, "ts": "2026-07-29T12:12:56Z", "hours": 0.5267, "text": "fixed it and now it works!! turns out socket mode wasn’t on. i was pretty busy so i haven’t the chance to tackle this, but now i was able to."}, {"post_id": 22138, "ts": "2026-07-04T13:13:41Z", "hours": 0.2581, "text": "working on the .js. honestly confused about the signingsecret or wtv it’s called."}]...
|
Title: slackernot by @miminstrels | Stardance
Dev Title: slackernot by @miminstrels | Stardance
Devlogs:
working on the .js. honestly confused about the signingsecret or wtv it’s called.
fixed it and now it works!! turns out socket mode wasn’t on. i was pretty busy so i haven’t the chance to tackle this, but now i was able to.
added some api commands but apparently the app is having problems so..
uploaded on github cus now it kinda works ddhsfa
fixed this command.. cus i realised that image commands are different.
replaced a command with a random fox image one, the request on the former was a lil confusing
after hours of debugging cus i’m still learning, it finally worked huzzah🥹🥹
Ships:
Hello! I made a slackbot named Slackernot and frankly it’s really random. There are a few commands you can try out on the channel: /slackernot-ping (checks bot latency) /slackernot-catfact (for a cat fact) /slackernot-dadjoke (for a dad joke) /slackernot-joke - (for a random regular joke) /slackernot-duck - (gets a random duck image) /slackernot-fox - (gets a random fox image) This was only for jokes and giggles so don’t expect too much. But I’m really glad the random image command works yaeyyy....
|
1793335742.0696404
|
1793422142.0696404
|
|
56140
|
slackette by @hann | Stardance
|
hann
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slackette by @hann | Stardance
|
1792918413.6328287
|
1793782413.6328287
|
|
51337
|
slackinbot by @hamzahabib | Stardance
|
hamzahabib
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slackinbot by @hamzahabib | Stardance
|
1792666298.6360795
|
1793271098.6360795
|
|
53439
|
slacky by @Kabeer-M | Stardance
|
Kabeer-M
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T20:38:36Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "So hey I created this slack bot and named it slackyy. I don’t want it slacking off but it does. It pulls ISS location in real time, Astrononmy picture of the day and also tells a cat fact", "repo": "https://github.com/thedev-k/slackyy", "demo": "https://hackclub.enterprise.slack.com/archives/C0P5NE354"}]...
|
[{"post_id": 53342, "ts": "202 [{"post_id": 53342, "ts": "2026-08-23T20:35:36Z", "hours": 0.2611, "text": "Created slackyy. I worked on the project before but didn’t get nest approval now I got it so here it is. Its working and there are many commands"}]...
|
Title: slacky by @Kabeer-M | Stardance
Devlogs:
C Title: slacky by @Kabeer-M | Stardance
Devlogs:
Created slackyy. I worked on the project before but didn’t get nest approval now I got it so here it is. Its working and there are many commands
Ships:
So hey I created this slack bot and named it slackyy. I don’t want it slacking off but it does. It pulls ISS location in real time, Astrononmy picture of the day and also tells a cat fact...
|
1793202786.3098485
|
1793289186.3098485
|
|
21682
|
slacky by @alanthereal | Stardance
|
alanthereal
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slacky by @alanthereal | Stardance
|
1793174088.1270869
|
1793778888.1270869
|
|
62474
|
slackyyy by @aiza_asad | Stardance
|
aiza_asad
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slackyyy by @aiza_asad | Stardance
|
1793044444.1128385
|
1793649244.1128385
|
|
4967
|
slackzilla 🦖🦖 by @rylvion | Stardance
|
rylvion
|
0
|
151.14
|
0
|
[]
|
[{"post_id": 78787, "ts": "202 [{"post_id": 78787, "ts": "2026-10-11T16:34:14Z", "hours": 31.9517, "text": "devlog 11 - ADMIN EHANCEMENTS: errors views, log archiving & restoration, logs deletion controls, RAG IMPROVEMENTS AND MORE… date: 11/10/2026 time logged: 31hr 57m version: v0.9.6-beta this release focused on making Slackzilla easier to debug, manage and understand internally. a LOT of work went into the admin panel, route extraction and testing. 1. admin panel got some SERIOUS upgrades added 3 new admin pages for server events, errors and logs. also split admin.css into separate stylesheets because one giant stylesheet isn’t exactly a maintenance strategy. error monitoring added an error viewer with timestamps, stack traces and source files improved error messages to make them more user-friendly log management added a log archive viewer with backup timestamps, line counts and file sizes added backup restoration and switching added controls to delete specific lines, ranges or the last X lines added log rotation and telemetry reset controls added the /log-archives admin endpoint 7 new admin controls: delete-logs , delete-lines , delete-last , delete-line , rotate-logs , restore-log and reset-telemetry that’s a LOT more control over server logs than before. 2. endpoints & session security added 4 new endpoints : 3 admin endpoints: /errors , /errors/stream , /log-archives 1 public endpoint: /api/session /api/session now provides current session information, with csrfToken moved from /api/admin/summary to the new endpoint. also fixed the CSRF token not appearing in the document head. small bug, annoying consequences. removed the children=[] pattern from routes.js and its associated dependencies. 3. RAG / code parser improvements route extraction got a substantial upgrade. detects routes using exact path checks, prefix checks and array-based matching improved HTTP method inference for conditional routes, including GET and POST merges duplicate route entries and inferred methods expanded discovery beyond server/api/ , including /webhook and /admin/login improved /api/routes to return supported methods, match types, source files and line numbers the goal: give the RAG system more accurate route information instead of confidently retrieving incomplete or duplicated data. ᕦ(ò_óˇ)ᕤ 4. AI activity & markdown the AI activity view now displays elapsed time alongside tool summaries and responses, making it easier to follow what the system actually did. replaced the custom Markdown parser with marked AND dompurify for established parsing and HTML sanitisation. switched the configured model from openrouter/free to openai/gpt-6-luna , aiming for better performance and reliability. also deduplicated getReleaseInfo to avoid maintaining redundant version information. 5. testing added 3 npm scripts : test:code-parser for code parser tests test:rag for RAG tests test:all for the broader test suite and validation checks added automated code parser tests covering route extraction, HTTP method inference and deduplication. 6. docs updated README.md and project documentation to reflect the latest endpoints, admin controls, route extraction changes and RAG improvements. documentation staying in sync with the codebase. revolutionary concept, apparently. release summary v0.9.6-beta added: 4 endpoints 7 admin controls 3 admin pages 3 npm testing scripts improved error visibility, log management, session information and route extraction updated Markdown rendering, AI activity information and documentation the main focus was improving maintainability, debugging and the reliability of Slackzilla’s internal tooling. ( ͡° ͜ʖ ͡°) next devlog hint: a terminal is coming. think less clicking through admin pages, more interacting with Slackzilla directly through a terminal interface. details in the NEXT devlog. \(^o^)/"}, {"post_id": 71489, "ts": "2026-09-20T22:15:26Z", "hours": 27.4447, "text": "Devlog 10 - QOL DASHBOARD IMPROVEMENTS, RAG ENHANCEMENTS WITH TOOLS & CACING AND LOTS OF STUFF time logged: 27 hrs 30 mins date: 20/09/2026 version: v0.9.5-beta This devlog is COVERING A LOT of stuff that i did, but im not gonna drag this over like i did from all other devlogs so heres are the features: covering from v0.9.1-beta to v0.9.5-beta, see release-history.json for the full changelog Features added Added RAG TOOLS including getStatus - returns the status of the RAG getCommands - with enhanced filtering (filter by name, usage hint, id, category and fuzzy filter (makes it easier for RAG to find commands)) getReleaseInfo - returns the release info of the CURRENT version and (optionally) any other version (pass it by parameter) runCommand - runs a command by id getLogs - returns recent logs for the RAG to inspect (max 100, default 20) getMetrics - returns the metrics of the RAG (memory usage, cpu usage, etc) getRoutes - returns the routes of the APIs added 3 new scripts ( npm run ) which are rag - runs the RAG with or without the --ai flag to see context/answer cli rag:use-tool - runs a tool by name (with optional parameters) release - appends current release notes from package.json to release-history.json . Added new endpoints /api/telemetry - returns the telemetry history separately from the main status endpoint /api/command/:id - gets or executes a command by id /api/telemetry/stream - streams telemetry updates using SSE /api/admin/server-events - returns server events for the admin dashboard /api/ask - now uses SSE to stream the RAG’s activity ( yers now we can see the RAG in aciton ), context, tool usage, token usage and final response dashboard imporvements added a seperate admin server events page (wevent searching, filtering, prioritisation and stylying) added a command runner on the command page fixed recent activity not showing up on the dashboard Added visible AI activity to the AI page the RAG now emits activity events while processing a question AI page is cached on localStorage so you can go back and forth between pages without losing the AI page state Improved the RAG’s repository awareness added AST-based parsing using acorn and acorn-walk added persistent .rag/index.json added symbol search and dependency analysis added function, export, function call, environment variable and route extraction added richer code context and source metadata added automatic index rebuilding improved path-based dependency detection fixed the RAG detecting references created using path.join(rootDir, ...) add token budgeting and usage tracking. Changed how telemetry is handled telemetry history is no longer included in /api/status or any other endpoints CHANGED all admin endpoints so that none of them has the telemetryHistory anymore Added release history tracking added release-history.json /sz-release can now retrieve release information for different versions npm run release automatically appends the current release notes Tl;DR: RAG got a major upgrade with AST-powered repository indexing (acorn/acorn-walk), persistent indexing via .rag/index.json , symbol search, dependency analysis, function/export/call/env-var/route extraction, richer source metadata, automatic index rebuilding, 7 new RAG tools, 3 new CLI tools, SSE-powered streaming for /api/ask and telemetry, telemetry endpoints, admin server events, live AI activity tracing, token/context/tool usage visibility, AI session caching, release history tracking, telemetry separation from /api/status, admin API cleanup, and a large collection of bug fixes, repository-awareness improvements and major QOL improvements. . hopefully i will be devloging every version till i ship"}, {"post_id": 61072, "ts": "2026-09-03T19:44:37Z", "hours": 29.0225, "text": "Devlog 9: React Dashboard time logged: 29hr 1m date: 03/09/2026 The React dashboard is finally here! I completely migrated the old EJS dashboard with a new React app. THIS will be IS the biggest devlog yet, as it covers a lot of changes and new features. main features added is migration, codebase assistance, graphs, telemetary and a new api. Heres a summary of what i changed renamed src/ to bot/ - this is because its related to the bot and not the server and its not where all the main files are migrated the EJS dashboard into a React app overhauled the UI deleted the pages system and the workflow to build it added a new RAG modal that answers questions about the repo and shows related visual assets (also includes a new rag.js file that handles retrieval and generation of answers) The react dashboard has the following features: 10 pages (Home, Admin, Api, Commands, Docs, Home, Logs, AI, Sitemap, Status) 12 components 8 utilities js exports in the utils/ folder 404 page (with routing) & Error Boundary modal page public AI assistant page with repository-aware retrieval and related visual assets command API with stable IDs, command help, and captured command responses (so API can be called from the dashboard) public status, logs, metrics, command, and AI API endpoints admin feedback controls for filtering, viewing, replying, marking read/unread, and deleting (they dont work on windows only linux) CPU, memory, disk, and network telemetry with responsive graphs and hover data tooltips (so satisfying) Current React Architecture The active client source lives in server/client/src/ . Vite builds it into server/client/dist/ , which is served by server/server.js . React Router renders the page routes declared in server/client/src/components/utils/routes.js . The server still owns the HTTP status code: known browser routes receive the React shell with 200 , while unknown browser routes receive the same shell with 404 so the client can render the NotFound page without hiding the correct HTTP semantics. The old EJS dashboard and static page-generation flow are no longer the active dashboard path. The bot remains in bot/ , separate from the dashboard server, and the server uses explicit Node http handlers under server/api/ . RAG and Command APIs The new /ai page sends questions to POST /api/ask . server/lib/rag.js retrieves relevant repository text while excluding priv/ , .env files, dependencies, logs, and build output. It can identify related image assets such as the calculator flowchart without parsing binary image contents. If configured, the retrieved context is sent to the AI provider; otherwise the endpoint returns a local configuration message and source metadata. Commands are exposed through GET /api/commands , GET /api/commands/:id , and POST /api/commands/:id . The API adapter reuses the same command modules as Slack and captures their responses. The Commands page provides the interactive runner, while the AI page remains focused on repository questions. Explicit natural-language requests can still ask the RAG service to execute a recognised slash command and return its result. Limitations The migration exposed several boundaries that are now documented in docs/ : authentication and CSRF, the webhook protocol, API registration, setup, and RAG behaviour. Runtime persistence is still file-backed through server/database/store.js ; an external database remains a future adapter project rather than a required dependency. Linux systemd controls and deployment scripts are intended for the hosted environment. On Windows local development, the dashboard, APIs, telemetry, and React pages work, but system service actions and Bash deployment are not expected to succeed. The dashboard must be rebuilt and restarted after production client or server changes."}, {"post_id": 48936, "ts": "2026-08-17T14:33:48Z", "hours": 17.7958, "text": "Devlog 8 - server hosted dashboard finally happened time logged: 17hr 47min 45s date: 16/08/2026 The server hosted dashboard is finally here! It is hosted with the webhook, connected to the bot, and shows logs, status, and other information. architecture The Slackzilla server-hosted dashboard is the web control centre sitting alongside the webhook (runs on the same port). The server runs the dashboard, API routes, authentication/session handling, CSRF protection, logging, monitoring and administrative controls. The dashboard has been moving from the earlier static local/pages prototype (see devlog 7) towards an EJS-based server-rendered architecture, with shared layouts/partials and a global dashboard styling system. The server also handles the GitHub deployment webhook on port 9000 , while Nginx sits in front of the application. The dashboard is intended to expose things such as bot status, logs, statistics, monitoring, API documentation and admin controls rather than sshing into the server and running commands manually I’ve been separating the dashboard’s presentation layer, API layer and server logic. During development, I encountered and fixed several contract problems where route modules expected helpers such as context.sendError() and context.sendOk() that the runtime context did not provide. I also changed the authentication-aware API/SSE routes so unauthenticated requests return proper JSON/HTTP responses rather than accidentally redirecting an EventSource connection into an HTML login page. The dashboard has admin-only functionality, CSRF protection and server-side authentication, whilst the bot itself uses Slack’s Events/Slash Command mechanisms for incoming Slack activity. Slack’s Events API delivers subscribed events to the HTTP endpoint, while slash commands are sent to the configured app endpoint via HTTP POST. /api/admin routes are protected by an authenticated admin session and CSRF protection. Admin authentication uses a session cookie, which is only created after logging in through rylvion.hackclub.app/admin/login . The admin password is never stored in plaintext. It is stored as a PBKDF2-HMAC-SHA512 hash in the server environment, using a random salt and a high iteration count. The dashboard does not allow the password to be created or changed, so the server environment must be updated manually before restarting the service. CSRF tokens are generated server-side and sent to the authenticated client via a cookie. For POST requests, the client must return the token in the X-CSRF-Token header, preventing unauthorised or forged requests from triggering admin actions. /api/ (excluding /api/admin ) has no authentication Port 9000 is used for the webhook and the dashboard whilst the bot itself runs on socket mode. The api that currently has these endpoints base url: https://rylvion.hackclub.app/api/ GET /api/status - returns the bot status and other information GET /api/logs - returns the bot logs from slackzilla.log as JSON, including the file size in bytes POST /api/admin/control - allow the admin to control the accepts several actions such as start , stop , restart , redeploy , refresh , refresh-logs , refresh-status (self explanatory actions) with dangerous actions (such as redeploy , restart and stop ) contains a confirmation prompt to prevent accidental execution of the action. GET /api/admin/feedback - returns database feedback as JSON GET /api/admin/feedback/:id - returns the feedback with the given ID as JSON POST /api/admin/feedback/:id - allows the admin to control and accepts 3 actions such as delete , read , unread , respond . GET /api/admin/events - is a SSE (Server Sent Event) endpoint that allows the admin to receive real time events from the server such as logs, status, feedbacks and other information about the bot."}, {"post_id": 38519, "ts": "2026-07-31T22:58:19Z", "hours": 9.9792, "text": "Devlog 7 - Adding a Web Dashboard (locally) time logged: 9hr 58m date: 31/07/2026 ███████╗██╗ █████╗ ██████╗██╗ ██╗███████╗██╗██╗ ██╗ █████╗ ██╔════╝██║ ██╔══██╗██╔════╝██║ ██╔╝╚══███╔╝██║██║ ██║ ██╔══██╗ ███████╗██║ ███████║██║ █████╔╝ ███╔╝ ██║██║ ██║ ███████║ ╚════██║██║ ██╔══██║██║ ██╔═██╗ ███╔╝ ██║██║ ██║ ██╔══██║ ███████║███████╗██║ ██║╚██████╗██║ ██╗███████╗██║███████╗███████╗██║ ██║ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝╚══════╝╚══════╝╚═╝ ╚═╝ added a local prototype view of the web dashboard for slackzilla, its hosted on Github Pages and is a static site that is not connected to the bot yet, it shows the design and layout of the dashboard and how it will look when its connected to the bot. the dashboard is designed to be responsive and works on both desktop and mobile devices. it has a clean and modern design that is easy to navigate. for Github Pages hosting, i used gh-pages branch which meant creating a seperate workflow ( pages.yml ) to build and deploy the dashboard to the dist/ folder. before that i needed a way to make it minified and optimised for production, so i used terser , clean-css and html-minifier-terser to minify the js, css and html files respectively, i do realise that this meant adding extra dependencies to the project (even though its not linked to the bot yet). The deployment website will be hosted on the bot’s server ( rylvion.hackclub.app ) and on the same port as the webhook server i also added new logging functionality that return smth like this the one below, this helps me track the usage of the commands and see how many times they have been used, when they were last used and by whom. this will be useful for the dashboard to show command usage statistics and manage command permissions. { \" commands \" : { \" sz-hash \" : { \" count \" : 3 , \" lastUsedAt \" : \" 2026-07-23T13:27:28.116Z \" , \" lastUser \" : \" rylvion \" , \" lastUserId \" : \" U0A84FA2NP2 \" } } } TL;DR: added a local prototype view of the web dashboard for slackzilla, its hosted on Github Pages and is a static site that is not connected to the bot yet, it shows the design and layout of the dashboard and how it will look when its connected to the bot and logging functionality that return command usage statistics and manage command permissions. introduced a new logging system that logs to both console and a file. added command usage tracking to record how often each command is used. enhanced server.js to serve dashboard, logs, and status pages. improved webhook handling and added signature verification. added a new metrics utility and feedback.js for tracking command usage statistics. next devlog will be about connecting the dashboard to the bot & server and making it functional, its gonna be a long one so stay tuned for that"}, {"post_id": 35837, "ts": "2026-07-27T15:06:51Z", "hours": 6.6219, "text": "Devlog 6 - command buffet time logged: 6hr 37m 19s date: 22/07/2026 okay since most of the major architectural refactors are done, i can finally focus on adding more commands to Slackzilla. this devlog is about the new commands that i added to the bot, which are mostly utility commands that can be used for various purposes. base64 encoding hashing - supports multiple algorithms, default: sha256 decoder - decodes every algorithm that hashing supports random ids (uuid) secure tokens random numbers unix date conversion text case conversion (camel, pascal, snake, kebab) character counter rock paper scissors magic 8ball (the only entertainment command added in this devlog) the trickier parts were the input parsers. hash has to decide whether the first word is an algorithm or part of the text, case needs to split words without mangling the content too much, and unix has to switch between timestamps and readable dates without getting confused by weird inputs. i also added guardrails for invalid ranges and missing text so the bot gives a useful reply instead of just silently failing. the fun commands were the easiest win. 8ball just picks from a response list, and rps does a quick match against the player choice and the bot choice to decide whether it was a win, lose, or tie. it is very low stakes code, which is honestly refreshing after the manifest workflow stuff from last time. all utilities commands all have a help command associated to it the current utilities commands include: /sz-base64 - encodes a string to base64 /sz-hash - generates a hash of a string, default: sha256 /sz-decode - decodes a base64 encoded string /sz-uuid - generates a random uuid /sz-token - generates a random secure token /sz-random - generates a random number in a given range /sz-unix - converts a unix timestamp to a human-readable date and vice versa /sz-case - converts a string to camelCase, PascalCase, snake_case, or kebab-case /sz-count - counts the number of characters in a string /sz-rps - plays rock paper scissors with the bot /sz-calc - evaluates mathematical expression so all of it has a 2nd argument for help, so for example /sz-hash help will show the usage and examples of the command. i also added on package.json , 2 new scripts \"validate-commands\" : \"ajv validate -s schemas/command.schema.json -d src/data/commands.json\" , \"cmd-stats\" : \"node scripts/stats.js\" one to validate the commands.json file against the command.schema.json file, and another to provide statistics about the number of commands in the commands.json file. this will help me keep track of how many commands are in the bot and also make sure that the commands.json file is valid before a pull request is merged. currently, the bot has 22 commands in total, and 11 of them are utility commands (10 of them got added into this devlog (excluding the /sz-8ball that also was added in this devlog, but is an entertainment command)). the other 11 commands are the ones that were already in the bot before this devlog. i need some feedback on what other commands i should add to the bot, so if you have any ideas, please let me know. (im running out of ideas * sighs * ) im also planning on adding a web dashboard to the bot, which will allow users to see the bot’s status, logs, and other information in a more user-friendly way. this will be a big change, so stay tuned for that in the next devlog TL;DR: added a bunch of new slash commands for Slackzilla, kept the implementations small and native where possible, and tightened up the input handling so the new tools fail a little more gracefully."}, {"post_id": 33001, "ts": "2026-07-22T15:09:05Z", "hours": 7.1047, "text": "Devlog 5 - manifest workflow time logged: 7hrs 6min 16 sec date: 21/07/2026 ok so i kinda lied in the last devlog. this ended up being another major architectural change to slackzilla. the slack manifest system was always the most brittle part of the pipeline and manually maintaining manifest.json was a guaranteed way to let things drift. today i finally automated the entire manifest workflow. the new setup makes commands.json and meta.js the single source of truth. i wrote a manifest generator that loads all metadata like descriptions colours oauth scopes bot info and merges it with the command definitions to build a complete slack manifest object. once assembled it writes manifest.json and syncs it during deployment. validation is baked directly into the generator. i wired AJV into both stages. every command is validated against command.schema.json and the final manifest is validated again against slack’s official schema. if anything fails the generator stops immediately with a clear error instead of producing a broken file. this caught several issues especially after i moved all schemas into a dedicated schemas/ directory to clean up the project structure. the github actions workflow also got a major overhaul. every push now generates the manifest validates commands and manifest rotates the slack configuration token updates github secrets syncs the manifest through the slack api and deploys the bot. changing a slash command in commands.json now updates both the bot and the slack app config automatically. no more manual edits to manifest.json or the slack app settings. the entire pipeline is now self maintaining and fully automated. token rotation was the biggest pain. slack configuration tokens only last twelve hours so storing them in github secrets was not enough. i created a fine grained github PAT with permission to modify repo secrets and wrote rotateManifestToken.js to handle the full refresh cycle. it rotates the manifest token receives a new refresh token and updates both secrets so the next deployment does not break. i spent way too long debugging an invalid_refresh_token error. note that slack’s copy button does not copy the existing refresh token it generates a new pair. every time i clicked it the previously saved token became invalid instantly. once i realised that i started updating github secrets immediately after copying the new pair so everything stayed in sync. after that the rotated token still was not being passed correctly between github actions steps. i switched to GITHUB_OUTPUT so the rotation step could hand the new token to the manifest sync step. then slack started returning not_authed which led to another rabbit hole. the manifest update endpoint requires the token in the correct auth header not the request body. once i fixed the request format the entire pipeline finally ran clean end to end. See figure 2 for github actions workflow TL;DR slackzilla now auto generates its slack manifest validates everything with AJV rotates configuration tokens syncs the manifest during deployment and updates the bot server with minimal manual work. after a lot of debugging around token rotation schema mismatches and github actions quirks the deployment pipeline is basically self maintaining except refreshing the github PAT every ninety days."}, {"post_id": 30675, "ts": "2026-07-18T13:24:53Z", "hours": 2.345, "text": "Devlog 4: calc and roll commands time logged: 2 hr 20 minutes date: 17/07/2026 today i spent some time reading the Java Shunting Yard Algorithm implementation on GeeksforGeeks . The example focuses entirely on converting an infix expression into postfix form. It scans the expression character by character, places operands directly into the output string, and uses a stack to manage operators based on precedence and associativity. Once the scan is complete, any remaining operators are appended to produce a postfix expression like 5238-52^^/+. The Java version supports operators including + , - , * , / , and ^ , and it handles parentheses, but it stops after producing the postfix representation. It does not evaluate the numerical result. after reading that, i wanted something more complete for Slackzilla. I used the same core idea of converting infix to postfix, but I extended it in several ways. My implementation tokenises the input instead of reading one character at a time, which allows it to support multi digit numbers and decimals. I added unary minus detection so expressions like -3 or 5*-2 behave correctly. One challenge was distinguishing unary minus from subtraction. The parser has to determine whether it starts with a number or subtracts two values depending on the previous token. I kept exponentiation with the correct right associativity. Once the postfix array is built, I added a second stage that evaluates the postfix expression using a number stack. This lets the function return the final computed value rather than just the postfix notation. The result is a more flexible and practical version of the algorithm that fits naturally into Slackzilla and can evaluate real expressions interactively. after finishing the calculator command, I also added another command to Slackzilla called /sz-roll . This command allows users to simulate dice rolls directly inside Slack. It supports normal dice notation like d6 , custom dice sizes like d20 , multiple dice such as 2d6 , and modifiers like 2d20+5 . I added parsing logic to split the dice expression into the amount of dice, number of sides, and any modifier before rolling each dice individually and calculating the final total. I also added a /sz-roll help and /sz-calc help command which explains how to use the command and shows examples of supported formats. also i spent A LOT of time making the flowchart to describe this more than the implementation itself. I think it will be useful for future reference and for anyone else who wants to understand how the algorithm works. i also added json schema validation for commands.json as talked in devlog 2 the commands.json is the source of truth, so i addded a validator.yml to validate the json schema of commands.json and make sure it is valid before a pull request is merged. This will help prevent errors and ensure that the commands are correctly defined. TL;DR: added a calculator using the Shunting Yard algorithm with postfix evaluation, plus a flexible dice rolling command. Also added help commands, a flowchart and automated JSON schema validation. also ill add way more devlogs from now on since most of my last devlogs were major architecture refactor, unless there is a major change, i will just add a small devlog to add a new command/small feature, fix a bug, improve an existing feature and add more documentation."}, {"post_id": 27894, "ts": "2026-07-13T20:15:52Z", "hours": 6.0267, "text": "Devlog 3 - github actions webhook request (13/07/2026) time logged: 6hr 01min i added a webhook dispatcher that automatically triggers a deployment whenever i commit to the main branch. Instead of manually pulling changes on the server and restarting the service myself, the GitHub Action now sends a signed webhook to my deployment server, which verifies it and runs the deploy script for me. i also added 2 more commands /sz-meme - this makes a meme /sz-echo [str] - this echoes the string you can see the flowchart below and see the full devlog 3 here (hyperlinked) TL;DR whenever i commit the server automatically receives it and slackzilla updates to the latest version"}, {"post_id": 21774, "ts": "2026-07-03T21:35:52Z", "hours": 11.0325, "text": "Devlog 2 - server setup & modular command system & more [03/07/2026] time logged: 10hr 59 min so since the last devlog, i’ve have worked on LOADS of things including behind the scene (this doesnt get tracked on hacaktime :( ), i dont even know if this will hit the char limit, but anyways, here are the logs EDIT: IT DID HIT THE CHAR LIMIT, turns out the original devlog was ~9.6k characters 💀 while the limit is only 4k, so this is the shortened version. the full one is still in priv/devlogs/devlog2.md if anyone wants the extended edition.z Commits logs e47c48ac0970b49015e920607a59657259122f2f - made the cur proj into more modular featuring dynamic command loading system w commands.json as the source of truth on this, i figured out that packing every single thing into one file is a bad idea, so i made a modular command system that loads commands dynamically from a commands.json file, this way, i can add new commands without having to touch the main bot.js file, and also, it makes it easier to manage commands since they are all in one place 03b07ffc6f44d0231f9073f637caee1f9437705a) - added more detailed server logging with time & user at the start of most console logs onto terminal [coloured output] this was way more of a pain than i thought it was gonna be. after countless rounds of testing i finally got it working how i wanted. the ansi colours kept either leaking into the rest of the terminal or resetting back to the default colour when i needed them to go back to the current log level. i was genuinely losing my mind because every “fix” just broke something else. after hours of messing around i ended up making a wrapper so instead of resetting after things like the username or command, it switches back to whatever the current log level colour is (info, success or error), then only resets once right at the end of the log. it took way longer than it should’ve and nearly made me give up, but it finally does exactly what i wanted and nothing leaks anymore.added src/utils/logger.js and switched almost every console.log over to it. it adds timestamps, users, commands and coloured log levels.and changed all the console logs in src/bot.js and src/cmds/ to use the new logger api b81c739cc06edba2895695e51dbbf88d8868f19f - overhauled readme well as the name implies its pretty self explanatory lol but i massively expanded the README with better documentation and setup instructions. Server setup find more info in the setup guide on Step 7 out of 8 in https://stardance.hackclub.com/missions/slack-bot/guide#step-7 i had to apply for a Nest server and get SSH access.yeah so basically my starting gear is a potato server (2GB RAM, 16GB storage) but that’s more than enough for this bot. i also got to mess around with linux for a bit ( yes i am a windows user ). honestly… i kinda liked it and i’m like 80% convinced i’ll switch one day (but too much of a hassle to switch rn, but maybe in the future). after installing everything, setting up the environment variables and creating a systemd service, i finally got the bot running 24/7.TL;DR: i got the bot running 24/7 in the server and it works perfectly fine, and i can now add new commands without having to touch the main bot.js file, and also, and added detailed server logging with time & user aight y’all i spent an ENTIRE HOUR writing this devlog and THEN i had to rewrite a shortened down version, y’all better rate me 9/9 for story telling, rylvion signing out 🫡 pls see my full devlog version"}, {"post_id": 1731, "ts": "2026-06-03T22:11:42Z", "hours": 1.815, "text": "slackzilla after countless testing of figuring out why my bot isnt working, i found out the reason… well sort of… it seems so that the bot doesnt read my messages nad only respond to app commands idk how to make it respond to my messages if it not a cmd but anyways here are the logs 7be9077de2a487f7be8a779123420295dc9bff7e - add MIT license 9ceb9c2fe638f91ab6b0a14326437c9a5f32f499 - add initial bot setup (just for testing!] 66eb775434c871f063fd57daf0bdfc7bd66501f1 - add launch.json, .env.example (like formats), README.md, add stuff to bot.js btw this isnt hosted (will host soon) or anything and to use it you have to use the cmd prefix (sc-) e.g., /sz-ping"}]...
|
Title: slackzilla 🦖🦖 by @rylvion | Stardance
Devl Title: slackzilla 🦖🦖 by @rylvion | Stardance
Devlogs:
slackzilla after countless testing of figuring out why my bot isnt working, i found out the reason… well sort of… it seems so that the bot doesnt read my messages nad only respond to app commands idk how to make it respond to my messages if it not a cmd but anyways here are the logs 7be9077de2a487f7be8a779123420295dc9bff7e - add MIT license 9ceb9c2fe638f91ab6b0a14326437c9a5f32f499 - add initial bot setup (just for testing!] 66eb775434c871f063fd57daf0bdfc7bd66501f1 - add launch.json, .env.example (like formats), README.md, add stuff to bot.js btw this isnt hosted (will host soon) or anything and to use it you have to use the cmd prefix (sc-) e.g., /sz-ping
Devlog 2 - server setup & modular command system & more [03/07/2026] time logged: 10hr 59 min so since the last devlog, i’ve have worked on LOADS of things including behind the scene (this doesnt get tracked on hacaktime :( ), i dont even know if this will hit the char limit, but anyways, here are the logs EDIT: IT DID HIT THE CHAR LIMIT, turns out the original devlog was ~9.6k characters 💀 while the limit is only 4k, so this is the shortened version. the full one is still in priv/devlogs/devlog2.md if anyone wants the extended edition.z Commits logs e47c48ac0970b49015e920607a59657259122f2f - made the cur proj into more modular featuring dynamic command loading system w commands.json as the source of truth on this, i figured out that packing every single thing into one file is a bad idea, so i made a modular command system that loads commands dynamically from a commands.json file, this way, i can add new commands without having to touch the main bot.js file, and also, it makes it easier to manage commands since they are all in one place 03b07ffc6f44d0231f9073f637caee1f9437705a) - added more detailed server logging with time & user at the start of most console logs onto terminal [coloured output] this was way more of a pain than i thought it was gonna be. after countless rounds of testing i finally got it working how i wanted. the ansi colours kept either leaking into the rest of the terminal or resetting back to the default colour when i needed them to go back to the current log level. i was genuinely losing my mind because every “fix” just broke something else. after hours of messing around i ended up making a wrapper so instead of resetting after things like the username or command, it switches back to whatever the current log level colour is (info, success or error), then only resets once right at the end of the log. it took way longer than it should’ve and nearly made me give up, but it finally does exactly what i wanted and nothing leaks anymore.added src/utils/logger.js and switched almost every console.log over to it. it adds timestamps, users, commands and coloured log levels.and changed all the console logs in src/bot.js and src/cmds/ to use the new logger api b81c739cc06edba2895695e51dbbf88d8868f19f - overhauled readme well as the name implies its pretty self explanatory lol but i massively expanded the README with better documentation and setup instructions. Server setup find more info in the setup guide on Step 7 out of 8 in https://stardance.hackclub.com/missions/slack-bot/guide#step-7 i had to apply for a Nest server and get SSH access.yeah so basically my starting gear is a potato server (2GB RAM, 16GB storage) but that’s more than enough for this bot. i also got to mess around with linux for a bit ( yes i am a windows user ). honestly… i kinda liked it and i’m like 80% convinced i’ll switch one day (but too much of a hassle to switch rn, but maybe in the future). after installing everything, setting up the environment variables and creating a systemd service, i finally got the bot running 24/7.TL;DR: i got the bot running 24/7 in the server and it works perfectly fine, and i can now add new commands without having to touch the main bot.js file, and also, and added detailed server logging with time & user aight y’all i spent an ENTIRE HOUR writing this devlog and THEN i had to rewrite a shortened down version, y’all better rate me 9/9 for story telling, rylvion signing out 🫡 pls see my full devlog version
Devlog 3 - github actions webhook request (13/07/2026) time logged: 6hr 01min i added a webhook dispatcher that automatically triggers a deployment whenever i commit to the main branch. Instead of manually pulling changes on the server and restarting the service myself, the GitHub Action now sends a signed webhook to my deployment server, which verifies it and runs the deploy script for me. i also added 2 more commands /sz-meme - this makes a meme /sz-echo [str] - this echoes the string you can see the flowchart below and see the full devlog 3 here (hyperlinked) TL;DR whenever i commit the server automatically receives it and slackzilla updates to the latest version
Devlog 4: calc and roll commands time logged: 2 hr 20 minutes date: 17/07/2026 today i spent some time reading the Java Shunting Yard Algorithm implementation on GeeksforGeeks . The example focuses entirely on converting an infix expression into postfix form. It scans the expression character by character, places operands directly into the output string, and uses a stack to manage operators based on precedence and associativity. Once the scan is complete, any remaining operators are appended to produce a postfix expression like 5238-52^^/+. The Java version supports operators including + , - , * , / , and ^ , and it handles parentheses, but it stops after producing the postfix representation. It does not evaluate the numerical result. after reading that, i wanted something more complete for Slackzilla. I used the same core idea of converting infix to postfix, but I extended it in several ways. My implementation tokenises the input instead of reading one character at a time, which allows it to support multi digit numbers and decimals. I added unary minus detection so expressions like -3 or 5*-2 behave correctly. One challenge was distinguishing unary minus from subtraction. The parser has to determine whether it starts with a number or subtracts two values depending on the previous token. I kept exponentiation with the correct right associativity. Once the postfix array is built, I added a second stage that evaluates the postfix expression using a number stack. This lets the function return the final computed value rather than just the postfix notation. The result is a more flexible and practical version of the algorithm that fits naturally into Slackzilla and can evaluate real expressions interactively. after finishing the calculator command, I also added another command to Slackzilla called /sz-roll . This command allows users to simulate dice rolls directly inside Slack. It supports normal dice notation like d6 , custom dice sizes like d20 , multiple dice such as 2d6 , and modifiers like 2d20+5 . I added parsing logic to split the dice expression into the amount of dice, number of sides, and any modifier before rolling each dice individually and calculating the final total. I also added a /sz-roll help and /sz-calc help command which explains how to use the command and shows examples of supported formats. also i spent A LOT of time making the flowchart to describe this more than the implementation itself. I think it will be useful for future reference and for anyone else who wants to understand how the algorithm works. i also added json schema validation for commands.json as talked in devlog 2 the commands.json is the source of truth, so i addded a validator.yml to validate the json schema of commands.json and make sure it is valid before a pull request is merged. This will help prevent errors and ensure that the commands are correctly defined. TL;DR: added a calculator using the Shunting Yard algorithm with postfix evaluation, plus a flexible dice rolling command. Also added help commands, a flowchart and automated JSON schema validation. also ill add way more devlogs from now on since most of my last devlogs were major architecture refactor, unless there is a major change, i will just add a small devlog to add a new command/small feature, fix a bug, improve an existing feature and add more documentation.
Devlog 5 - manifest workflow time logged: 7hrs 6min 16 sec date: 21/07/2026 ok so i kinda lied in the last devlog. this ended up being another major architectural change to slackzilla. the slack manifest system was always the most brittle part of the pipeline and manually maintaining manifest.json was a guaranteed way to let things drift. today i finally automated the entire manifest workflow. the new setup makes commands.json and meta.js the single source of truth. i wrote a manifest generator that loads all metadata like descriptions colours oauth scopes bot info and merges it with the command definitions to build a complete slack manifest object. once assembled it writes manifest.json and syncs it during deployment. validation is baked directly into the generator. i wired AJV into both stages. every command is validated against command.schema.json and the final manifest is validated again against slack’s official schema. if anything fails the generator stops immediately with a clear error instead of producing a broken file. this caught several issues especially after i moved all schemas into a dedicated schemas/ directory to clean up the project structure. the github actions workflow also got a major overhaul. every push now generates the manifest validates commands and manifest rotates the slack configuration token updates github secrets syncs the manifest through the slack api and deploys the bot. changing a slash command in commands.json now updates both the bot and the slack app config automatically. no more manual edits to manifest.json or the slack app settings. the entire pipeline is now self maintaining and fully automated. token rotation was the biggest pain. slack configuration tokens only last twelve hours so storing them in github secrets was not enough. i created a fine grained github PAT with permission to modify repo secrets and wrote rotateManifestToken.js to handle the full refresh cycle. it rotates the manifest token receives a new refresh token and updates both secrets so the next deployment does not break. i spent way too long debugging an invalid_refresh_token error. note that slack’s copy button does not copy the existing refresh token it generates a new pair. every time i clicked it the previously saved token became invalid instantly. once i realised that i started updating github secrets immediately after copying the new pair so everything stayed in sync. after that the rotated token still was not being passed correctly between github actions steps. i switched to GITHUB_OUTPUT so the rotation step could hand the new token to the manifest sync step. then slack started returning not_authed which led to another rabbit hole. the manifest update endpoint requires the token in the correct auth header not the request body. once i fixed the request format the entire pipeline finally ran clean end to end. See figure 2 for github actions workflow TL;DR slackzilla now auto generates its slack manifest validates everything with AJV rotates configuration tokens syncs the manifest during deployment and updates the bot server with minimal manual work. after a lot of debugging around token rotation schema mismatches and github actions quirks the deployment pipeline is basically self maintaining except refreshing the github PAT every ninety days.
Devlog 6 - command buffet time logged: 6hr 37m 19s date: 22/07/2026 okay since most of the major architectural refactors are done, i can finally focus on adding more commands to Slackzilla. this devlog is about the new commands that i added to the bot, which are mostly utility commands that can be used for various purposes. base64 encoding hashing - supports multiple algorithms, default: sha256 decoder - decodes every algorithm that hashing supports random ids (uuid) secure tokens random numbers unix date conversion text case conversion (camel, pascal, snake, kebab) character counter rock paper scissors magic 8ball (the only entertainment command added in this devlog) the trickier parts were the input parsers. hash has to decide whether the first word is an algorithm or part of the text, case needs to split words without mangling the content too much, and unix has to switch between timestamps and readable dates without getting confused by weird inputs. i also added guardrails for invalid ranges and missing text so the bot gives a useful reply instead of just silently failing. the fun commands were the easiest win. 8ball just picks from a response list, and rps does a quick match against the player choice and the bot choice to decide whether it was a win, lose, or tie. it is very low stakes code, which is honestly refreshing after the manifest workflow stuff from last time. all utilities commands all have a help command associated to it the current utilities commands include: /sz-base64 - encodes a string to base64 /sz-hash - generates a hash of a string, default: sha256 /sz-decode - decodes a base64 encoded string /sz-uuid - generates a random uuid /sz-token - generates a random secure token /sz-random - generates a random number in a given range /sz-unix - converts a unix timestamp to a human-readable date and vice versa /sz-case - converts a string to camelCase, PascalCase, snake_case, or kebab-case /sz-count - counts the number of characters in a string /sz-rps - plays rock paper scissors with the bot /sz-calc - evaluates mathematical expression so all of it has a 2nd argument for help, so for example /sz-hash help will show the usage and examples of the command. i also added on package.json , 2 new scripts "validate-commands" : "ajv validate -s schemas/command.schema.json -d src/data/commands.json" , "cmd-stats" : "node scripts/stats.js" one to validate the commands.json file against the command.schema.json file, and another to provide statistics about the number of commands in the commands.json file. this will help me keep track of how many commands are in the bot and also make sure that the commands.json file is valid before a pull request is merged. currently, the bot has 22 commands in total, and 11 of them are utility commands (10 of them got added into this devlog (excluding the /sz-8ball that also was added in this devlog, but is an entertainment command)). the other 11 commands are the ones that were already in the bot before this devlog. i need some feedback on what other commands i should add to the bot, so if you have any ideas, please let me know. (im running out of ideas * sighs * ) im also planning on adding a web dashboard to the bot, which will allow users to see the bot’s status, logs, and other information in a more user-friendly way. this will be a big change, so stay tuned for that in the next devlog TL;DR: added a bunch of new slash commands for Slackzilla, kept the implementations small and native where possible, and tightened up the input handling so the new tools fail a little more gracefully.
Devlog 7 - Adding a Web Dashboard (locally) time logged: 9hr 58m date: 31/07/2026 ███████╗██╗ █████╗ ██████╗██╗ ██╗███████╗██╗██╗ ██╗ █████╗ ██╔════╝██║ ██╔══██╗██╔════╝██║ ██╔╝╚══███╔╝██║██║ ██║ ██╔══██╗ ███████╗██║ ███████║██║ █████╔╝ ███╔╝ ██║██║ ██║ ███████║ ╚════██║██║ ██╔══██║██║ ██╔═██╗ ███╔╝ ██║██║ ██║ ██╔══██║ ███████║███████╗██║ ██║╚██████╗██║ ██╗███████╗██║███████╗███████╗██║ ██║ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝╚══════╝╚══════╝╚═╝ ╚═╝ added a local prototype view of the web dashboard for slackzilla, its hosted on Github Pages and is a static site that is not connected to the bot yet, it shows the design and layout of the dashboard and how it will look when its connected to the bot. the dashboard is designed to be responsive and works on both desktop and mobile devices. it has a clean and modern design that is easy to navigate. for Github Pages hosting, i used gh-pages branch which meant creating a seperate workflow ( pages.yml ) to build and deploy the dashboard to the dist/ folder. before that i needed a way to make it minified and optimised for production, so i used terser , clean-css and html-minifier-terser to minify the js, css and html files respectively, i do realise that this meant adding extra dependencies to the project (even though its not linked to the bot yet). The deployment website will be hosted on the bot’s server ( rylvion.hackclub.app ) and on the same port as the webhook server i also added new logging functionality that return smth like this the one below, this helps me track the usage of the commands and see how many times they have been used, when they were last used and by whom. this will be useful for the dashboard to show command usage statistics and manage command permissions. { " commands " : { " sz-hash " : { " count " : 3 , " lastUsedAt " : " 2026-07-23T13:27:28.116Z " , " lastUser " : " rylvion " , " lastUserId " : " U0A84FA2NP2 " } } } TL;DR: added a local prototype view of the web dashboard for slackzilla, its hosted on Github Pages and is a static site that is not connected to the bot yet, it shows the design and layout of the dashboard and how it will look when its connected to the bot and logging functionality that return command usage statistics and manage command permissions. introduced a new logging system that logs to both console and a file. added command usage tracking to record how often each command is used. enhanced server.js to serve dashboard, logs, and status pages. improved webhook handling and added signature verification. added a new metrics utility and feedback.js for tracking command usage statistics. next devlog will be about connecting the dashboard to the bot & server and making it functional, its gonna be a long one so stay tuned for that
Devlog 8 - server hosted dashboard finally happened time logged: 17hr 47min 45s date: 16/08/2026 The server hosted dashboard is finally here! It is hosted with the webhook, connected to the bot, and shows logs, status, and other information. architecture The Slackzilla server-hosted dashboard is the web control centre sitting alongside the webhook (runs on the same port). The server runs the dashboard, API routes, authentication/session handling, CSRF protection, logging, monitoring and administrative controls. The dashboard has been moving from the earlier static local/pages prototype (see devlog 7) towards an EJS-based server-rendered architecture, with shared layouts/partials and a global dashboard styling system. The server also handles the GitHub deployment webhook on port 9000 , while Nginx sits in front of the application. The dashboard is intended to expose things such as bot status, logs, statistics, monitoring, API documentation and admin controls rather than sshing into the server and running commands manually I’ve been separating the dashboard’s presentation layer, API layer and server logic. During development, I encountered and fixed several contract problems where route modules expected helpers such as context.sendError() and context.sendOk() that the runtime context did not provide. I also changed the authentication-aware API/SSE routes so unauthenticated requests return proper JSON/HTTP responses rather than accidentally redirecting an EventSource connection into an HTML login page. The dashboard has admin-only functionality, CSRF protection and server-side authentication, whilst the bot itself uses Slack’s Events/Slash Command mechanisms for incoming Slack activity. Slack’s Events API delivers subscribed events to the HTTP endpoint, while slash commands are sent to the configured app endpoint via HTTP POST. /api/admin routes are protected by an authenticated admin session and CSRF protection. Admin authentication uses a session cookie, which is only created after logging in through rylvion.hackclub.app/admin/login . The admin password is never stored in plaintext. It is stored as a PBKDF2-HMAC-SHA512 hash in the server environment, using a random salt and a high iteration count. The dashboard does not allow the password to be created or changed, so the server environment must be updated manually before restarting the service. CSRF tokens are generated server-side and sent to the authenticated client via a cookie. For POST requests, the client must return the token in the X-CSRF-Token header, preventing unauthorised or forged requests from triggering admin actions. /api/ (excluding /api/admin ) has no authentication Port 9000 is used for the webhook and the dashboard whilst the bot itself runs on socket mode. The api that currently has these endpoints base url: https://rylvion.hackclub.app/api/ GET /api/status - returns the bot status and other information GET /api/logs - returns the bot logs from slackzilla.log as JSON, including the file size in bytes POST /api/admin/control - allow the admin to control the accepts several actions such as start , stop , restart , redeploy , refresh , refresh-logs , refresh-status (self explanatory actions) with dangerous actions (such as redeploy , restart and stop ) contains a confirmation prompt to prevent accidental execution of the action. GET /api/admin/feedback - returns database feedback as JSON GET /api/admin/feedback/:id - returns the feedback with the given ID as JSON POST /api/admin/feedback/:id - allows the admin to control and accepts 3 actions such as delete , read , unread , respond . GET /api/admin/events - is a SSE (Server Sent Event) endpoint that allows the admin to receive real time events from the server such as logs, status, feedbacks and other information about the bot.
Devlog 9: React Dashboard time logged: 29hr 1m date: 03/09/2026 The React dashboard is finally here! I completely migrated the old EJS dashboard with a new React app. THIS will be IS the biggest devlog yet, as it covers a lot of changes and new features. main features added is migration, codebase assistance, graphs, telemetary and a new api. Heres a summary of what i changed renamed src/ to bot/ - this is because its related to the bot and not the server and its not where all the main files are migrated the EJS dashboard into a React app overhauled the UI deleted the pages system and the workflow to build it added a new RAG modal that answers questions about the repo and shows related visual assets (also includes a new rag.js file that handles retrieval and generation of answers) The react dashboard has the following features: 10 pages (Home, Admin, Api, Commands, Docs, Home, Logs, AI, Sitemap, Status) 12 components 8 utilities js exports in the utils/ folder 404 page (with routing) & Error Boundary modal page public AI assistant page with repository-aware retrieval and related visual assets command API with stable IDs, command help, and captured command responses (so API can be called from the dashboard) public status, logs, metrics, command, and AI API endpoints admin feedback controls for filtering, viewing, replying, marking read/unread, and deleting (they dont work on windows only linux) CPU, memory, disk, and network telemetry with responsive graphs and hover data tooltips (so satisfying) Current React Architecture The active client source lives in server/client/src/ . Vite builds it into server/client/dist/ , which is served by server/server.js . React Router renders the page routes declared in server/client/src/components/utils/routes.js . The server still owns the HTTP status code: known browser routes receive the React shell with 200 , while unknown browser routes receive the same shell with 404 so the client can render the NotFound page without hiding the correct HTTP semantics. The old EJS dashboard and static page-generation flow are no longer the active dashboard path. The bot remains in bot/ , separate from the dashboard server, and the server uses explicit Node http handlers under server/api/ . RAG and Command APIs The new /ai page sends questions to POST /api/ask . server/lib/rag.js retrieves relevant repository text while excluding priv/ , .env files, dependencies, logs, and build output. It can identify related image assets such as the calculator flowchart without parsing binary image contents. If configured, the retrieved context is sent to the AI provider; otherwise the endpoint returns a local configuration message and source metadata. Commands are exposed through GET /api/commands , GET /api/commands/:id , and POST /api/commands/:id . The API adapter reuses the same command modules as Slack and captures their responses. The Commands page provides the interactive runner, while the AI page remains focused on repository questions. Explicit natural-language requests can still ask the RAG service to execute a recognised slash command and return its result. Limitations The migration exposed several boundaries that are now documented in docs/ : authentication and CSRF, the webhook protocol, API registration, setup, and RAG behaviour. Runtime persistence is still file-backed through server/database/store.js ; an external database remains a future adapter project rather than a required dependency. Linux systemd controls and deployment scripts are intended for the hosted environment. On Windows local development, the dashboard, APIs, telemetry, and React pages work, but system service actions and Bash deployment are not expected to succeed. The dashboard must be rebuilt and restarted after production client or server changes.
Devlog 10 - QOL DASHBOARD IMPROVEMENTS, RAG ENHANCEMENTS WITH TOOLS & CACING AND LOTS OF STUFF time logged: 27 hrs 30 mins date: 20/09/2026 version: v0.9.5-beta This devlog is COVERING A LOT of stuff that i did, but im not gonna drag this over like i did from all other devlogs so heres are the features: covering from v0.9.1-beta to v0.9.5-beta, see release-history.json for the full changelog Features added Added RAG TOOLS including getStatus - returns the status of the RAG getCommands - with enhanced filtering (filter by name, usage hint, id, category and fuzzy filter (makes it easier for RAG to find commands)) getReleaseInfo - returns the release info of the CURRENT version and (optionally) any other version (pass it by parameter) runCommand - runs a command by id getLogs - returns recent logs for the RAG to inspect (max 100, default 20) getMetrics - returns the metrics of the RAG (memory usage, cpu usage, etc) getRoutes - returns the routes of the APIs added 3 new scripts ( npm run ) which are rag - runs the RAG with or without the --ai flag to see context/answer cli rag:use-tool - runs a tool by name (with optional parameters) release - appends current release notes from package.json to release-history.json . Added new endpoints /api/telemetry - returns the telemetry history separately from the main status endpoint /api/command/:id - gets or executes a command by id /api/telemetry/stream - streams telemetry updates using SSE /api/admin/server-events - returns server events for the admin dashboard /api/ask - now uses SSE to stream the RAG’s activity ( yers now we can see the RAG in aciton ), context, tool usage, token usage and final response dashboard imporvements added a seperate admin server events page (wevent searching, filtering, prioritisation and stylying) added a command runner on the command page fixed recent activity not showing up on the dashboard Added visible AI activity to the AI page the RAG now emits activity events while processing a question AI page is cached on localStorage so you can go back and forth between pages without losing the AI page state Improved the RAG’s repository awareness added AST-based parsing using acorn and acorn-walk added persistent .rag/index.json added symbol search and dependency analysis added function, export, function call, environment variable and route extraction added richer code context and source metadata added automatic index rebuilding improved path-based dependency detection fixed the RAG detecting references created using path.join(rootDir, ...) add token budgeting and usage tracking. Changed how telemetry is handled telemetry history is no longer included in /api/status or any other endpoints CHANGED all admin endpoints so that none of them has the telemetryHistory anymore Added release history tracking added release-history.json /sz-release can now retrieve release information for different versions npm run release automatically appends the current release notes Tl;DR: RAG got a major upgrade with AST-powered repository indexing (acorn/acorn-walk), persistent indexing via .rag/index.json , symbol search, dependency analysis, function/export/call/env-var/route extraction, richer source metadata, automatic index rebuilding, 7 new RAG tools, 3 new CLI tools, SSE-powered streaming for /api/ask and telemetry, telemetry endpoints, admin server events, live AI activity tracing, token/context/tool usage visibility, AI session caching, release history tracking, telemetry separation from /api/status, admin API cleanup, and a large collection of bug fixes, repository-awareness improvements and major QOL improvements. . hopefully i will be devloging every version till i ship
devlog 11 - ADMIN EHANCEMENTS: errors views, log archiving & restoration, logs deletion controls, RAG IMPROVEMENTS AND MORE… date: 11/10/2026 time logged: 31hr 57m version: v0.9.6-beta this release focused on making Slackzilla easier to debug, manage and understand internally. a LOT of work went into the admin panel, route extraction and testing. 1. admin panel got some SERIOUS upgrades added 3 new admin pages for server events, errors and logs. also split admin.css into separate stylesheets because one giant stylesheet isn’t exactly a maintenance strategy. error monitoring added an error viewer with timestamps, stack traces and source files improved error messages to make them more user-friendly log management added a log archive viewer with backup timestamps, line counts and file sizes added backup restoration and switching added controls to delete specific lines, ranges or the last X lines added log rotation and telemetry reset controls added the /log-archives admin endpoint 7 new admin controls: delete-logs , delete-lines , delete-last , delete-line , rotate-logs , restore-log and reset-telemetry that’s a LOT more control over server logs than before. 2. endpoints & session security added 4 new endpoints : 3 admin endpoints: /errors , /errors/stream , /log-archives 1 public endpoint: /api/session /api/session now provides current session information, with csrfToken moved from /api/admin/summary to the new endpoint. also fixed the CSRF token not appearing in the document head. small bug, annoying consequences. removed the children=[] pattern from routes.js and its associated dependencies. 3. RAG / code parser improvements route extraction got a substantial upgrade. detects routes using exact path checks, prefix checks and array-based matching improved HTTP method inference for conditional routes, including GET and POST merges duplicate route entries and inferred methods expanded discovery beyond server/api/ , including /webhook and /admin/login improved /api/routes to return supported methods, match types, source files and line numbers the goal: give the RAG system more accurate route information instead of confidently retrieving incomplete or duplicated data. ᕦ(ò_óˇ)ᕤ 4. AI activity & markdown the AI activity view now displays elapsed time alongside tool summaries and responses, making it easier to follow what the system actually did. replaced the custom Markdown parser with marked AND dompurify for established parsing and HTML sanitisation. switched the configured model from openrouter/free to openai/gpt-6-luna , aiming for better performance and reliability. also deduplicated getReleaseInfo to avoid maintaining redundant version information. 5. testing added 3 npm scripts : test:code-parser for code parser tests test:rag for RAG tests test:all for the broader test suite and validation checks added automated code parser tests covering route extraction, HTTP method inference and deduplication. 6. docs updated README.md and project documentation to reflect the latest endpoints, admin controls, route extraction changes and RAG improvements. documentation staying in sync with the codebase. revolutionary concept, apparently. release summary v0.9.6-beta added: 4 endpoints 7 admin controls 3 admin pages 3 npm testing scripts improved error visibility, log management, session information and route extraction updated Markdown rendering, AI activity information and documentation the main focus was improving maintainability, debugging and the reliability of Slackzilla’s internal tooling. ( ͡° ͜ʖ ͡°) next devlog hint: a terminal is coming. think less clicking through admin pages, more interacting with Slackzilla directly through a terminal interface. details in the NEXT devlog. \(^o^)/...
|
1792752514.4039207
|
1793357314.4039207
|
|
44437
|
slak bot by @bahodirboliqulov3 | Stardance
|
bahodirboliqulov3
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slak bot by @bahodirboliqulov3 | Stardance
|
1793274565.454394
|
1793879365.454394
|
|
59533
|
slakie by @IcedThrower_95 | Stardance
|
IcedThrower_95
|
1
|
10.71
|
48
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-11T10:32:16Z", "hours": 8.0, "multiplier": 6.23, "payout": 48, "blessing": "neutral", "text": "What did you make? I built Slackie—a multi-purpose Slack bot packed with 10 fully functional slash commands! I wanted to make something that wasn’t just a simple text responder, so I integrated multiple APIs to make it genuinely useful and fun. It features a Gemini 3.8 Flash AI assistant that can browse the web, a currency converter, a math expression evaluator, a QR code generator, and even a command that fetches the exact countdown and details for the next Formula 1 race. What was challenging? Trying to get the currency converter to accept flexible inputs (like “1299 USD to INR” vs just “USD to INR”) without completely breaking the code took a lot of trial and error. What am I proud of? The F1 Command: As a massive Formula 1 fan, building a custom /my-slakie-f1 command that tracks the next Grand Prix weekend using the Jolpica API was super satisfying. I am really proud that I figured out the Linux service file stuff. Slackie is now running flawlessly 24/7 on my own hardware. What should you know before testing? To talk to the AI, use /my-slakie-gemini [your question]. It has Google Search grounding enabled, so you can ask it about current events or tech news! Try /my-slakie-currency 100 USD to INR to test the live exchange rates. Type /my-slakie-help to see the full list of all 10 commands you can play with. Make sure you use the exact /my-slakie-… prefix so it doesn’t collide with other bots in the workspace! Example Here in the image attached shows the working of the /my-slakie-gemini [Question] command the model intellingently uses web search to get the latest information if its system instrutction is outdated", "repo": "https://github.com/IcedThrower95/slakie_bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0C16D3SXCK"}]...
|
[{"post_id": 72632, "ts": "202 [{"post_id": 72632, "ts": "2026-09-23T12:01:07Z", "hours": 1.6297, "text": "wrote the code my self from scratch again, as the reviewers were flagging it as “more than 30% usage of AI”"}, {"post_id": 66636, "ts": "2026-09-12T14:20:36Z", "hours": 1.0817, "text": "final devlog after review. Today I edited some of my codebase to make it more cleaner rather than having it clustered.I added a few comments as well along the way"}, {"post_id": 65887, "ts": "2026-09-11T10:18:56Z", "hours": 0.2964, "text": "at last i finished the README document and also edited some code(tiny changes to make it better)"}, {"post_id": 65832, "ts": "2026-09-11T07:29:41Z", "hours": 1.0794, "text": "#final - devlog3 I have finally fixed the gemini ai integration and i have 10 fully working commands, here i have attached. It took me a lot of time to debug the Gemini AI errors. i even used AI to debug but failed unfortunately. Anyways it is now fixed and everything works. Signing off on this project"}, {"post_id": 65318, "ts": "2026-09-10T12:10:30Z", "hours": 3.1189, "text": "#devlog2 , today i completed all the commands which i wanted to integrate in my slackbot.Moreover I am trying to fix the gemini ai which i have intergrated in my slakie it keeps giving me outdated information it is unable to do a web search. I hope to fix it by the end of today"}, {"post_id": 64343, "ts": "2026-09-08T17:24:03Z", "hours": 3.2531, "text": "#devlog1, today I started working on my project Slack bot—my-slakie. At first I followed the guide and went along with the flow. After a while, I had some ideas pop up into my head, and I tried to integrate Gemini AI in the slash command, but unfortunately I was unable to get the desired result—the bot is giving outdated data; the rest of the functions are fine. I will work on debugging the problem with Gemini tomorrow. Also, I am hosting my Slack bot on my Raspberry Pi instead of using the Hack Club Nest. So yeah, that’s it for today!!"}]...
|
Title: slakie by @IcedThrower_95 | Stardance
Devl Title: slakie by @IcedThrower_95 | Stardance
Devlogs:
#devlog1, today I started working on my project Slack bot—my-slakie. At first I followed the guide and went along with the flow. After a while, I had some ideas pop up into my head, and I tried to integrate Gemini AI in the slash command, but unfortunately I was unable to get the desired result—the bot is giving outdated data; the rest of the functions are fine. I will work on debugging the problem with Gemini tomorrow. Also, I am hosting my Slack bot on my Raspberry Pi instead of using the Hack Club Nest. So yeah, that’s it for today!!
#devlog2 , today i completed all the commands which i wanted to integrate in my slackbot.Moreover I am trying to fix the gemini ai which i have intergrated in my slakie it keeps giving me outdated information it is unable to do a web search. I hope to fix it by the end of today
#final - devlog3 I have finally fixed the gemini ai integration and i have 10 fully working commands, here i have attached. It took me a lot of time to debug the Gemini AI errors. i even used AI to debug but failed unfortunately. Anyways it is now fixed and everything works. Signing off on this project
at last i finished the README document and also edited some code(tiny changes to make it better)
final devlog after review. Today I edited some of my codebase to make it more cleaner rather than having it clustered.I added a few comments as well along the way
wrote the code my self from scratch again, as the reviewers were flagging it as “more than 30% usage of AI”
Ships:
What did you make? I built Slackie—a multi-purpose Slack bot packed with 10 fully functional slash commands! I wanted to make something that wasn’t just a simple text responder, so I integrated multiple APIs to make it genuinely useful and fun. It features a Gemini 3.8 Flash AI assistant that can browse the web, a currency converter, a math expression evaluator, a QR code generator, and even a command that fetches the exact countdown and details for the next Formula 1 race. What was challenging? Trying to get the currency converter to accept flexible inputs (like “1299 USD to INR” vs just “USD to INR”) without completely breaking the code took a lot of trial and error. What am I proud of? The F1 Command: As a massive Formula 1 fan, building a custom /my-slakie-f1 command that tracks the next Grand Prix weekend using the Jolpica API was super satisfying. I am really proud that I figured out the Linux service file stuff. Slackie is now running flawlessly 24/7 on my own hardware. What should you know before testing? To talk to the AI, use /my-slakie-gemini [your question]. It has Google Search grounding enabled, so you can ask it about current events or tech news! Try /my-slakie-currency 100 USD to INR to test the live exchange rates. Type /my-slakie-help to see the full list of all 10 commands you can play with. Make sure you use the exact /my-slakie-… prefix so it doesn’t collide with other bots in the workspace! Example Here in the image attached shows the working of the /my-slakie-gemini [Question] command the model intellingently uses web search to get the latest information if its system instrutction is outdated...
|
1793324965.146307
|
1793411365.146307
|
|
34769
|
slap people off the map by @leeyon | Stardance
|
leeyon
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slap people off the map by @leeyon | Starda Title: slap people off the map by @leeyon | Stardance...
|
1792658886.51895
|
1793263686.51895
|
|
52863
|
slashbotstem by @hamd | Stardance
|
hamd
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slashbotstem by @hamd | Stardance
|
1792727520.1805098
|
1793332320.1805098
|
|
46630
|
slate by @rizz | Stardance
|
rizz
|
0
|
0.62
|
0
|
[]
|
[{"post_id": 46883, "ts": "202 [{"post_id": 46883, "ts": "2026-08-14T13:00:50Z", "hours": 0.6167, "text": "devlog one: so idk what happened i recorded a timelapse but it didn’t record that screen idk how obv and yea i had selected the correct tab anyways i have designed the PCB….it is a 3 button pad that works on a esp32 super mini and i added some GPIO jumpers and that’s all for now"}]...
|
Title: slate by @rizz | Stardance
Devlogs:
devlog Title: slate by @rizz | Stardance
Devlogs:
devlog one: so idk what happened i recorded a timelapse but it didn’t record that screen idk how obv and yea i had selected the correct tab anyways i have designed the PCB….it is a 3 button pad that works on a esp32 super mini and i added some GPIO jumpers and that’s all for now...
|
1793141452.9295523
|
1793746252.9295523
|
|
30453
|
slate by @swedishsplidney | Stardance
|
swedishsplidney
|
0
|
150.35
|
0
|
[]
|
[{"post_id": 73395, "ts": "202 [{"post_id": 73395, "ts": "2026-09-25T01:57:08Z", "hours": 8.295, "text": "shadows this one is really cool, i feel like it really takes it from looking like its from 1995 to like… 2015 maybe? it doesnt look that good but i think its a massive improvement! right now, its a 4096x4096 shadowmap with an extent of 24 units, a random noise filter to reduce pixelation, and 3x3 pcf to make it look somewhat smooth it is currently orthographic light projection only, but I think i’ll work on getting perspective lighting soon :) shadows did reqire implementing a whole new imageview, descriptor set, render pass, all that, but i’m getting used to it atp lol serialization is also completely broken right now, so I do need to fix that…"}, {"post_id": 67098, "ts": "2026-09-13T04:51:35Z", "hours": 7.6267, "text": "texture loading!!! absolute yipee moment this took like a lot of thinking to figure out how to implement for reasons that i think are obvious, but some of them are: how tf do you load an image what does the loaded image data mean how do you map the texture to the model’s uv coords how does normal mapping work how does the shader know where on the image its reading and a lot more that i prolly forgot lol this whole thing basically meant a whole shader overhaul again (even though i alr did that last devlog but its whatever loll) you can now map albedo (color), normal (height/offset), orm (occlusion, roughness, metallic), and emmision (glowiness) emission only kind of works rn lol, but i will get to it soon also, you currently have to manually set filepaths to the textures you want in the .json sidecar for that model, i need to add filepicker stuff to the inspector but i will get to it ok the textures in the video below were manually baked, packed, etc at 4096*4096 in blender i think another feature i should work on soon is procedural material generating, because texture mapping will always have a resolution limit (even 4k textures look kinda bad when mapped to larger models) i also want to change how reflections work a little bit, or maybe add anti-aliasing because right now the reflections look deep fried (as you will see in the video below)"}, {"post_id": 65721, "ts": "2026-09-11T02:04:30Z", "hours": 7.1881, "text": "shader overhaul so i noticed that the pbr shader lowkey looked kinda ugly and my microfacet solver was buns af so i js spent a while fixing it up and basically ended up going down a rabbit hole of tonemapping and completely rewrote the whole thing i switched from some random generic tonemapping to khronos standard neutral pbr mapping, which i think looks wayyyyyy better, the colors actually feel accurate now i also spent a little while setting up the shader to support texture colors when i get that all working it is wayyy better now, especially metallic things i also started setting up for texture imports but right now its only albedo and it does NOT work in the slightest lmao i think i will hopefully have texture importing and mapping done by next devlog, but uhhhhh…. no promises"}, {"post_id": 63897, "ts": "2026-09-07T22:41:08Z", "hours": 8.7083, "text": "physics aaaaaaaaaaaaaaaaa it works concerningly well and it actually makes me really happy to see it working i legit jumped for joy when i first saw stuff dropping due to gravity the actual underlying physics engine is jolt physics, but all the init and handling and all that is custom from me its all linked to the inspector and allat, so you can tweak values real time, such as body type, bounciness, friction, and mass its now a physics playground instead of just a glorified obj viewer scaling is very broken as far as colliders go, ill probably fix that soon you can start and stop the physics sim with f5"}, {"post_id": 62615, "ts": "2026-09-06T02:39:32Z", "hours": 5.9828, "text": "working scene serialization (saving) if you hit ctrl + s (or hit the gui button) then it creates a .slate file, containing all the data of every object in the scene this .slate file is human readable (and editable), written in a format very similar to toml heres an example .slate file: [ scene ] name = \"SlateScene\" version = \"1.0\" [[ entity ]] index = 0 name = \"\" mesh_path = \"models/test_obj.obj\" position = [ -0.310723 , 0.927019 , 1.47743 ] rotation = [ 0 , -0 , 0 ] scale = [ 1.9916 , 2.28848 , 3.38984 ] [ entity . material ] albedo = [ 0.183333 , 1 , 0 , 1 ] roughness = 0.5 metallic = 1 ior = 1.5 transmission = 0 [[ entity ]] index = 1 name = \"\" mesh_path = \"models/emerald_monkey.obj\" position = [ 1.29034 , 0 , -5.64025e-08 ] rotation = [ 8.61461 , 6.18611 , 2.71029 ] scale = [ 3.07852 , 3.38535 , 3.86504 ] [ entity . material ] albedo = [ 0.050432 , 0.800023 , 0.302281 , 1 ] roughness = 0 metallic = 0 ior = 2.418 transmission = 1 next, ill probably start working on physics"}, {"post_id": 61285, "ts": "2026-09-04T04:09:23Z", "hours": 8.2292, "text": "scene serialization okay so this is akward but it doesnt actually work yet, but in my defense serialization is really confusing to me since i generally don’t do a whole lot with file writing and loading, especially in a custom formatted and extensioned .slate file it basically just takes a bunch of data by looping through scene objects and records them, then it also has to do that backwards, then i also have to implement a command and gui system to trigger the logic and i also want the .slate to be easily readable, so i need to format the text in a way that makes sense (i’m taking inspiration from TOML) hopefully its done next devlog, but no promises lol"}, {"post_id": 59368, "ts": "2026-09-01T04:03:06Z", "hours": 8.3792, "text": "color picking! i noticed that setting color in the inspector with 3 rgb values was really annoying, so i made a whole new ui class ( ui_color_picker.hpp/cpp ), that can hook into any other ui it supports: S/B box + hue bar RGB input CMYK input (mildly broken) hex input (very broken) it actually works pretty well, there is some bug where an object can never be fully white but i think thats a command issue not color picker or inspector next, it might be time to work on physics"}, {"post_id": 58306, "ts": "2026-08-30T17:59:13Z", "hours": 8.5094, "text": "bugfixes and writing docs i spent a good 4 hours just going through some code, finding anything that might be wrong and fixing them. surprisingly, i didnt find that much, which means that i’m better at coding than i thought i found a few places where i just forgot to add something to a cleanup function, which could have led to a small memory leak over time, but nothing major some bugs i fixed: the background of any dropdown menu was rendering behind the viewport selecting stuff in the hierarchy wouldnt sync with the inspector properly i forgot to add screenPointToRay to my cleanup function some other things that i forgot i also added a few std::couts in some spots that needed them i also decided to start writing some docs because my brain was fried i basically just dug through my ~3000 lines of vulkan init and rendering code, and took notes throughout and tried explaining my confusing mental processes in a .md file this kinda made me realize that i do not have enough annotation in my code but thats a problem for future me :)"}, {"post_id": 56986, "ts": "2026-08-29T01:24:41Z", "hours": 8.5281, "text": "hierarchy panel and scrolling the hierarchy panel itself was actually not that hard, the hard part was coming up with a reliable system that can detect and list every object currently loaded in the scene without turning your pc into an explosive the other hard part was modifying the dockspace layout to be able to handle multiple different panels, because previously, it was just one window per dockspace panel, but now it can be as many as you want also, the scrolling system is new, it is its own class ui_scrollable_container , and it is basically doing what the dockspace used to do, but it also lets you scroll. so now, the dockspace just loads a scrollable container, and the scrollable container does all the arrangement and sizing logic. the hierarchy works exactly as you would expect it to, it lists current scene objects and then you can select them from it eventually, ill prolly add support for parenting, which should be pretty easy its kinda crazy to see my custom persistent ui system slowly turn into something useful as i add more features to it so far ive just been adding features when i need them, i havent just thought of features i might need and added all of them"}, {"post_id": 55367, "ts": "2026-08-27T04:34:36Z", "hours": 8.7392, "text": "inspector updates and dropdowns the inspector now has IOR and transmission values that you can change, ui updates, and dropdowns this took literally like 45 epochs because i was running into a materialgpu indexing issue where the inspector boxes would update the wrong values and my peanut brain didnt even think to check if i set the indices correctly dropdowns also took a good 3-4 hours, but it wasnt too bad, mostly just figuring out the correct logic in total, the dropdown class (ui_dropdown.cpp/hpp) is at 169 lines, and the inspector class (ui_inspector_panel.cpp/hpp) is at 470 lines next, i think ill either work on ui rounding or a file hierarchy viewer"}, {"post_id": 52171, "ts": "2026-08-22T08:13:19Z", "hours": 8.115, "text": "ui inspector the inspector is by no means done, but its a start! right now its just supposed to be purely functional, but i plan on making it look better in the future the input boxes are their own ui class, meaning i can have those input boxes everywhere making the ui system from scratch is very fun, but it at times i do regret not using qml or im gui, but overall, i dont regret making it from scratch too much the main issues with it right now is that the sensitivity values in the input boxes feel wrong, i think the position needs less sensitivity and the rotation needs more also, the color ones are a bit broken, theres a little bit of discrepancy between what the ui shows and what the actual .json material sidecar has written, so i’ll have to figure out how to fix that i think at some point, i want to add support for dropdowns, so each row can be expanded into larger input boxes if needed, or so the entire transform or material section can be collapsed i also need to add input boxes for IOR and transmission, i jus forgot to do that lol, should be pretty easy tho"}, {"post_id": 49355, "ts": "2026-08-18T04:12:43Z", "hours": 5.6403, "text": "rotation gizmo, multi-object support you can now switch between the translation gizmo, and the rotation gizmo, and click between objects to change what one has the gizmo active the gizmo also stays locked to the selected meshes’ local axes, i might add switching between local and global axis orientation at some point, but for right now local only is good enough all of the gizmo mesh is generated from code, not as an obj, making it very efficient and fast and robust, but making the logic that generates vertices in the right position was very annoying lol next, ill probably work on an inspector panel where you can edit an object’s location, rotation, scale, material data, etc or maybe saving the scene to file but now you can move and rotate any amount of objects to your heart’s content"}, {"post_id": 47420, "ts": "2026-08-15T10:46:06Z", "hours": 9.2511, "text": "translation gizmo this was like miserable to make lol it took me sooooooo long to get translation working, basically i had this samurai battle with a scaling issue for the longest time, i accidentally told my code that the viewport was smaller than it actually was and it just took forever to find that out this issue caused a really annoying issue where the actual location of the rendered gizmo was different than the clickable area there was also this other issue where the gizmo would move twice the speed of the mesh it was translating, but it was just a flaw with the mesh class, the gizmo was basically constantly recieving its own center as well as the meshes’ center which made it translate double but it works now, i think it works pretty well its all based off of the modular command system, so anything can call translatemeshcommand and it translate meshes next is prolly working on rotate and scale and stuff, all the other gizmos that we need the gizmos also meant a new .vert and .frag pair, and a whole new vulkan render pipeline lol"}, {"post_id": 43684, "ts": "2026-08-09T02:47:19Z", "hours": 9.0197, "text": "grid generation this took forever, and was much harder than i expected basically, i needed to create a whole new rendering pipeline and a whole new glsl shader pair, as well as coming up with logic so the triangle-focused renderer can actually render some super thin infinite lines the grid does generate dynamically around the camera view, so it is endless i think it does look pretty good tho next, ill prolly work on adding some move and rotation and maybe even scale tools"}, {"post_id": 37279, "ts": "2026-07-29T21:25:56Z", "hours": 9.8689, "text": "mesh importing and refraction ima start off by saying that this isn’t true refraction, since that requires path tracing, which is really computationally intensive instead, i went with screen space refraction offset approximation , which is a good, efficient refraction approximator that i still think looks pretty cool material data for refraction the value that determines the transparency of an object is called transmission , and the value for refraction is index of refraction (or IOR) the current filesystem for materials that i have is .mtl files, because thats the standard filetype for exporting materials with objs from programs like blender. however, .mtl is a filesystem from the 1990s that was originally created for phong systems, meaning it doesnt really contain transmission values so, i created a json sidecar system, that generates a better, more robust, human readable material file for every model. so now, when you import an obj/mtl pair: it checks for a json sidecar file if there is one already, just load from that and finish! if there isn’t one already, now read the .mtl, extract as much info as you can from that, and write it to a new json file multi pass rendering in order to correctly render transparent meshes, you need at least 2 render passes (render the opaque ones first, then the transparent ones) also, for the refraction to work, it needs an image of everything behind it, so in between the opaque and transparent pass, it quickly copies everything on the screen to an offscreen framebuffer how the refraction works 1. get the view vector (v): this one’s simple, just evaluate the view direction from the fragment position to the camera position also, adjust the normal (n) if rendering backface 2. refraction vector (snell’s law): the refraction vector is actually easy too, glsl has a built in refract intrinsic so you just drive that with a clamped ior value 3. deviation mapping: to determine how much to bend the background scene texture, just calculate the deviation vector between the refracted ray and the view ray: vec3 rayDeviation = refractDir - (- V ); vec2 distortion = ( push . viewProjMatrix * vec4 ( rayDeviation , 0.0 )). xy * 0.05 * transmission ; 4. uv sampling + composite blending offset the screen coordinates, but in order to prevent the edges from exploding, it needs to be clamped also, sample the background buffer to blend lighting and make a fresnel rim other stuff i did: i also made a full custom persistent ui system (this took a while), and a command system, because hardcoding the ui to do stuff is bad so instead of the ui code directly running logic, clicking a button just sends a command to the command system this meant creating another render pass, meaning i’m up to 3 render passes per frame now the only command so far is file.import_mesh , which is also hooked into the ui (you can see in the video below)"}, {"post_id": 35648, "ts": "2026-07-27T07:01:43Z", "hours": 7.2731, "text": "pbr materials pbr math reflectance: this is the main equation that a cook-torrance pbr system, all the other equations lead back to this one at some point 𝐿𝑜(𝑝,𝜔𝑜) =𝐿𝑒(𝑝,𝜔𝑜) +∫Ω𝑓𝑟(𝑝,𝜔𝑖,𝜔𝑜)𝐿𝑖(𝑝,𝜔𝑖)(𝐧⋅𝜔𝑖)𝑑𝜔𝑖 this equation essentially just determines what light does after hitting a surface with specific parameters we approximate the integral with two different light interactions: diffuse (𝑘𝐷): any light that penetrates the surface, scatters internally, and re-emerges specular (𝑘𝑆): light that reflects directly off the micro-surface in the code itself, the total outgoing radiance ($L_o$) is calculated with: vec3 Lo = ( kD * albedo / PI + specular ) * radiance * NdotL ; cook-torrance brdf: the specular component is calculated using the cook-torrance microfacet brdf: ## 𝑓cook-torrance =𝐷⋅𝐺⋅𝐹 / 4(𝐍⋅𝐕)(𝐍⋅𝐋) where 𝐷, 𝐺, and 𝐹 represent: normal distribution (𝐷): the NDF statistical distribution calculates how many microfacets are aligned with the halfway vector ($𝐇=𝐕+𝐋 / abs(𝐕+𝐋)) 𝐷GGX(𝐍,𝐇,𝛼) = 𝛼^2 / 𝜋((𝐍⋅𝐇)2(𝛼2−1)+1)2 ```glsl float DistributionGGX(vec3 N, vec3 H, float roughness) { float a = roughness * roughness; float a2 = a * a; float NdotH = max(dot(N, H), 0.0); float NdotH2 = NdotH * NdotH; float num = a2; float denom = (NdotH2 * (a2 - 1.0) + 1.0); denom = PI * denom * denom; return num / max(denom, 0.000001); } ``` geometry (𝐺): smiths schlick-ggx microfacets can cast shadows and obscure light from the camera too, so the geometry function calculates the self shading factor using smiths method: 𝐺(𝐍,𝐕,𝐋,𝑘) =𝐺1(𝐍,𝐕,𝑘) ⋅𝐺1(𝐍,𝐋,𝑘) where 𝑘 maps roughness for direct lighting using 𝑘 = (roughness+1)^2 / 8: ```glsl float GeometrySchlickGGX(float NdotV, float roughness) { float r = (roughness + 1.0); float k = (r * r) / 8.0; float num = NdotV; float denom = NdotV * (1.0 - k) + k; return num / denom; } float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) { float NdotV = max(dot(N, V), 0.0); float NdotL = max(dot(N, L), 0.0); float ggx2 = GeometrySchlickGGX(NdotV, roughness); float ggx1 = GeometrySchlickGGX(NdotL, roughness); return ggx1 * ggx2; } ``` fresnel equation (𝐹): fresnel-schlick approximation the fresnel factor calculates the percentage of light reflected versus absorbed based on the viewing angle (𝜃): 𝐹(𝜃,𝐹0) =𝐹0 +(1−𝐹0)(1−cos𝜃)^5 nonmetals reflect around 4% of light (𝐹0 =0.04), while metals (conductors) use their tinted base albedo color as 𝐹0: ```glsl vec3 fresnelSchlick(float cosTheta, vec3 F0) { return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0); } // lower, inside main(): vec3 F0 = mix(vec3(0.04), albedo, metallic); vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0); ``` other stuff: a surface cant reflect more light than it recieves, so a simple equation is used to make sure this doesnt happen: ## 𝐤𝐃 =(1−𝐤𝐒) ⋅(1−metallic) right now, all the material data is pulled from a .mtl file i also added bindless ssbo storage so it doesnt explode when you have a lot of models next, i might keep working on the custom persistent ui system"}, {"post_id": 32732, "ts": "2026-07-22T02:20:30Z", "hours": 8.3064, "text": "custom obj file loading all of the obj loading is done using tinyobjloader , which is a popular header file that im using to get the raw vertex coords of any .obj file however, all tinyobj does is pass the raw vertex data to my code (technically it can do some basic triangulation, but thats not its main purpose so its not perfect) this means that any model with n-gons (complex polygons) will not work and will look super weird technically you can tell blender to explicitly triangulate a file when you export it, but i think that it should be able to take any obj that you can throw at it without needing external setup so i also added a popular header file called earcut , which at a basic level, just cuts any complex polygons into 3-vertex triangles (which my index pass and renderer accepts). this now means that it can load any custom obj file i want to add auto color loading (from the obj data) or texture loading next, or maybe work on the ui or add ambient occlusion"}, {"post_id": 25108, "ts": "2026-07-09T03:12:17Z", "hours": 6.5614, "text": "entered the 3rd dimension wasd movement made a whole separate Camera class (look at me keepin things organized ) this means that now the vulkan_renderer class has model, projection, view, and transform matrices: the model matrix tracks the transformations the view matrix essentially tracks where the camera is the projection matrix sets a perspective frustum in order to make things actually have perspective and not just be flat the lerping is also based on deltaTime, which means smooth movement no matter ur fps the mouse tracking is locked via SDL_SetWindowRelativeMouseMode , and can be unlocked with the escape key vertices and index buffers right now, the vertices are being set manually in my code… however, importing obj (and maybe gltf and stl) files is next on the feature list, i’m planning on using tinyobj all the geometry is indexed, which basically means that instead of wasting a ton of memory repeating data for 36 raw vertices, you can just define the 8 corner vertices, then use an index buffer pass to tell the gpu how to connect those 8 vertices into 12 triangles window resizing this was easy, basically just had to tell it to make new image views and framebuffers based on the current aspect ratio (w/h) when the size of the window changes so now, its a spinning cube in a resizeable window that you can move around with wasd"}, {"post_id": 22507, "ts": "2026-07-05T00:42:28Z", "hours": 6.1236, "text": "the window opens (!!) so, why did it take me 6 hours to get a window to open? it kinda just comes down to the fact that vulkan is vulkan on other apis such as opengl, the graphics driver just does stuff for you. you can say sumn like “open a window and make it pink” and it just does the memory, thread syncing, and goofy platform stuff for you vulkan on the other hand, wants none of that. if you dont specifically ask for something, it wont happen. this does make it significantly harder (and much easier to create a gpu-ending vram overflow) to code with, but it does have the benifit of being much more powerful, having no overhead, and 100% control. its not gonna do anything that you dont tell it to so what do you have to do to open a beautiful grey window with vulkan? os bridge (sdl3): instead of writing a whole abstraction for wayland/x11, win32 and metal, you just have to tell sdl3 that you’re making a vulkan window, and it does some magic stuff vulkan instance ( VkInstance ): this is how you get into the vulkan sdk. you kinda just have to tell vulkan everything it needs to know and ask sdl what extensions you need window surface ( VkSurfaceKHR ): vulkan is kinda dumb and doesnt know what a window actually is, so this is where sdl tells vulkan where it can actually write pixels pick a physical device: scan the current hardware, loop through every available device, and then just pick the best one (eventually ill probably add a way to select a custom one) logical device ( VkDevice ): the physical device is the actual doohickey in your computer that runs stuff, the logical device is the software’s interface to it. swapchain ( VkSwapchainKHR ): vulkan can’t actually write images directly to the screen (and that would look bad anyway), so you make a swapchain. my code does double buffering (basically vsync), which means that the screen displays image a, while the gpu is rendering image b. render pass and framebuffers: basically just telling vulkan what to do (in this case, clear the screen, then draw the color). the framebuffer just binds the swapchain image views to the render pass synchronization and command subsystem: believe it or not, your gpu’s clock speed is usually around (or more than) half of your cpu’s clock speed, so you have to make sure that your code waits for the gpu is ready before running the next c++ line. if you don’t, your gpu ram and cache will overflow. overall, this took a total of 764 lines of code just to get a grey window the nice part is that the progress that i’ll make is exponential, since the very beginning stuff takes the longest i also made a logo (the current project page banner)"}]...
|
Title: slate by @swedishsplidney | Stardance
Devl Title: slate by @swedishsplidney | Stardance
Devlogs:
the window opens (!!) so, why did it take me 6 hours to get a window to open? it kinda just comes down to the fact that vulkan is vulkan on other apis such as opengl, the graphics driver just does stuff for you. you can say sumn like “open a window and make it pink” and it just does the memory, thread syncing, and goofy platform stuff for you vulkan on the other hand, wants none of that. if you dont specifically ask for something, it wont happen. this does make it significantly harder (and much easier to create a gpu-ending vram overflow) to code with, but it does have the benifit of being much more powerful, having no overhead, and 100% control. its not gonna do anything that you dont tell it to so what do you have to do to open a beautiful grey window with vulkan? os bridge (sdl3): instead of writing a whole abstraction for wayland/x11, win32 and metal, you just have to tell sdl3 that you’re making a vulkan window, and it does some magic stuff vulkan instance ( VkInstance ): this is how you get into the vulkan sdk. you kinda just have to tell vulkan everything it needs to know and ask sdl what extensions you need window surface ( VkSurfaceKHR ): vulkan is kinda dumb and doesnt know what a window actually is, so this is where sdl tells vulkan where it can actually write pixels pick a physical device: scan the current hardware, loop through every available device, and then just pick the best one (eventually ill probably add a way to select a custom one) logical device ( VkDevice ): the physical device is the actual doohickey in your computer that runs stuff, the logical device is the software’s interface to it. swapchain ( VkSwapchainKHR ): vulkan can’t actually write images directly to the screen (and that would look bad anyway), so you make a swapchain. my code does double buffering (basically vsync), which means that the screen displays image a, while the gpu is rendering image b. render pass and framebuffers: basically just telling vulkan what to do (in this case, clear the screen, then draw the color). the framebuffer just binds the swapchain image views to the render pass synchronization and command subsystem: believe it or not, your gpu’s clock speed is usually around (or more than) half of your cpu’s clock speed, so you have to make sure that your code waits for the gpu is ready before running the next c++ line. if you don’t, your gpu ram and cache will overflow. overall, this took a total of 764 lines of code just to get a grey window the nice part is that the progress that i’ll make is exponential, since the very beginning stuff takes the longest i also made a logo (the current project page banner)
entered the 3rd dimension wasd movement made a whole separate Camera class (look at me keepin things organized ) this means that now the vulkan_renderer class has model, projection, view, and transform matrices: the model matrix tracks the transformations the view matrix essentially tracks where the camera is the projection matrix sets a perspective frustum in order to make things actually have perspective and not just be flat the lerping is also based on deltaTime, which means smooth movement no matter ur fps the mouse tracking is locked via SDL_SetWindowRelativeMouseMode , and can be unlocked with the escape key vertices and index buffers right now, the vertices are being set manually in my code… however, importing obj (and maybe gltf and stl) files is next on the feature list, i’m planning on using tinyobj all the geometry is indexed, which basically means that instead of wasting a ton of memory repeating data for 36 raw vertices, you can just define the 8 corner vertices, then use an index buffer pass to tell the gpu how to connect those 8 vertices into 12 triangles window resizing this was easy, basically just had to tell it to make new image views and framebuffers based on the current aspect ratio (w/h) when the size of the window changes so now, its a spinning cube in a resizeable window that you can move around with wasd
custom obj file loading all of the obj loading is done using tinyobjloader , which is a popular header file that im using to get the raw vertex coords of any .obj file however, all tinyobj does is pass the raw vertex data to my code (technically it can do some basic triangulation, but thats not its main purpose so its not perfect) this means that any model with n-gons (complex polygons) will not work and will look super weird technically you can tell blender to explicitly triangulate a file when you export it, but i think that it should be able to take any obj that you can throw at it without needing external setup so i also added a popular header file called earcut , which at a basic level, just cuts any complex polygons into 3-vertex triangles (which my index pass and renderer accepts). this now means that it can load any custom obj file i want to add auto color loading (from the obj data) or texture loading next, or maybe work on the ui or add ambient occlusion
pbr materials pbr math reflectance: this is the main equation that a cook-torrance pbr system, all the other equations lead back to this one at some point 𝐿𝑜(𝑝,𝜔𝑜) =𝐿𝑒(𝑝,𝜔𝑜) +∫Ω𝑓𝑟(𝑝,𝜔𝑖,𝜔𝑜)𝐿𝑖(𝑝,𝜔𝑖)(𝐧⋅𝜔𝑖)𝑑𝜔𝑖 this equation essentially just determines what light does after hitting a surface with specific parameters we approximate the integral with two different light interactions: diffuse (𝑘𝐷): any light that penetrates the surface, scatters internally, and re-emerges specular (𝑘𝑆): light that reflects directly off the micro-surface in the code itself, the total outgoing radiance ($L_o$) is calculated with: vec3 Lo = ( kD * albedo / PI + specular ) * radiance * NdotL ; cook-torrance brdf: the specular component is calculated using the cook-torrance microfacet brdf: ## 𝑓cook-torrance =𝐷⋅𝐺⋅𝐹 / 4(𝐍⋅𝐕)(𝐍⋅𝐋) where 𝐷, 𝐺, and 𝐹 represent: normal distribution (𝐷): the NDF statistical distribution calculates how many microfacets are aligned with the halfway vector ($𝐇=𝐕+𝐋 / abs(𝐕+𝐋)) 𝐷GGX(𝐍,𝐇,𝛼) = 𝛼^2 / 𝜋((𝐍⋅𝐇)2(𝛼2−1)+1)2 ```glsl float DistributionGGX(vec3 N, vec3 H, float roughness) { float a = roughness * roughness; float a2 = a * a; float NdotH = max(dot(N, H), 0.0); float NdotH2 = NdotH * NdotH; float num = a2; float denom = (NdotH2 * (a2 - 1.0) + 1.0); denom = PI * denom * denom; return num / max(denom, 0.000001); } ``` geometry (𝐺): smiths schlick-ggx microfacets can cast shadows and obscure light from the camera too, so the geometry function calculates the self shading factor using smiths method: 𝐺(𝐍,𝐕,𝐋,𝑘) =𝐺1(𝐍,𝐕,𝑘) ⋅𝐺1(𝐍,𝐋,𝑘) where 𝑘 maps roughness for direct lighting using 𝑘 = (roughness+1)^2 / 8: ```glsl float GeometrySchlickGGX(float NdotV, float roughness) { float r = (roughness + 1.0); float k = (r * r) / 8.0; float num = NdotV; float denom = NdotV * (1.0 - k) + k; return num / denom; } float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) { float NdotV = max(dot(N, V), 0.0); float NdotL = max(dot(N, L), 0.0); float ggx2 = GeometrySchlickGGX(NdotV, roughness); float ggx1 = GeometrySchlickGGX(NdotL, roughness); return ggx1 * ggx2; } ``` fresnel equation (𝐹): fresnel-schlick approximation the fresnel factor calculates the percentage of light reflected versus absorbed based on the viewing angle (𝜃): 𝐹(𝜃,𝐹0) =𝐹0 +(1−𝐹0)(1−cos𝜃)^5 nonmetals reflect around 4% of light (𝐹0 =0.04), while metals (conductors) use their tinted base albedo color as 𝐹0: ```glsl vec3 fresnelSchlick(float cosTheta, vec3 F0) { return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0); } // lower, inside main(): vec3 F0 = mix(vec3(0.04), albedo, metallic); vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0); ``` other stuff: a surface cant reflect more light than it recieves, so a simple equation is used to make sure this doesnt happen: ## 𝐤𝐃 =(1−𝐤𝐒) ⋅(1−metallic) right now, all the material data is pulled from a .mtl file i also added bindless ssbo storage so it doesnt explode when you have a lot of models next, i might keep working on the custom persistent ui system
mesh importing and refraction ima start off by saying that this isn’t true refraction, since that requires path tracing, which is really computationally intensive instead, i went with screen space refraction offset approximation , which is a good, efficient refraction approximator that i still think looks pretty cool material data for refraction the value that determines the transparency of an object is called transmission , and the value for refraction is index of refraction (or IOR) the current filesystem for materials that i have is .mtl files, because thats the standard filetype for exporting materials with objs from programs like blender. however, .mtl is a filesystem from the 1990s that was originally created for phong systems, meaning it doesnt really contain transmission values so, i created a json sidecar system, that generates a better, more robust, human readable material file for every model. so now, when you import an obj/mtl pair: it checks for a json sidecar file if there is one already, just load from that and finish! if there isn’t one already, now read the .mtl, extract as much info as you can from that, and write it to a new json file multi pass rendering in order to correctly render transparent meshes, you need at least 2 render passes (render the opaque ones first, then the transparent ones) also, for the refraction to work, it needs an image of everything behind it, so in between the opaque and transparent pass, it quickly copies everything on the screen to an offscreen framebuffer how the refraction works 1. get the view vector (v): this one’s simple, just evaluate the view direction from the fragment position to the camera position also, adjust the normal (n) if rendering backface 2. refraction vector (snell’s law): the refraction vector is actually easy too, glsl has a built in refract intrinsic so you just drive that with a clamped ior value 3. deviation mapping: to determine how much to bend the background scene texture, just calculate the deviation vector between the refracted ray and the view ray: vec3 rayDeviation = refractDir - (- V ); vec2 distortion = ( push . viewProjMatrix * vec4 ( rayDeviation , 0.0 )). xy * 0.05 * transmission ; 4. uv sampling + composite blending offset the screen coordinates, but in order to prevent the edges from exploding, it needs to be clamped also, sample the background buffer to blend lighting and make a fresnel rim other stuff i did: i also made a full custom persistent ui system (this took a while), and a command system, because hardcoding the ui to do stuff is bad so instead of the ui code directly running logic, clicking a button just sends a command to the command system this meant creating another render pass, meaning i’m up to 3 render passes per frame now the only command so far is file.import_mesh , which is also hooked into the ui (you can see in the video below)
grid generation this took forever, and was much harder than i expected basically, i needed to create a whole new rendering pipeline and a whole new glsl shader pair, as well as coming up with logic so the triangle-focused renderer can actually render some super thin infinite lines the grid does generate dynamically around the camera view, so it is endless i think it does look pretty good tho next, ill prolly work on adding some move and rotation and maybe even scale tools
translation gizmo this was like miserable to make lol it took me sooooooo long to get translation working, basically i had this samurai battle with a scaling issue for the longest time, i accidentally told my code that the viewport was smaller than it actually was and it just took forever to find that out this issue caused a really annoying issue where the actual location of the rendered gizmo was different than the clickable area there was also this other issue where the gizmo would move twice the speed of the mesh it was translating, but it was just a flaw with the mesh class, the gizmo was basically constantly recieving its own center as well as the meshes’ center which made it translate double but it works now, i think it works pretty well its all based off of the modular command system, so anything can call translatemeshcommand and it translate meshes next is prolly working on rotate and scale and stuff, all the other gizmos that we need the gizmos also meant a new .vert and .frag pair, and a whole new vulkan render pipeline lol
rotation gizmo, multi-object support you can now switch between the translation gizmo, and the rotation gizmo, and click between objects to change what one has the gizmo active the gizmo also stays locked to the selected meshes’ local axes, i might add switching between local and global axis orientation at some point, but for right now local only is good enough all of the gizmo mesh is generated from code, not as an obj, making it very efficient and fast and robust, but making the logic that generates vertices in the right position was very annoying lol next, ill probably work on an inspector panel where you can edit an object’s location, rotation, scale, material data, etc or maybe saving the scene to file but now you can move and rotate any amount of objects to your heart’s content
ui inspector the inspector is by no means done, but its a start! right now its just supposed to be purely functional, but i plan on making it look better in the future the input boxes are their own ui class, meaning i can have those input boxes everywhere making the ui system from scratch is very fun, but it at times i do regret not using qml or im gui, but overall, i dont regret making it from scratch too much the main issues with it right now is that the sensitivity values in the input boxes feel wrong, i think the position needs less sensitivity and the rotation needs more also, the color ones are a bit broken, theres a little bit of discrepancy between what the ui shows and what the actual .json material sidecar has written, so i’ll have to figure out how to fix that i think at some point, i want to add support for dropdowns, so each row can be expanded into larger input boxes if needed, or so the entire transform or material section can be collapsed i also need to add input boxes for IOR and transmission, i jus forgot to do that lol, should be pretty easy tho
inspector updates and dropdowns the inspector now has IOR and transmission values that you can change, ui updates, and dropdowns this took literally like 45 epochs because i was running into a materialgpu indexing issue where the inspector boxes would update the wrong values and my peanut brain didnt even think to check if i set the indices correctly dropdowns also took a good 3-4 hours, but it wasnt too bad, mostly just figuring out the correct logic in total, the dropdown class (ui_dropdown.cpp/hpp) is at 169 lines, and the inspector class (ui_inspector_panel.cpp/hpp) is at 470 lines next, i think ill either work on ui rounding or a file hierarchy viewer
hierarchy panel and scrolling the hierarchy panel itself was actually not that hard, the hard part was coming up with a reliable system that can detect and list every object currently loaded in the scene without turning your pc into an explosive the other hard part was modifying the dockspace layout to be able to handle multiple different panels, because previously, it was just one window per dockspace panel, but now it can be as many as you want also, the scrolling system is new, it is its own class ui_scrollable_container , and it is basically doing what the dockspace used to do, but it also lets you scroll. so now, the dockspace just loads a scrollable container, and the scrollable container does all the arrangement and sizing logic. the hierarchy works exactly as you would expect it to, it lists current scene objects and then you can select them from it eventually, ill prolly add support for parenting, which should be pretty easy its kinda crazy to see my custom persistent ui system slowly turn into something useful as i add more features to it so far ive just been adding features when i need them, i havent just thought of features i might need and added all of them
bugfixes and writing docs i spent a good 4 hours just going through some code, finding anything that might be wrong and fixing them. surprisingly, i didnt find that much, which means that i’m better at coding than i thought i found a few places where i just forgot to add something to a cleanup function, which could have led to a small memory leak over time, but nothing major some bugs i fixed: the background of any dropdown menu was rendering behind the viewport selecting stuff in the hierarchy wouldnt sync with the inspector properly i forgot to add screenPointToRay to my cleanup function some other things that i forgot i also added a few std::couts in some spots that needed them i also decided to start writing some docs because my brain was fried i basically just dug through my ~3000 lines of vulkan init and rendering code, and took notes throughout and tried explaining my confusing mental processes in a .md file this kinda made me realize that i do not have enough annotation in my code but thats a problem for future me :)
color picking! i noticed that setting color in the inspector with 3 rgb values was really annoying, so i made a whole new ui class ( ui_color_picker.hpp/cpp ), that can hook into any other ui it supports: S/B box + hue bar RGB input CMYK input (mildly broken) hex input (very broken) it actually works pretty well, there is some bug where an object can never be fully white but i think thats a command issue not color picker or inspector next, it might be time to work on physics
scene serialization okay so this is akward but it doesnt actually work yet, but in my defense serialization is really confusing to me since i generally don’t do a whole lot with file writing and loading, especially in a custom formatted and extensioned .slate file it basically just takes a bunch of data by looping through scene objects and records them, then it also has to do that backwards, then i also have to implement a command and gui system to trigger the logic and i also want the .slate to be easily readable, so i need to format the text in a way that makes sense (i’m taking inspiration from TOML) hopefully its done next devlog, but no promises lol
working scene serialization (saving) if you hit ctrl + s (or hit the gui button) then it creates a .slate file, containing all the data of every object in the scene this .slate file is human readable (and editable), written in a format very similar to toml heres an example .slate file: [ scene ] name = "SlateScene" version = "1.0" [[ entity ]] index = 0 name = "" mesh_path = "models/test_obj.obj" position = [ -0.310723 , 0.927019 , 1.47743 ] rotation = [ 0 , -0 , 0 ] scale = [ 1.9916 , 2.28848 , 3.38984 ] [ entity . material ] albedo = [ 0.183333 , 1 , 0 , 1 ] roughness = 0.5 metallic = 1 ior = 1.5 transmission = 0 [[ entity ]] index = 1 name = "" mesh_path = "models/emerald_monkey.obj" position = [ 1.29034 , 0 , -5.64025e-08 ] rotation = [ 8.61461 , 6.18611 , 2.71029 ] scale = [ 3.07852 , 3.38535 , 3.86504 ] [ entity . material ] albedo = [ 0.050432 , 0.800023 , 0.302281 , 1 ] roughness = 0 metallic = 0 ior = 2.418 transmission = 1 next, ill probably start working on physics
physics aaaaaaaaaaaaaaaaa it works concerningly well and it actually makes me really happy to see it working i legit jumped for joy when i first saw stuff dropping due to gravity the actual underlying physics engine is jolt physics, but all the init and handling and all that is custom from me its all linked to the inspector and allat, so you can tweak values real time, such as body type, bounciness, friction, and mass its now a physics playground instead of just a glorified obj viewer scaling is very broken as far as colliders go, ill probably fix that soon you can start and stop the physics sim with f5
shader overhaul so i noticed that the pbr shader lowkey looked kinda ugly and my microfacet solver was buns af so i js spent a while fixing it up and basically ended up going down a rabbit hole of tonemapping and completely rewrote the whole thing i switched from some random generic tonemapping to khronos standard neutral pbr mapping, which i think looks wayyyyyy better, the colors actually feel accurate now i also spent a little while setting up the shader to support texture colors when i get that all working it is wayyy better now, especially metallic things i also started setting up for texture imports but right now its only albedo and it does NOT work in the slightest lmao i think i will hopefully have texture importing and mapping done by next devlog, but uhhhhh…. no promises
texture loading!!! absolute yipee moment this took like a lot of thinking to figure out how to implement for reasons that i think are obvious, but some of them are: how tf do you load an image what does the loaded image data mean how do you map the texture to the model’s uv coords how does normal mapping work how does the shader know where on the image its reading and a lot more that i prolly forgot lol this whole thing basically meant a whole shader overhaul again (even though i alr did that last devlog but its whatever loll) you can now map albedo (color), normal (height/offset), orm (occlusion, roughness, metallic), and emmision (glowiness) emission only kind of works rn lol, but i will get to it soon also, you currently have to manually set filepaths to the textures you want in the .json sidecar for that model, i need to add filepicker stuff to the inspector but i will get to it ok the textures in the video below were manually baked, packed, etc at 4096*4096 in blender i think another feature i should work on soon is procedural material generating, because texture mapping will always have a resolution limit (even 4k textures look kinda bad when mapped to larger models) i also want to change how reflections work a little bit, or maybe add anti-aliasing because right now the reflections look deep fried (as you will see in the video below)
shadows this one is really cool, i feel like it really takes it from looking like its from 1995 to like… 2015 maybe? it doesnt look that good but i think its a massive improvement! right now, its a 4096x4096 shadowmap with an extent of 24 units, a random noise filter to reduce pixelation, and 3x3 pcf to make it look somewhat smooth it is currently orthographic light projection only, but I think i’ll work on getting perspective lighting soon :) shadows did reqire implementing a whole new imageview, descriptor set, render pass, all that, but i’m getting used to it atp lol serialization is also completely broken right now, so I do need to fix that…...
|
1792774523.8995285
|
1793379323.8995285
|
|
51226
|
slave hand SDG1 by @shadowmm | Stardance
|
shadowmm
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slave hand SDG1 by @shadowmm | Stardance
|
1792662610.427312
|
1793267410.427312
|
|
66504
|
slayerOS by @tanzeemrockz | Stardance
|
tanzeemrockz
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-08T13:13:40Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Well, after HOURS of learning and building, here it is: slayerOS is now officially live! So slayerOS is a web-based OS like environment and it has a “slay” menu, a taskbar, a notes app that saves to localStorage, a calculator app that works , and an F1 hub app that shows you live formula 1 race results! that’s almost it but i learnt a LOT on my way!", "repo": "https://github.com/tanzeemrockz/slayerOS/", "demo": "https://slayeros.cyberslayercorpz.dev/"}]...
|
[{"post_id": 77818, "ts": "202 [{"post_id": 77818, "ts": "2026-10-08T12:14:16Z", "hours": 0.6572, "text": "well, i’m workin on a bit of the f1 hub app and it’s a pain ngl but stay tuned!"}, {"post_id": 76065, "ts": "2026-10-02T07:29:10Z", "hours": 0.8264, "text": "okay guys i just added a new app (calculator) and MAN I HATE JAVASCRIPT it’s soo bad and it’s just messing with my mind atp. but, now that’s all i’ve done for the last hour (you might call it 49 mins but nah) okay that’s all for the devlog looking forward to maybe add an f1 tracker in the next one. cya!"}, {"post_id": 75657, "ts": "2026-09-30T17:28:56Z", "hours": 0.3283, "text": "so, the last devlog was a bit funky, as i wrote the devlog and then went off to go code (but i forgot to click on post) so this post says 19 mins when it was definitely MORE than 45 mins. anyways, i just added functionality to the minimize button, added the apps to the taskbar, and now the start menu has smth (if not nothing it looks bad but i mean who cares) so looking forward to makin it better!"}, {"post_id": 75639, "ts": "2026-09-30T16:58:08Z", "hours": 0.9378, "text": "next up, i just wired up the notes app to localStorage (it failed to work due to a missing comma at first i basically gave up at that point lol) then now the maximize button is also working! looking forward to fixing the minimize button, make a start-menu perhaps (slay-menu lol) so stay tuned!"}, {"post_id": 75608, "ts": "2026-09-30T15:31:13Z", "hours": 0.3217, "text": "so i just made the close button and the desktop shortcut for the only app (notepad) work so now looking forward to make this better!"}, {"post_id": 75487, "ts": "2026-09-30T07:29:22Z", "hours": 0.9481, "text": "Well, just fixed a few things and made the window moving! well, that was quite hard and i accidentally made just the header move first then i had to debug a LOT and fixed it but, works like a charm!"}, {"post_id": 74850, "ts": "2026-09-28T13:16:02Z", "hours": 0.53, "text": "Just added a notes windows (looks draggable but it’s not lol) and fixed the time with some JavaScript, and looking forward!"}, {"post_id": 74841, "ts": "2026-09-28T12:40:49Z", "hours": 1.475, "text": "So, just got the shell ready, ultra-basic, has no functionality whatsoever, and I used a stock image as the bg-image lol!"}]...
|
Title: slayerOS by @tanzeemrockz | Stardance
Devl Title: slayerOS by @tanzeemrockz | Stardance
Devlogs:
So, just got the shell ready, ultra-basic, has no functionality whatsoever, and I used a stock image as the bg-image lol!
Just added a notes windows (looks draggable but it’s not lol) and fixed the time with some JavaScript, and looking forward!
Well, just fixed a few things and made the window moving! well, that was quite hard and i accidentally made just the header move first then i had to debug a LOT and fixed it but, works like a charm!
so i just made the close button and the desktop shortcut for the only app (notepad) work so now looking forward to make this better!
next up, i just wired up the notes app to localStorage (it failed to work due to a missing comma at first i basically gave up at that point lol) then now the maximize button is also working! looking forward to fixing the minimize button, make a start-menu perhaps (slay-menu lol) so stay tuned!
so, the last devlog was a bit funky, as i wrote the devlog and then went off to go code (but i forgot to click on post) so this post says 19 mins when it was definitely MORE than 45 mins. anyways, i just added functionality to the minimize button, added the apps to the taskbar, and now the start menu has smth (if not nothing it looks bad but i mean who cares) so looking forward to makin it better!
okay guys i just added a new app (calculator) and MAN I HATE JAVASCRIPT it’s soo bad and it’s just messing with my mind atp. but, now that’s all i’ve done for the last hour (you might call it 49 mins but nah) okay that’s all for the devlog looking forward to maybe add an f1 tracker in the next one. cya!
well, i’m workin on a bit of the f1 hub app and it’s a pain ngl but stay tuned!
Ships:
Well, after HOURS of learning and building, here it is: slayerOS is now officially live! So slayerOS is a web-based OS like environment and it has a “slay” menu, a taskbar, a notes app that saves to localStorage, a calculator app that works , and an F1 hub app that shows you live formula 1 race results! that’s almost it but i learnt a LOT on my way!...
|
1793216964.5357296
|
1793303364.5357296
|
|
64005
|
sleeper rc car by @Bhavyadeep | Stardance
|
Bhavyadeep
|
0
|
4.09
|
0
|
[]
|
[{"post_id": 71812, "ts": "202 [{"post_id": 71812, "ts": "2026-09-21T16:20:17Z", "hours": 1.4778, "text": "Just completed the random rc car build!! the project’s name was sleeper rc car cuz this thing has a upgraded motor and a 3s lipo powering it also it has a hobby grade servo too!!"}, {"post_id": 71769, "ts": "2026-09-21T14:26:06Z", "hours": 2.6167, "text": "hello everyone so this is a random weekend project that i did and this is basically a cheap rc car which i split in half and then made the whole thing hobby grade in one go one day. this was originally a hangout project with my friend but then we were not able to do much so i decided to do it as a fun weekend project in this Log i completed the whole of the hardware and in the next one i will be doing the cosmetics and refining it a bit"}]...
|
Title: sleeper rc car by @Bhavyadeep | Stardance
Title: sleeper rc car by @Bhavyadeep | Stardance
Devlogs:
hello everyone so this is a random weekend project that i did and this is basically a cheap rc car which i split in half and then made the whole thing hobby grade in one go one day. this was originally a hangout project with my friend but then we were not able to do much so i decided to do it as a fun weekend project in this Log i completed the whole of the hardware and in the next one i will be doing the cosmetics and refining it a bit
Just completed the random rc car build!! the project’s name was sleeper rc car cuz this thing has a upgraded motor and a 3s lipo powering it also it has a hobby grade servo too!!...
|
1793058483.1489155
|
1793663283.1489155
|
|
15386
|
sleepy runner by @uzunemir778 | Stardance
|
uzunemir778
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: sleepy runner by @uzunemir778 | Stardance
|
1792713069.4810622
|
1793317869.4810622
|
|
47358
|
slick-slack-bot by @ctrl_z_assem | Stardance
|
ctrl_z_assem
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slick-slack-bot by @ctrl_z_assem | Stardanc Title: slick-slack-bot by @ctrl_z_assem | Stardance...
|
1793177716.7677584
|
1794041716.7677584
|
|
50737
|
slider diner by @Theflyingelf | Stardance
|
Theflyingelf
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slider diner by @Theflyingelf | Stardance
|
1792641172.1870158
|
1793245972.1870158
|
|
13888
|
slime webOs by @smileslime271 | Stardance
|
smileslime271
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slime webOs by @smileslime271 | Stardance
|
1792662481.35854
|
1793267281.35854
|
|
67950
|
slimePet by @yahoo77 | Stardance
|
yahoo77
|
1
|
8.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-24T19:45:30Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "slimePet - LAST DEVLOG Well the biggest thing that I took away from this project is that game development is not for me hahah. Fixing bugs was the most challenging part to be honest. It was the most painful experience to make slime behave normally on my resolution and make sure it wouldn’t bug out at the borders of the screen. Everything you should know is in the README on GitHub if you want to check it out! My teacher already asked me if it isn’t annoying to code with a weird slime jumping on my screen lol", "repo": "https://github.com/Chillerek/SlimePet", "demo": "https://yahoo-77.itch.io/slimepet"}]...
|
[{"post_id": 77638, "ts": "202 [{"post_id": 77638, "ts": "2026-10-07T18:20:12Z", "hours": 1.5775, "text": "slimePet - 00 Before shipping i made some new things he gets angry when you hold him for too long you can pet him behavioral system fixed many errors 🙏🙏🙏 Because of this project i know that game development is not for me hahah"}, {"post_id": 77382, "ts": "2026-10-06T18:47:32Z", "hours": 1.3997, "text": "slimePet - 03 Today I fixed errors with dragging the slime outside the screen and changing its appearance i think it handles all errors that user can do! (i don’t have any screenshots so i will just add some random stuff lol)"}, {"post_id": 77121, "ts": "2026-10-05T18:12:11Z", "hours": 2.4514, "text": "slimePet - 02 Made some skins that you can change by using your numbers Repaired some errors And more…"}, {"post_id": 76787, "ts": "2026-10-04T15:58:53Z", "hours": 3.0606, "text": "slimePet - 01 I’ve copied the code from guide and now i’m making my own pet it’s gonna to be a slime that will bounce on ur desktop bar :3 today i’ve added Movement Bouncing off the edges Animations Dragging And animation of death when you’re clicking it with the scroll! Started designing the apperance menu too and afk animation code"}]...
|
Title: slimePet by @yahoo77 | Stardance
Devlogs:
Title: slimePet by @yahoo77 | Stardance
Devlogs:
slimePet - 01 I’ve copied the code from guide and now i’m making my own pet it’s gonna to be a slime that will bounce on ur desktop bar :3 today i’ve added Movement Bouncing off the edges Animations Dragging And animation of death when you’re clicking it with the scroll! Started designing the apperance menu too and afk animation code
slimePet - 02 Made some skins that you can change by using your numbers Repaired some errors And more…
slimePet - 03 Today I fixed errors with dragging the slime outside the screen and changing its appearance i think it handles all errors that user can do! (i don’t have any screenshots so i will just add some random stuff lol)
slimePet - 00 Before shipping i made some new things he gets angry when you hold him for too long you can pet him behavioral system fixed many errors 🙏🙏🙏 Because of this project i know that game development is not for me hahah
Ships:
slimePet - LAST DEVLOG Well the biggest thing that I took away from this project is that game development is not for me hahah. Fixing bugs was the most challenging part to be honest. It was the most painful experience to make slime behave normally on my resolution and make sure it wouldn’t bug out at the borders of the screen. Everything you should know is in the README on GitHub if you want to check it out! My teacher already asked me if it isn’t annoying to code with a weird slime jumping on my screen lol...
|
1793292682.8772237
|
1793379082.8772237
|
|
6600
|
slnap-bot by @JSnap | Stardance
|
JSnap
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-25T19:51:23Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "successfully made the “slnap-bot” (mix of slack and snap… get it? get it???) it can get a cat gif (/slnapbot-gifcat) it can get a cat pic(/slnapbot-catpic) and you can ping it (/slnapbot-ping) it uses catas (cat as a service) for the pics.", "repo": "https://github.com/JSnapXYZ/slnap-bot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0AS9G1FLAV"}]...
|
[{"post_id": 73723, "ts": "202 [{"post_id": 73723, "ts": "2026-09-25T19:46:54Z", "hours": 1.7225, "text": "successfully made the “slnap-bot” (mix of slack and snap… get it? get it???) it can get a cat gif (/slnapbot-gifcat) it can get a cat pic(/slnapbot-catpic) and you can ping it (/slnapbot-ping) it uses catas (cat as a service) for the pics."}]...
|
Title: slnap-bot by @JSnap | Stardance
Devlogs:
s Title: slnap-bot by @JSnap | Stardance
Devlogs:
successfully made the “slnap-bot” (mix of slack and snap… get it? get it???) it can get a cat gif (/slnapbot-gifcat) it can get a cat pic(/slnapbot-catpic) and you can ping it (/slnapbot-ping) it uses catas (cat as a service) for the pics.
Ships:
successfully made the “slnap-bot” (mix of slack and snap… get it? get it???) it can get a cat gif (/slnapbot-gifcat) it can get a cat pic(/slnapbot-catpic) and you can ping it (/slnapbot-ping) it uses catas (cat as a service) for the pics....
|
1793148933.6980047
|
1793235333.6980047
|
|
61210
|
slop-slack by @asamarth875 | Stardance
|
asamarth875
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: slop-slack by @asamarth875 | Stardance
|
1793040458.3874366
|
1793645258.3874366
|
|
20841
|
slot machine verification code by @lindae | Starda slot machine verification code by @lindae | Stardance...
|
lindae
|
0
|
0.45
|
0
|
[]
|
[{"post_id": 10616, "ts": "202 [{"post_id": 10616, "ts": "2026-06-17T13:39:46Z", "hours": 0.4511, "text": "I started to create my worstui program for a project with bad UI."}]...
|
Title: slot machine verification code by @lindae | Title: slot machine verification code by @lindae | Stardance
Devlogs:
I started to create my worstui program for a project with bad UI....
|
1793177480.087155
|
1793782280.087155
|
|
50572
|
slover by @skue | Stardance
|
skue
|
0
|
10.38
|
0
|
[]
|
[{"post_id": 60332, "ts": "202 [{"post_id": 60332, "ts": "2026-09-02T16:44:48Z", "hours": 1.4003, "text": "DEVLOG 6 - I added OpenAI detection to my AI watermark detector library ! So uhm I was tired with Videoseal, so I just decided to do the openai implementation instead. It was pretty simple, and I tried to do it without using the OpenAI sdk because i didn’t wanted to add yet another dependency. I also added a config to pass to the detector, and a way to ignore a detector."}, {"post_id": 59855, "ts": "2026-09-01T20:36:46Z", "hours": 4.3836, "text": "DEVLOG 5 - It’s been a looong time, it’s so hard… I tried to implement meta videoseal, and after countless of tries, I managed to export the detector to an ONNX model, that I could use in the library. The only problem is that I don’t know a lot about machine learning, so it doesn’t work at all. The JS script made to use the model just gives random results, often giving more score to non-ai images than to watermarked images. If anyone knows how to help with this, I would love a biiit of help. The Github repo is opened to issues and all the code is Open Source :). (Also I did the Jame Gam it was really fun :3)"}, {"post_id": 51285, "ts": "2026-08-20T20:33:49Z", "hours": 1.4819, "text": "Devlog 4 - Very tiny update :). I don’t have my main computer, so I can’t do heavy things, which is what I need to do right now. But I used Blob objects instead of paths so that the library is compatible with bot Node and web browsers. I also tried some things with the openai detector, but the public api needs an API key and the private one has a turnstile challenge to solve. If anyone has tips to solve that, I would be really happy to hear them ! I also experimented with pytorch export to ONNX, but I don’t have the right pc right now (not committed yet). So yeah very smoll update, thanks for reading till the end."}, {"post_id": 49963, "ts": "2026-08-18T23:20:10Z", "hours": 1.2847, "text": "DEVLOG 3 - I made a logo for my AI watermark detection tool ! Also, I fixed a bug that made C2PA flag human made c2pa content as ai content."}, {"post_id": 49535, "ts": "2026-08-18T12:36:21Z", "hours": 0.9353, "text": "Devlog 2 - I made the base implémentation for image and video detection !When sending an image or a video, the system will pass the file against each available detector (for now, only SynthID), and return a ImageAnalysisResult object (or a VideoAnalysisResult) with every result, and some methods to easily manage the data.I also created a base README (on mobile, without hackatime), and a ROADMAP with what I plan to implement.Here is the list of detectors I will implement, but feel free to suggest some other watermarks to implement ! C2PA (done), OpenAI verificator (in progress), Stable signature, Meta Content Seal (Audiodeal, Videoseal, Textdeal, Imageseal), Elevenlabs synthid (not sure), Claude Watermark (when public). That’s it for now !"}, {"post_id": 49253, "ts": "2026-08-17T22:55:39Z", "hours": 0.8964, "text": "[FIRST DEVLOG] Building my first JS project, Slover ! Slover is a tool to unify every major AI watermarking detection tool (c2pa, openai verificator, synthid-text..) in an easy to use JS library. For now, there is a start of c2pa detector implementation, but I plan on adding a lot more of tools ! Also, I plan on making a browser extension, and a website to use it, but users will be free to integrate it wherever they want."}]...
|
Title: slover by @skue | Stardance
Devlogs:
[FIRS Title: slover by @skue | Stardance
Devlogs:
[FIRST DEVLOG] Building my first JS project, Slover ! Slover is a tool to unify every major AI watermarking detection tool (c2pa, openai verificator, synthid-text..) in an easy to use JS library. For now, there is a start of c2pa detector implementation, but I plan on adding a lot more of tools ! Also, I plan on making a browser extension, and a website to use it, but users will be free to integrate it wherever they want.
Devlog 2 - I made the base implémentation for image and video detection !When sending an image or a video, the system will pass the file against each available detector (for now, only SynthID), and return a ImageAnalysisResult object (or a VideoAnalysisResult) with every result, and some methods to easily manage the data.I also created a base README (on mobile, without hackatime), and a ROADMAP with what I plan to implement.Here is the list of detectors I will implement, but feel free to suggest some other watermarks to implement ! C2PA (done), OpenAI verificator (in progress), Stable signature, Meta Content Seal (Audiodeal, Videoseal, Textdeal, Imageseal), Elevenlabs synthid (not sure), Claude Watermark (when public). That’s it for now !
DEVLOG 3 - I made a logo for my AI watermark detection tool ! Also, I fixed a bug that made C2PA flag human made c2pa content as ai content.
Devlog 4 - Very tiny update :). I don’t have my main computer, so I can’t do heavy things, which is what I need to do right now. But I used Blob objects instead of paths so that the library is compatible with bot Node and web browsers. I also tried some things with the openai detector, but the public api needs an API key and the private one has a turnstile challenge to solve. If anyone has tips to solve that, I would be really happy to hear them ! I also experimented with pytorch export to ONNX, but I don’t have the right pc right now (not committed yet). So yeah very smoll update, thanks for reading till the end.
DEVLOG 5 - It’s been a looong time, it’s so hard… I tried to implement meta videoseal, and after countless of tries, I managed to export the detector to an ONNX model, that I could use in the library. The only problem is that I don’t know a lot about machine learning, so it doesn’t work at all. The JS script made to use the model just gives random results, often giving more score to non-ai images than to watermarked images. If anyone knows how to help with this, I would love a biiit of help. The Github repo is opened to issues and all the code is Open Source :). (Also I did the Jame Gam it was really fun :3)
DEVLOG 6 - I added OpenAI detection to my AI watermark detector library ! So uhm I was tired with Videoseal, so I just decided to do the openai implementation instead. It was pretty simple, and I tried to do it without using the OpenAI sdk because i didn’t wanted to add yet another dependency. I also added a config to pass to the detector, and a way to ignore a detector....
|
1792634031.022318
|
1793238831.022318
|
|
70469
|
small 3d printed monorail for rural intra-delivery small 3d printed monorail for rural intra-delivery by @rapier | Stardance...
|
rapier
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: small 3d printed monorail for rural intra-d Title: small 3d printed monorail for rural intra-delivery by @rapier | Stardance...
|
1793011655.0509768
|
1793616455.0509768
|
|
70391
|
small laser security system by @sfzrashdi | Starda small laser security system by @sfzrashdi | Stardance...
|
sfzrashdi
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: small laser security system by @sfzrashdi | Title: small laser security system by @sfzrashdi | Stardance...
|
1793008393.7190454
|
1793613193.7190454
|
|
62610
|
small new drone concept by @finnu050 | Stardance
|
finnu050
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: small new drone concept by @finnu050 | Star Title: small new drone concept by @finnu050 | Stardance...
|
1793047671.346549
|
1793652471.346549
|
|
1040
|
small overtures by @luftacen | Stardance
|
luftacen
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: small overtures by @luftacen | Stardance
|
1792633674.2686536
|
1793238474.2686536
|
|
65410
|
small parkour game by @AsilDorukAtik | Stardance
|
AsilDorukAtik
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: small parkour game by @AsilDorukAtik | Star Title: small parkour game by @AsilDorukAtik | Stardance...
|
1793087414.491874
|
1793692214.491874
|
|
27770
|
small physics simulator by @halit | Stardance
|
halit
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: small physics simulator by @halit | Stardan Title: small physics simulator by @halit | Stardance...
|
1792676870.054019
|
1793540870.054019
|
|
24422
|
small scale steam turbine by @theodor | Stardance
|
theodor
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: small scale steam turbine by @theodor | Sta Title: small scale steam turbine by @theodor | Stardance...
|
1793242129.2229574
|
1793846929.2229574
|
|
42239
|
small site by @nickthelinuxuser | Stardance
|
nickthelinuxuser
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-31T19:41:08Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a simple site for myself to show off who i am and promote my projects. Learning webGL was a bit challenging but i managed to pull through", "repo": "https://github.com/MonoliGames/monoligames.github.io", "demo": "https://monoligames.github.io/"}]...
|
[{"post_id": 38058, "ts": "202 [{"post_id": 38058, "ts": "2026-07-31T07:37:51Z", "hours": 0.5428, "text": "Built my first HTML/CSS/JS site! Used my knowledge of GLSL to make a mac-inspired UI for it"}]...
|
Title: small site by @nickthelinuxuser | Stardance Title: small site by @nickthelinuxuser | Stardance
Devlogs:
Built my first HTML/CSS/JS site! Used my knowledge of GLSL to make a mac-inspired UI for it
Ships:
I made a simple site for myself to show off who i am and promote my projects. Learning webGL was a bit challenging but i managed to pull through...
|
1793285393.1350965
|
1793371793.1350965
|
|
47233
|
smallaspossiblewebsite by @EfeAydin | Stardance
|
EfeAydin
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: smallaspossiblewebsite by @EfeAydin | Stard Title: smallaspossiblewebsite by @EfeAydin | Stardance...
|
1793173775.7135444
|
1793778575.7135444
|
|
17987
|
smart ambulance by @anshpatel9720 | Stardance
|
anshpatel9720
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: smart ambulance by @anshpatel9720 | Stardan Title: smart ambulance by @anshpatel9720 | Stardance...
|
1792569075.6963286
|
1793433075.6963286
|
|
26941
|
smart clock by @Gosiya | Stardance
|
Gosiya
|
1
|
5.1
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-11T09:42:10Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a working clock based on arduino and DS1302 module. It can be called a demo version since I plan to work in further and as a demo version it of course was fairly simple though I stumbled upon wiring problem which was fixed by swapping faulty jumperwires", "repo": "https://github.com/kgiorgi/clock", "demo": "https://wokwi.com/projects/471087475156579329"}]...
|
[{"post_id": 39584, "ts": "202 [{"post_id": 39584, "ts": "2026-08-02T17:33:53Z", "hours": 5.0983, "text": "Finished the arduino version of my clock/alarm. added a lot of stuff at once such as the whole alarm mechanism and also memory system which allows the clock to “remember” last date you’ve set after being powered off."}, {"post_id": 26477, "ts": "2026-07-11T09:19:31Z", "hours": 0.0, "text": "For now it’s just a simple arduino based clock but I plan to add features such as weather display, alarm system, and maybe make an app for it so you can set the clock remotely. of course I would need to swap the platform from arduino to esp32 but that’s a problem for later"}]...
|
Title: smart clock by @Gosiya | Stardance
Devlogs Title: smart clock by @Gosiya | Stardance
Devlogs:
For now it’s just a simple arduino based clock but I plan to add features such as weather display, alarm system, and maybe make an app for it so you can set the clock remotely. of course I would need to swap the platform from arduino to esp32 but that’s a problem for later
Finished the arduino version of my clock/alarm. added a lot of stuff at once such as the whole alarm mechanism and also memory system which allows the clock to “remember” last date you’ve set after being powered off.
Ships:
I made a working clock based on arduino and DS1302 module. It can be called a demo version since I plan to work in further and as a demo version it of course was fairly simple though I stumbled upon wiring problem which was fixed by swapping faulty jumperwires...
|
1793252877.0031512
|
1793339277.0031512
|
|
63307
|
smart garden/farm model. by @ocynno | Stardance
|
ocynno
|
0
|
5.97
|
0
|
[]
|
[{"post_id": 73017, "ts": "202 [{"post_id": 73017, "ts": "2026-09-24T07:09:35Z", "hours": 1.5453, "text": "finally built. every component works almost finished."}, {"post_id": 72469, "ts": "2026-09-23T01:06:15Z", "hours": 2.2481, "text": "finnaly tested the real components i bought a week ago. they work perfectly and the code works, also cut some sensors i deemed to be too much, made the features less so its more simple and streamlined"}, {"post_id": 71623, "ts": "2026-09-21T05:59:46Z", "hours": 2.1742, "text": "Coding it to access Blynk and wifi, tested on the board not yet attached to all sensors and outputs. made a dashboard first time doing anything, spent 2 hours troubleshooting, forgot to record a timelapse"}]...
|
Title: smart garden/farm model. by @ocynno | Stard Title: smart garden/farm model. by @ocynno | Stardance
Devlogs:
Coding it to access Blynk and wifi, tested on the board not yet attached to all sensors and outputs. made a dashboard first time doing anything, spent 2 hours troubleshooting, forgot to record a timelapse
finnaly tested the real components i bought a week ago. they work perfectly and the code works, also cut some sensors i deemed to be too much, made the features less so its more simple and streamlined
finally built. every component works almost finished....
|
1793051322.6518183
|
1793656122.6518183
|
|
69884
|
smart hand gloves by @mohanmahajan0903 | Stardance
|
mohanmahajan0903
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: smart hand gloves by @mohanmahajan0903 | St Title: smart hand gloves by @mohanmahajan0903 | Stardance...
|
1792918135.5777678
|
1793522935.5777678
|
|
42350
|
smart home by @wardaqasim5 | Stardance
|
wardaqasim5
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: smart home by @wardaqasim5 | Stardance
|
1793173898.4711769
|
1793778698.4711769
|