|
57140
|
Visora by @Amadev | Stardance
|
Amadev
|
1
|
31.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-10T17:29:23Z", "hours": 31.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Built Visora, an MCP server that gives AI agents reliable high-level control over the Unity Editor. The hardest part was making animation and editor workflows safe and predictable: IK, gaze, retargeting, animation QA, bridge reload recovery, prefab inspection, rollback, and reproducible preview artifacts. I’m most proud of how much of the Unity-side behavior is covered by real EditMode/integration tests instead of only mocked Python tests. To test it, use the GitHub release/source, follow the setup guide, connect Visora to a Unity project, and try the MCP tools for animation, scene inspection, previews, or prefab inspection.", "repo": "https://github.com/AmaLS367/Visora", "demo": "https://github.com/AmaLS367/Visora/releases/tag/v0.1.3"}]...
|
[{"post_id": 65482, "ts": "202 [{"post_id": 65482, "ts": "2026-09-10T17:21:38Z", "hours": 5.3419, "text": "Preview Artifacts, Bridge Recovery & Prefab Workflows Added reproducible animation preview artifacts with stored records and comparison tools for repeatable QA.Improved Unity bridge recovery during reloads/recompiles, added retry hints and safer timeout handling. Added real Unity E2E animation fixtures and reorganized the test suite.Finished the v0.1.3 release, refreshed the README/docs, and started v0.1.4 prefab workflows. Added inspect_prefab_asset and inspect_prefab_overrides with native Unity services, support for nested/variant/model prefabs, structured override inspection, stable IDs, and Python/integration/EditMode test coverage."}, {"post_id": 64760, "ts": "2026-09-09T12:27:18Z", "hours": 8.7661, "text": "Worked on a large animation/character workflow update for Visora. Added dedicated agent workflows for animation authoring, camera/action sequences, rig retargeting, IK, gaze, motion polishing, contact handling and animation QA. Updated the MCP instructions and project docs so agents have a clear workflow for checking rigs, previewing animation, validating motion and handling Humanoid/Generic fallback cases. Implemented new animation tooling around Two-Bone IK, viewport-based effector placement and character gaze. Added support for solving and baking IK/gaze into animation clips, including parameter validation and Unity capability checks.Added a bigger QA layer for animation. This includes temporal motion analysis, curve discontinuity diagnostics, self-intersection checks and comparison of animation previews. Also added contact baking for things like planted feet/hands and camera-subject action tooling for synchronizing character motion with camera impacts. Added atomic animation transactions and improved rollback/backup handling so multiple animation edits can be applied together and reverted safely when something fails. Refactored the Unity-side animation services around shared sampling, curve writing and rollback helpers. Spent a good amount of time hardening all of this against actual Unity edge cases: Edit Mode requirements, unsupported bridge capabilities, invalid parameters, unknown diagnostic values, quaternion discontinuities, tangent preservation and proper exception handling. Added a Unity EditMode integration test suite covering IK, gaze, contact baking and atomic animation transactions, together with a runner script. Expanded the Python unit tests for the new animation tools and failure cases as well.Also reworked Visora’s visual output. Screenshots, animation previews and video frames now use multimodal MCP image blocks and file artifacts instead of dumping Base64 data into the response. Multi-frame previews can generate contact sheets, and full-resolution artifacts stay on disk. After that I focused heavily on MCP context usage. Compact tool definitions reduced the tool catalog payload significantly, diagnostic tools now have limits/filtering for large skeletons and clips, tool results are compacted, duplicate structured output is removed, and several redundant tools/wrappers were merged or deleted. The tool catalog went from 55 tools down to 44. Merged the two separate video capture tools into a single capture_video workflow and reduced the default screenshot resolution to 720p. Inline images are now automatically downscaled while keeping the full-resolution artifact available separately. Finally tuned the default diagnostic dump sizes further so normal tool calls consume much less agent context and larger detailed dumps are requested only when they are actually needed."}, {"post_id": 62172, "ts": "2026-09-05T13:09:04Z", "hours": 2.9436, "text": "Editing Animation Clips & Events Hey everyone, continue working on it. Up until now, the agent could only really watch animations—taking previews and checking poses. If a keyframe was off or a transition looked janky, you still had to go into Unity and fix it by hand. Now, the agent can actually edit AnimationClip assets directly. It can add, move, or delete keyframes, tweak curves, and set tangent modes like smooth, linear, or step holds. Giving an AI write access to your animation files is honestly a bit scary—one bad curve and your character turns into a noodle. To keep things safe, Visora now takes an automatic backup of the clip before touching it, and hooks every edit into Unity’s native Undo system. If the agent makes a mess, you can roll it back with a tool call or just hit Ctrl + Z right in the editor. We also added tools to create and remove animation events. This makes it way easier to sync things like hit-stops, camera shake, or footstep sounds to exact frames on the timeline instead of guessing with timers."}, {"post_id": 61583, "ts": "2026-09-04T15:45:13Z", "hours": 5.5072, "text": "Visora v0.1.3 — Giving Agents Eyes on Unity Animations So, we just fixed a massive problem. Once I hit merge, a huge weight lifted off my shoulders. It feels like the raw volume of code I write is getting smaller each time, but what actually lands has a massive, cascading impact on the entire system.Until now, whenever an AI agent needed to inspect an animation in Unity, it was basically flying blind. The old approach was either pulling raw curve data (which tells an agent nothing about clipping, silhouette, or visual feel) or recording full video dumps over the HTTP bridge. Video was heavy, expensive on tokens, slow to transfer, and worse: if the camera wasn’t manually lined up in the scene, the character would just walk right out of frame or get clipped halfway through. With Visora v0.1.3, we tackled this head-on by building preview_animation. It’s not just a snapshot tool — it’s a complete visual pipeline designed specifically for agent context budgets. What Actually Changed Under the Hood Trajectory-Aware Auto-Framing (C# Engine Side) Instead of relying on whatever camera happens to be in the scene, Visora now spins up a transient preview camera. Before snapping a single frame, it samples the clip across its timeline, collects every active skinned and mesh renderer, and computes a union bounding sphere for the entire motion trajectory. It places the camera at an ideal 45° vantage point, automatically calculates the optimal distance based on camera FOV, and dynamically compensates for vertical vs. horizontal aspect ratios so tall or wide aspect ratios don’t clip the character’s head or limbs. Smart Keyframe Selection (Python Side) Agents can’t look at 120 raw frames — that would incinerate context windows and latency. We built an intelligent keyframe extractor (preview_keyframes.py) that analyzes the clip curves to find where actual motion happens: curve extrema, zero-crossings, sudden velocity changes, and animation event timestamps. It pins the start and end poses, then fits the most informative frames within a strict frame budget (e.g. 4 to 8 images). Zero-Side-Effect Scene Safety One of the hardest parts of building agent tooling for Unity is engine hygiene. The preview system samples the animation, renders offscreen to a custom RenderTexture, encodes directly to PNG byte buffers, and cleans up after itself. No dummy cameras left in the hierarchy, no dirty scene flags, and character poses are strictly restored to their pre-sampling state. Hardened CI & The Unity Package Gate We also tightened our pre-commit and CI gates. We introduced scripts/check_unity_package.py, compiling the C# package directly against real Unity assemblies with Microsoft.Unity.Analyzers in headless Linux containers. If there’s an obsolete API, a loose memory allocation, or a CA analyzer warning, the build fails before it ever touches a project. It feels great to have this merged and rock-solid. With animation visual inspection out of the way, I’m heading straight to the next item on the Roadmap: Typed Clip, Event, and Camera Authoring!"}, {"post_id": 60781, "ts": "2026-09-03T11:33:29Z", "hours": 2.2286, "text": "Visora devlog — v0.1.1 & v0.1.2 Shipped two releases back to back. Visora now has a proper open-source foundation: an Apache-2.0 license, full contributor and security docs, a hardened Docker image, and a complete CI pipeline that tests every change and publishes releases automatically. v0.1.1 was about infrastructure — agents can now search the web for 3D models, environments and rigs and import them straight into a live Unity project, plus all the CI/CD and Docker groundwork. v0.1.2 was about packaging and community — licensing, PyPI metadata, issue templates, contributor guides, and release integrity checks. You can now just pip install visora. And here’s the first real demo. A 2-second shot: a Rover-style character from Wuthering Waves throws a flying kick straight into the camera in a desert wasteland. The environment, the rig, the animation and the capture were all built by an AI agent driving a live Unity Editor through Visora — nothing hand-placed. The whole thing was made by Claude Sonnet 5, using about 20% of the 5-hour limit on the $20 plan. So a mid-tier model, for a fraction of a cheap subscription, can already take a scene from empty to finished shot on its own. Right now it’s 2 seconds — deliberately small, to set the floor. The goal is for Visora to grow into something where AI can build full, directed animation sequences: minute-long shots, multiple characters, real rigging, proper timelines. “Make me a cutscene” turning into an actual cutscene. This dropkick is just the starting line."}, {"post_id": 60717, "ts": "2026-09-03T08:42:43Z", "hours": 0.915, "text": "Production CI/CD and MCP 2.0 are now complete for Visora. The project now has a parallel GitHub Actions pipeline covering formatting, Ruff linting, strict mypy checks, unit and integration tests, lockfile validation, Unity package validation, distribution builds, and an enforced 80% coverage threshold. The workflows use uv caching, cancel outdated runs automatically, and skip runs for documentation-only changes. All GitHub Actions are pinned by commit SHA. A release pipeline now validates version tags, runs the full verification suite, builds the package, publishes it to PyPI, and creates a GitHub Release. Dependabot was added to update GitHub Actions and Python dependencies weekly. Funding configuration was added as well. Visora was migrated from MCP 1.x to MCP 2.1.1, replacing FastMCP with MCPServer and updating the related tests and documentation. The updated Dependabot pull request passed every CI check and was merged. The Production CI/CD roadmap item is now marked as completed."}, {"post_id": 60695, "ts": "2026-09-03T07:39:13Z", "hours": 3.4883, "text": "Visora devlog — asset pipeline & Unity native bridge (18 commits) Asset pipeline: from broken to trustworthy Built out the 3D-asset workflow (search → download → import → verify) and then spent most of the effort hardening it against silent failures: Added asset search/download/Unity-import tools (1a0bcd3, bf6a7d9), then refactored out dead backward-compat aliases (dda6c17). Fixed real bugs found by actually running it: ambientCG downloads being wrongly rejected and Sketchfab results silently hidden (99d3f15), a wrong ambientCG download URL for 3D models (1d6e2ce), a crash on comma-separated port lists plus missing env-var docs (117e6e3), and .bin/.mtl companion files being incorrectly stripped out of glTF/OBJ archives (5cb1afa). Discovered Sketchfab’s own search API ignores the query text entirely (verified live) — added web_search_assets, a SearXNG-primary/DuckDuckGo-fallback real web search to find a specific named model and extract its Sketchfab UID (4489725). Biggest find: download_and_import_asset was reporting success=true even when Unity couldn’t actually parse the file (glTF with no importer installed → empty placeholder asset). Fixed to detect and reject that case explicitly instead of lying about success (8c4241b). Native Unity bridge: first real compile & runtime test com.visora.editor had apparently never been compiled in a real Unity Editor before. Opening it in Unity 6.6 surfaced a chain of genuine bugs, fixed one at a time: A broken float field that Unity’s JSON deserializer can’t handle, flattened to float on both C# and Python sides (08f502e, 4d05468). Unity 6.6 API removals: GetInstanceID() → GetEntityId() (c8c8905), then GetEntityId()’s own obsolete int-conversion operator → GetRawData() (027e39c). Two HTTP handlers (/api/editor/state, /api/visora/info) and a log-callback subscription were calling Unity APIs off the main thread, causing runtime errors — dispatched onto the main thread (d27e03f, 5e3069b). Dynamic C# snippet compilation was missing a reference to UnityEditor.CoreModule, breaking any snippet touching EditorApplication/EditorSceneManager (a8689a9). Agent guidance Shipped documentation aimed at other agents driving Visora, not just humans: an always-on MCP instructions block plus a copyable Claude Code skill (visora-asset-workflow) covering Sketchfab’s broken search, supported import formats, and how to actually verify an import worked (4e8cd5c). Housekeeping Committed the 29 .meta files Unity generated on first real import of the package — standard Unity convention, and further confirmation the package had never been opened in a real editor before this round of testing (b9e4f01). Net effect: the asset import pipeline no longer lies about success, Sketchfab search actually works for named models, and the native Unity bridge compiles and runs cleanly on Unity 6.6 — all verified end-to-end (ambientCG apple + a Sketchfab character model imported, inspected, and visually confirmed in-scene)."}, {"post_id": 60167, "ts": "2026-09-02T11:47:32Z", "hours": 1.5803, "text": "Building Visora: Teaching AI agents to actually see and fix Unity scenes (v0.1.0 update) Quick update on what I’ve been hacking on for Visora since adding the project banner. The problem I ran into: If you try to let an AI agent (like Claude or Cursor) work inside Unity, it’s usually a disaster. Current bridges just let the model run raw C# strings and read console logs.The agent is completely blind. It doesn’t know if a 3D character spawned behind the camera, if an animation is flying off into infinity, or if a model looks like a spiky mess because bone weights are broken. Even worse, agents love to edit things during Play Mode or hit save while Unity is recompiling, completely wrecking the scene files.I got tired of babysitting that, so I built Visora — a Python MCP server and a companion Unity package that gives agents actual eyes, rigging smarts, and guardrails so they don’t break your project. V0.1.0 — Here is what I’ve coded and got working over the last few days: Gave the agent actual vision. The agent can now render screenshots from any camera in the scene, check if a character is cut off by the screen edges or clipping planes (project_world_points and diagnose_camera_framing), compare before/after images, and even record short MP4/WebP video clips to inspect physics and animations over time. Made it understand rigs and animations. Instead of guessing why an animation looks wrong: It inspects AnimationClip curves directly and catches unwanted position or scale drift. It can sample any character’s pose at a specific second, inspect the transforms, and immediately restore the original pose so nothing stays messed up. Added a skeleton mapper with fuzzy bone search that understands both standard Humanoid rigs and messy Japanese MMD bone chains (like 全ての親, センター, 下半身, D-bones). Skinned mesh diagnostics Added tools to inspect SkinnedMeshRenderers. It detects inverted or zero-sized bounding boxes, missing root bones, and broken bone weights. It also tells you whether a glitch is just a missing material/texture or an actual broken mesh deformation. Made scene edits safe (undo & transaction rollback). Every script the agent runs now happens inside an isolated Undo group. If the C# code crashes or throws an exception, Visora automatically rolls back the entire scene to before the run. It also blocks saving during Play Mode so your scene never gets corrupted. Native Unity package + 24 typed tools Built a native Unity Editor package (com.visora.editor) using HttpListener hooked directly into Unity’s main editor update loop. On the Python side, I implemented 24 clean MCP tools with strict Pydantic schemas, auto-discovery for ports 8080-8085, and async queue polling for long tasks. Tagged and released v0.1.0 on GitHub with complete setup guides, agent recipes, and test coverage. What I’m building next for v0.1.1: Auto 3D model web search & download: I want the agent to search the web, find 3D models, textures, and environments, and download/import them directly into the Unity project so it can build and animate entire scenes on its own. Clean GitHub Actions CI/CD: Automatic linting, typing, and test runners on every commit. Docker support: A lightweight Dockerfile to easily run the MCP server anywhere in a headless container. You can check out the code and the v0.1.0 release here: https://github.com/AmaLS367/Visora"}]...
|
Title: Visora by @Amadev | Stardance
Devlogs:
Bui Title: Visora by @Amadev | Stardance
Devlogs:
Building Visora: Teaching AI agents to actually see and fix Unity scenes (v0.1.0 update) Quick update on what I’ve been hacking on for Visora since adding the project banner. The problem I ran into: If you try to let an AI agent (like Claude or Cursor) work inside Unity, it’s usually a disaster. Current bridges just let the model run raw C# strings and read console logs.The agent is completely blind. It doesn’t know if a 3D character spawned behind the camera, if an animation is flying off into infinity, or if a model looks like a spiky mess because bone weights are broken. Even worse, agents love to edit things during Play Mode or hit save while Unity is recompiling, completely wrecking the scene files.I got tired of babysitting that, so I built Visora — a Python MCP server and a companion Unity package that gives agents actual eyes, rigging smarts, and guardrails so they don’t break your project. V0.1.0 — Here is what I’ve coded and got working over the last few days: Gave the agent actual vision. The agent can now render screenshots from any camera in the scene, check if a character is cut off by the screen edges or clipping planes (project_world_points and diagnose_camera_framing), compare before/after images, and even record short MP4/WebP video clips to inspect physics and animations over time. Made it understand rigs and animations. Instead of guessing why an animation looks wrong: It inspects AnimationClip curves directly and catches unwanted position or scale drift. It can sample any character’s pose at a specific second, inspect the transforms, and immediately restore the original pose so nothing stays messed up. Added a skeleton mapper with fuzzy bone search that understands both standard Humanoid rigs and messy Japanese MMD bone chains (like 全ての親, センター, 下半身, D-bones). Skinned mesh diagnostics Added tools to inspect SkinnedMeshRenderers. It detects inverted or zero-sized bounding boxes, missing root bones, and broken bone weights. It also tells you whether a glitch is just a missing material/texture or an actual broken mesh deformation. Made scene edits safe (undo & transaction rollback). Every script the agent runs now happens inside an isolated Undo group. If the C# code crashes or throws an exception, Visora automatically rolls back the entire scene to before the run. It also blocks saving during Play Mode so your scene never gets corrupted. Native Unity package + 24 typed tools Built a native Unity Editor package (com.visora.editor) using HttpListener hooked directly into Unity’s main editor update loop. On the Python side, I implemented 24 clean MCP tools with strict Pydantic schemas, auto-discovery for ports 8080-8085, and async queue polling for long tasks. Tagged and released v0.1.0 on GitHub with complete setup guides, agent recipes, and test coverage. What I’m building next for v0.1.1: Auto 3D model web search & download: I want the agent to search the web, find 3D models, textures, and environments, and download/import them directly into the Unity project so it can build and animate entire scenes on its own. Clean GitHub Actions CI/CD: Automatic linting, typing, and test runners on every commit. Docker support: A lightweight Dockerfile to easily run the MCP server anywhere in a headless container. You can check out the code and the v0.1.0 release here: https://github.com/AmaLS367/Visora
Visora devlog — asset pipeline & Unity native bridge (18 commits) Asset pipeline: from broken to trustworthy Built out the 3D-asset workflow (search → download → import → verify) and then spent most of the effort hardening it against silent failures: Added asset search/download/Unity-import tools (1a0bcd3, bf6a7d9), then refactored out dead backward-compat aliases (dda6c17). Fixed real bugs found by actually running it: ambientCG downloads being wrongly rejected and Sketchfab results silently hidden (99d3f15), a wrong ambientCG download URL for 3D models (1d6e2ce), a crash on comma-separated port lists plus missing env-var docs (117e6e3), and .bin/.mtl companion files being incorrectly stripped out of glTF/OBJ archives (5cb1afa). Discovered Sketchfab’s own search API ignores the query text entirely (verified live) — added web_search_assets, a SearXNG-primary/DuckDuckGo-fallback real web search to find a specific named model and extract its Sketchfab UID (4489725). Biggest find: download_and_import_asset was reporting success=true even when Unity couldn’t actually parse the file (glTF with no importer installed → empty placeholder asset). Fixed to detect and reject that case explicitly instead of lying about success (8c4241b). Native Unity bridge: first real compile & runtime test com.visora.editor had apparently never been compiled in a real Unity Editor before. Opening it in Unity 6.6 surfaced a chain of genuine bugs, fixed one at a time: A broken float field that Unity’s JSON deserializer can’t handle, flattened to float on both C# and Python sides (08f502e, 4d05468). Unity 6.6 API removals: GetInstanceID() → GetEntityId() (c8c8905), then GetEntityId()’s own obsolete int-conversion operator → GetRawData() (027e39c). Two HTTP handlers (/api/editor/state, /api/visora/info) and a log-callback subscription were calling Unity APIs off the main thread, causing runtime errors — dispatched onto the main thread (d27e03f, 5e3069b). Dynamic C# snippet compilation was missing a reference to UnityEditor.CoreModule, breaking any snippet touching EditorApplication/EditorSceneManager (a8689a9). Agent guidance Shipped documentation aimed at other agents driving Visora, not just humans: an always-on MCP instructions block plus a copyable Claude Code skill (visora-asset-workflow) covering Sketchfab’s broken search, supported import formats, and how to actually verify an import worked (4e8cd5c). Housekeeping Committed the 29 .meta files Unity generated on first real import of the package — standard Unity convention, and further confirmation the package had never been opened in a real editor before this round of testing (b9e4f01). Net effect: the asset import pipeline no longer lies about success, Sketchfab search actually works for named models, and the native Unity bridge compiles and runs cleanly on Unity 6.6 — all verified end-to-end (ambientCG apple + a Sketchfab character model imported, inspected, and visually confirmed in-scene).
Production CI/CD and MCP 2.0 are now complete for Visora. The project now has a parallel GitHub Actions pipeline covering formatting, Ruff linting, strict mypy checks, unit and integration tests, lockfile validation, Unity package validation, distribution builds, and an enforced 80% coverage threshold. The workflows use uv caching, cancel outdated runs automatically, and skip runs for documentation-only changes. All GitHub Actions are pinned by commit SHA. A release pipeline now validates version tags, runs the full verification suite, builds the package, publishes it to PyPI, and creates a GitHub Release. Dependabot was added to update GitHub Actions and Python dependencies weekly. Funding configuration was added as well. Visora was migrated from MCP 1.x to MCP 2.1.1, replacing FastMCP with MCPServer and updating the related tests and documentation. The updated Dependabot pull request passed every CI check and was merged. The Production CI/CD roadmap item is now marked as completed.
Visora devlog — v0.1.1 & v0.1.2 Shipped two releases back to back. Visora now has a proper open-source foundation: an Apache-2.0 license, full contributor and security docs, a hardened Docker image, and a complete CI pipeline that tests every change and publishes releases automatically. v0.1.1 was about infrastructure — agents can now search the web for 3D models, environments and rigs and import them straight into a live Unity project, plus all the CI/CD and Docker groundwork. v0.1.2 was about packaging and community — licensing, PyPI metadata, issue templates, contributor guides, and release integrity checks. You can now just pip install visora. And here’s the first real demo. A 2-second shot: a Rover-style character from Wuthering Waves throws a flying kick straight into the camera in a desert wasteland. The environment, the rig, the animation and the capture were all built by an AI agent driving a live Unity Editor through Visora — nothing hand-placed. The whole thing was made by Claude Sonnet 5, using about 20% of the 5-hour limit on the $20 plan. So a mid-tier model, for a fraction of a cheap subscription, can already take a scene from empty to finished shot on its own. Right now it’s 2 seconds — deliberately small, to set the floor. The goal is for Visora to grow into something where AI can build full, directed animation sequences: minute-long shots, multiple characters, real rigging, proper timelines. “Make me a cutscene” turning into an actual cutscene. This dropkick is just the starting line.
Visora v0.1.3 — Giving Agents Eyes on Unity Animations So, we just fixed a massive problem. Once I hit merge, a huge weight lifted off my shoulders. It feels like the raw volume of code I write is getting smaller each time, but what actually lands has a massive, cascading impact on the entire system.Until now, whenever an AI agent needed to inspect an animation in Unity, it was basically flying blind. The old approach was either pulling raw curve data (which tells an agent nothing about clipping, silhouette, or visual feel) or recording full video dumps over the HTTP bridge. Video was heavy, expensive on tokens, slow to transfer, and worse: if the camera wasn’t manually lined up in the scene, the character would just walk right out of frame or get clipped halfway through. With Visora v0.1.3, we tackled this head-on by building preview_animation. It’s not just a snapshot tool — it’s a complete visual pipeline designed specifically for agent context budgets. What Actually Changed Under the Hood Trajectory-Aware Auto-Framing (C# Engine Side) Instead of relying on whatever camera happens to be in the scene, Visora now spins up a transient preview camera. Before snapping a single frame, it samples the clip across its timeline, collects every active skinned and mesh renderer, and computes a union bounding sphere for the entire motion trajectory. It places the camera at an ideal 45° vantage point, automatically calculates the optimal distance based on camera FOV, and dynamically compensates for vertical vs. horizontal aspect ratios so tall or wide aspect ratios don’t clip the character’s head or limbs. Smart Keyframe Selection (Python Side) Agents can’t look at 120 raw frames — that would incinerate context windows and latency. We built an intelligent keyframe extractor (preview_keyframes.py) that analyzes the clip curves to find where actual motion happens: curve extrema, zero-crossings, sudden velocity changes, and animation event timestamps. It pins the start and end poses, then fits the most informative frames within a strict frame budget (e.g. 4 to 8 images). Zero-Side-Effect Scene Safety One of the hardest parts of building agent tooling for Unity is engine hygiene. The preview system samples the animation, renders offscreen to a custom RenderTexture, encodes directly to PNG byte buffers, and cleans up after itself. No dummy cameras left in the hierarchy, no dirty scene flags, and character poses are strictly restored to their pre-sampling state. Hardened CI & The Unity Package Gate We also tightened our pre-commit and CI gates. We introduced scripts/check_unity_package.py, compiling the C# package directly against real Unity assemblies with Microsoft.Unity.Analyzers in headless Linux containers. If there’s an obsolete API, a loose memory allocation, or a CA analyzer warning, the build fails before it ever touches a project. It feels great to have this merged and rock-solid. With animation visual inspection out of the way, I’m heading straight to the next item on the Roadmap: Typed Clip, Event, and Camera Authoring!
Editing Animation Clips & Events Hey everyone, continue working on it. Up until now, the agent could only really watch animations—taking previews and checking poses. If a keyframe was off or a transition looked janky, you still had to go into Unity and fix it by hand. Now, the agent can actually edit AnimationClip assets directly. It can add, move, or delete keyframes, tweak curves, and set tangent modes like smooth, linear, or step holds. Giving an AI write access to your animation files is honestly a bit scary—one bad curve and your character turns into a noodle. To keep things safe, Visora now takes an automatic backup of the clip before touching it, and hooks every edit into Unity’s native Undo system. If the agent makes a mess, you can roll it back with a tool call or just hit Ctrl + Z right in the editor. We also added tools to create and remove animation events. This makes it way easier to sync things like hit-stops, camera shake, or footstep sounds to exact frames on the timeline instead of guessing with timers.
Worked on a large animation/character workflow update for Visora. Added dedicated agent workflows for animation authoring, camera/action sequences, rig retargeting, IK, gaze, motion polishing, contact handling and animation QA. Updated the MCP instructions and project docs so agents have a clear workflow for checking rigs, previewing animation, validating motion and handling Humanoid/Generic fallback cases. Implemented new animation tooling around Two-Bone IK, viewport-based effector placement and character gaze. Added support for solving and baking IK/gaze into animation clips, including parameter validation and Unity capability checks.Added a bigger QA layer for animation. This includes temporal motion analysis, curve discontinuity diagnostics, self-intersection checks and comparison of animation previews. Also added contact baking for things like planted feet/hands and camera-subject action tooling for synchronizing character motion with camera impacts. Added atomic animation transactions and improved rollback/backup handling so multiple animation edits can be applied together and reverted safely when something fails. Refactored the Unity-side animation services around shared sampling, curve writing and rollback helpers. Spent a good amount of time hardening all of this against actual Unity edge cases: Edit Mode requirements, unsupported bridge capabilities, invalid parameters, unknown diagnostic values, quaternion discontinuities, tangent preservation and proper exception handling. Added a Unity EditMode integration test suite covering IK, gaze, contact baking and atomic animation transactions, together with a runner script. Expanded the Python unit tests for the new animation tools and failure cases as well.Also reworked Visora’s visual output. Screenshots, animation previews and video frames now use multimodal MCP image blocks and file artifacts instead of dumping Base64 data into the response. Multi-frame previews can generate contact sheets, and full-resolution artifacts stay on disk. After that I focused heavily on MCP context usage. Compact tool definitions reduced the tool catalog payload significantly, diagnostic tools now have limits/filtering for large skeletons and clips, tool results are compacted, duplicate structured output is removed, and several redundant tools/wrappers were merged or deleted. The tool catalog went from 55 tools down to 44. Merged the two separate video capture tools into a single capture_video workflow and reduced the default screenshot resolution to 720p. Inline images are now automatically downscaled while keeping the full-resolution artifact available separately. Finally tuned the default diagnostic dump sizes further so normal tool calls consume much less agent context and larger detailed dumps are requested only when they are actually needed.
Preview Artifacts, Bridge Recovery & Prefab Workflows Added reproducible animation preview artifacts with stored records and comparison tools for repeatable QA.Improved Unity bridge recovery during reloads/recompiles, added retry hints and safer timeout handling. Added real Unity E2E animation fixtures and reorganized the test suite.Finished the v0.1.3 release, refreshed the README/docs, and started v0.1.4 prefab workflows. Added inspect_prefab_asset and inspect_prefab_overrides with native Unity services, support for nested/variant/model prefabs, structured override inspection, stable IDs, and Python/integration/EditMode test coverage.
Ships:
Built Visora, an MCP server that gives AI agents reliable high-level control over the Unity Editor. The hardest part was making animation and editor workflows safe and predictable: IK, gaze, retargeting, animation QA, bridge reload recovery, prefab inspection, rollback, and reproducible preview artifacts. I’m most proud of how much of the Unity-side behavior is covered by real EditMode/integration tests instead of only mocked Python tests. To test it, use the GitHub release/source, follow the setup guide, connect Visora to a Unity project, and try the MCP tools for animation, scene inspection, previews, or prefab inspection....
|
1793347040.1110332
|
1793433440.1110332
|
|
7336
|
VoidBoard by @AuraMonster | Stardance
|
AuraMonster
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-11T14:49:37Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a macropad, so that it can do many things. The hardest part was the PCB designing because some parts were confusing.", "repo": "https://github.com/mdmutahhar24-pixel/VoidBoard", "demo": ""}]...
|
[{"post_id": 6549, "ts": "2026 [{"post_id": 6549, "ts": "2026-06-11T00:13:41Z", "hours": 4.3, "text": "What Is Voidboard going to be used for? I am thinking of using VoidBoard for shortcuts, keyboard, and numpad. It may not be obvious, but it’s design coloring was influenced by Hollow Knight. Current Progress: Finished Schematic Finished PCB Finished CAD Finished Firmware Uploaded all necessary files to Github Repository"}]...
|
Title: VoidBoard by @AuraMonster | Stardance
Devl Title: VoidBoard by @AuraMonster | Stardance
Devlogs:
What Is Voidboard going to be used for? I am thinking of using VoidBoard for shortcuts, keyboard, and numpad. It may not be obvious, but it’s design coloring was influenced by Hollow Knight. Current Progress: Finished Schematic Finished PCB Finished CAD Finished Firmware Uploaded all necessary files to Github Repository
Ships:
I made a macropad, so that it can do many things. The hardest part was the PCB designing because some parts were confusing....
|
1793325247.4778106
|
1793411647.4778106
|
|
59104
|
Sanchar_jaal by @thebiraj_hkr | Stardance
|
thebiraj_hkr
|
0
|
28.73
|
0
|
[]
|
[{"post_id": 65492, "ts": "202 [{"post_id": 65492, "ts": "2026-09-10T17:47:41Z", "hours": 8.3483, "text": "so lots of things have been changed since last devlog… first i have made my full CAD for the bottom part and the front part is not accomplished yet. since i was weak in CAD fusion 360 i sook help rom youtube videos and AI and google to accomplish my work. i have made two compartments in my cad. one is components part and other is battery part cause battery should be in sealed place where no foreign material should enter. also i have created screw mouts and inserted screws to my CAD and it look so nice now."}, {"post_id": 64731, "ts": "2026-09-09T11:14:35Z", "hours": 20.3817, "text": "The circuit board is done! I finally finished placing and routing all the parts in KiCad for my custom mesh walkie-talkie. also I decided to expose all the metal traces on the top of the black board instead of hiding them. It gives the whole thing a really cool, futuristic look. and I added a real, physical volume knob to the design because you just can’t beat the feeling of turning a real dial. Next up: The electronics are officially locked in. I just exported the board into Autodesk Fusion and I’m starting to design the 3D-printed case to hold it all together!"}]...
|
Title: Sanchar_jaal by @thebiraj_hkr | Stardance
Title: Sanchar_jaal by @thebiraj_hkr | Stardance
Devlogs:
The circuit board is done! I finally finished placing and routing all the parts in KiCad for my custom mesh walkie-talkie. also I decided to expose all the metal traces on the top of the black board instead of hiding them. It gives the whole thing a really cool, futuristic look. and I added a real, physical volume knob to the design because you just can’t beat the feeling of turning a real dial. Next up: The electronics are officially locked in. I just exported the board into Autodesk Fusion and I’m starting to design the 3D-printed case to hold it all together!
so lots of things have been changed since last devlog… first i have made my full CAD for the bottom part and the front part is not accomplished yet. since i was weak in CAD fusion 360 i sook help rom youtube videos and AI and google to accomplish my work. i have made two compartments in my cad. one is components part and other is battery part cause battery should be in sealed place where no foreign material should enter. also i have created screw mouts and inserted screws to my CAD and it look so nice now....
|
1792936459.595018
|
1793800459.595018
|
|
60375
|
Buy me a Chai by @adityarajput | Stardance
|
adityarajput
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-12T09:12:48Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built 0% commision Support page which is just static project. - As my friends started ask me to build one for them too - So I made new feature of build your own, Now you can just filll out details and get code for your support page too. The most challenging part here was changing the variables as per need of the user - But never mind It was worth it. And I hope y’all also try your own and deploy it to Github-Pages", "repo": "https://github.com/Aditya0058/Buy-Me-A-Chai", "demo": "https://aditya0058.github.io/Buy-Me-A-Chai/"}]...
|
[{"post_id": 65502, "ts": "202 [{"post_id": 65502, "ts": "2026-09-10T18:05:58Z", "hours": 2.8742, "text": "Hi everyone - I am Aditya working on static website which will act as Support Page - and will be easy to deploy like for free and best part you can too create your own by just filling out details and copying code - thats it. Btw - this too me 3 hours and I learned to much from this project. you can try it on this https://aditya0058.github.io/Buy-Me-A-Chai/"}]...
|
Title: Buy me a Chai by @adityarajput | Stardance
Title: Buy me a Chai by @adityarajput | Stardance
Devlogs:
Hi everyone - I am Aditya working on static website which will act as Support Page - and will be easy to deploy like for free and best part you can too create your own by just filling out details and copying code - thats it. Btw - this too me 3 hours and I learned to much from this project. you can try it on this https://aditya0058.github.io/Buy-Me-A-Chai/
Ships:
I built 0% commision Support page which is just static project. - As my friends started ask me to build one for them too - So I made new feature of build your own, Now you can just filll out details and get code for your support page too. The most challenging part here was changing the variables as per need of the user - But never mind It was worth it. And I hope y’all also try your own and deploy it to Github-Pages...
|
1793411569.8478763
|
1793497969.8478763
|
|
47806
|
Sumesh Bot by @nove | Stardance
|
nove
|
1
|
2.95
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-14T17:07:31Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I love to make discord bots, and other small javascript things. and when i entered stardance i got a mission to make a bot. i was like “eyy, can we make slack bots ?”. and that question made me build this bot and thank you for your guide. I will surely update this in future.", "repo": "https://github.com/NOVE300IQ/sumesh-bot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354?skip_today=1"}]...
|
[{"post_id": 65503, "ts": "202 [{"post_id": 65503, "ts": "2026-09-10T18:10:08Z", "hours": 0.3275, "text": "Yo I was having some exams. I got many feedbacks from recent review sections, First of all thank you everyone for your valuable time taken for making the review. As per all those reviews am gonna improve this project and add more features and fixing some sort of bugs reported by the reviewers. And improve the writing of my DevLogs. Now i fixed the structure of the codespace and made it better and clean. Thank You 🫡💕"}, {"post_id": 54664, "ts": "2026-08-25T18:12:05Z", "hours": 0.6625, "text": "Updgrading Sumesh To A Peak 😁"}, {"post_id": 50344, "ts": "2026-08-19T14:58:23Z", "hours": 0.3083, "text": "New commands Broo :D"}, {"post_id": 49052, "ts": "2026-08-17T17:17:37Z", "hours": 0.6481, "text": "Implemented new 2 commands. :)"}, {"post_id": 47019, "ts": "2026-08-14T16:37:29Z", "hours": 1.2556, "text": "A slack bot which cares you commands. and probably the best one 😁"}]...
|
Title: Sumesh Bot by @nove | Stardance
Devlogs:
A Title: Sumesh Bot by @nove | Stardance
Devlogs:
A slack bot which cares you commands. and probably the best one 😁
Implemented new 2 commands. :)
New commands Broo :D
Updgrading Sumesh To A Peak 😁
Yo I was having some exams. I got many feedbacks from recent review sections, First of all thank you everyone for your valuable time taken for making the review. As per all those reviews am gonna improve this project and add more features and fixing some sort of bugs reported by the reviewers. And improve the writing of my DevLogs. Now i fixed the structure of the codespace and made it better and clean. Thank You 🫡💕
Ships:
I love to make discord bots, and other small javascript things. and when i entered stardance i got a mission to make a bot. i was like “eyy, can we make slack bots ?”. and that question made me build this bot and thank you for your guide. I will surely update this in future....
|
1793523348.9394305
|
1793609748.9394305
|
|
50286
|
YOURS by @deepermemer | Stardance
|
deepermemer
|
2
|
34.0
|
141
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-10T18:26:21Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "It’s a custom new tab made by me. It’s based on the feeling of something being your own that’s what it’s name suggest… “YOURS” And it’s theme is dark and blue so it won’t hurt your eyes and it should looks good as I am a guy who is into designing and shi so i tried to make it look good It’s features contain a lot of things but all are the one you need so you don’t hv roam here and there it’s your everything… It has clock, it has weather(allow location acces to get it), it has search bar it works with Google… Typing url leads you directly to url… Typing other than url searches it on google, it has to-do to keep your tasks together… U can delete a to-do… You can make a to-do… You can edit a to-do… you can check a to-do, it has music player with good songs… Previous next and play pause shi everything, it has recent tabs … It tracks latest 10 sites you visited and there’s a delete button too to delete them. I had only used ai to understand concept and to check if there’s a error or not Credits, it motive and other stuff are written in README you check from there from review of old ship i got to know people wanted multi search engine so i added it click on google icon in search bar it will let u change search engine rn it has brave duckduckgo and google", "repo": "https://github.com/deepermemer-bit/Yours", "demo": "https://yours-virid.vercel.app"}, {"ship_num": 2, "ts": "2026-09-04T14:05:22Z", "hours": 32.0, "multiplier": 4.4, "payout": 141, "blessing": "neutral", "text": "It’s a custom new tab made by me. It’s based on the feeling of something being your own that’s what it’s name suggest… “YOURS” And it’s theme is dark and blue so it won’t hurt your eyes and it should looks good as I am a guy who is into designing and shi so i tried to make it look good It’s features contain a lot of things but all are the one you need so you don’t hv roam here and there it’s your everything… It has clock , it has weather (allow location acces to get it), it has search bar it works with Google… Typing url leads you directly to url… Typing other than url searches it on google, it has to-do to keep your tasks together… U can delete a to-do… You can make a to-do… You can edit a to-do… you can check a to-do, it has music player with good songs… Previous next and play pause shi everything, it has recent tabs … It tracks latest 10 sites you visited and there’s a delete button too to delete them. I had only used ai to understand concept and to check if there’s a error or not Credits, it motive and other stuff are written in README you check from there", "repo": "https://github.com/deepermemer-bit/Yours", "demo": "https://yours-virid.vercel.app"}]...
|
[{"post_id": 65505, "ts": "202 [{"post_id": 65505, "ts": "2026-09-10T18:16:52Z", "hours": 1.8931, "text": "DEVLOG-10 got a laptop suiiii yeah so ts is 1st devlog from laptop and rehsiping this proj with multi search engine option, so added it, yeah"}, {"post_id": 61447, "ts": "2026-09-04T11:32:05Z", "hours": 2.8594, "text": "DEVLOG-9 done adding random stuff and readme too took a long time… Enhancements were easy but readme… Nah there was a lot of things to write… But now it’s done suiiiii…."}, {"post_id": 61034, "ts": "2026-09-03T18:58:16Z", "hours": 4.6231, "text": "DEVLOG-8 finally everything done now jus some random enhancements left suiii…. After that I will write a good readme then ship then sleep"}, {"post_id": 58143, "ts": "2026-08-30T14:30:40Z", "hours": 2.175, "text": "DEVLOG-7 as I said I will be consistent… Had done making To-do now it full and final (may do some changes at last of proj as a cherry on top) It has 4 placeholder todos u add more and also del them and also check them (it was tough man) now I will head to music player then readme then final upgrading then ship then pray to god for good ratings then sleep… Ahem ahem okay enough yapping let me go for music player… Pokemon"}, {"post_id": 57905, "ts": "2026-08-30T07:28:59Z", "hours": 8.0994, "text": "DEVLOG-6 okay hadn’t posted from a while but work is still going on mah man… Yup I had done a lot of things such as upgrading css (I am in love with css) had done js of clock, weather, recent tabs search bar etc. working on todo then will work on music player that’s it suiiiiiiii (I will be more consistent i wear)"}, {"post_id": 53716, "ts": "2026-08-24T11:59:22Z", "hours": 1.2725, "text": "#DEVLOG-5 this Devlog is coming too early I mean I haven’t done a lot of work but its to announce that i finally ended doing css stuf 😭 now stepping towards js suiiii… See you after some js."}, {"post_id": 52976, "ts": "2026-08-23T10:58:18Z", "hours": 4.7611, "text": "#DEVLOG-4 whole css done too only js remaining now will do some minor changes in css later ig but this is the end visual till then I am fed up so going now bye… Soon project will be ready"}, {"post_id": 52216, "ts": "2026-08-22T09:50:11Z", "hours": 3.2431, "text": "#DEVLOG-3 most css done such as search bar, side bar, recent tabs, and other stuff still ig 40% css remaining to do and thats why in image it looks bad and as I am a new person in coding like yeah I am literally coding stuff for like 3rd or 4th time in my whole life so its pretty confusing but fun at the same time + I am more into visual things thats why I am making mostly visual stuff on my own like that bg image and stuff and the js aaaaa thats the main prob for me its too confusing man that’s it now go do something else till i complete my stuff"}, {"post_id": 51490, "ts": "2026-08-21T07:20:11Z", "hours": 2.4472, "text": "#DEVLOG-2 This time i had done making whole html file… 182 additions doen, had also done some css shi and added some image files in project too i have a refrence image made by me… So i am jus trying to achieve that quality…"}, {"post_id": 51135, "ts": "2026-08-20T17:06:12Z", "hours": 2.5503, "text": "YOURS - DEVLOG 1, had finally started doing stuff this is the 1st project mainly focused on the mission give your website a pulse or something i forgot the Mission name tbh… Well what’s the progress? Had done Setuping basic stuff such as readme, vercel, git, GitHub, hackatime and all it took some time (or may be i was the lazy one, wo cares…) + started work on the project too had made html css and js files. I already had started to commit stuff and yeah I had committed a lot… + started work on html too (basic layout is ready). So that’s it it’s my 1st project, will try to complete it as early as i can…"}]...
|
Title: YOURS by @deepermemer | Stardance
Devlogs: Title: YOURS by @deepermemer | Stardance
Devlogs:
YOURS - DEVLOG 1, had finally started doing stuff this is the 1st project mainly focused on the mission give your website a pulse or something i forgot the Mission name tbh… Well what’s the progress? Had done Setuping basic stuff such as readme, vercel, git, GitHub, hackatime and all it took some time (or may be i was the lazy one, wo cares…) + started work on the project too had made html css and js files. I already had started to commit stuff and yeah I had committed a lot… + started work on html too (basic layout is ready). So that’s it it’s my 1st project, will try to complete it as early as i can…
#DEVLOG-2 This time i had done making whole html file… 182 additions doen, had also done some css shi and added some image files in project too i have a refrence image made by me… So i am jus trying to achieve that quality…
#DEVLOG-3 most css done such as search bar, side bar, recent tabs, and other stuff still ig 40% css remaining to do and thats why in image it looks bad and as I am a new person in coding like yeah I am literally coding stuff for like 3rd or 4th time in my whole life so its pretty confusing but fun at the same time + I am more into visual things thats why I am making mostly visual stuff on my own like that bg image and stuff and the js aaaaa thats the main prob for me its too confusing man that’s it now go do something else till i complete my stuff
#DEVLOG-4 whole css done too only js remaining now will do some minor changes in css later ig but this is the end visual till then I am fed up so going now bye… Soon project will be ready
#DEVLOG-5 this Devlog is coming too early I mean I haven’t done a lot of work but its to announce that i finally ended doing css stuf 😭 now stepping towards js suiiii… See you after some js.
DEVLOG-6 okay hadn’t posted from a while but work is still going on mah man… Yup I had done a lot of things such as upgrading css (I am in love with css) had done js of clock, weather, recent tabs search bar etc. working on todo then will work on music player that’s it suiiiiiiii (I will be more consistent i wear)
DEVLOG-7 as I said I will be consistent… Had done making To-do now it full and final (may do some changes at last of proj as a cherry on top) It has 4 placeholder todos u add more and also del them and also check them (it was tough man) now I will head to music player then readme then final upgrading then ship then pray to god for good ratings then sleep… Ahem ahem okay enough yapping let me go for music player… Pokemon
DEVLOG-8 finally everything done now jus some random enhancements left suiii…. After that I will write a good readme then ship then sleep
DEVLOG-9 done adding random stuff and readme too took a long time… Enhancements were easy but readme… Nah there was a lot of things to write… But now it’s done suiiiii….
DEVLOG-10 got a laptop suiiii yeah so ts is 1st devlog from laptop and rehsiping this proj with multi search engine option, so added it, yeah
Ships:
It’s a custom new tab made by me. It’s based on the feeling of something being your own that’s what it’s name suggest… “YOURS” And it’s theme is dark and blue so it won’t hurt your eyes and it should looks good as I am a guy who is into designing and shi so i tried to make it look good It’s features contain a lot of things but all are the one you need so you don’t hv roam here and there it’s your everything… It has clock , it has weather (allow location acces to get it), it has search bar it works with Google… Typing url leads you directly to url… Typing other than url searches it on google, it has to-do to keep your tasks together… U can delete a to-do… You can make a to-do… You can edit a to-do… you can check a to-do, it has music player with good songs… Previous next and play pause shi everything, it has recent tabs … It tracks latest 10 sites you visited and there’s a delete button too to delete them. I had only used ai to understand concept and to check if there’s a error or not Credits, it motive and other stuff are written in README you check from there
It’s a custom new tab made by me. It’s based on the feeling of something being your own that’s what it’s name suggest… “YOURS” And it’s theme is dark and blue so it won’t hurt your eyes and it should looks good as I am a guy who is into designing and shi so i tried to make it look good It’s features contain a lot of things but all are the one you need so you don’t hv roam here and there it’s your everything… It has clock, it has weather(allow location acces to get it), it has search bar it works with Google… Typing url leads you directly to url… Typing other than url searches it on google, it has to-do to keep your tasks together… U can delete a to-do… You can make a to-do… You can edit a to-do… you can check a to-do, it has music player with good songs… Previous next and play pause shi everything, it has recent tabs … It tracks latest 10 sites you visited and there’s a delete button too to delete them. I had only used ai to understand concept and to check if there’s a error or not Credits, it motive and other stuff are written in README you check from there from review of old ship i got to know people wanted multi search engine so i added it click on google icon in search bar it will let u change search engine rn it has brave duckduckgo and google...
|
1793436477.1801116
|
1793522877.1801116
|
|
1275
|
My awesome macropad! by @Bobert3D | Stardance
|
Bobert3D
|
0
|
1.74
|
0
|
[]
|
[{"post_id": 65512, "ts": "202 [{"post_id": 65512, "ts": "2026-09-10T18:21:35Z", "hours": 1.7444, "text": "I started the Hackpad!!!!"}]...
|
Title: My awesome macropad! by @Bobert3D | Stardan Title: My awesome macropad! by @Bobert3D | Stardance
Devlogs:
I started the Hackpad!!!!...
|
1793447462.2379656
|
1794052262.2379656
|
|
59153
|
Wall-E alarm by @Bobert3D | Stardance
|
Bobert3D
|
0
|
5.57
|
0
|
[]
|
[{"post_id": 65517, "ts": "202 [{"post_id": 65517, "ts": "2026-09-10T18:26:03Z", "hours": 0.9675, "text": "Continued to design case and cry on how i just should go to my pc and use fusion360…"}, {"post_id": 63830, "ts": "2026-09-07T20:04:01Z", "hours": 2.3506, "text": "I finally finished the pcb after changing from keyboard matrix to back and then the DRC was weird but it wasnt that bad and now I can start making the case!"}, {"post_id": 63539, "ts": "2026-09-07T13:44:39Z", "hours": 2.2506, "text": "Started the pcb and then decided that I wanted to do a matrix so lol and did pcb art!!!!"}]...
|
Title: Wall-E alarm by @Bobert3D | Stardance
Devl Title: Wall-E alarm by @Bobert3D | Stardance
Devlogs:
Started the pcb and then decided that I wanted to do a matrix so lol and did pcb art!!!!
I finally finished the pcb after changing from keyboard matrix to back and then the DRC was weird but it wasnt that bad and now I can start making the case!
Continued to design case and cry on how i just should go to my pc and use fusion360…...
|
1793534186.054526
|
1794138986.054526
|
|
57900
|
tele-type-site by @forkosssa | Stardance
|
forkosssa
|
0
|
3.74
|
0
|
[]
|
[{"post_id": 65527, "ts": "202 [{"post_id": 65527, "ts": "2026-09-10T18:41:05Z", "hours": 3.2808, "text": "3 productive hrs tbh, updated everything, added basic I/O, added a VFS, added basic commands, outsourced style to a stylesheet, updated the design (not for long) as soon as i finish the basics so that it will look maybe not 1:1 as a tty but at least close enough then i will be ready to do the actual webpages and commands like fastfetch and others, maybe even sl"}, {"post_id": 61011, "ts": "2026-09-03T18:26:20Z", "hours": 0.4628, "text": "The start of a new journey! I need to make it at least 25hrs to get a flipper, also the sticky streak so it’s a double challenge for me!"}]...
|
Title: tele-type-site by @forkosssa | Stardance
D Title: tele-type-site by @forkosssa | Stardance
Devlogs:
The start of a new journey! I need to make it at least 25hrs to get a flipper, also the sticky streak so it’s a double challenge for me!
3 productive hrs tbh, updated everything, added basic I/O, added a VFS, added basic commands, outsourced style to a stylesheet, updated the design (not for long) as soon as i finish the basics so that it will look maybe not 1:1 as a tty but at least close enough then i will be ready to do the actual webpages and commands like fastfetch and others, maybe even sl...
|
1793462089.9045906
|
1794066889.9045906
|
|
60034
|
Morse Code Keyboard by @leroyl6420 | Stardance
|
leroyl6420
|
0
|
1.55
|
0
|
[]
|
[{"post_id": 65532, "ts": "202 [{"post_id": 65532, "ts": "2026-09-10T18:46:05Z", "hours": 0.2669, "text": "I adjusted the positioning of the button and LED on the CAD model. I still didn’t update the existence of the resistor, as that is pretty redundant."}, {"post_id": 64830, "ts": "2026-09-09T14:45:10Z", "hours": 0.9806, "text": "I built the initial Morse Code Keyboard! Apparently I can’t code the CH32X035 using the USB-C cable, and I’ll have to do so using a WCH-LinkE. I’ll switch my project over to funding to afford that."}, {"post_id": 64598, "ts": "2026-09-09T03:28:07Z", "hours": 0.3025, "text": "I CADed a model of the Morse Code Keyboard! I couldn’t find a .step file of the devboard Hack Club gave out (and that I’m using) online so I left it out. I also intentionally left out a case because I don’t want a case to dim the beauty of my creation. I didn’t add the resistor because I’m too lazy. Here’s the CAD, time to solder!"}]...
|
Title: Morse Code Keyboard by @leroyl6420 | Starda Title: Morse Code Keyboard by @leroyl6420 | Stardance
Devlogs:
I CADed a model of the Morse Code Keyboard! I couldn’t find a .step file of the devboard Hack Club gave out (and that I’m using) online so I left it out. I also intentionally left out a case because I don’t want a case to dim the beauty of my creation. I didn’t add the resistor because I’m too lazy. Here’s the CAD, time to solder!
I built the initial Morse Code Keyboard! Apparently I can’t code the CH32X035 using the USB-C cable, and I’ll have to do so using a WCH-LinkE. I’ll switch my project over to funding to afford that.
I adjusted the positioning of the button and LED on the CAD model. I still didn’t update the existence of the resistor, as that is pretty redundant....
|
1793030060.392491
|
1793634860.392491
|
|
47272
|
Pagina web par crear beatmaps by @laret | Stardanc Pagina web par crear beatmaps by @laret | Stardance...
|
laret
|
0
|
0.74
|
0
|
[]
|
[{"post_id": 65534, "ts": "202 [{"post_id": 65534, "ts": "2026-09-10T18:49:33Z", "hours": 0.7397, "text": "hize un boton para poder descargarun archivo aun no contiene nada pero despues se usara para exportar el beatmap"}]...
|
Title: Pagina web par crear beatmaps by @laret | S Title: Pagina web par crear beatmaps by @laret | Stardance
Devlogs:
hize un boton para poder descargarun archivo aun no contiene nada pero despues se usara para exportar el beatmap...
|
1793177255.961617
|
1793782055.961617
|
|
55057
|
ThecybersecurityGame by @eli_27 | Stardance
|
eli_27
|
1
|
19.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-10T18:55:33Z", "hours": 19.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a website that allows you to immerse yourself in the world of investigations, you can review suspect case files, view evidence folders and ultimately you can determine who you think committed the crime. The biggest struggle with this project was making sure that all of the evidence and the clues led to the right person whilst making sure that there was enough room for you to make your own decision.", "repo": "https://github.com/elivickery27/mystery", "demo": "https://elivickery27.github.io/mystery/"}]...
|
[{"post_id": 65535, "ts": "202 [{"post_id": 65535, "ts": "2026-09-10T18:51:31Z", "hours": 0.3775, "text": "adding the final tab the the heading bar, allowing you to select what case you want to pick."}, {"post_id": 64854, "ts": "2026-09-09T15:28:41Z", "hours": 2.3708, "text": "Finally finished both part and tidied up the css."}, {"post_id": 62442, "ts": "2026-09-05T19:47:34Z", "hours": 3.8411, "text": "added a case selection page, allowing the user to pick different options."}, {"post_id": 61603, "ts": "2026-09-04T16:19:14Z", "hours": 12.1931, "text": "making a website and designing the face of it"}]...
|
Title: ThecybersecurityGame by @eli_27 | Stardance Title: ThecybersecurityGame by @eli_27 | Stardance
Devlogs:
making a website and designing the face of it
added a case selection page, allowing the user to pick different options.
Finally finished both part and tidied up the css.
adding the final tab the the heading bar, allowing you to select what case you want to pick.
Ships:
This is a website that allows you to immerse yourself in the world of investigations, you can review suspect case files, view evidence folders and ultimately you can determine who you think committed the crime. The biggest struggle with this project was making sure that all of the evidence and the clues led to the right person whilst making sure that there was enough room for you to make your own decision....
|
1793335736.3896003
|
1793422136.3896003
|
|
38416
|
Badgeware Tufty WeatherStation by @nouxinf | Stard Badgeware Tufty WeatherStation by @nouxinf | Stardance...
|
nouxinf
|
1
|
31.0
|
579
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-10T19:20:46Z", "hours": 31.0, "multiplier": 18.44, "payout": 579, "blessing": "neutral", "text": "I just finished making the Badgeware Tufty Weatherstation. The Badgeware Tufty is a cool digital conference badge made by Pimoroni that comes with a nice screen, buttons, a battery and the RP2350 chip. This makes it fairly capable at 8MiB of RAM, meaning it could be used for just about anything (yes 8MiB is enough). The default firmware has an apps launcher that can launch user-made MicroPython apps, like Weatherstation. Weatherstation is essentially a weather app. The two main features are 1. the multisensor strip: you can plug in a Pimoroni made multisensor stick to get temperature, humidity and air pressure data and 2. internet data from openmeteo. you set the coordinates for your locations in options.json (typing them in manually with the tufty’s 5 buttons would be a pain), it fetches place names for the coordinates (usually suburb, city) through OpenStreetMap Nominatim and displays them or you can set a nickname to override it. it then fetches the weather data from openmeteo and displays temperature, precipitation and wind direction with cool pixel art icons. it updates weather data every 10 minutes, but you can manually refresh by pressing A. The other two screens is the vitals screen, which displays battery percentage, though it doesn’t display the percentage if it’s charging due to a bug with either the firmware or the hardware where it always shows 100% even though its not, the amount of storage space left and the amount of ram free. The next screen after that is attribution info, giving credit to OpenStreetMap and Open-meteo which is legally required. If you’re reading this you probably don’t have a Badgeware Tufty and that’s ok because I forked the official Badgeware Web Emulator at https://try.badgewa.re/ (with permission “I think it’s acceptable to consider it MIT, but either way fork away- and enjoy!” - Gadgetoid, the developer of the simulator on the pimoroni discord) and updated it with some info, installation instructions, and an options.json setup tool. Try it out at https://weatherstation.nouxinf.net/ or press the “Try Project” button! Note that Vitals info data and sensor data are made up (obviously). I hope you enjoy this project!", "repo": "https://github.com/nouxinf/weatherstation", "demo": "https://weatherstation.nouxinf.net/"}]...
|
[{"post_id": 65536, "ts": "202 [{"post_id": 65536, "ts": "2026-09-10T18:54:32Z", "hours": 3.0042, "text": "Devlog #11 of the Badgeware Tufty Weatherstation (prob the final one) In this devlog I: added this vitals screen which includes battery percentage, flash storage space used and the amount of PSRAM free. It doesn’t show the percentage when its plugged in because for some reason the battery reader always gives 100% when its plugged in published the weatherstation website to https://weatherstation.nouxinf.net/ fix a few bugs"}, {"post_id": 64339, "ts": "2026-09-08T17:18:47Z", "hours": 2.3861, "text": "Devlog #10 of the Badgeware Tufty Weatherstation In this devlog I: added some more effective error handling moved a bunch of functions out of __init__.py into their own files to make the code cleaner add an attribution screen (pictured) to be legally compliant with copyright"}, {"post_id": 63098, "ts": "2026-09-06T18:20:34Z", "hours": 6.5119, "text": "Devlog #9 of the Badgeware Tufty Weatherstation In this devlog I: stripped down the fork of the badgeware web emulator to onl have the badge screen and console log then added content to the homepage talking about the app added a new page with installation instructions for users unfamiliar with the badgeware tufty in that tutorial page i made a tool that generates options.json configurations where you can set temperature unit and pick out coordinates on a map"}, {"post_id": 59070, "ts": "2026-08-31T17:54:39Z", "hours": 1.4375, "text": "Devlog #8 of the Badgeware Tufty Weatherstation In this devlog I: forked the badgeware web simulator with permission modified the backend slightly to “work on my machine” also modified the actual badge code to use badgeware libraries instead of micropython libraries to let it work on the emulator added a github action to automatically update whats on the simulator repo when a new weatherstation release comes out things i’ve yet to add: automatic time zone setting in the simulator: will add that by overriding secrets.py somehow reskinning the whole site to be a weatherstation homepage"}, {"post_id": 58207, "ts": "2026-08-30T15:49:08Z", "hours": 2.3372, "text": "Devlog #7 of the Badgeware Tufty Weatherstation In this devlog I: Made it that the A button allows refetching weather data Automatically refresh weather data every 10 minutes Have a text display that shows when the weather was last updated (respecting TIMEZONE setting in secrets.py) Fixed some issues so now most of the time you can plug and replug the multisensor stick. Doesn’t work very reliably though due to issues where the cable is half-connected yet the badge is trying to read from the sensor."}, {"post_id": 53955, "ts": "2026-08-24T17:43:27Z", "hours": 0.3058, "text": "Devlog #6 of the Badgeware Tufty Weatherstation In this devlog I: removed unused functions that were replaced by native 3.0 functions made it so that the app works without internet so you can just use it as a sensor"}, {"post_id": 53936, "ts": "2026-08-24T17:12:48Z", "hours": 4.6589, "text": "Devlog #5 of the Badgeware Tufty Weatherstation Stuff added since the last devlog: Updated firmware version: While I was working on a side project Pimoroni made new firmware versions so I ported it from 2.0.2 to 3.0.2 though I’m pretty sure it works with 3.0.0 3.0.1 Along with that I changed some functions to native ones like word wrapping and centering text that came with 3.0 I added a temperature icon to the internet weather, and added precipitation and wind direction both with icons (pictured) I modified someone else’s screenshot code to work on windows and have a few extra features, which is how the screenshot attached was taken. Added comment boxes generated by one of my side projects, https://commentboxgenerator.lemonsite.uk/ Write a readme and roadmap Things that have yet to be added (from the roadmap) Offline support internet is optional just like sensor Update weather every 1 hour or on request- Some basic forecast information (e.g. weather icons per day of the week) in another screen Web editor for options.json through Flask or Bun (preferrably something self contained though) Badge diagnostics page (e.g. storage space, RAM, battery) Fork badgeware web simulator to work with weatherstation by adding proxy"}, {"post_id": 39425, "ts": "2026-08-02T11:36:26Z", "hours": 2.7283, "text": "Devlog #4 of the Badgeware Tufty Weatherstation Stuff added in this devlog: Indicator to show how many pages there are and which one you’re on 16 weather icons that map to the WMO codes that openmeteo gives Temperature display (that respects units set in options.json) Potentially next I’ll code a precipitation levels display, and maybe some charts that show temperature and precipitation throughout the day when you press B."}, {"post_id": 37151, "ts": "2026-07-29T17:22:28Z", "hours": 4.6317, "text": "Devlog #3 of the Badgeware Tufty Weatherstation The Badgeware Tufty is this cool conference badge from Pimoroni that is programmable with MicroPython. I’ve been making a Weather Station app for it, which can use a Pimoroni multisensor kit to show temperature, humidity and air pressure, but soon it will be able to fetch weather data around the world from the internet. In the previous devlogs I added the multisensor screen. Now I’ve started working on the weather from the internet part. So far it gets coordinates from options.json, and can show the suburb/neighbourhood and the city from Openstreetmap Nominatim. You can also optionally set a nickname for a location. Next up I’ll actually be putting the weather info in. That’ll involve getting data from Openmeteo, drawing a bunch of pixel art icons for each (~80) weather codes and rendering out the data."}, {"post_id": 34081, "ts": "2026-07-24T15:30:16Z", "hours": 0.5519, "text": "Added an option to use Fahrenheit or Kelvin instead of Celsius by editing options.json on the computer"}, {"post_id": 34047, "ts": "2026-07-24T14:28:24Z", "hours": 2.8611, "text": "I’m making a weather app for the Badgeware Tufty, a cool badge wearable that’s programmable with MicroPython! First step that I’ve done for my app is coding a screen that shows the temperature, humidity and air pressure sensed from the multisensor strip that comes with the Badgeware Tufty STEM kit. I’ve made 30 pixel art icons so far that scale with the values. Next up I’ll be adding the option to grab weather data from the internet using Openmeteo API for the weather data and Openstreetmap nominatim to get a place name. The locations would have to be configured through a JSON config file on the computer as the 5 buttons on the Tufty aren’t really enough for this kind of input. Maybe there could be some web UI to pick coordinates off a map and update the config file?"}]...
|
Title: Badgeware Tufty WeatherStation by @nouxinf Title: Badgeware Tufty WeatherStation by @nouxinf | Stardance
Devlogs:
I’m making a weather app for the Badgeware Tufty, a cool badge wearable that’s programmable with MicroPython! First step that I’ve done for my app is coding a screen that shows the temperature, humidity and air pressure sensed from the multisensor strip that comes with the Badgeware Tufty STEM kit. I’ve made 30 pixel art icons so far that scale with the values. Next up I’ll be adding the option to grab weather data from the internet using Openmeteo API for the weather data and Openstreetmap nominatim to get a place name. The locations would have to be configured through a JSON config file on the computer as the 5 buttons on the Tufty aren’t really enough for this kind of input. Maybe there could be some web UI to pick coordinates off a map and update the config file?
Added an option to use Fahrenheit or Kelvin instead of Celsius by editing options.json on the computer
Devlog #3 of the Badgeware Tufty Weatherstation The Badgeware Tufty is this cool conference badge from Pimoroni that is programmable with MicroPython. I’ve been making a Weather Station app for it, which can use a Pimoroni multisensor kit to show temperature, humidity and air pressure, but soon it will be able to fetch weather data around the world from the internet. In the previous devlogs I added the multisensor screen. Now I’ve started working on the weather from the internet part. So far it gets coordinates from options.json, and can show the suburb/neighbourhood and the city from Openstreetmap Nominatim. You can also optionally set a nickname for a location. Next up I’ll actually be putting the weather info in. That’ll involve getting data from Openmeteo, drawing a bunch of pixel art icons for each (~80) weather codes and rendering out the data.
Devlog #4 of the Badgeware Tufty Weatherstation Stuff added in this devlog: Indicator to show how many pages there are and which one you’re on 16 weather icons that map to the WMO codes that openmeteo gives Temperature display (that respects units set in options.json) Potentially next I’ll code a precipitation levels display, and maybe some charts that show temperature and precipitation throughout the day when you press B.
Devlog #5 of the Badgeware Tufty Weatherstation Stuff added since the last devlog: Updated firmware version: While I was working on a side project Pimoroni made new firmware versions so I ported it from 2.0.2 to 3.0.2 though I’m pretty sure it works with 3.0.0 3.0.1 Along with that I changed some functions to native ones like word wrapping and centering text that came with 3.0 I added a temperature icon to the internet weather, and added precipitation and wind direction both with icons (pictured) I modified someone else’s screenshot code to work on windows and have a few extra features, which is how the screenshot attached was taken. Added comment boxes generated by one of my side projects, https://commentboxgenerator.lemonsite.uk/ Write a readme and roadmap Things that have yet to be added (from the roadmap) Offline support internet is optional just like sensor Update weather every 1 hour or on request- Some basic forecast information (e.g. weather icons per day of the week) in another screen Web editor for options.json through Flask or Bun (preferrably something self contained though) Badge diagnostics page (e.g. storage space, RAM, battery) Fork badgeware web simulator to work with weatherstation by adding proxy
Devlog #6 of the Badgeware Tufty Weatherstation In this devlog I: removed unused functions that were replaced by native 3.0 functions made it so that the app works without internet so you can just use it as a sensor
Devlog #7 of the Badgeware Tufty Weatherstation In this devlog I: Made it that the A button allows refetching weather data Automatically refresh weather data every 10 minutes Have a text display that shows when the weather was last updated (respecting TIMEZONE setting in secrets.py) Fixed some issues so now most of the time you can plug and replug the multisensor stick. Doesn’t work very reliably though due to issues where the cable is half-connected yet the badge is trying to read from the sensor.
Devlog #8 of the Badgeware Tufty Weatherstation In this devlog I: forked the badgeware web simulator with permission modified the backend slightly to “work on my machine” also modified the actual badge code to use badgeware libraries instead of micropython libraries to let it work on the emulator added a github action to automatically update whats on the simulator repo when a new weatherstation release comes out things i’ve yet to add: automatic time zone setting in the simulator: will add that by overriding secrets.py somehow reskinning the whole site to be a weatherstation homepage
Devlog #9 of the Badgeware Tufty Weatherstation In this devlog I: stripped down the fork of the badgeware web emulator to onl have the badge screen and console log then added content to the homepage talking about the app added a new page with installation instructions for users unfamiliar with the badgeware tufty in that tutorial page i made a tool that generates options.json configurations where you can set temperature unit and pick out coordinates on a map
Devlog #10 of the Badgeware Tufty Weatherstation In this devlog I: added some more effective error handling moved a bunch of functions out of __init__.py into their own files to make the code cleaner add an attribution screen (pictured) to be legally compliant with copyright
Devlog #11 of the Badgeware Tufty Weatherstation (prob the final one) In this devlog I: added this vitals screen which includes battery percentage, flash storage space used and the amount of PSRAM free. It doesn’t show the percentage when its plugged in because for some reason the battery reader always gives 100% when its plugged in published the weatherstation website to https://weatherstation.nouxinf.net/ fix a few bugs
Ships:
I just finished making the Badgeware Tufty Weatherstation. The Badgeware Tufty is a cool digital conference badge made by Pimoroni that comes with a nice screen, buttons, a battery and the RP2350 chip. This makes it fairly capable at 8MiB of RAM, meaning it could be used for just about anything (yes 8MiB is enough). The default firmware has an apps launcher that can launch user-made MicroPython apps, like Weatherstation. Weatherstation is essentially a weather app. The two main features are 1. the multisensor strip: you can plug in a Pimoroni made multisensor stick to get temperature, humidity and air pressure data and 2. internet data from openmeteo. you set the coordinates for your locations in options.json (typing them in manually with the tufty’s 5 buttons would be a pain), it fetches place names for the coordinates (usually suburb, city) through OpenStreetMap Nominatim and displays them or you can set a nickname to override it. it then fetches the weather data from openmeteo and displays temperature, precipitation and wind direction with cool pixel art icons. it updates weather data every 10 minutes, but you can manually refresh by pressing A. The other two screens is the vitals screen, which displays battery percentage, though it doesn’t display the percentage if it’s charging due to a bug with either the firmware or the hardware where it always shows 100% even though its not, the amount of storage space left and the amount of ram free. The next screen after that is attribution info, giving credit to OpenStreetMap and Open-meteo which is legally required. If you’re reading this you probably don’t have a Badgeware Tufty and that’s ok because I forked the official Badgeware Web Emulator at https://try.badgewa.re/ (with permission “I think it’s acceptable to consider it MIT, but either way fork away- and enjoy!” - Gadgetoid, the developer of the simulator on the pimoroni discord) and updated it with some info, installation instructions, and an options.json setup tool. Try it out at https://weatherstation.nouxinf.net/ or press the “Try Project” button! Note that Vitals info data and sensor data are made up (obviously). I hope you enjoy this project!...
|
1793339288.6298912
|
1793425688.6298912
|
|
60760
|
Slackyyy bot by @Romomankoo | Stardance
|
Romomankoo
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-10T19:09:14Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "made Slackyyy Bot, a Slack bot packed with a bunch of fun and utility commands. Some of my favorite features are /slackyyy-bot-encrypt and /slackyyy-bot-decrypt for quick Base64 encoding right inside chat, /slackyyy-bot-flip for quick coin flips when making decisions, and the classic /slackyyy-bot-catfact and /slackyyy-bot-joke commands when you just need a quick break. The trickiest part was definitely dealing with Slack’s 3-second timeout limit and getting server deployment right. I kept getting hit with that annoying “app did not respond” error because socket lag was delaying my ack() calls, and at one point a single missing semicolon threw a whole TypeError: app.command is not a function error that took a minute to track down. 😭 I’m really proud that I pushed through all the server bugs and command errors to get it shipped. I learned a ton about Node.js, the Slack Bolt framework, Socket Mode, and writing systemd services to manage background processes. Seeing the commands actually work live in the workspace without any timeouts was super satisfying after all the trial and error!", "repo": "https://github.com/Romomankoo147/slackyyy-bot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354?skip_today=1"}]...
|
[{"post_id": 65538, "ts": "202 [{"post_id": 65538, "ts": "2026-09-10T18:58:51Z", "hours": 0.5844, "text": "I am working on slack bot that can respond with your ping, then tell you jokes or random cat facts, then you can flip a coin and lastly it supports encrypting and decrypting messages with Base64."}]...
|
Title: Slackyyy bot by @Romomankoo | Stardance
De Title: Slackyyy bot by @Romomankoo | Stardance
Devlogs:
I am working on slack bot that can respond with your ping, then tell you jokes or random cat facts, then you can flip a coin and lastly it supports encrypting and decrypting messages with Base64.
Ships:
made Slackyyy Bot, a Slack bot packed with a bunch of fun and utility commands. Some of my favorite features are /slackyyy-bot-encrypt and /slackyyy-bot-decrypt for quick Base64 encoding right inside chat, /slackyyy-bot-flip for quick coin flips when making decisions, and the classic /slackyyy-bot-catfact and /slackyyy-bot-joke commands when you just need a quick break. The trickiest part was definitely dealing with Slack’s 3-second timeout limit and getting server deployment right. I kept getting hit with that annoying “app did not respond” error because socket lag was delaying my ack() calls, and at one point a single missing semicolon threw a whole TypeError: app.command is not a function error that took a minute to track down. 😭 I’m really proud that I pushed through all the server bugs and command errors to get it shipped. I learned a ton about Node.js, the Slack Bolt framework, Socket Mode, and writing systemd services to manage background processes. Seeing the commands actually work live in the workspace without any timeouts was super satisfying after all the trial and error!...
|
1793411742.6936657
|
1793498142.6936657
|
|
59110
|
fire boy and water girl by @daniyathecoder | Stard fire boy and water girl by @daniyathecoder | Stardance...
|
daniyathecoder
|
0
|
4.56
|
0
|
[]
|
[{"post_id": 65548, "ts": "202 [{"post_id": 65548, "ts": "2026-09-10T19:11:59Z", "hours": 2.1744, "text": "FIXED SO MANY BUGS. and added another platform and a door , now I’ll make the code teleport the characters to the 2nd floor."}, {"post_id": 64416, "ts": "2026-09-08T19:42:37Z", "hours": 1.9828, "text": "I managed to fix previous bugs. Now I added a platform and gravity effect, it still needs some fixing though."}, {"post_id": 63149, "ts": "2026-09-06T19:50:53Z", "hours": 0.4067, "text": "Im making fireboy and water girl, I js made 2 squares, one can move using arrow keys and other moves with “w,a,s,d”."}]...
|
Title: fire boy and water girl by @daniyathecoder Title: fire boy and water girl by @daniyathecoder | Stardance
Devlogs:
Im making fireboy and water girl, I js made 2 squares, one can move using arrow keys and other moves with “w,a,s,d”.
I managed to fix previous bugs. Now I added a platform and gravity effect, it still needs some fixing though.
FIXED SO MANY BUGS. and added another platform and a door , now I’ll make the code teleport the characters to the 2nd floor....
|
1792936460.4170322
|
1793800460.4170322
|
|
40732
|
Pack of worlds by @freeboardtortoise | Stardance
|
freeboardtortoise
|
1
|
20.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-29T19:15:23Z", "hours": 20.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A small tic80 retro exploring sandbox game note, I was unable to build for native executable, so only website, but the website uses much a bit of resources please keep that in mind when running or viewing it Thanks.", "repo": "https://github.com/Freeboardtortoise/gameofnote", "demo": "https://freeboardtortoise.github.io/gameofnote/"}]...
|
[{"post_id": 65556, "ts": "202 [{"post_id": 65556, "ts": "2026-09-10T19:29:12Z", "hours": 10.0839, "text": "Dev-Log Number 2 for pack of worlds (formerly know as game of note, or untitled or something else) since the last time I wrote a Dev-Log I have added the following things: a very simple combat system what could possibly be called a shader system ( remap function / class for the map() calls) for hiding what the player should not be able to see… ray casting system I think its called and have decided it is called State Machine Vector2 Class abstraction A Nice looking start Screen Ores What do I need to do next The realy urgent thing that I need to do next is to add the actual main mechanic ( the backpack entering system) and I also need to add the Persistent saving system ( but I guess that can wait a bit longer :) ) Commit hash in case you want to go and check it out: 695b4e1 The release 0.0.2 will come out as soon as I can compile it successfully. For now you will just have to run it yourself with tic80"}, {"post_id": 51682, "ts": "2026-08-21T14:20:42Z", "hours": 9.5056, "text": "Devlog number 1 for the gameofnote (lack of a nother name of yet) This is a retro tic80 game where you explore a proceduraly generated world as a small charactor where you can carry your base along with you in your inventory. The things that are currently in the game are the very basics of a sandbox survival game. A procedural generated tarain system using a single seed Mob system A system for breaking blocks that is mildly functional A simple inventory system Basic art Zero music Cave walking A lives system with a glitchy death screen git hub commit hash in case you want to check it out: de0ed54f89af40e9a4b94aa583c9eac82e04b034"}]...
|
Title: Pack of worlds by @freeboardtortoise | Star Title: Pack of worlds by @freeboardtortoise | Stardance
Devlogs:
Devlog number 1 for the gameofnote (lack of a nother name of yet) This is a retro tic80 game where you explore a proceduraly generated world as a small charactor where you can carry your base along with you in your inventory. The things that are currently in the game are the very basics of a sandbox survival game. A procedural generated tarain system using a single seed Mob system A system for breaking blocks that is mildly functional A simple inventory system Basic art Zero music Cave walking A lives system with a glitchy death screen git hub commit hash in case you want to check it out: de0ed54f89af40e9a4b94aa583c9eac82e04b034
Dev-Log Number 2 for pack of worlds (formerly know as game of note, or untitled or something else) since the last time I wrote a Dev-Log I have added the following things: a very simple combat system what could possibly be called a shader system ( remap function / class for the map() calls) for hiding what the player should not be able to see… ray casting system I think its called and have decided it is called State Machine Vector2 Class abstraction A Nice looking start Screen Ores What do I need to do next The realy urgent thing that I need to do next is to add the actual main mechanic ( the backpack entering system) and I also need to add the Persistent saving system ( but I guess that can wait a bit longer :) ) Commit hash in case you want to go and check it out: 695b4e1 The release 0.0.2 will come out as soon as I can compile it successfully. For now you will just have to run it yourself with tic80
Ships:
A small tic80 retro exploring sandbox game note, I was unable to build for native executable, so only website, but the website uses much a bit of resources please keep that in mind when running or viewing it Thanks....
|
1793519553.5324388
|
1793605953.5324388
|
|
60634
|
My own site! by @stefanellinicolas72 | Stardance
|
stefanellinicolas72
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-14T14:19:06Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made a custom website about myself. it’s not very pretty but i’m not good at coding so it was kinda hard", "repo": "https://github.com/stefanellinicolas72-glitch/my-website-", "demo": "https://stefanellinicolas72-glitch.github.io/my-website-/"}]...
|
[{"post_id": 65561, "ts": "202 [{"post_id": 65561, "ts": "2026-09-10T19:39:03Z", "hours": 0.3806, "text": "a simple page that tells about me"}]...
|
Title: My own site! by @stefanellinicolas72 | Star Title: My own site! by @stefanellinicolas72 | Stardance
Devlogs:
a simple page that tells about me
Ships:
i made a custom website about myself. it’s not very pretty but i’m not good at coding so it was kinda hard...
|
1793411696.9812481
|
1793498096.9812481
|
|
38804
|
doddle cat ware by @Slear69_githud | Stardance
|
Slear69_githud
|
2
|
13.0
|
47
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-10T20:46:37Z", "hours": 6.0, "multiplier": 7.32, "payout": 47, "blessing": "neutral", "text": "in this ship there are 5 game in total andd yess like this is :)", "repo": "https://github.com/slear69/catt_ware", "demo": "https://catss-lovee.itch.io/doddle-cats-ware67"}, {"ship_num": 2, "ts": "2026-07-29T17:56:56Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "okkkk this is the project the last game is not that good but i will try to add animations", "repo": "https://github.com/slear69/catt_ware", "demo": "https://catss-lovee.itch.io/doddle-cats-ware67"}]...
|
[{"post_id": 65570, "ts": "202 [{"post_id": 65570, "ts": "2026-09-10T19:54:07Z", "hours": 2.8553, "text": "in the 5ft game you have to PET THE CAT :3 12 time with a and d"}, {"post_id": 64682, "ts": "2026-09-09T08:45:30Z", "hours": 1.8453, "text": "4th minigame :) in here you have to dodge the incoming water"}, {"post_id": 63845, "ts": "2026-09-07T20:32:07Z", "hours": 1.7367, "text": "New stuff : 1. new font , 2. new animation , and better 3rd game"}, {"post_id": 37171, "ts": "2026-07-29T17:55:26Z", "hours": 1.3411, "text": "FOR EVRY ONE WHO WILLMAKE THIS MISSON !!!!! if you want to post it on itch io the seance have to be in the same folder where everything is i mean in the ress: \\ folder this was the problem for me i hope it helps"}, {"post_id": 36701, "ts": "2026-07-28T22:31:10Z", "hours": 5.3025, "text": "i have most of the game done only the player left"}]...
|
Title: doddle cat ware by @Slear69_githud | Starda Title: doddle cat ware by @Slear69_githud | Stardance
Devlogs:
i have most of the game done only the player left
FOR EVRY ONE WHO WILLMAKE THIS MISSON !!!!! if you want to post it on itch io the seance have to be in the same folder where everything is i mean in the ress: \ folder this was the problem for me i hope it helps
New stuff : 1. new font , 2. new animation , and better 3rd game
4th minigame :) in here you have to dodge the incoming water
in the 5ft game you have to PET THE CAT :3 12 time with a and d
Ships:
okkkk this is the project the last game is not that good but i will try to add animations
in this ship there are 5 game in total andd yess like this is :)...
|
1793407957.1439095
|
1793494357.1439095
|
|
55584
|
Jaw by @badcoder_of | Stardance
|
badcoder_of
|
0
|
26.05
|
0
|
[]
|
[{"post_id": 65573, "ts": "202 [{"post_id": 65573, "ts": "2026-09-10T20:07:58Z", "hours": 3.7919, "text": "Keyboard Measurement Pipeline & Popup-State Hook Engineered a keyboard management and built a declarative popup-controll hook. What was done: Custom Keyboard-Offset Hook: Built a hook to subscribe to native keyboard height events. Layout Shift Prevention: Refactored AddTodoInput to dynamically adjust bottom offsets based on real-time keyboard metrics. Universal Popup Component: Standardized backdrop animations, gesture dismissal, and positioning into a headless overlay container. Popup-Control Hook: Developed usePopup to encapsulate popup parameters, visibility controllers, and click-the-backdrop handler."}, {"post_id": 64859, "ts": "2026-09-09T15:33:55Z", "hours": 3.3864, "text": "State-Driven Dynamic Routing & Upgrade UI with animations In short: Instant, zero-latency switching between workspaces, implemented by replacing expo-routing with reactively changing internal state. What was done: Routing-to-State: Replaced Expo Router with React state for internal workspace switching. UX optimization: Prevented global remounting of App caused by workspace toggles. UI Development: Connected the WorkspaceManager and DB-syncing to a clean, intuitive UI layer. Animations: Integrated custom react-native-reanimated transitions to Workspace Popup. Performance: Reduced workspace switching latency to state-updating-time while keeping background DB actions fully synced."}, {"post_id": 63810, "ts": "2026-09-07T19:33:07Z", "hours": 4.9869, "text": "Database Schema Migration & Bidirectional Syncing In short: Built a pipeline that auto-generates default workspace, added DB migrations, added relations between workspaces and todos, created a workspaceManger to send request to SQLite, added DB-to-UI sync. What was done: Database & Schema Migrations: Designed and executed SQLite schema migrations with relations between todos and workspaces . Dynamic Routing: Integrated workspaceId into application navigation state for context-aware (workspaces) data isolation. WorkspaceManager Pattern: Created a unified WorkspaceManager layer to centralize database queries. First-Boot Pipeline: Implemented auto-generation of user’s first workspace. Bidirectional Sync: UI is watching the DB updates now."}, {"post_id": 61111, "ts": "2026-09-03T20:44:48Z", "hours": 2.6417, "text": "Reusable Modal Backdrop & Component Composition Architecture Refactored backdrop rendering layer for all app-level modals. What was done: Architecture: Evaluated custom hook implementation for state isolation vs wrapper component design Component Composition: Placed backdrop fade logic into a standalone component ( Backdrop ) supporting children injection. Refactoring: Replaced duplicated backdrop styles across modals with a single declarative API."}, {"post_id": 60424, "ts": "2026-09-02T18:47:23Z", "hours": 1.5964, "text": "Queue drop fix & Refactoring What was done: Bugfix: Resolved event dropping in syncService during state updates. Architecture: Refactored queue state management from component-level code into a reusable useTodo custom hook for better side-effect isolation."}, {"post_id": 60191, "ts": "2026-09-02T12:48:25Z", "hours": 2.7014, "text": "🔄 Queue-based sync: instant UI, background persistence I added a small SyncService queue to keep the UI and storage in sync without blocking renders. How it works: the UI updates instantly (optimistic update), then the service persists the change to SQLite in the background, one task at a time."}, {"post_id": 59759, "ts": "2026-09-01T18:04:10Z", "hours": 1.4731, "text": "So, since i want to create a responsive local-first app, I have to implement the next sync schema: ui -> state -> local db -> queue -> server-db -> clients-notifications -> pulling -> render. I have already implemented the first step: ui -> state. Now I am at the stage of developing the next step of syncing: state -> local db. The whole project is so large, so i decided to start form fully local app. Which means i am not going to develop the server-side and client - server synchronization with conflict resolution. I already installed the drizzle ORM, and created the external Task Manager. I chose the Object because of the Single-Responsibility principle (UI must be just a renderer of the content, the logic is outside), i could also use the class, but the objects are “cleaner” than the classes, which can be counted as boilerplate."}, {"post_id": 59521, "ts": "2026-09-01T12:05:34Z", "hours": 1.0017, "text": "Jaw: First Look 🎬 Sharing the first video of Jaw! Done so far: smooth transitions + workspace popup picker. Stack is React Native (Expo) + TS + Reanimated, SQLite in progress. Design inspo is Telegram - love its UX and engineering. I’m not a designer, so ideas to make it more user-friendly are super welcome - drop them in the comments! Why Jaw? 1. Local-first. Works fully offline, syncs when you’re back online. Shipping a fully local version first to get it usable faster. Server (sync + conflict resolution) is WIP. 2. All-in-one. You only need this one app. Everything is deeply integrated: you can link a note inside a task, attach a pomodoro timer to a task, etc. It’s a monolithic workspace for students with 4 modules: • Todo / Planning - simple list for everyday stuff. Switch to calendar view for curriculum, events, and repeatable tasks. • Time - time management and pomodoro timers. • Notes - fast capture for ideas & info. Attach files and link anything else from Jaw. • Study - Anki/Quizlet-style flashcards, AI-powered interactive tests and games. NextUp: multi-user and public workspaces + live-editing for all modules. Would you use an all-in-one workspace like this? What would you change/add? P.S. This is just the first idea dump. I’ll be posting more devlogs (for the people who are into coding) as I build, so stay tuned!"}, {"post_id": 59163, "ts": "2026-08-31T19:53:46Z", "hours": 0.9917, "text": "Just sharing the first screen of the app"}, {"post_id": 58875, "ts": "2026-08-31T13:28:32Z", "hours": 2.8517, "text": "Workspace Layout Decomposition & Animated Navigation What was done: Component Architecture: Deconstructed monolithic layout into reusable components Interactive UI: Built custom workspace selection popup modal with dynamic backdrop Micro-interactions: Fine-tuned react-native-reanimated layout transitions and tab indicator springs for zero-lag UI feedback."}, {"post_id": 58730, "ts": "2026-08-31T08:49:20Z", "hours": 0.6283, "text": "Hey, I am creating the personal workspace (mobile app) for students and for myself. I will share the ideas of all of these modules step by step during the developing. This screenshot shows my first component (nav-bar)"}]...
|
Title: Jaw by @badcoder_of | Stardance
Devlogs:
H Title: Jaw by @badcoder_of | Stardance
Devlogs:
Hey, I am creating the personal workspace (mobile app) for students and for myself. I will share the ideas of all of these modules step by step during the developing. This screenshot shows my first component (nav-bar)
Workspace Layout Decomposition & Animated Navigation What was done: Component Architecture: Deconstructed monolithic layout into reusable components Interactive UI: Built custom workspace selection popup modal with dynamic backdrop Micro-interactions: Fine-tuned react-native-reanimated layout transitions and tab indicator springs for zero-lag UI feedback.
Just sharing the first screen of the app
Jaw: First Look 🎬 Sharing the first video of Jaw! Done so far: smooth transitions + workspace popup picker. Stack is React Native (Expo) + TS + Reanimated, SQLite in progress. Design inspo is Telegram - love its UX and engineering. I’m not a designer, so ideas to make it more user-friendly are super welcome - drop them in the comments! Why Jaw? 1. Local-first. Works fully offline, syncs when you’re back online. Shipping a fully local version first to get it usable faster. Server (sync + conflict resolution) is WIP. 2. All-in-one. You only need this one app. Everything is deeply integrated: you can link a note inside a task, attach a pomodoro timer to a task, etc. It’s a monolithic workspace for students with 4 modules: • Todo / Planning - simple list for everyday stuff. Switch to calendar view for curriculum, events, and repeatable tasks. • Time - time management and pomodoro timers. • Notes - fast capture for ideas & info. Attach files and link anything else from Jaw. • Study - Anki/Quizlet-style flashcards, AI-powered interactive tests and games. NextUp: multi-user and public workspaces + live-editing for all modules. Would you use an all-in-one workspace like this? What would you change/add? P.S. This is just the first idea dump. I’ll be posting more devlogs (for the people who are into coding) as I build, so stay tuned!
So, since i want to create a responsive local-first app, I have to implement the next sync schema: ui -> state -> local db -> queue -> server-db -> clients-notifications -> pulling -> render. I have already implemented the first step: ui -> state. Now I am at the stage of developing the next step of syncing: state -> local db. The whole project is so large, so i decided to start form fully local app. Which means i am not going to develop the server-side and client - server synchronization with conflict resolution. I already installed the drizzle ORM, and created the external Task Manager. I chose the Object because of the Single-Responsibility principle (UI must be just a renderer of the content, the logic is outside), i could also use the class, but the objects are “cleaner” than the classes, which can be counted as boilerplate.
🔄 Queue-based sync: instant UI, background persistence I added a small SyncService queue to keep the UI and storage in sync without blocking renders. How it works: the UI updates instantly (optimistic update), then the service persists the change to SQLite in the background, one task at a time.
Queue drop fix & Refactoring What was done: Bugfix: Resolved event dropping in syncService during state updates. Architecture: Refactored queue state management from component-level code into a reusable useTodo custom hook for better side-effect isolation.
Reusable Modal Backdrop & Component Composition Architecture Refactored backdrop rendering layer for all app-level modals. What was done: Architecture: Evaluated custom hook implementation for state isolation vs wrapper component design Component Composition: Placed backdrop fade logic into a standalone component ( Backdrop ) supporting children injection. Refactoring: Replaced duplicated backdrop styles across modals with a single declarative API.
Database Schema Migration & Bidirectional Syncing In short: Built a pipeline that auto-generates default workspace, added DB migrations, added relations between workspaces and todos, created a workspaceManger to send request to SQLite, added DB-to-UI sync. What was done: Database & Schema Migrations: Designed and executed SQLite schema migrations with relations between todos and workspaces . Dynamic Routing: Integrated workspaceId into application navigation state for context-aware (workspaces) data isolation. WorkspaceManager Pattern: Created a unified WorkspaceManager layer to centralize database queries. First-Boot Pipeline: Implemented auto-generation of user’s first workspace. Bidirectional Sync: UI is watching the DB updates now.
State-Driven Dynamic Routing & Upgrade UI with animations In short: Instant, zero-latency switching between workspaces, implemented by replacing expo-routing with reactively changing internal state. What was done: Routing-to-State: Replaced Expo Router with React state for internal workspace switching. UX optimization: Prevented global remounting of App caused by workspace toggles. UI Development: Connected the WorkspaceManager and DB-syncing to a clean, intuitive UI layer. Animations: Integrated custom react-native-reanimated transitions to Workspace Popup. Performance: Reduced workspace switching latency to state-updating-time while keeping background DB actions fully synced.
Keyboard Measurement Pipeline & Popup-State Hook Engineered a keyboard management and built a declarative popup-controll hook. What was done: Custom Keyboard-Offset Hook: Built a hook to subscribe to native keyboard height events. Layout Shift Prevention: Refactored AddTodoInput to dynamically adjust bottom offsets based on real-time keyboard metrics. Universal Popup Component: Standardized backdrop animations, gesture dismissal, and positioning into a headless overlay container. Popup-Control Hook: Developed usePopup to encapsulate popup parameters, visibility controllers, and click-the-backdrop handler....
|
1793166835.058166
|
1793771635.058166
|
|
33667
|
Nuclear Energy Calculator by @Boyra_Zeren | Starda Nuclear Energy Calculator by @Boyra_Zeren | Stardance...
|
Boyra_Zeren
|
0
|
2.66
|
0
|
[]
|
[{"post_id": 65574, "ts": "202 [{"post_id": 65574, "ts": "2026-09-10T20:11:05Z", "hours": 0.7225, "text": "3d Viewer Works! So in the past version 3d viewer stuff was there but it didn’t work.The code was looking for some typo name :/ Anyway it work now, I plan on making some atom models if possible later on instead of just cubes and change the UI a bit bcs it looks like ahh rn. After that I worked on the terminal and commands (at the bottom) which commands doesnt do really anything super useful but its better than nothing. Also I added scene saving via Json so you can view a past test later on if you like. I will serach other saving types tho"}, {"post_id": 65029, "ts": "2026-09-09T20:43:54Z", "hours": 1.935, "text": "Hell to the yea this thing works! So I wanted to make a physics simulation but never got to it (procastination mb) but now I got somethings done! I wanted to make the UI layout some-what like godot (while changing some stuff to fit the idea) so the bottom section shows output and actions while left and right show infromation about whats going on. Right there’s a graphics part (Sim) that shows what happened overall but it doesnt work prb matplotlib version problem and then theres 3D part which I want to make like again godot or blender (in moving thorugh the 3d space). 2D shows where everything is placed from a bird-eye view. I want to add commands and stuff but thats for wayy later on. Going great though I will focus on 3D enviroment for now."}]...
|
Title: Nuclear Energy Calculator by @Boyra_Zeren | Title: Nuclear Energy Calculator by @Boyra_Zeren | Stardance
Devlogs:
Hell to the yea this thing works! So I wanted to make a physics simulation but never got to it (procastination mb) but now I got somethings done! I wanted to make the UI layout some-what like godot (while changing some stuff to fit the idea) so the bottom section shows output and actions while left and right show infromation about whats going on. Right there’s a graphics part (Sim) that shows what happened overall but it doesnt work prb matplotlib version problem and then theres 3D part which I want to make like again godot or blender (in moving thorugh the 3d space). 2D shows where everything is placed from a bird-eye view. I want to add commands and stuff but thats for wayy later on. Going great though I will focus on 3D enviroment for now.
3d Viewer Works! So in the past version 3d viewer stuff was there but it didn’t work.The code was looking for some typo name :/ Anyway it work now, I plan on making some atom models if possible later on instead of just cubes and change the UI a bit bcs it looks like ahh rn. After that I worked on the terminal and commands (at the bottom) which commands doesnt do really anything super useful but its better than nothing. Also I added scene saving via Json so you can view a past test later on if you like. I will serach other saving types tho...
|
1793523341.1058738
|
1794128141.1058738
|
|
58464
|
atomic by @ttyChud | Stardance
|
ttyChud
|
0
|
36.45
|
0
|
[]
|
[{"post_id": 65584, "ts": "202 [{"post_id": 65584, "ts": "2026-09-10T20:25:58Z", "hours": 7.5739, "text": "atomic Devlog #6: the atom stops lying and starts solving itself Since last time i added a whole layer: fine structure, real spectral lines, a hot-gas version, and Hartree-Fock — the atom now solves its own electrons. Change 1: real levels. The clean Bohr ladder hides structure, so i added five closed-form refinements: fine structure, Dirac (which shows 2s1/2=2p1/2 exactly — reality splits them with the Lamb shift, and the model admits it), Zeeman’s full Breit-Rabi crossover, Stark, and the hyperfine 21 cm line. Each carries its own trust tier. Change 2: line strengths. I compute the dipole integral, then oscillator strength, Einstein A and lifetimes, and check everything against vendored NIST wavelengths (never live). The silent killer: both states in a transition must share one grid, so a test feeds a pair whose natural boxes differ. Change 3: it’s a gas now. Boltzmann + Saha populations, Gaussian/Lorentzian/Voigt profiles, optical depth, transfer I=B(1-e^-tau), and the curve of growth. Where a choice is a choice (plasma level truncation), it’s tagged MODEL. Change 4: Hartree-Fock. GSZ was a fitted model — no sulfur or chlorine, double-counted energy, unsigned error. HF is variational, so E_HF >= E_exact: a bounded, one-signed error the provenance can state. Slater integrals, angular coefficients pinned four ways, matrix-free LOBPCG for the non-local exchange, three independent energy checks. Payoff: Li->P, plus sulfur and chlorine — atoms GSZ couldn’t do. Result: 888 Python + 179 frontend tests green. Next: counterfactual electrons and HF 3D clouds."}, {"post_id": 65048, "ts": "2026-09-09T21:38:28Z", "hours": 8.0586, "text": "atomic Devlog #5: breaking physics on purpose, then adding real atoms Two big landings since last time: the What-If labs (altered constants, custom force laws, classical ghosts) and screened multi-electron atoms all the way from engine to UI. 359 tests green. You can now break the laws of physics Five sliders over the raw constants of nature — double the electron charge, quadruple vacuum permittivity, watch alpha, the Bohr radius and binding energy refuse to move. That degeneracy is the whole lesson: only dimensionless combinations are observable. Next to it, force-law presets (power law, Yukawa, harmonic, finite well, Coulomb-plus-core) plus a type-your-own V(r) box with a whitelist parser and a trust gate that flags unconverged levels instead of silently serving them. And the classical ghost: what Newton predicts for hydrogen, a spiral into the nucleus in picoseconds, which quantum mechanics forbids. That refusal is the point. Real multi-electron atoms GSZ screened model with honest transcribed parameters for 15 elements, self-consistent-solver-free but validated against ionization data. Monte-Carlo cloud sampling with KS-tested distributions, y=0 plane cross-sections, screened levels and radial endpoints on the API, atom picker entries and an occupancy ladder in the UI. Sulfur and chlorine get a named refusal instead of invented numbers — no fitted parameters exist for them, so the server says exactly that."}, {"post_id": 64197, "ts": "2026-09-08T12:55:37Z", "hours": 8.1053, "text": "atomic Devlog #3: solver, server, and the web instrument Three phases landed since last time: the numerical solver, the FastAPI backend, and the React + Three.js frontend. 193 backend tests and 48 frontend tests green, everything pushed. Change 1: numerical radial solver Built a 3-point finite-difference solver for arbitrary central potentials, plus a grid-halving error estimator. Validated against the exact hydrogen answers: energies match, 1s overlap > 0.99999, convergence measures exactly 2.00 across all cases. Two of my own test assertions were wrong along the way (forgot reduced mass in the expected energy, grid too coarse for the normalization check) — the engine was right both times. Change 2: FastAPI backend atomic serve now runs a real server: health, systems, state, levels, radial endpoints, plus background jobs (cloud sampling, plane cross-sections) with websocket progress and binary data channels. Sampling is honest inverse-transform Monte Carlo of |psi|². Also fixed a URL-encoding bug where the he+ key decoded as “he “ and got refused everywhere — verified against the live server. Change 3: web instrument Full frontend: orbitable 3D point clouds with density/phase coloring, y=0 plane canvas views, clickable energy ladders, radial R/P plots with node marks and mean-radius markers, shareable URLs for every state, zustand store underneath. Production build splits Three.js into a lazy chunk; the server mounts the built UI directly."}, {"post_id": 63080, "ts": "2026-09-06T17:50:33Z", "hours": 6.7197, "text": "atomic Devlog #2: exact hydrogen engine + systems registry I had two goals in my mind in this session. One was to build the exact hydrogen-like physics engine and the other is to add a systems registry plus the element tables. Here is what and how I implemented this stuff and the challenges i faced: Change/Problem 1: Before I even got started on the new stuff i wanted to add, i faced a big problem. The moment i wired the new physics into last session’s spine, 4 tests instantly failed. My Field type (the container every array result travels in) demanded its grid be strictly increasing, but wavefunction sampling evaluates on scattered, unsorted points, so every single evaluation got rejected with a ValueError. The fix: It is important to know what a Field actually is here. It’s not a mesh — it’s just samples of a function on a set of points, plus the provenance saying how they were computed. Sorted-ness is a quadrature concern and belongs to the mesh module, not the container. So i dropped just the ordering rule and kept the finite/shape guards, then added a regression test pinning the decision so nobody re-adds it later and silently breaks everything again. Change 2: hydrogen engine implementation I implemented the exact closed-form hydrogen-like solutions, all in Hartree atomic units. The energy is E_n = −mu_ratio · Z² / (2n²), and the trick that makes it powerful is the reduced-mass ratio mu/m_e sitting right in the formula — deuterium, tritium, muonic hydrogen and positronium all fall out of the same code just by changing that one number. The radial functions use the normalized generalized-Laguerre form R_nl = N · exp(−ρ/2) · ρ^l · L(ρ) with ρ = 2Zμ′r/n, and mean radii come from = (3n² − l(l+1)) / (2Zμ′). I checked the 1s case by hand: = 1.5 bohr, exactly like the textbooks say. Change 3: angular bases + systems + proof I implemented both angular bases as first-class outputs: complex spherical harmonics (with the Condon-Shortley phase, so Y_1^1 has a negative real part at phi=0) and real chemistry orbitals (p_x, p_y, d_xy and friends with proper orientation). On top of that sits the systems registry — H, D, T, muonic hydrogen, positronium, He+, plus a generic hydrogen_like(Z) — each carrying CODATA-cited reduced masses and honest nuclear radii (positronium gets None instead of a fake zero, because its “nucleus” is a point positron). The last batch of work was the proof: 139 tests green. Normalization, orthogonality, node counts coming out as exactly n−l−1 every time, angular orthonormality up to l=3 in both bases. Nothing’s shipped anywhere yet though — next is Phase 2, the numerical solver, validated against these exact answers. That’s the first real solver-vs-truth showdown."}, {"post_id": 62261, "ts": "2026-09-05T15:27:04Z", "hours": 5.99, "text": "atomic Devlog #1: foundation is done, the atom has a spine i just kick started a new project called atomic, and the aim is kinda crazy: a quantum-mechanical atom model that never quietly lies about its physics. every number that crosses a module boundary carries a record of how it was computed and how far it can be trusted, with tiers going from EXACT (closed-form) all the way to COUNTERFACTUAL (deliberately altered physics, computed rigorously). i’ve got the whole thing mapped out as a 15-phase plan. today was all about Phase 0: the foundation. no physics yet, just the spine everything else will stand on. Change 1: environment setup (this fought me) my machine had no conda, no pip, no uv, nothing. just bare python 3.14. i almost gave up and then found out python ships with ensurepip, so i bootstrapped a venv with python3 -m venv .venv and pip-installed numpy, scipy, pytest and ruff into it. worked first try after that. lesson learned: check ensurepip before panicking. Change 2: the provenance spine + constants + mesh i scaffolded the actual package: provenance.py (the fidelity tiers plus the Quantity and Field types that carry them), constants.py (CODATA values with a counterfactual-universe hook for the future What-If lab, where you’ll be able to mess with constants like e and watch what breaks), and numerics/mesh.py (uniform + exponential radial meshes with a ghost-node fix at the inner wall, since an exponential mesh can’t reach the origin). getting the discretization right now means every solver later stands on solid ground. Change 3: evidence-style tests, all green i wrote 34 tests and they all pass in 0.2 seconds. they’re written as evidence, not coverage: solver checks against the exact hydrogen ground state, mesh guards that refuse bad inputs, constants checked against published CODATA values. the idea is that if i ever break the physics, CI screams at me immediately."}]...
|
Title: atomic by @ttyChud | Stardance
Devlogs:
at Title: atomic by @ttyChud | Stardance
Devlogs:
atomic Devlog #1: foundation is done, the atom has a spine i just kick started a new project called atomic, and the aim is kinda crazy: a quantum-mechanical atom model that never quietly lies about its physics. every number that crosses a module boundary carries a record of how it was computed and how far it can be trusted, with tiers going from EXACT (closed-form) all the way to COUNTERFACTUAL (deliberately altered physics, computed rigorously). i’ve got the whole thing mapped out as a 15-phase plan. today was all about Phase 0: the foundation. no physics yet, just the spine everything else will stand on. Change 1: environment setup (this fought me) my machine had no conda, no pip, no uv, nothing. just bare python 3.14. i almost gave up and then found out python ships with ensurepip, so i bootstrapped a venv with python3 -m venv .venv and pip-installed numpy, scipy, pytest and ruff into it. worked first try after that. lesson learned: check ensurepip before panicking. Change 2: the provenance spine + constants + mesh i scaffolded the actual package: provenance.py (the fidelity tiers plus the Quantity and Field types that carry them), constants.py (CODATA values with a counterfactual-universe hook for the future What-If lab, where you’ll be able to mess with constants like e and watch what breaks), and numerics/mesh.py (uniform + exponential radial meshes with a ghost-node fix at the inner wall, since an exponential mesh can’t reach the origin). getting the discretization right now means every solver later stands on solid ground. Change 3: evidence-style tests, all green i wrote 34 tests and they all pass in 0.2 seconds. they’re written as evidence, not coverage: solver checks against the exact hydrogen ground state, mesh guards that refuse bad inputs, constants checked against published CODATA values. the idea is that if i ever break the physics, CI screams at me immediately.
atomic Devlog #2: exact hydrogen engine + systems registry I had two goals in my mind in this session. One was to build the exact hydrogen-like physics engine and the other is to add a systems registry plus the element tables. Here is what and how I implemented this stuff and the challenges i faced: Change/Problem 1: Before I even got started on the new stuff i wanted to add, i faced a big problem. The moment i wired the new physics into last session’s spine, 4 tests instantly failed. My Field type (the container every array result travels in) demanded its grid be strictly increasing, but wavefunction sampling evaluates on scattered, unsorted points, so every single evaluation got rejected with a ValueError. The fix: It is important to know what a Field actually is here. It’s not a mesh — it’s just samples of a function on a set of points, plus the provenance saying how they were computed. Sorted-ness is a quadrature concern and belongs to the mesh module, not the container. So i dropped just the ordering rule and kept the finite/shape guards, then added a regression test pinning the decision so nobody re-adds it later and silently breaks everything again. Change 2: hydrogen engine implementation I implemented the exact closed-form hydrogen-like solutions, all in Hartree atomic units. The energy is E_n = −mu_ratio · Z² / (2n²), and the trick that makes it powerful is the reduced-mass ratio mu/m_e sitting right in the formula — deuterium, tritium, muonic hydrogen and positronium all fall out of the same code just by changing that one number. The radial functions use the normalized generalized-Laguerre form R_nl = N · exp(−ρ/2) · ρ^l · L(ρ) with ρ = 2Zμ′r/n, and mean radii come from = (3n² − l(l+1)) / (2Zμ′). I checked the 1s case by hand: = 1.5 bohr, exactly like the textbooks say. Change 3: angular bases + systems + proof I implemented both angular bases as first-class outputs: complex spherical harmonics (with the Condon-Shortley phase, so Y_1^1 has a negative real part at phi=0) and real chemistry orbitals (p_x, p_y, d_xy and friends with proper orientation). On top of that sits the systems registry — H, D, T, muonic hydrogen, positronium, He+, plus a generic hydrogen_like(Z) — each carrying CODATA-cited reduced masses and honest nuclear radii (positronium gets None instead of a fake zero, because its “nucleus” is a point positron). The last batch of work was the proof: 139 tests green. Normalization, orthogonality, node counts coming out as exactly n−l−1 every time, angular orthonormality up to l=3 in both bases. Nothing’s shipped anywhere yet though — next is Phase 2, the numerical solver, validated against these exact answers. That’s the first real solver-vs-truth showdown.
atomic Devlog #3: solver, server, and the web instrument Three phases landed since last time: the numerical solver, the FastAPI backend, and the React + Three.js frontend. 193 backend tests and 48 frontend tests green, everything pushed. Change 1: numerical radial solver Built a 3-point finite-difference solver for arbitrary central potentials, plus a grid-halving error estimator. Validated against the exact hydrogen answers: energies match, 1s overlap > 0.99999, convergence measures exactly 2.00 across all cases. Two of my own test assertions were wrong along the way (forgot reduced mass in the expected energy, grid too coarse for the normalization check) — the engine was right both times. Change 2: FastAPI backend atomic serve now runs a real server: health, systems, state, levels, radial endpoints, plus background jobs (cloud sampling, plane cross-sections) with websocket progress and binary data channels. Sampling is honest inverse-transform Monte Carlo of |psi|². Also fixed a URL-encoding bug where the he+ key decoded as “he “ and got refused everywhere — verified against the live server. Change 3: web instrument Full frontend: orbitable 3D point clouds with density/phase coloring, y=0 plane canvas views, clickable energy ladders, radial R/P plots with node marks and mean-radius markers, shareable URLs for every state, zustand store underneath. Production build splits Three.js into a lazy chunk; the server mounts the built UI directly.
atomic Devlog #5: breaking physics on purpose, then adding real atoms Two big landings since last time: the What-If labs (altered constants, custom force laws, classical ghosts) and screened multi-electron atoms all the way from engine to UI. 359 tests green. You can now break the laws of physics Five sliders over the raw constants of nature — double the electron charge, quadruple vacuum permittivity, watch alpha, the Bohr radius and binding energy refuse to move. That degeneracy is the whole lesson: only dimensionless combinations are observable. Next to it, force-law presets (power law, Yukawa, harmonic, finite well, Coulomb-plus-core) plus a type-your-own V(r) box with a whitelist parser and a trust gate that flags unconverged levels instead of silently serving them. And the classical ghost: what Newton predicts for hydrogen, a spiral into the nucleus in picoseconds, which quantum mechanics forbids. That refusal is the point. Real multi-electron atoms GSZ screened model with honest transcribed parameters for 15 elements, self-consistent-solver-free but validated against ionization data. Monte-Carlo cloud sampling with KS-tested distributions, y=0 plane cross-sections, screened levels and radial endpoints on the API, atom picker entries and an occupancy ladder in the UI. Sulfur and chlorine get a named refusal instead of invented numbers — no fitted parameters exist for them, so the server says exactly that.
atomic Devlog #6: the atom stops lying and starts solving itself Since last time i added a whole layer: fine structure, real spectral lines, a hot-gas version, and Hartree-Fock — the atom now solves its own electrons. Change 1: real levels. The clean Bohr ladder hides structure, so i added five closed-form refinements: fine structure, Dirac (which shows 2s1/2=2p1/2 exactly — reality splits them with the Lamb shift, and the model admits it), Zeeman’s full Breit-Rabi crossover, Stark, and the hyperfine 21 cm line. Each carries its own trust tier. Change 2: line strengths. I compute the dipole integral, then oscillator strength, Einstein A and lifetimes, and check everything against vendored NIST wavelengths (never live). The silent killer: both states in a transition must share one grid, so a test feeds a pair whose natural boxes differ. Change 3: it’s a gas now. Boltzmann + Saha populations, Gaussian/Lorentzian/Voigt profiles, optical depth, transfer I=B(1-e^-tau), and the curve of growth. Where a choice is a choice (plasma level truncation), it’s tagged MODEL. Change 4: Hartree-Fock. GSZ was a fitted model — no sulfur or chlorine, double-counted energy, unsigned error. HF is variational, so E_HF >= E_exact: a bounded, one-signed error the provenance can state. Slater integrals, angular coefficients pinned four ways, matrix-free LOBPCG for the non-local exchange, three independent energy checks. Payoff: Li->P, plus sulfur and chlorine — atoms GSZ couldn’t do. Result: 888 Python + 179 frontend tests green. Next: counterfactual electrons and HF 3D clouds....
|
1792932855.3437366
|
1793796855.3437366
|
|
50158
|
Kazi by @Bianca | Stardance
|
Bianca
|
1
|
212.74
|
407
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-20T21:14:41Z", "hours": 30.0, "multiplier": 13.9, "payout": 407, "blessing": "neutral", "text": "What I made: Kazi connects skilled trade workers with customers who need their services, making the process faster and easier. Workers are electricians, plumbers, builders, welders, mechanics, and other professionals who create profiles, showcase their skills, and find relevant jobs. Customers can use Kazi to discover skilled workers, view their profiles, and find the right person for the work they need. The challenges I faced: The challenges I faced were setting up the Google API to allow for Google sign-up and making sure the frontend and backend were communicating. Additionally, making a polished, well-thought-out app with minimal bugs was another challenge. Things I accomplished that I am proud of: Before starting this challenge, using the terminal felt like a foreign language and I didn’t know why the backend and frontend had to be separate. Now I can confidently say that the terminal is my best friend, and I don’t need to watch YouTube tutorials on the difference between an API and an SDK. Things to know: On the demo the google sign in does not work only on emulators it does. Taking photos and contact via phone is not supported on the demo as well. Using th README file has a lot of additional tips. If you create an account even if you close the file will be saved in the database and you can log in, if you have trouble deleting the account you made email me the email you used and ill do it manually.", "repo": "https://github.com/PhantomJelly/Kazi-Cursor.git", "demo": "https://phantomjelly.github.io/Kazi-Cursor/"}]...
|
[{"post_id": 65589, "ts": "202 [{"post_id": 65589, "ts": "2026-09-10T20:37:40Z", "hours": 9.9253, "text": "Dev vlog 21 - I didnt like the first iteration of the subsriptions screen so I made it more personalised to the specific industry im targeting. I changed words like “Pro plan” to “Artisan plan” and “Free plan” to “Apprentice plan”. The reason there is some what space is because I’ll be adding some assets what I’m still designing in procreate and Lottie."}, {"post_id": 65015, "ts": "2026-09-09T20:11:12Z", "hours": 10.4989, "text": "Dev vlog 20 - Today I made the workers job screen more interactable and customizable. I’m going through day by day to improve each screen’s UI. I’m honestly quite happy with how the app is coming up even though I’ve only done 2 screens im slowly getting to a completed version 1."}, {"post_id": 64677, "ts": "2026-09-09T08:33:15Z", "hours": 10.4519, "text": "Dev vlog 19 - I added a pay wall on the worker account that limits theamount of jobs a worker can recieve and and the features they have. It costs $3.00 (I converted it) which is a small amount for the workers, I dont want it to be too high as in Namibia subscriptions is not something people are willing to pay. Especially low wage workers and unemployed people"}, {"post_id": 64413, "ts": "2026-09-08T19:39:24Z", "hours": 6.9683, "text": "Dev vlog 18 - I’ve been making some assets to use for the UI and testing the app to find more areas I’d like to add more features and animations."}, {"post_id": 63751, "ts": "2026-09-07T18:24:22Z", "hours": 9.5639, "text": "Dev vlog 17 - Hi I made good progress with the UI, I started with the splash screen and I’m working my way from there, the animation was a bit glitchy and i fexed the issue. Additionally, the letters were not lined up which was quite a task to do, i though it would be easier but when importing the animation it would keep changing it so I had to make tha letters separate to the animation. I used Mobbin to get references and I saw most we’re too flashy so i made mine simple but enjoyable. Next I’ll be working on the user onboardeing, im currently preparing a lot of assets as I want it to be interactive and unique."}, {"post_id": 62718, "ts": "2026-09-06T06:43:31Z", "hours": 9.8536, "text": "Dev vlog 16 - After adding the Didit verification the SQL database was not syncing, a had to make 2 separate databses to make it work, now im able to make an account again."}, {"post_id": 62449, "ts": "2026-09-05T19:59:59Z", "hours": 9.1511, "text": "Dev post 15 - Hey everyone, I spent the day improving the web experience for testers and you guys :). Im still having troubles with the google sign in but ill try and address it tomorrow. My favourite thing i did was limiting the web screen so that it gives more of that app feel."}, {"post_id": 61380, "ts": "2026-09-04T08:21:31Z", "hours": 10.3572, "text": "Dev post 14 - Hi everyone I spent the whole day polishing up Kazi, fixing bugs, and just improving the overall experience. Now im going to add more features I’m planning on adding a paywall to start making some income from this, and im now brainstorming the features I should add."}, {"post_id": 60515, "ts": "2026-09-02T22:09:05Z", "hours": 10.7911, "text": "Dev vlog 13 - I caught a bug which was actually quite critical. When the user would delete their account, their information would not get deleted, so if they made an account with same old email all the past information would still be there."}, {"post_id": 59122, "ts": "2026-08-31T19:07:19Z", "hours": 9.1975, "text": "Dev post 12 - I added back the google sign in and polished up the rest of the verification setup."}, {"post_id": 58193, "ts": "2026-08-30T15:27:10Z", "hours": 9.7597, "text": "Dev vlog 11 - I’m building the a better workflow in Figma and iy was been taking quite a long time to implement and I want to change some of the things I’ve build. I also want to make the UI animations in Figma instead of Lottie because I know how to use Figma more and you can add an extension to export your work as .lottie files (a type of file that allows your animation to run on your app without taking much storage)."}, {"post_id": 57327, "ts": "2026-08-29T13:23:34Z", "hours": 9.3769, "text": "Dev vlog 10 - Hi there I’ve been finalising the setup of the workers ID verification. I ran into some problems but I found this site that allows ID verification (can use passports, drivers licenses) for free for your first 500 verification every month, essentially meaning that if you stay below 500 verifications per month its completely free. Its called Didit. After setting up I’ll go on tosetting up analytics to track onboarding and activity of users."}, {"post_id": 56479, "ts": "2026-08-28T08:06:11Z", "hours": 12.835, "text": "Dev vlog 9 - Hi and thank you to everyone who voted for my project and all the tips you’ve given me. I have a few challenges I’m tackling at the moment: 1. Google sign it, it works with then mobile version (if I test with an APK) but not on web like in the demo. 2. The ID verification, it needs to be able to authenticate yours profiles which seems so complex. 3. The UI and making animations, I dont have much time as I have my A-level exams soon."}, {"post_id": 55756, "ts": "2026-08-27T18:56:17Z", "hours": 10.3631, "text": "Dev vlog 8 - I made some changes to the assistant section so that the questions asked by agent is more conscience and more interactive. Where the user can just tap on the screen and not type."}, {"post_id": 54739, "ts": "2026-08-25T20:25:24Z", "hours": 10.1636, "text": "Dev vlog 7 - After I made a basic AI chat assist, I made some minor UI improvements. I mainly focused on the inquiry generation, I’m not 100% there but I’m trying to make it as quick and easy as possible for users to easily send a detailed inquiries with minimal effort."}, {"post_id": 54310, "ts": "2026-08-25T08:13:39Z", "hours": 11.7128, "text": "Dev vlog 6 - Hi there, I’ve made a drastic change as I’ve descided to add an AI chat bot to the app to make it even more easier to send workers inquiries. It will be a place where you just describe the issue and it will automatically find the best worker and send them an inquiry for you after you give it all the necessary information."}, {"post_id": 53196, "ts": "2026-08-23T17:12:34Z", "hours": 10.9467, "text": "Dev vlog 6 - I finished with the official Beta version of Kazi and will be launching soon to the play store. After launching and getting my first wavy of users I’ll launch the official version 1."}, {"post_id": 52272, "ts": "2026-08-22T11:49:28Z", "hours": 2.8028, "text": "Dev vlog 5 - I set up notifications that pop up when a user opens the app, next I want to make it more interactive and add custom icons. Also for when allowing for photos I’ll add some humor when asking for permission and more custom icons. I’ll be making the icon on procreate then use Lottie to turn it into files that can be used on the app."}, {"post_id": 51479, "ts": "2026-08-21T06:40:27Z", "hours": 8.0186, "text": "Dev vlog 4 - Im now focusing on making the UI more unique and interactive. For planning im using Figma and for animations im using Lottie. I added some coloured elements so that its easier to see the difference between features more easily, like if your inquiry is pending or has been answered."}, {"post_id": 50803, "ts": "2026-08-20T06:37:08Z", "hours": 9.8239, "text": "Dev vlog 3 - I started using emulator, it took a while to install and setup. I made worker accounts have bonuses feature to get more clients, but now I want to improve the UI and add custom badges and animations, I started learning how to use Lottie to do that."}, {"post_id": 50478, "ts": "2026-08-19T17:19:01Z", "hours": 10.575, "text": "Dev vlog 2 - I made the customer side of the app but I used dummy data and didn’t connect any APIs yet so I need to do that. I also need to fix bugs and allow customers to contact the workers."}, {"post_id": 49519, "ts": "2026-08-18T12:07:28Z", "hours": 9.4683, "text": "Dev vlog 1 - I’m building a mobile app to help trade workers like plumbers, electricians, and cleaners find work. In the same light to help people find someone who can fix their leaky tap or install a cupboard. This is the workers side that I’ve built, I used my brothers phone to help me make a demo account and test out the features. The key features are different languages, photo verification, and google sign up."}]...
|
Title: Kazi by @Bianca | Stardance
Devlogs:
Dev v Title: Kazi by @Bianca | Stardance
Devlogs:
Dev vlog 1 - I’m building a mobile app to help trade workers like plumbers, electricians, and cleaners find work. In the same light to help people find someone who can fix their leaky tap or install a cupboard. This is the workers side that I’ve built, I used my brothers phone to help me make a demo account and test out the features. The key features are different languages, photo verification, and google sign up.
Dev vlog 2 - I made the customer side of the app but I used dummy data and didn’t connect any APIs yet so I need to do that. I also need to fix bugs and allow customers to contact the workers.
Dev vlog 3 - I started using emulator, it took a while to install and setup. I made worker accounts have bonuses feature to get more clients, but now I want to improve the UI and add custom badges and animations, I started learning how to use Lottie to do that.
Dev vlog 4 - Im now focusing on making the UI more unique and interactive. For planning im using Figma and for animations im using Lottie. I added some coloured elements so that its easier to see the difference between features more easily, like if your inquiry is pending or has been answered.
Dev vlog 5 - I set up notifications that pop up when a user opens the app, next I want to make it more interactive and add custom icons. Also for when allowing for photos I’ll add some humor when asking for permission and more custom icons. I’ll be making the icon on procreate then use Lottie to turn it into files that can be used on the app.
Dev vlog 6 - I finished with the official Beta version of Kazi and will be launching soon to the play store. After launching and getting my first wavy of users I’ll launch the official version 1.
Dev vlog 6 - Hi there, I’ve made a drastic change as I’ve descided to add an AI chat bot to the app to make it even more easier to send workers inquiries. It will be a place where you just describe the issue and it will automatically find the best worker and send them an inquiry for you after you give it all the necessary information.
Dev vlog 7 - After I made a basic AI chat assist, I made some minor UI improvements. I mainly focused on the inquiry generation, I’m not 100% there but I’m trying to make it as quick and easy as possible for users to easily send a detailed inquiries with minimal effort.
Dev vlog 8 - I made some changes to the assistant section so that the questions asked by agent is more conscience and more interactive. Where the user can just tap on the screen and not type.
Dev vlog 9 - Hi and thank you to everyone who voted for my project and all the tips you’ve given me. I have a few challenges I’m tackling at the moment: 1. Google sign it, it works with then mobile version (if I test with an APK) but not on web like in the demo. 2. The ID verification, it needs to be able to authenticate yours profiles which seems so complex. 3. The UI and making animations, I dont have much time as I have my A-level exams soon.
Dev vlog 10 - Hi there I’ve been finalising the setup of the workers ID verification. I ran into some problems but I found this site that allows ID verification (can use passports, drivers licenses) for free for your first 500 verification every month, essentially meaning that if you stay below 500 verifications per month its completely free. Its called Didit. After setting up I’ll go on tosetting up analytics to track onboarding and activity of users.
Dev vlog 11 - I’m building the a better workflow in Figma and iy was been taking quite a long time to implement and I want to change some of the things I’ve build. I also want to make the UI animations in Figma instead of Lottie because I know how to use Figma more and you can add an extension to export your work as .lottie files (a type of file that allows your animation to run on your app without taking much storage).
Dev post 12 - I added back the google sign in and polished up the rest of the verification setup.
Dev vlog 13 - I caught a bug which was actually quite critical. When the user would delete their account, their information would not get deleted, so if they made an account with same old email all the past information would still be there.
Dev post 14 - Hi everyone I spent the whole day polishing up Kazi, fixing bugs, and just improving the overall experience. Now im going to add more features I’m planning on adding a paywall to start making some income from this, and im now brainstorming the features I should add.
Dev post 15 - Hey everyone, I spent the day improving the web experience for testers and you guys :). Im still having troubles with the google sign in but ill try and address it tomorrow. My favourite thing i did was limiting the web screen so that it gives more of that app feel.
Dev vlog 16 - After adding the Didit verification the SQL database was not syncing, a had to make 2 separate databses to make it work, now im able to make an account again.
Dev vlog 17 - Hi I made good progress with the UI, I started with the splash screen and I’m working my way from there, the animation was a bit glitchy and i fexed the issue. Additionally, the letters were not lined up which was quite a task to do, i though it would be easier but when importing the animation it would keep changing it so I had to make tha letters separate to the animation. I used Mobbin to get references and I saw most we’re too flashy so i made mine simple but enjoyable. Next I’ll be working on the user onboardeing, im currently preparing a lot of assets as I want it to be interactive and unique.
Dev vlog 18 - I’ve been making some assets to use for the UI and testing the app to find more areas I’d like to add more features and animations.
Dev vlog 19 - I added a pay wall on the worker account that limits theamount of jobs a worker can recieve and and the features they have. It costs $3.00 (I converted it) which is a small amount for the workers, I dont want it to be too high as in Namibia subscriptions is not something people are willing to pay. Especially low wage workers and unemployed people
Dev vlog 20 - Today I made the workers job screen more interactable and customizable. I’m going through day by day to improve each screen’s UI. I’m honestly quite happy with how the app is coming up even though I’ve only done 2 screens im slowly getting to a completed version 1.
Dev vlog 21 - I didnt like the first iteration of the subsriptions screen so I made it more personalised to the specific industry im targeting. I changed words like “Pro plan” to “Artisan plan” and “Free plan” to “Apprentice plan”. The reason there is some what space is because I’ll be adding some assets what I’m still designing in procreate and Lottie.
Ships:
What I made: Kazi connects skilled trade workers with customers who need their services, making the process faster and easier. Workers are electricians, plumbers, builders, welders, mechanics, and other professionals who create profiles, showcase their skills, and find relevant jobs. Customers can use Kazi to discover skilled workers, view their profiles, and find the right person for the work they need. The challenges I faced: The challenges I faced were setting up the Google API to allow for Google sign-up and making sure the frontend and backend were communicating. Additionally, making a polished, well-thought-out app with minimal bugs was another challenge. Things I accomplished that I am proud of: Before starting this challenge, using the terminal felt like a foreign language and I didn’t know why the backend and frontend had to be separate. Now I can confidently say that the terminal is my best friend, and I don’t need to watch YouTube tutorials on the difference between an API and an SDK. Things to know: On the demo the google sign in does not work only on emulators it does. Taking photos and contact via phone is not supported on the demo as well. Using th README file has a lot of additional tips. If you create an account even if you close the file will be saved in the database and you can log in, if you have trouble deleting the account you made email me the email you used and ill do it manually....
|
1792878526.8970366
|
1793742526.8970366
|
|
10275
|
4x1 osu mania pad by @gumarky | Stardance
|
gumarky
|
0
|
0.26
|
0
|
[]
|
[{"post_id": 6559, "ts": "2026 [{"post_id": 6559, "ts": "2026-06-11T00:44:31Z", "hours": 0.2594, "text": "schematic"}]...
|
Title: 4x1 osu mania pad by @gumarky | Stardance
Title: 4x1 osu mania pad by @gumarky | Stardance
Devlogs:
schematic...
|
1793357381.4506867
|
1793962181.4506867
|
|
32216
|
My very own WebOS by @yayabskt | Stardance
|
yayabskt
|
2
|
34.08
|
10
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-12T12:39:38Z", "hours": 1.0, "multiplier": 10.26, "payout": 10, "blessing": "neutral", "text": "i’ve make my first ever OS i never touch js in my life apart to make a little game for my friend! so it was a brand new journey💫 i only use ia to explain me some thing about js (like a teacher), I’VE MAKE ALL THE SITE (yippie 💫) i’m quite proud for this achivement moreover the music app is like my baby I LOVE IT!! With the setting to loop or the menu i find it so great.. but i know i still have a lot to learn! ! (“GO BEYOND PLUS ULTRA”💫✨ the little quote in the top bar is an “my hero acadamy” ref, it’s like outpass your limit keep learning and become stronger!💪) the OS is made in a cyberpunk theme as i love the serie! and even if i don’t have the hardware to play i watch a lot of gameplay of the game! i will try add thing like in the game for the future (map or mini game). i’m also proud because i learn how to use git hub desktop and git hub pages (i don’t know everything BUT i know my way around👀) it will be use full for all my future project! this os is for me the start of a journey because before the only thing i do is unity and coding an esp32. i hope you will listen to the playlist (even if it’s no copyright music so not the best of this world i agree ) and if you know some no copyright music give me some! ✨ to recap: this os as a welcome page a fake note app a music app a cyberpunk look! and a big potnetial that can be held by advice⋆˚꩜。 p.s : i really want to make something people find a way to use so if you have app recommandation or anything i love to learn by other advices and improve, i would love to have the level to understand backend and api so i would make great app but unfortunatly i try to use these, it was a big fail 😭 ദ്ദി ༎ຶ‿༎ຶ )", "repo": "https://github.com/ysxaybarroso-ux/yaya-os", "demo": "https://ysxaybarroso-ux.github.io/yaya-os/static/html/index.html"}, {"ship_num": 2, "ts": "2026-07-12T01:26:25Z", "hours": 24.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i’ve make my first ever OS i never touch js in my life apart to make a little game for my friend! so it was a brand new journey💫 i only use ia to explain me some thing about js (like a teacher), I'VE MAKE ALL THE SITE (yippie 💫) i’m quite proud for this achivement moreover the music app is like my baby I LOVE IT!! With the setting to loop or the menu i find it so great.. but i know i still have a lot to learn! ! (\"GO BEYOND PLUS ULTRA\"💫✨ the little quote in the top bar is an \"my hero acadamy\" ref, it's like outpass your limit keep learning and become stronger!💪) the OS is made in a cyberpunk theme as i love the serie! and even if i don’t have the hardware to play i watch a lot of gameplay of the game! i will try add thing like in the game for the future (map or mini game). i'm also proud because i learn how to use git hub desktop and git hub pages (i don't know everything BUT i know my way around👀) it will be use full for all my future project! this os is for me the start of a journey because before the only thing i do is unity and coding an esp32. i hope you will listen to the playlist (even if it's no copyright music so not the best of this world i agree ) and if you know some no copyright music give me some! ✨ to recap: - this os as a welcome page - a fake not app - a music app - a cyberpunk look! - and a big potnetial that can be held by advice⋆˚꩜。 p.s : i really want to make something people find a way to use so if you have app recommandation or anything i love to learn by other advices and improve, i would love to have the level to understand backend and api so i would make great app but unfortunatly i try to use these, it was a big fail 😭 ദ്ദി ༎ຶ‿༎ຶ )", "repo": "https://github.com/ysxaybarroso-ux/yaya-os", "demo": "https://ysxaybarroso-ux.github.io/yaya-os/static/html/index.html"}]...
|
[{"post_id": 65599, "ts": "202 [{"post_id": 65599, "ts": "2026-09-10T20:46:00Z", "hours": 5.0192, "text": "heyyy it’s been a whileeeee recently i’m quite busy but i’m here to log old hour and so what i have done for thee 5h i start the animation at the start and got some strughlle and then i also try to fix the message app but it still in progress so not big thing only fixing debuging but the web site is on the old version till i finish this one !! have a good dayyy and enjoyyy lifee see you next timeee!!!"}, {"post_id": 27687, "ts": "2026-07-13T14:01:07Z", "hours": 4.0569, "text": "my top new OS DEV LOG #12 Hello this might been a while hehe i have work and 2thing in my os : first of all i implemented the famous localStorage for the note app and make it look a way more stilized. I also implemanted 2 new button -delete note - edit note these make the experience better and make it usable in every day life (yippie) for this a just use the splice(i(index of the thing that will be change ), 1(only this note, newNote(the new content) method if you edit. And push if you had a new one note ––––––––––––––––––––––––––then i’ve work on the message app i make my account on fire base and set un my program with fire code (i use claude to help me understand how to set up) then i’ve made the page look like cyberpunk in game messagerie! and i prepare the account button so like i said i’m starting implementing a auth parameter i still wondering if i would make one for the whole page or one only for the message (as if i make one for the whole page i’m free to implement new app with auth and without remaking the aut thing then i hope you will love experience and play the moon or jazz playlist in the musics app! ;)"}, {"post_id": 27131, "ts": "2026-07-12T12:38:00Z", "hours": 0.5167, "text": "i’m making the note editable and deletable heheh"}, {"post_id": 26968, "ts": "2026-07-12T02:10:24Z", "hours": 0.4844, "text": "DEV LOG #11 i don’t why i have to post because the program don’t understand that i’ve made dev log before trying to ship btw i’m starting the note app i’m using localestorage"}, {"post_id": 26936, "ts": "2026-07-12T00:47:44Z", "hours": 2.0942, "text": "DEV LOG#10 i’ve fix the setting menus and the loop music (also the playlist system in fact after the music it wasn’t reading the rest of the playlist … i forgot ) now everything is okay"}, {"post_id": 26845, "ts": "2026-07-11T21:22:13Z", "hours": 1.6344, "text": "DEV LOG #09 i’ve finally finish the music app yeahhhhhh iif you propose no copyright song i will add them / the next step is an work not app ( and if i succes learning how to do a realchat app and MAYBE…NOT SURE a map app or a mini game I LOVE MAKE GAMES IN MY PROJECTS!!!) i finaly understand a bit git hub to post the demo and ect HOOOO NOO I FORGOT i have to make the repeat button and the parameter working TT THIS IS THE NEXT STEP!!!"}, {"post_id": 26336, "ts": "2026-07-11T02:08:14Z", "hours": 4.1733, "text": "DEV LOG#08 i’m trying to improve the look with “border-image” i’m also reaching the final version on my music app only a view look to set (i will add music no copyright if you give me some ideas)"}, {"post_id": 25644, "ts": "2026-07-10T01:43:21Z", "hours": 4.0392, "text": "DEV LOG#07 i’m making a radio app with playlist!!! i also change the header (it was time) and i’m step by step changing some little details in the look that is only decorative but in found it quite use full for my radio app i prepare the playlist un js next step it’s to make the ap look with and then i will add some little nois lique changing the radio make a little scratch or mouseover some element it wil make a little clic like some cyberpunk sound un the menu"}, {"post_id": 25024, "ts": "2026-07-08T23:13:03Z", "hours": 3.2472, "text": "DEV LOG #06 i’m making the note app i will try to make it editable for user like a real one but now i’m very tired the tuto was hard to follow"}, {"post_id": 24852, "ts": "2026-07-08T18:09:26Z", "hours": 2.3606, "text": "DEV LOG #05 i’ve finally make my first window closing and openning up with a change of color for some text"}, {"post_id": 24765, "ts": "2026-07-08T15:32:08Z", "hours": 2.7617, "text": "DEV LOG #04 in making the outside window and i finally make the vs code ide look (quite messy i have a trouble doing it) i have a animted background theme cyberpunk"}, {"post_id": 24634, "ts": "2026-07-08T11:06:04Z", "hours": 1.6814, "text": "DEV LOG#03 i’m trying to make the vs code ide looks"}, {"post_id": 24402, "ts": "2026-07-07T22:45:06Z", "hours": 0.8692, "text": "DEV LOG#02 i’m trying to make it loo like code in vs code"}, {"post_id": 24295, "ts": "2026-07-07T19:30:32Z", "hours": 0.9594, "text": "DEV LOG #01 styling and following the tuto TT (i already know a lot about css and js but it’s a great time to review my knowledge)"}]...
|
Title: My very own WebOS by @yayabskt | Stardance
Title: My very own WebOS by @yayabskt | Stardance
Devlogs:
DEV LOG #01 styling and following the tuto TT (i already know a lot about css and js but it’s a great time to review my knowledge)
DEV LOG#02 i’m trying to make it loo like code in vs code
DEV LOG#03 i’m trying to make the vs code ide looks
DEV LOG #04 in making the outside window and i finally make the vs code ide look (quite messy i have a trouble doing it) i have a animted background theme cyberpunk
DEV LOG #05 i’ve finally make my first window closing and openning up with a change of color for some text
DEV LOG #06 i’m making the note app i will try to make it editable for user like a real one but now i’m very tired the tuto was hard to follow
DEV LOG#07 i’m making a radio app with playlist!!! i also change the header (it was time) and i’m step by step changing some little details in the look that is only decorative but in found it quite use full for my radio app i prepare the playlist un js next step it’s to make the ap look with and then i will add some little nois lique changing the radio make a little scratch or mouseover some element it wil make a little clic like some cyberpunk sound un the menu
DEV LOG#08 i’m trying to improve the look with “border-image” i’m also reaching the final version on my music app only a view look to set (i will add music no copyright if you give me some ideas)
DEV LOG #09 i’ve finally finish the music app yeahhhhhh iif you propose no copyright song i will add them / the next step is an work not app ( and if i succes learning how to do a realchat app and MAYBE…NOT SURE a map app or a mini game I LOVE MAKE GAMES IN MY PROJECTS!!!) i finaly understand a bit git hub to post the demo and ect HOOOO NOO I FORGOT i have to make the repeat button and the parameter working TT THIS IS THE NEXT STEP!!!
DEV LOG#10 i’ve fix the setting menus and the loop music (also the playlist system in fact after the music it wasn’t reading the rest of the playlist … i forgot ) now everything is okay
DEV LOG #11 i don’t why i have to post because the program don’t understand that i’ve made dev log before trying to ship btw i’m starting the note app i’m using localestorage
i’m making the note editable and deletable heheh
my top new OS DEV LOG #12 Hello this might been a while hehe i have work and 2thing in my os : first of all i implemented the famous localStorage for the note app and make it look a way more stilized. I also implemanted 2 new button -delete note - edit note these make the experience better and make it usable in every day life (yippie) for this a just use the splice(i(index of the thing that will be change ), 1(only this note, newNote(the new content) method if you edit. And push if you had a new one note ––––––––––––––––––––––––––then i’ve work on the message app i make my account on fire base and set un my program with fire code (i use claude to help me understand how to set up) then i’ve made the page look like cyberpunk in game messagerie! and i prepare the account button so like i said i’m starting implementing a auth parameter i still wondering if i would make one for the whole page or one only for the message (as if i make one for the whole page i’m free to implement new app with auth and without remaking the aut thing then i hope you will love experience and play the moon or jazz playlist in the musics app! ;)
heyyy it’s been a whileeeee recently i’m quite busy but i’m here to log old hour and so what i have done for thee 5h i start the animation at the start and got some strughlle and then i also try to fix the message app but it still in progress so not big thing only fixing debuging but the web site is on the old version till i finish this one !! have a good dayyy and enjoyyy lifee see you next timeee!!!
Ships:
i’ve make my first ever OS i never touch js in my life apart to make a little game for my friend! so it was a brand new journey💫 i only use ia to explain me some thing about js (like a teacher), I'VE MAKE ALL THE SITE (yippie 💫) i’m quite proud for this achivement moreover the music app is like my baby I LOVE IT!! With the setting to loop or the menu i find it so great.. but i know i still have a lot to learn! ! ("GO BEYOND PLUS ULTRA"💫✨ the little quote in the top bar is an "my hero acadamy" ref, it's like outpass your limit keep learning and become stronger!💪) the OS is made in a cyberpunk theme as i love the serie! and even if i don’t have the hardware to play i watch a lot of gameplay of the game! i will try add thing like in the game for the future (map or mini game). i'm also proud because i learn how to use git hub desktop and git hub pages (i don't know everything BUT i know my way around👀) it will be use full for all my future project! this os is for me the start of a journey because before the only thing i do is unity and coding an esp32. i hope you will listen to the playlist (even if it's no copyright music so not the best of this world i agree ) and if you know some no copyright music give me some! ✨ to recap: - this os as a welcome page - a fake not app - a music app - a cyberpunk look! - and a big potnetial that can be held by advice⋆˚꩜。 p.s : i really want to make something people find a way to use so if you have app recommandation or anything i love to learn by other advices and improve, i would love to have the level to understand backend and api so i would make great app but unfortunatly i try to use these, it was a big fail 😭 ദ്ദി ༎ຶ‿༎ຶ )
i’ve make my first ever OS i never touch js in my life apart to make a little game for my friend! so it was a brand new journey💫 i only use ia to explain me some thing about js (like a teacher), I’VE MAKE ALL THE SITE (yippie 💫) i’m quite proud for this achivement moreover the music app is like my baby I LOVE IT!! With the setting to loop or the menu i find it so great.. but i know i still have a lot to learn! ! (“GO BEYOND PLUS ULTRA”💫✨ the little quote in the top bar is an “my hero acadamy” ref, it’s like outpass your limit keep learning and become stronger!💪) the OS is made in a cyberpunk theme as i love the serie! and even if i don’t have the hardware to play i watch a lot of gameplay of the game! i will try add thing like in the game for the future (map or mini game). i’m also proud because i learn how to use git hub desktop and git hub pages (i don’t know everything BUT i know my way around👀) it will be use full for all my future project! this os is for me the start of a journey because before the only thing i do is unity and coding an esp32. i hope you will listen to the playlist (even if it’s no copyright music so not the best of this world i agree ) and if you know some no copyright music give me some! ✨ to recap: this os as a welcome page a fake note app a music app a cyberpunk look! and a big potnetial that can be held by advice⋆˚꩜。 p.s : i really want to make something people find a way to use so if you have app recommandation or anything i love to learn by other advices and improve, i would love to have the level to understand backend and api so i would make great app but unfortunatly i try to use these, it was a big fail 😭 ദ്ദി ༎ຶ‿༎ຶ )...
|
1793329160.3791938
|
1793415560.3791938
|
|
4817
|
MMPad by @Mapplect | Stardance
|
Mapplect
|
0
|
15.88
|
0
|
[]
|
[{"post_id": 6560, "ts": "2026 [{"post_id": 6560, "ts": "2026-06-11T00:46:25Z", "hours": 2.4972, "text": "4th and last devlog! The Work So Far! Everything is done! I’ve (finally) made the USB cutout so I can actually connect my XIAO. Didn’t make any changes to the design because I couldn’t come up with anything else but I’m happy with everything (especially since this was my first time making a macropad). I hope to make more advanced stuff in the next couple of days/weeks!"}, {"post_id": 5350, "ts": "2026-06-09T02:49:52Z", "hours": 8.0725, "text": "3rd devlog! The Work So Far: The past 8 hours have been used to finally lean towards the Jolteon theme. Still not done, but I’m happy with my design so far. Only recently did I realized I need to fix my entire PCB because i changed my design (altered location of rotary encoder), so I spent the past 3 hours fixing that and everything should (finally) be good. That’s about it, going to try and truly finalize things tomorrow."}, {"post_id": 2741, "ts": "2026-06-05T14:43:53Z", "hours": 4.4089, "text": "2nd devlog! The Work So Far: The base of my macropad (case + plate) has been established. I’ve scaled the entire thing up (which came with its own issues that have been fixed) because it felt a little small to me. Still looks very bland but I’ve got some ideas to spice things up. I want to etch designs into the case/plate but I’ve got no idea how to do that (yet). I also decided on a theme for it: Pokemon (specifically Jolteon because its one of my favorite ones). In the next couple hours, I’ll focus on adding details to make the macropad something I’m truly proud of."}, {"post_id": 2271, "ts": "2026-06-04T17:45:08Z", "hours": 0.8964, "text": "This is my first ever devlog! I’ve been very interested in making a project for HackClub for months, but life has stopped me from doing so up until now. The Work So Far: I’ve created the schematic and the PCB so far, and I am currently working on the actual design for my macropad. I have never used these applications before (KiCad, Fusion, QMK) so its been a very interesting experience. However, I have enjoyed every step of the way so far. I hope to keep learning and eventually move to more complex projects in the next couple weeks."}]...
|
Title: MMPad by @Mapplect | Stardance
Devlogs:
Th Title: MMPad by @Mapplect | Stardance
Devlogs:
This is my first ever devlog! I’ve been very interested in making a project for HackClub for months, but life has stopped me from doing so up until now. The Work So Far: I’ve created the schematic and the PCB so far, and I am currently working on the actual design for my macropad. I have never used these applications before (KiCad, Fusion, QMK) so its been a very interesting experience. However, I have enjoyed every step of the way so far. I hope to keep learning and eventually move to more complex projects in the next couple weeks.
2nd devlog! The Work So Far: The base of my macropad (case + plate) has been established. I’ve scaled the entire thing up (which came with its own issues that have been fixed) because it felt a little small to me. Still looks very bland but I’ve got some ideas to spice things up. I want to etch designs into the case/plate but I’ve got no idea how to do that (yet). I also decided on a theme for it: Pokemon (specifically Jolteon because its one of my favorite ones). In the next couple hours, I’ll focus on adding details to make the macropad something I’m truly proud of.
3rd devlog! The Work So Far: The past 8 hours have been used to finally lean towards the Jolteon theme. Still not done, but I’m happy with my design so far. Only recently did I realized I need to fix my entire PCB because i changed my design (altered location of rotary encoder), so I spent the past 3 hours fixing that and everything should (finally) be good. That’s about it, going to try and truly finalize things tomorrow.
4th and last devlog! The Work So Far! Everything is done! I’ve (finally) made the USB cutout so I can actually connect my XIAO. Didn’t make any changes to the design because I couldn’t come up with anything else but I’m happy with everything (especially since this was my first time making a macropad). I hope to make more advanced stuff in the next couple of days/weeks!...
|
1793285535.3980205
|
1793890335.3980205
|
|
58504
|
Study app by @Jay-can-code | Stardance
|
Jay-can-code
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-10T20:49:18Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made something that I felt would personally help me and those like me, being people with ADHD, keep track of school things! It was hard to make its dynamic graphics, but im satisfied with how things turned out!", "repo": "https://github.com/Jay-at-GSMST/Organize", "demo": "https://jay-at-gsmst.github.io/Organize/"}]...
|
[{"post_id": 65601, "ts": "202 [{"post_id": 65601, "ts": "2026-09-10T20:47:40Z", "hours": 0.4436, "text": "Made a page for tracking budget for school related things"}, {"post_id": 65564, "ts": "2026-09-10T19:45:28Z", "hours": 1.3736, "text": "I’ve made it so that theres a checklist and a progress wheel for assignments, and something to upload notes on. Next thing im gonna do is a folder system to categorize it, and then flesh out the other pages!"}, {"post_id": 63971, "ts": "2026-09-08T02:05:00Z", "hours": 0.8844, "text": "Just made a rough draft for the home page! It’ll have tabs to the other pages on the left, a place for you to type general notes in the bottom, it’ll show your to-do list in the middle with a progress bar on the right!"}]...
|
Title: Study app by @Jay-can-code | Stardance
Dev Title: Study app by @Jay-can-code | Stardance
Devlogs:
Just made a rough draft for the home page! It’ll have tabs to the other pages on the left, a place for you to type general notes in the bottom, it’ll show your to-do list in the middle with a progress bar on the right!
I’ve made it so that theres a checklist and a progress wheel for assignments, and something to upload notes on. Next thing im gonna do is a folder system to categorize it, and then flesh out the other pages!
Made a page for tracking budget for school related things
Ships:
I made something that I felt would personally help me and those like me, being people with ADHD, keep track of school things! It was hard to make its dynamic graphics, but im satisfied with how things turned out!...
|
1793468981.645959
|
1793555381.645959
|
|
15818
|
PSim - Particle Simulator by @etaiami09-cmd | Star PSim - Particle Simulator by @etaiami09-cmd | Stardance...
|
etaiami09-cmd
|
1
|
64.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-10T21:25:14Z", "hours": 64.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "PSimUltimate Is Ready! I made a particle simulator desktop application in C++ with heavy extension support. Overview PSimUltimate models real physics, but also allows you to inject your own behavior. Using a simple development API that even someone with no C++ experience can understand, you can create, compile and load your own custom modules to the simulator and watch the behavior you’ve coded in action. PSim even ships with 2 of these modules built into the binary, and 3 more modules that you can load dynamically. PSimUltimate also comes with a very simple UI, one that anyone could be comfortable with within minutes. How it works PSimUltimate has documentation for creating your own modules, and compiling them is very simple with a few commands. You can then load the modules, and PSim knows how to run your module and follow its physics. PSimUltimate is written in modern C++, using Raylib and Dear ImGui to provide a clean UI and good support in multiple platforms. While it only ships a Windows binary, you can easily follow the instructions in README.md to compile in other platforms. How to try it You can download the PSimUltimate installation wizard in this page . For more instructions and information, including information on support for other platforms, check out README.md in the source code. Challenges I’ve faced This project took a lot of effort to complete. It is the largest single solo project I have worked on since I started programming, and it included a lot of technical software design and infrastructure that I had to familiarize myself with, like dynamic libraries and using and altering 3rd party libraries (I altered portable file dialogs and Dear ImGui to suit my needs). I also had to deal with moving to a new computer, and then when that computer broke down due to a faulty motherboard, I had to move back to my old computer. I also started a full-time internship at a tech company. All that, coupled with some massive life changes, made it much harder to work on this project. But I enjoyed making it nonetheless, and I’m proud to show off what I’ve created.", "repo": "https://github.com/etaiami09-cmd/PSimUltimate", "demo": "https://github.com/etaiami09-cmd/PSimUltimate/releases/tag/v1.0"}]...
|
[{"post_id": 65606, "ts": "202 [{"post_id": 65606, "ts": "2026-09-10T20:55:45Z", "hours": 7.9922, "text": "Devlog #13 - Time To Ship! PSimUltimate is finally ready to ship. I have put a lot of effort into this project, and I feel genuinely proud of my what I have achieved. While working on this project I have gotten a new computer, lost that computer due to a faulty motherboard, got an internship at a tech company, and started working there full time. Suffice to say, I haven’t had much time to work on PSim in the last month. But I did. I spent time polishing what I have already created and now I feel content with my product. What I’ve done since the last devlog PSimUltimate now has a logo, designed by me. I have also run PSim on WSL and fixed various issues that only appeared on Linux. There is now a way to use your mouse to set the next particle’s position There is now a menu for editing particle data - you can delete a particle and change its position, velocity, mass, etc. PSim is now ready for release. I’m happy and proud to present it and show what I’ve done, and I hope other people receive it well. Thank you all for your support!"}, {"post_id": 48457, "ts": "2026-08-16T20:12:07Z", "hours": 4.1594, "text": "Half Devlog - Short Update: Sorry for not posting for a while. My computer broke and I’m waiting for the repair. Hopefully I’ll be back next week! Thank you for your patience."}, {"post_id": 32968, "ts": "2026-07-22T13:52:27Z", "hours": 8.5469, "text": "Devlog #12 - Solid, Boring Progress I’ve spent the last few days making regular feature updates to PSim. Here are the highlights: 1. Unload Modules Until now, if a user loaded a module and didn’t want it anymore, he would have to reopen the app. Additionally, there was no way to unload the built-in modules. I added an options tooltip in the module order GUI that allows the user to unload a module and everything it has registered. 2. Confirm Action Menu If a user is about to do an action which might lead to loss of data (close the window, override a save file), we want to confirm they know about the potential consequences and accept it. For this, I created an interface for creating a blocking modal that forces the user to either confirm an action or cancel it. 3. Graphics Handlers Behavior Improved The default should obviously be for graphics callbacks to have what they draw to the screen be projected into the actual intended buffer - that is, not anywhere in the top menu bar or the left-hand control panel. This is also already where particles are drawn, so a particle at 0, 0 is drawn in the top-left corner where the top menu bar and control panel intersect. This math had to be applied to every single thing drawn by a graphics callback, and I decided to fix it by calling graphics callbacks while in a raylib 2D mode that offsets everything so that 0, 0 is where a particle at 0,0 is drawn. 4. DPI Scaling I switched to a new laptop this week, and went from a 14 Inch 1080p screen to a 14 Inch 1440p screen. Suddenly, the menu became much smaller, because the program was drawing by pixel instead of by the system’s default scaling (which, on my new laptop, is 200%). I fixed this by making Raylib scale everything by the user’s system DPI. 5. Module Internal Serialization If a module has any internal state that should be preserved when a save file is written, it can now register a callback that returns a std::string and a callback that accepts one, and those can be used to serialize and deserialize its internal state. 6. Extended Module API Documentation I’ve now written documentation for everything but the feature discussed in point 5. 7. New Particle Target I’ve added a cross target placed in the position where a new particle would be placed according to the Position buffer, to ease on visualizing the new particle. This cross is customizeable in the settings menu and you can change width, length and color."}, {"post_id": 27577, "ts": "2026-07-13T09:02:19Z", "hours": 5.8525, "text": "Devlog #11 - Adding A Settings Page, A Config System, And More Module API Yesterday I wrote about my commitment to making PSim an actual, usable desktop application that doesn’t feel limiting to the user. What I did yesterday was create an error notification system, so if something goes wrong the user can understand why and code has a standard philosophy to handle issues. Today, I put my focus on improving the user experience by adding a settings page to PSim. The Layout Personally, when I think of a settings page in a desktop application, I usually imagine a blocking pop-up (as in, a subwindow inside the application window that while opened, does not let you touch anything outside of it) with a few tabs for different categories of settings. ImGui actually has great support for this, with OpenPopup to create one. the smaller, left-side portion of the settings page is a tab-selection area, and the right-side portion is the tab which is selected. There are 4 tabs: General Simulation Modules - modules can register custom settings About - basically just the full text of the MIT License + a link to the project’s GitHub page The Config System Personally, when I change a setting on a desktop application, I generally expect that change to still be in effect when I close and reopen it. To do this, PSim needs to get to the target platform’s app data folder, create a folder for itself if one doesn’t already exist, and then save whatever information it needs there. Now, this is obviously annoying to have to re-write every time you want to save something as simple as what FPS the user wants, so I wrote a template system to save and access binary settings files on the fly. I now had a way to make it so arbitrary settings stay the same every time I open the app. Now, I need to make it so modules have the same privilege. I created 3 new functions in the module API, writeConfig , readConfig , and registerSwitch . Each of these does as the name implies, and it allows you to add on-off switches (support for more will come later) and read/write configs to disk. Conclusion It may have taken 6 hours of work, but I managed to create a fully-functional settings UI with module support to my first desktop application. This is an important piece of architechture and makes it much easier to add more features in the future and expand the app into something I can be very proud of. Thank you very much for reading! Please enjoy this proof-of-concept video of me changing settings and reopening the app."}, {"post_id": 27058, "ts": "2026-07-12T08:08:01Z", "hours": 3.7278, "text": "Devlog #10 - Don’t Hate The User One of the most important unwritten (though I’m sure it is written somewhere) rules of writing good software is responsible error handling. I’m writing a desktop application, and personally, when I’m using a desktop application, I don’t like it when it suddenly crashes with no useful error message. This is especially possible in a desktop application written in C++, where irresponsible coding practices can lead to segfaults and other crashes without so much as a Java-style “NullPointerException”. It would be incredibly frustrating for the user to lose progress and not even know why. Another potentially frustrutaing situation is when the program fails silently. It doesn’t quite crash, but when you ask a program to do something and it just doesn’t do it, that can be frustrating. When a program can’t satisfy an action the user wants it to make, it should make it as clear as possible that it’s aware of its failure, and attempt to clarify what went wrong. What I’ve Been Doing Until Now Up until now I have handled runtime errors by… well… not handling them. I wrote my application under the assumption that everything works smoothly, every module loaded by the user exports the correct signature, every file opened by the user is well-formed, and every file the user wants to write to has the necessary permissions. If any of this went wrong, the program entered undefined behavior. Most likely, it will crash. My Solution Whenever the user requests an action by the program, for example, trying to open a saved simulation state JSON, the program goes through the following steps: Make sure the file is actually opened Make sure the file is correctly-formed JSON syntax Make sure the actual data in the file aligns with PSimUltimate’s requirements and constraints Actually deserialize the file If any of these goes wrong, the deserialization process immidiately ends and an error notification is pushed to the bottom-right corner of the screen. If multiple things are wrong about the data in the file, only the first thing in the deserialization order is written. There can be up to 3 error notifications displayed at once, with any more notifications being queued for when those are closed by the user . This solves the issue of responsible, user-friendly error handling, and is an important piece of infrastructure for a usable desktop application."}, {"post_id": 25930, "ts": "2026-07-10T13:04:03Z", "hours": 1.7719, "text": "Devlog #9 - Expanding The Module Developer API Before I begin this devlog, I would like to apologize for being inactive over the past week. I have had quite a busy week, and I did not have much of an opportunity to work on PSimUltimate unfortunately. What I Have Been Working On I’ve been putting more attention to the module API, modules are the most important part of PSim, and their API should be more advanced than the very basic one that currently exists. I’ve split the API into 5 different sections: Physics Behavior - callbacks into force, velocity, and positions of particles User Input - adding new keyboard shortcuts, reading mouse positions, reading which keys are being pressed Graphical Behavior - being able to draw stuff on the screen GUI - adding buttons, settings pages, descriptions, and more for specific modules. Other Modules - modules should be able to register dependencies and force certain modules to be either lower or higher than them on the callback order. I have been hard at work (when I can) on designing and implementing these needs. So far I have made some progress, but there is still much to do and research, and I’m sorry it’s not so juicy for a week’s worth of progress. Either way, thank you for reading, attached is an example of custom buttons that can be registered by modules in the top bar, and please keep following the project for more updates."}, {"post_id": 19922, "ts": "2026-07-01T11:10:57Z", "hours": 3.965, "text": "Devlog #8 - I Need Your Help This devlog is not so focused on what I’ve been doing since the last one, but what I have been doing is pretty cool, so I’ll go over it: PSim uses Dear ImGui as the backend for its GUI. Up until now, the font size in the GUI has been way too small (13px) and the GUI sidebar could not be resized in any way. I had to make it so resizing is possible and the font is more readable, because I want the app to be properly useable. The first thing I did switch fonts from Dear ImGui’s default non-scalable font to Dear ImGui’s default scalable version, ProggyForever. This took a few minutes but the big challenge was getting resizing to do exactly what I wanted. Despite Dear ImGui usually having exactly the correct amount of features, there is no option to make resizing only possible from one side or disable the completely free bottom-right resize grip. I had to go directly into Dear ImGui’s source code and manually disable those things myself, which was a first for me. What I Need Help With Right now whenever I try to do anything I realize that I don’t actually have a good feel for what’s missing and what needs improvement. If anyone reading this could spare some time of their day to install my application and play around with it, maybe write a module. I have added proper documentation for modules to make the whole process much easier, so hopefully someone will be able to help me find issues and missing features. You can get the release on GitHub . Thank you for reading and thank you for helping out!"}, {"post_id": 17653, "ts": "2026-06-28T15:14:57Z", "hours": 1.375, "text": "Devlog #7 - Steady Progress Is Not Interesting Sorry for the low logged time, I’ve actually been working for several hours but I forgot to install wakatime after switching to CLion. What I’ve Been Working On One of the most important things when working with multiple modules that work on a callback-based system is the ability to reorder modules so some callbacks get called before others. Imagine this: You have a module foo which clamps all particles to the window border so they can never escape the boundaries of the window. You also have module bar which increments the X position of each particle by 3, each frame. Say foo gets registered after bar , particles will get clamped to the border AND THEN move 3 pixels, breaking the behavior both module authors likely intended. The Solution Create a GUI which allows the user to reorder modules by, so a module placed after another module gets called last. Implementation Challenges I had to learn how std::list works (a linked list was the obvious choice for this use case), and let me tell you, it is by far one of the worst STL containers I’ve had to work with, and anyone who writes C++ code knows that MEANS somethimg. Conclusion Again, not much to write about today, but steady progress just isn’t all that interesting. Thanks for reading!"}, {"post_id": 14586, "ts": "2026-06-23T19:08:32Z", "hours": 1.7331, "text": "Mini Devlog - How Writing Unit Tests Made Me Fight C++ For An Hour Whenever I spend some time fighting with C++ instead of actually being productive, I feel like I at least need to get a devlog out of it, so here goes. Background I’ve been writing unit tests for my particle simulator, and one thing I’ve noticed is that I have no code to protect global state when a single module is registered more than once, which leads to weird and unintended behavior. My solution is lazy: silent failure. If a module already exists when addModule(const std::string& name) is called through the module interface function registerModule(const std::string& name) (You can read about why these are separated in an earlier blog post, it’s very cool!), the function just doesn’t register it again. Simple enough, but I wanted to implement it in “correct” C++. The Implementation (Where Things Went Wrong) What I did was create a function in module.cpp with internal linkage called getModuleByName which returns a std::optional<Module&> . Well, apparently for the C++ standard that amounts to heresy, since up until C++26 the committee never managed to agree on how to handle std::optional s that contain references. Well, I thought, I am already compiling with -std=c++26 in my project, so this should work. But it didn’t. I needed an updated libc++ implementation, which I managed to get through MinGW. I spent 30 more minutes fighting with CMake as it insisted to link against MSVC’s headers, but eventually I did manage to get it to compile. A normal programmer would have just used std::optional<Module*> but I am definitely not normal. Was it worth it? probably not. Especially when it’s all for a function which only has internal linkage and is only used in one place. But I like to think that writing code I’m comfortable with will help maintain the codebase in the future."}, {"post_id": 14286, "ts": "2026-06-23T10:40:41Z", "hours": 2.7964, "text": "Devlog #6 - Adding Testing To My Particle Simulator I’ve been working on adding unit testing to my project. It was important for me to add unit tests for several reasons: I have never written unit tests in C++, so it’s a good learning experience I genuinely want this project to end up as a polished desktop application, and that’s not really possible without following best practices. Tests are important. Parts of my application are already extremely vulnerable to bugs It’s easier to catch bugs through unit tests than through actual use of the application Catch2 as the framework I chose Catch2 as my framework because it seemed easy to work with and not too verbose. Current sensitive parts of the application Position , Velocity , and Force are all independent wrappers around Vec2<float> . It is extremely important to me that these have proper arithmetic, but are not implicitly convertible, since that is almost definitely not intended behavior. This is why I wrote almost 200 lines of code’s worth of unit tests to make sure that the typing system is strong and acts the way I want it to. Catching bugs easily through unit testing While a user will most likely eventually stumble upon any bug worth fixing, I don’t really have any users yet! I would like to ship an app that isn’t obviously broken, and to do that, I need unit tests that stress the logic of my program to make sure it can survive users messing with it. Current progress on writing tests I’ve written fairly extensive tests to enforce the Vec2<float> variants type system, and to enforce particles working and ticking correctly and interacting with modules correctly. I still have many more tests to write, and I expect to spend the next couple of hours doing that. Thank you for reading!"}, {"post_id": 11527, "ts": "2026-06-18T20:30:02Z", "hours": 1.4006, "text": "Mini Devlog - Just Spent An Hour Fighting With The C++ Standard Library + Live Showcase! I just finished spending 8 hours on a massive refactor and new features, so I thought it would be nice to sit for a little while and play around with the program and fix some errors, and generally try to make the code a little safer. I’ve spent the past hour looking at various crashes i’ve had and tryint to pinpoint and debug them, and pretty much every single one of them came down to the fact that I keep forgetting that std::vector<T>::resize(n) does not have the same functionality as std::vector<T>::clear(); std::vector<T>::reserve(n) . This should be a very simple concept, and yet it’s apperently riddled my program with bugs. That’s all solved now, and you can try release 0.1.4 here with an example boxing module! Happy programming! Also, here’s a live demo of the program in action. The recording doesn’t capture the file dialog opening up, but you can tell it’s there before the particles spawn and when I load in the module."}, {"post_id": 11357, "ts": "2026-06-18T15:58:33Z", "hours": 8.3031, "text": "Devlog #5 - I spent 8 hours overengineering my desktop application to avoid spaghetti code A few days ago I wrote about how my small desktop app was already suffering from spaghetti code due to interaction between its modules. I had originally set out to create an application with just 3 modes: Gravity, Electrostatic movement, and chemical bonds. But this has a big problem: The scope is small, making development uninteresting and the actual application pointless to users. The Change In order to solve my spaghetti code problem, I came up with a solution: Instead of implementing 3 different modes, implement an interface that allows you to add as many modes as you want. The Process My first step was to decide what the public API should be for creating a new module. I settled for this: What the module author needs The module author may want to intercept a few different things: Change Force, Velocity and Position values every frame when they are being evaluated Add an attribute for a particle (like how a particle needs a charge in electrostatics) Add a universal physical constant (like Coulomb’s constant or the gravitational constant) Render something on top of the application What I need to do I built a module system to register all of the above, plus a psim_module_api.hpp header for the module author. It defines a C-ABI entry point that calls a C++ init function the author provides. I was almost done with the entire process when I discovered that Windows apparently doesn’t properly support the ability of DLLs to access functions in the main program by linking against them at compile time, and had to rewrite a large chunk from scratch. All the user has to do is include the header and define a void initializePSimModule() which is forward-declared by the header and called by the entry point after populating the function pointer table. Then we just use user-friendly functions to register anything the module might need. An example module is shown in the screenshots, along with its source code. This module creates constants for boundaries that particles cannot cross, effectively boxing them in a rectangle. I rewrote the Gravity and Electric modules in the module system. They are part of the core application, so I’m not loading them dynamically every time, but they use the same API as dynamic extensions. This makes it essentially impossible to create spaghetti code around the different modes, and now all I have to do to load a new module into the program is call loadModule(const std::string& path) . The final flow is something like this: The module entry point is a function that receives a function pointer table to all the C-ABI functions that the module uses under the hood. It populates the module’s function pointer table (the one I added because of Windows) and then calls the main initialization function implemented by the module author. To put things in perspective, here is what happens when you register a constant: You call registerConstant(...) with a std::string and a std::function => they’re destructured into C-friendly structs => the module finds _regConstant(const char* module, size_t moduleLen, ..., PSIM_Constant_Change_Callback) in the pointer table and calls it => the main program restructures the C parameters back into C++ types => the main program calls the real registration function. And this is precisely the hard part: The module author can believe that he’s dealing with the same exact std::span<Particle> that is passed to him by the main program, but in reality that span was destructured into a Particle* and a size_t and was then restructured, all before his callback was even called. This took me 8 hours, and out of everything I’ve done with PSimUltimate for now, this has definitely been the most valuable learning experience. I learned how to expose C++ APIs while maintaining a stable C ABI backend. Very cool!"}, {"post_id": 9226, "ts": "2026-06-15T14:32:40Z", "hours": 3.5978, "text": "Devlog - 04 - Fast JSON Serialization And Deserialization I need a way to save the simulation’s state. My options were few: Create a custom binary format (pretty easy, but not readable) Create a custom text format (hard but readable) Use an existing JSON library and format state into a JSON (very easy, very readable) Option 3 is naturally the best one, so that’s the one I went with. I used nlohmann/json as my JSON library, and for now I have just gone with the native approach of manually looping through the particles to build an object tree and walking the object tree to deserialize files. Now, I know that technically this part of the application doesn’t really require any form of optimization, since even with 1,000 particles and O3 compiler optimizations this native approach takes a small enough time that there isn’t even one frame of overhead. But I still didn’t want to leave performance on the table for no reason. I started with a 10000 particle serialization benchmark. It originally took 100ms to serialize and write to disk with O3 optimizations. After a few changes, mainly first formatting the json object to a std::string and then piping it to a std::ofstream to reduce OS overhead, I quickly reached about 40ms for building an object tree and writing to disk. I got similar results without really adding any optimizations to the deserialization process. Now, this is definitely fast enough for the kind of application that PSimUltimate is, but it still seems slow. People manage to write gigabytes of JSON per second, why is my process so slow? Well, turns out the main reason is the fact that nlohmann/json is, well, pretty slow to build an object tree with. Every single item in the tree is a heap-allocated object, which means both malloc and free overhead and cache-unfriendliness. You can see in the benchmark that serializeState and deserializeState both take a couple milliseconds despite not doing anything but set up the work for the other functions, and this is because of the time it takes to malloc and free the object trees. Theoretically, there are ways to write faster nlohmann/json code that doesn’t rely on as many heap allocations, but it’s not really worth it for me to do spend time looking into it and designing it right now, so this is good enough for me for now."}, {"post_id": 9148, "ts": "2026-06-15T10:03:31Z", "hours": 0.3217, "text": "(Advice Welcome) Devlog - 03 - How to design extensible architechture for my particle simulator desktop application I tried making a simple refactor - when I was first experimenting with the code, Whenever electrostatics were disabled the vector of charges for each particle was reset. This is obviously not great behavior for when you want to be able to quickly toggle modes on and off, so I tried making it so toggling electrostatics simply switches whether the simulation notices them or not, and not whether the data exists. This took 4 different attempts at compilation and playing around before I arrived at the expected behavior - and all I was doing was just deleting some code! It became clear that even though my application is still tiny (under 1k lines of code) and even though I have only 2 modes (gravity and electrostatics), I already have spaghetti code. Now I need to do one thing: design a safe and extensible architechture for adding new types of forces. The first thing that needs to happen is deciding how each mode interacts with the particles. This is the easiest part: Each mode is told to calculate the force for which it is responsible for every particle, and those forces get added to an array of forces, and then the sum force for each particle is used to determine its new position. This alone means there will never be any meaningful spaghetti code. Now comes the hard part: deciding how modes should be declared and added to the application. There are two approaches: Create an interface for modes which is known at compile time. This will lead to better performance due to optimizations, faster startup times, and more control for me over how the application works. Create an interface for modes which is registered dynamically at startup, this approach allows for 3rd-party extensions in the form of dll files that are dropped into some folder in the install directory. This leads to slower startup times, less optimizations due to the need of a stable ABI, and an overall increase in architechture size. I don’t know what I should choose, but I would love to have someone’s input on which would be better for my project."}, {"post_id": 7542, "ts": "2026-06-12T16:19:21Z", "hours": 3.0608, "text": "Devlog - 02 - Before Shabbos Since the last blogpost I have been working on cleaning up the existing codebase, improving some APIs and laying down the groundwork for electrostatic movement. I spent over an hour splitting the GUI rendering process into multiple independent files that are each much smaller than the monolithic “graphical.cpp” from before, which allowed for a cleaner structure which enabled me to think about the code more cleanly and refactor it further. I created a generic Holder struct which runs some function when constructed (and can receive arguments for that function when constructed) and calls another function when it goes out of scope. This is useful in ImGui because very often you have stuff like ImGui::BeginGroup() which must be followed with ImGui::EndGroup() which can easily be forgotten and also leads to unclean and spaghetti code. Instead, All that needs to be done now is a declaration of a GroupHolder variable, and then ImGui::EndGroup() is automatically called when that variable goes out of scope. I moved a bunch of constants from graphical.cpp to a PSimImpl namespace which allows them to be accessed from anywhere without polluting the global namespace. Additionally, I spent some time laying down the groundwork for electrostatic movement, which includes a Force type, which is a strongly typed wrapper around Vec2. I need these to be strongly typed so Force cannot be accidentally converted to Position or Velocity, but I also wanted to be able to explicitly (or implicitly) convert a Vec2 to one of its wrappers. This took a while to get right and eventually lead to the line of code in the screenshot. One more thing: I noticed that currently this website has no way to actually find the GitHub page for other people’s projects, so here’s the link to mine: https://etaiami09-cmd/PSimUltimate Enjoy!"}, {"post_id": 6808, "ts": "2026-06-11T12:46:37Z", "hours": 4.9311, "text": "Devlog - 01 This project is a remake of my first C++ project, which was an electrostatic particle simulator. This time, I’m looking to do a bit more - the simulator will have multiple modes which can be switched on or off, and instead of trying to reinvent the wheel by making a GUI with raw SFML, I’m using ImGui and binding it to raylib for the particles. So far, I’ve spent multiple hours (I started before linking the project) setting up the project with CMake, an install wizard, and external libraries. Additionally, so far I have implemented the ability to toggle gravity and the simulation, and there is a button to toggle electrostatics, even though electrostatics are not implemented yet. I also have a menu for spawning new particles, an about page, and a menu for editing constants (like gravity)."}]...
|
Title: PSim - Particle Simulator by @etaiami09-cmd Title: PSim - Particle Simulator by @etaiami09-cmd | Stardance
Devlogs:
Devlog - 01 This project is a remake of my first C++ project, which was an electrostatic particle simulator. This time, I’m looking to do a bit more - the simulator will have multiple modes which can be switched on or off, and instead of trying to reinvent the wheel by making a GUI with raw SFML, I’m using ImGui and binding it to raylib for the particles. So far, I’ve spent multiple hours (I started before linking the project) setting up the project with CMake, an install wizard, and external libraries. Additionally, so far I have implemented the ability to toggle gravity and the simulation, and there is a button to toggle electrostatics, even though electrostatics are not implemented yet. I also have a menu for spawning new particles, an about page, and a menu for editing constants (like gravity).
Devlog - 02 - Before Shabbos Since the last blogpost I have been working on cleaning up the existing codebase, improving some APIs and laying down the groundwork for electrostatic movement. I spent over an hour splitting the GUI rendering process into multiple independent files that are each much smaller than the monolithic “graphical.cpp” from before, which allowed for a cleaner structure which enabled me to think about the code more cleanly and refactor it further. I created a generic Holder struct which runs some function when constructed (and can receive arguments for that function when constructed) and calls another function when it goes out of scope. This is useful in ImGui because very often you have stuff like ImGui::BeginGroup() which must be followed with ImGui::EndGroup() which can easily be forgotten and also leads to unclean and spaghetti code. Instead, All that needs to be done now is a declaration of a GroupHolder variable, and then ImGui::EndGroup() is automatically called when that variable goes out of scope. I moved a bunch of constants from graphical.cpp to a PSimImpl namespace which allows them to be accessed from anywhere without polluting the global namespace. Additionally, I spent some time laying down the groundwork for electrostatic movement, which includes a Force type, which is a strongly typed wrapper around Vec2. I need these to be strongly typed so Force cannot be accidentally converted to Position or Velocity, but I also wanted to be able to explicitly (or implicitly) convert a Vec2 to one of its wrappers. This took a while to get right and eventually lead to the line of code in the screenshot. One more thing: I noticed that currently this website has no way to actually find the GitHub page for other people’s projects, so here’s the link to mine: https://etaiami09-cmd/PSimUltimate Enjoy!
(Advice Welcome) Devlog - 03 - How to design extensible architechture for my particle simulator desktop application I tried making a simple refactor - when I was first experimenting with the code, Whenever electrostatics were disabled the vector of charges for each particle was reset. This is obviously not great behavior for when you want to be able to quickly toggle modes on and off, so I tried making it so toggling electrostatics simply switches whether the simulation notices them or not, and not whether the data exists. This took 4 different attempts at compilation and playing around before I arrived at the expected behavior - and all I was doing was just deleting some code! It became clear that even though my application is still tiny (under 1k lines of code) and even though I have only 2 modes (gravity and electrostatics), I already have spaghetti code. Now I need to do one thing: design a safe and extensible architechture for adding new types of forces. The first thing that needs to happen is deciding how each mode interacts with the particles. This is the easiest part: Each mode is told to calculate the force for which it is responsible for every particle, and those forces get added to an array of forces, and then the sum force for each particle is used to determine its new position. This alone means there will never be any meaningful spaghetti code. Now comes the hard part: deciding how modes should be declared and added to the application. There are two approaches: Create an interface for modes which is known at compile time. This will lead to better performance due to optimizations, faster startup times, and more control for me over how the application works. Create an interface for modes which is registered dynamically at startup, this approach allows for 3rd-party extensions in the form of dll files that are dropped into some folder in the install directory. This leads to slower startup times, less optimizations due to the need of a stable ABI, and an overall increase in architechture size. I don’t know what I should choose, but I would love to have someone’s input on which would be better for my project.
Devlog - 04 - Fast JSON Serialization And Deserialization I need a way to save the simulation’s state. My options were few: Create a custom binary format (pretty easy, but not readable) Create a custom text format (hard but readable) Use an existing JSON library and format state into a JSON (very easy, very readable) Option 3 is naturally the best one, so that’s the one I went with. I used nlohmann/json as my JSON library, and for now I have just gone with the native approach of manually looping through the particles to build an object tree and walking the object tree to deserialize files. Now, I know that technically this part of the application doesn’t really require any form of optimization, since even with 1,000 particles and O3 compiler optimizations this native approach takes a small enough time that there isn’t even one frame of overhead. But I still didn’t want to leave performance on the table for no reason. I started with a 10000 particle serialization benchmark. It originally took 100ms to serialize and write to disk with O3 optimizations. After a few changes, mainly first formatting the json object to a std::string and then piping it to a std::ofstream to reduce OS overhead, I quickly reached about 40ms for building an object tree and writing to disk. I got similar results without really adding any optimizations to the deserialization process. Now, this is definitely fast enough for the kind of application that PSimUltimate is, but it still seems slow. People manage to write gigabytes of JSON per second, why is my process so slow? Well, turns out the main reason is the fact that nlohmann/json is, well, pretty slow to build an object tree with. Every single item in the tree is a heap-allocated object, which means both malloc and free overhead and cache-unfriendliness. You can see in the benchmark that serializeState and deserializeState both take a couple milliseconds despite not doing anything but set up the work for the other functions, and this is because of the time it takes to malloc and free the object trees. Theoretically, there are ways to write faster nlohmann/json code that doesn’t rely on as many heap allocations, but it’s not really worth it for me to do spend time looking into it and designing it right now, so this is good enough for me for now.
Devlog #5 - I spent 8 hours overengineering my desktop application to avoid spaghetti code A few days ago I wrote about how my small desktop app was already suffering from spaghetti code due to interaction between its modules. I had originally set out to create an application with just 3 modes: Gravity, Electrostatic movement, and chemical bonds. But this has a big problem: The scope is small, making development uninteresting and the actual application pointless to users. The Change In order to solve my spaghetti code problem, I came up with a solution: Instead of implementing 3 different modes, implement an interface that allows you to add as many modes as you want. The Process My first step was to decide what the public API should be for creating a new module. I settled for this: What the module author needs The module author may want to intercept a few different things: Change Force, Velocity and Position values every frame when they are being evaluated Add an attribute for a particle (like how a particle needs a charge in electrostatics) Add a universal physical constant (like Coulomb’s constant or the gravitational constant) Render something on top of the application What I need to do I built a module system to register all of the above, plus a psim_module_api.hpp header for the module author. It defines a C-ABI entry point that calls a C++ init function the author provides. I was almost done with the entire process when I discovered that Windows apparently doesn’t properly support the ability of DLLs to access functions in the main program by linking against them at compile time, and had to rewrite a large chunk from scratch. All the user has to do is include the header and define a void initializePSimModule() which is forward-declared by the header and called by the entry point after populating the function pointer table. Then we just use user-friendly functions to register anything the module might need. An example module is shown in the screenshots, along with its source code. This module creates constants for boundaries that particles cannot cross, effectively boxing them in a rectangle. I rewrote the Gravity and Electric modules in the module system. They are part of the core application, so I’m not loading them dynamically every time, but they use the same API as dynamic extensions. This makes it essentially impossible to create spaghetti code around the different modes, and now all I have to do to load a new module into the program is call loadModule(const std::string& path) . The final flow is something like this: The module entry point is a function that receives a function pointer table to all the C-ABI functions that the module uses under the hood. It populates the module’s function pointer table (the one I added because of Windows) and then calls the main initialization function implemented by the module author. To put things in perspective, here is what happens when you register a constant: You call registerConstant(...) with a std::string and a std::function => they’re destructured into C-friendly structs => the module finds _regConstant(const char* module, size_t moduleLen, ..., PSIM_Constant_Change_Callback) in the pointer table and calls it => the main program restructures the C parameters back into C++ types => the main program calls the real registration function. And this is precisely the hard part: The module author can believe that he’s dealing with the same exact std::span<Particle> that is passed to him by the main program, but in reality that span was destructured into a Particle* and a size_t and was then restructured, all before his callback was even called. This took me 8 hours, and out of everything I’ve done with PSimUltimate for now, this has definitely been the most valuable learning experience. I learned how to expose C++ APIs while maintaining a stable C ABI backend. Very cool!
Mini Devlog - Just Spent An Hour Fighting With The C++ Standard Library + Live Showcase! I just finished spending 8 hours on a massive refactor and new features, so I thought it would be nice to sit for a little while and play around with the program and fix some errors, and generally try to make the code a little safer. I’ve spent the past hour looking at various crashes i’ve had and tryint to pinpoint and debug them, and pretty much every single one of them came down to the fact that I keep forgetting that std::vector<T>::resize(n) does not have the same functionality as std::vector<T>::clear(); std::vector<T>::reserve(n) . This should be a very simple concept, and yet it’s apperently riddled my program with bugs. That’s all solved now, and you can try release 0.1.4 here with an example boxing module! Happy programming! Also, here’s a live demo of the program in action. The recording doesn’t capture the file dialog opening up, but you can tell it’s there before the particles spawn and when I load in the module.
Devlog #6 - Adding Testing To My Particle Simulator I’ve been working on adding unit testing to my project. It was important for me to add unit tests for several reasons: I have never written unit tests in C++, so it’s a good learning experience I genuinely want this project to end up as a polished desktop application, and that’s not really possible without following best practices. Tests are important. Parts of my application are already extremely vulnerable to bugs It’s easier to catch bugs through unit tests than through actual use of the application Catch2 as the framework I chose Catch2 as my framework because it seemed easy to work with and not too verbose. Current sensitive parts of the application Position , Velocity , and Force are all independent wrappers around Vec2<float> . It is extremely important to me that these have proper arithmetic, but are not implicitly convertible, since that is almost definitely not intended behavior. This is why I wrote almost 200 lines of code’s worth of unit tests to make sure that the typing system is strong and acts the way I want it to. Catching bugs easily through unit testing While a user will most likely eventually stumble upon any bug worth fixing, I don’t really have any users yet! I would like to ship an app that isn’t obviously broken, and to do that, I need unit tests that stress the logic of my program to make sure it can survive users messing with it. Current progress on writing tests I’ve written fairly extensive tests to enforce the Vec2<float> variants type system, and to enforce particles working and ticking correctly and interacting with modules correctly. I still have many more tests to write, and I expect to spend the next couple of hours doing that. Thank you for reading!
Mini Devlog - How Writing Unit Tests Made Me Fight C++ For An Hour Whenever I spend some time fighting with C++ instead of actually being productive, I feel like I at least need to get a devlog out of it, so here goes. Background I’ve been writing unit tests for my particle simulator, and one thing I’ve noticed is that I have no code to protect global state when a single module is registered more than once, which leads to weird and unintended behavior. My solution is lazy: silent failure. If a module already exists when addModule(const std::string& name) is called through the module interface function registerModule(const std::string& name) (You can read about why these are separated in an earlier blog post, it’s very cool!), the function just doesn’t register it again. Simple enough, but I wanted to implement it in “correct” C++. The Implementation (Where Things Went Wrong) What I did was create a function in module.cpp with internal linkage called getModuleByName which returns a std::optional<Module&> . Well, apparently for the C++ standard that amounts to heresy, since up until C++26 the committee never managed to agree on how to handle std::optional s that contain references. Well, I thought, I am already compiling with -std=c++26 in my project, so this should work. But it didn’t. I needed an updated libc++ implementation, which I managed to get through MinGW. I spent 30 more minutes fighting with CMake as it insisted to link against MSVC’s headers, but eventually I did manage to get it to compile. A normal programmer would have just used std::optional<Module*> but I am definitely not normal. Was it worth it? probably not. Especially when it’s all for a function which only has internal linkage and is only used in one place. But I like to think that writing code I’m comfortable with will help maintain the codebase in the future.
Devlog #7 - Steady Progress Is Not Interesting Sorry for the low logged time, I’ve actually been working for several hours but I forgot to install wakatime after switching to CLion. What I’ve Been Working On One of the most important things when working with multiple modules that work on a callback-based system is the ability to reorder modules so some callbacks get called before others. Imagine this: You have a module foo which clamps all particles to the window border so they can never escape the boundaries of the window. You also have module bar which increments the X position of each particle by 3, each frame. Say foo gets registered after bar , particles will get clamped to the border AND THEN move 3 pixels, breaking the behavior both module authors likely intended. The Solution Create a GUI which allows the user to reorder modules by, so a module placed after another module gets called last. Implementation Challenges I had to learn how std::list works (a linked list was the obvious choice for this use case), and let me tell you, it is by far one of the worst STL containers I’ve had to work with, and anyone who writes C++ code knows that MEANS somethimg. Conclusion Again, not much to write about today, but steady progress just isn’t all that interesting. Thanks for reading!
Devlog #8 - I Need Your Help This devlog is not so focused on what I’ve been doing since the last one, but what I have been doing is pretty cool, so I’ll go over it: PSim uses Dear ImGui as the backend for its GUI. Up until now, the font size in the GUI has been way too small (13px) and the GUI sidebar could not be resized in any way. I had to make it so resizing is possible and the font is more readable, because I want the app to be properly useable. The first thing I did switch fonts from Dear ImGui’s default non-scalable font to Dear ImGui’s default scalable version, ProggyForever. This took a few minutes but the big challenge was getting resizing to do exactly what I wanted. Despite Dear ImGui usually having exactly the correct amount of features, there is no option to make resizing only possible from one side or disable the completely free bottom-right resize grip. I had to go directly into Dear ImGui’s source code and manually disable those things myself, which was a first for me. What I Need Help With Right now whenever I try to do anything I realize that I don’t actually have a good feel for what’s missing and what needs improvement. If anyone reading this could spare some time of their day to install my application and play around with it, maybe write a module. I have added proper documentation for modules to make the whole process much easier, so hopefully someone will be able to help me find issues and missing features. You can get the release on GitHub . Thank you for reading and thank you for helping out!
Devlog #9 - Expanding The Module Developer API Before I begin this devlog, I would like to apologize for being inactive over the past week. I have had quite a busy week, and I did not have much of an opportunity to work on PSimUltimate unfortunately. What I Have Been Working On I’ve been putting more attention to the module API, modules are the most important part of PSim, and their API should be more advanced than the very basic one that currently exists. I’ve split the API into 5 different sections: Physics Behavior - callbacks into force, velocity, and positions of particles User Input - adding new keyboard shortcuts, reading mouse positions, reading which keys are being pressed Graphical Behavior - being able to draw stuff on the screen GUI - adding buttons, settings pages, descriptions, and more for specific modules. Other Modules - modules should be able to register dependencies and force certain modules to be either lower or higher than them on the callback order. I have been hard at work (when I can) on designing and implementing these needs. So far I have made some progress, but there is still much to do and research, and I’m sorry it’s not so juicy for a week’s worth of progress. Either way, thank you for reading, attached is an example of custom buttons that can be registered by modules in the top bar, and please keep following the project for more updates.
Devlog #10 - Don’t Hate The User One of the most important unwritten (though I’m sure it is written somewhere) rules of writing good software is responsible error handling. I’m writing a desktop application, and personally, when I’m using a desktop application, I don’t like it when it suddenly crashes with no useful error message. This is especially possible in a desktop application written in C++, where irresponsible coding practices can lead to segfaults and other crashes without so much as a Java-style “NullPointerException”. It would be incredibly frustrating for the user to lose progress and not even know why. Another potentially frustrutaing situation is when the program fails silently. It doesn’t quite crash, but when you ask a program to do something and it just doesn’t do it, that can be frustrating. When a program can’t satisfy an action the user wants it to make, it should make it as clear as possible that it’s aware of its failure, and attempt to clarify what went wrong. What I’ve Been Doing Until Now Up until now I have handled runtime errors by… well… not handling them. I wrote my application under the assumption that everything works smoothly, every module loaded by the user exports the correct signature, every file opened by the user is well-formed, and every file the user wants to write to has the necessary permissions. If any of this went wrong, the program entered undefined behavior. Most likely, it will crash. My Solution Whenever the user requests an action by the program, for example, trying to open a saved simulation state JSON, the program goes through the following steps: Make sure the file is actually opened Make sure the file is correctly-formed JSON syntax Make sure the actual data in the file aligns with PSimUltimate’s requirements and constraints Actually deserialize the file If any of these goes wrong, the deserialization process immidiately ends and an error notification is pushed to the bottom-right corner of the screen. If multiple things are wrong about the data in the file, only the first thing in the deserialization order is written. There can be up to 3 error notifications displayed at once, with any more notifications being queued for when those are closed by the user . This solves the issue of responsible, user-friendly error handling, and is an important piece of infrastructure for a usable desktop application.
Devlog #11 - Adding A Settings Page, A Config System, And More Module API Yesterday I wrote about my commitment to making PSim an actual, usable desktop application that doesn’t feel limiting to the user. What I did yesterday was create an error notification system, so if something goes wrong the user can understand why and code has a standard philosophy to handle issues. Today, I put my focus on improving the user experience by adding a settings page to PSim. The Layout Personally, when I think of a settings page in a desktop application, I usually imagine a blocking pop-up (as in, a subwindow inside the application window that while opened, does not let you touch anything outside of it) with a few tabs for different categories of settings. ImGui actually has great support for this, with OpenPopup to create one. the smaller, left-side portion of the settings page is a tab-selection area, and the right-side portion is the tab which is selected. There are 4 tabs: General Simulation Modules - modules can register custom settings About - basically just the full text of the MIT License + a link to the project’s GitHub page The Config System Personally, when I change a setting on a desktop application, I generally expect that change to still be in effect when I close and reopen it. To do this, PSim needs to get to the target platform’s app data folder, create a folder for itself if one doesn’t already exist, and then save whatever information it needs there. Now, this is obviously annoying to have to re-write every time you want to save something as simple as what FPS the user wants, so I wrote a template system to save and access binary settings files on the fly. I now had a way to make it so arbitrary settings stay the same every time I open the app. Now, I need to make it so modules have the same privilege. I created 3 new functions in the module API, writeConfig , readConfig , and registerSwitch . Each of these does as the name implies, and it allows you to add on-off switches (support for more will come later) and read/write configs to disk. Conclusion It may have taken 6 hours of work, but I managed to create a fully-functional settings UI with module support to my first desktop application. This is an important piece of architechture and makes it much easier to add more features in the future and expand the app into something I can be very proud of. Thank you very much for reading! Please enjoy this proof-of-concept video of me changing settings and reopening the app.
Devlog #12 - Solid, Boring Progress I’ve spent the last few days making regular feature updates to PSim. Here are the highlights: 1. Unload Modules Until now, if a user loaded a module and didn’t want it anymore, he would have to reopen the app. Additionally, there was no way to unload the built-in modules. I added an options tooltip in the module order GUI that allows the user to unload a module and everything it has registered. 2. Confirm Action Menu If a user is about to do an action which might lead to loss of data (close the window, override a save file), we want to confirm they know about the potential consequences and accept it. For this, I created an interface for creating a blocking modal that forces the user to either confirm an action or cancel it. 3. Graphics Handlers Behavior Improved The default should obviously be for graphics callbacks to have what they draw to the screen be projected into the actual intended buffer - that is, not anywhere in the top menu bar or the left-hand control panel. This is also already where particles are drawn, so a particle at 0, 0 is drawn in the top-left corner where the top menu bar and control panel intersect. This math had to be applied to every single thing drawn by a graphics callback, and I decided to fix it by calling graphics callbacks while in a raylib 2D mode that offsets everything so that 0, 0 is where a particle at 0,0 is drawn. 4. DPI Scaling I switched to a new laptop this week, and went from a 14 Inch 1080p screen to a 14 Inch 1440p screen. Suddenly, the menu became much smaller, because the program was drawing by pixel instead of by the system’s default scaling (which, on my new laptop, is 200%). I fixed this by making Raylib scale everything by the user’s system DPI. 5. Module Internal Serialization If a module has any internal state that should be preserved when a save file is written, it can now register a callback that returns a std::string and a callback that accepts one, and those can be used to serialize and deserialize its internal state. 6. Extended Module API Documentation I’ve now written documentation for everything but the feature discussed in point 5. 7. New Particle Target I’ve added a cross target placed in the position where a new particle would be placed according to the Position buffer, to ease on visualizing the new particle. This cross is customizeable in the settings menu and you can change width, length and color.
Half Devlog - Short Update: Sorry for not posting for a while. My computer broke and I’m waiting for the repair. Hopefully I’ll be back next week! Thank you for your patience.
Devlog #13 - Time To Ship! PSimUltimate is finally ready to ship. I have put a lot of effort into this project, and I feel genuinely proud of my what I have achieved. While working on this project I have gotten a new computer, lost that computer due to a faulty motherboard, got an internship at a tech company, and started working there full time. Suffice to say, I haven’t had much time to work on PSim in the last month. But I did. I spent time polishing what I have already created and now I feel content with my product. What I’ve done since the last devlog PSimUltimate now has a logo, designed by me. I have also run PSim on WSL and fixed various issues that only appeared on Linux. There is now a way to use your mouse to set the next particle’s position There is now a menu for editing particle data - you can delete a particle and change its position, velocity, mass, etc. PSim is now ready for release. I’m happy and proud to present it and show what I’ve done, and I hope other people receive it well. Thank you all for your support!
Ships:
PSimUltimate Is Ready! I made a particle simulator desktop application in C++ with heavy extension support. Overview PSimUltimate models real physics, but also allows you to inject your own behavior. Using a simple development API that even someone with no C++ experience can understand, you can create, compile and load your own custom modules to the simulator and watch the behavior you’ve coded in action. PSim even ships with 2 of these modules built into the binary, and 3 more modules that you can load dynamically. PSimUltimate also comes with a very simple UI, one that anyone could be comfortable with within minutes. How it works PSimUltimate has documentation for creating your own modules, and compiling them is very simple with a few commands. You can then load the modules, and PSim knows how to run your module and follow its physics. PSimUltimate is written in modern C++, using Raylib and Dear ImGui to provide a clean UI and good support in multiple platforms. While it only ships a Windows binary, you can easily follow the instructions in README.md to compile in other platforms. How to try it You can download the PSimUltimate installation wizard in this page . For more instructions and information, including information on support for other platforms, check out README.md in the source code. Challenges I’ve faced This project took a lot of effort to complete. It is the largest single solo project I have worked on since I started programming, and it included a lot of technical software design and infrastructure that I had to familiarize myself with, like dynamic libraries and using and altering 3rd party libraries (I altered portable file dialogs and Dear ImGui to suit my needs). I also had to deal with moving to a new computer, and then when that computer broke down due to a faulty motherboard, I had to move back to my old computer. I also started a full-time internship at a tech company. All that, coupled with some massive life changes, made it much harder to work on this project. But I enjoyed making it nonetheless, and I’m proud to show off what I’ve created....
|
1793325001.5489676
|
1793411401.5489676
|
|
49944
|
Trawl - CTF Toolkit by @yuv1 | Stardance
|
yuv1
|
1
|
55.65
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-04T18:24:13Z", "hours": 52.0, "multiplier": 18.88, "payout": 0, "blessing": "neutral", "text": "Trawl Trawl is a CTF toolkit for checking suspicious files, encoded text, binaries, and challenge websites from one place. In a CTF, you often get an image, audio file, string, or binary and have to figure out what is hidden inside it. Usually that means opening a bunch of different tools and already knowing what to try. Trawl tries to make that easier. You give it the challenge, and it runs checks that make sense for that input. Try it Live: trawlctf.vercel.app Source: github.com/Yuv1s/Trawl The easiest way to test it: Open the site. Click Tour . Trawl loads a sample file with a hidden flag. Watch the checks run and see what finds it. There are also more sample files under Demos , so you do not need your own CTF challenge. What it can do Trawl has 19 main checks in the web app. It can: inspect PNG, BMP, GIF, JPEG, and WAV files for hidden data check image and audio bits show image bit planes and audio spectrograms find metadata, readable strings, embedded files, and hidden file data inspect ZIP files and PDF structure inspect ELF and PE binaries unwrap encoded text such as base64 and hex solve several common classical ciphers collect useful findings and detected flags in one results panel There is also an optional local web scanner called Remora. It can crawl a CTF website, inspect pages, scripts, headers, and resources, then send useful findings back to Trawl. How it works Most of the analysis is written in Rust and compiled to WebAssembly. The frontend is built with SvelteKit. For normal file and text analysis, the input stays in your browser instead of being uploaded to a server. No account is needed, and the app can keep working offline after it loads. Remora is separate because website scanning needs network access. It runs locally on your computer and connects to the target you give it. I also wrote the analysis and file parsing code instead of relying on existing analysis libraries. The Rust core uses wasm-bindgen to connect Rust to JavaScript. Why I built it The annoying part of CTF forensics was having lots of separate tools and needing to know which one to use before I even understood the challenge. I wanted something where I could drop in the file first and get a useful starting point. I also added the tour and demo files so someone who has never used Trawl can still open the site and understand what it does. What took the most work A big part of the work was avoiding false positives. A detector that marks everything as suspicious is not useful, so I made test files where I knew what was hidden and clean files where nothing should be found. I also tested the ELF and PE parsers with real binaries and compared results with tools like readelf and objdump . One bug I found was that Trawl correctly detected a flag inside a GIF, but the result was stored in the wrong place, so it never appeared in the UI. That pushed me to test the full path from reading the file to actually showing the result. What I learned I learned a lot about image formats, audio samples, compression, steganography, classical cryptography, binary formats, WebAssembly, browser limits, and local networking. The biggest lesson was that finding the answer in code is only part of making a useful tool. The result also has to be tested, understandable, and easy to find.", "repo": "https://github.com/Yuv1s/Trawl", "demo": "https://trawlctf.vercel.app"}]...
|
[{"post_id": 65607, "ts": "202 [{"post_id": 65607, "ts": "2026-09-10T20:56:28Z", "hours": 3.6467, "text": "Trawl has just been shipped!"}, {"post_id": 61673, "ts": "2026-09-04T18:22:19Z", "hours": 0.6467, "text": "Now live at https://trawlctf.vercel.app"}, {"post_id": 61144, "ts": "2026-09-03T22:15:43Z", "hours": 6.5825, "text": "Reversing was the one category left. Trawl had nothing for it. Everything else was covered by the time the tour shipped: steganography, cryptography (Hill and Playfair joined a few weeks back, along with columnar transposition wide enough that brute force stops working), PDF documents read the same way a ZIP already was, object by object, checked against what the file’s own index claims. Drop a binary, though, and the best Trawl could do was name the format and stop there. I’m not building a decompiler. Ghidra and IDA earned that word over years of real compiler-engineering work, and half a decompiler is worse than none: wrong pseudocode still reads as confident, and confidently wrong is the last thing a forensics tool should ever hand someone. What Trawl does instead is the pass every real session starts with anyway, before a disassembler even opens: the header, the section table, what the binary calls, what it offers, and whether it was actually built with the defenses that matter, NX, ASLR, RELRO, a stack canary, Control Flow Guard. Two formats that don’t agree on anything ELF went first, since it’s most of what a CTF binary actually is. Then PE, the Windows half, which turned out to be a different kind of problem. An ELF section header says outright where its bytes sit in the file. A PE barely says anything that way. It addresses its import and export tables by where they’ll land in memory once the loader gets to them, so reading either one means walking the section table first, just to translate an address nobody gave you a file offset for. The two parsers ended up sharing almost nothing except a type underneath them, built so one panel could read both. Where a protection has no equivalent in the other format, the panel just leaves it out instead of guessing. A PE has nothing RELRO would describe, and showing RELRO: none there would report a defense as missing that the format never offered to begin with. The bug where the layout only worked on files I made up myself Testing this against binaries I built myself went fine, because of course it did. I wrote them to go fine. So I went and found real ones instead. gcc output straight out of WSL: a stripped build, a static build, a shared library. Real Windows system binaries too, notepad.exe and kernel32.dll . I checked every one byte for byte against readelf and objdump until the entry points and export counts lined up exactly. Then I compiled a tiny C++ file. Three lines, a map of vectors, nothing unusual. Its export name came out at 286 characters. That’s what name mangling does to the plainest code without even trying. My import list rendered each name as a small chip, capped with a percentage-based max-width so nothing would run off the page. It did nothing. A grid item won’t shrink below its own content unless you tell it to, and I hadn’t, so the chip just kept going: clipped mid-character, no ellipsis, dragging the whole panel sideways with it. Fine on every file I’d invented. Broken on the first real one I pointed it at. AI helped with the writing and most of the parsing code, same as always. The real time went into finding bytes I hadn’t written myself to test it against, a real compiler, a real linker, a symbol nobody designed to be readable. Testing against your own fixtures only ever proves the code agrees with itself. Next up: Windows registry hives, for tracing which USB stick was plugged in when."}, {"post_id": 58436, "ts": "2026-08-30T21:07:08Z", "hours": 14.1186, "text": "Trawl could find anything. Nobody knew where to start. Trawl has gotten good. It cracks AES by hand, forges JWTs, reads flags out of pixels and cookies and the low bits of a sound file. On the mock CTF site I keep building to break, it clears 24 of 26 now. None of that helps the person who opens it for the first time and sees a grid of two dozen tools and a box that says “drop a file.” What file? They don’t have one. They came to look, and there is nothing to look at. So I built the tour. The tour that drops the file for you Tick “take the tour” and Trawl hands itself a sample image with a flag already hidden in the low bits, runs every tool against it before you have done anything, and then walks you through what each one turned up. The flag it already found. The tool that read it out of the red channel. The one that does not read the message but estimates how much is hidden. Two minutes, no CTF knowledge required, and by the end you have watched the whole thing work on a real answer. Because one demo is not much of a demo, there is a library behind it now. Drop-in files for every tool: a flag in a PNG’s low bits, a flag stuck on after the image ends, a flag in the second frame of a GIF, a flag written into the low bit of every audio sample, a flag that only reads once you subtract one frame from the next. Each one hides its answer somewhere different. A button in the corner opens them any time, so the people who skipped the tour and the people who came back a week later can still poke at something real. The bug where the tool found it and never told anyone The GIF samples embarrassed me. Drop one, and the tool would decode the second frame, find the flag, and then say nothing. The cod-end, the panel where every find is supposed to surface, sat empty. It was not that the flag went unfound. It was found, written down, and filed one level too deep to ever be shown. The panel only reads findings from a file’s children, and a plain GIF has no children, so its own results fell through the floor. A few lines to lift them back up. The kind of bug that passes every test, because the test checks that the flag was found, not that a human would ever see it. AI helped with the writing and the mechanical parts, same as always. The real time went into the gap between “the tool works” and “a stranger can tell that it works,” which turns out to be most of the distance. The feature list still sounds small. A tour, some sample files, a button. But the whole point was to make the thing findable, and none of the finding matters if the first thing you see is a shrug. Next up: the last two flags on that mock site, and maybe a screenshot in the readme now that there is something worth showing."}, {"post_id": 55039, "ts": "2026-08-26T13:54:36Z", "hours": 11.1219, "text": "The scanner connected. That was the easy part. Last time, the whole win was that the scanner connected at all. Trawl spots the local process, the page swaps to a URL box, and it starts crawling. But a scanner that connects and finds nothing is just a slow way to load a webpage. So this time I made it actually find the flags. On the mock CTF site I built last time to be broken, the web scan went from 4 findings to 18. Counting the image tools, the whole thing now gets 23 of the 26. Teaching it to decode, not just fetch A flag is almost never sitting in plain text waiting to be read. It’s base64 hiding in a cookie. It’s hex in a JavaScript variable. It’s a colour written as CSS escape codes, or an array of numbers XORed against a single byte, or an ETag that’s really just base64 printed backwards. So the scanner now tries all of those on everything it pulls down: every page, every script, every response header. It keeps a result only when a decode actually produces a flag, and shuts up otherwise. That last part matters more than it sounds. A tool that reports something on every site is noise, not a finding. One challenge hid an AES key and its payload in an image’s metadata. The rule I keep breaking my own back over is no dependencies, nothing borrowed, so instead of pulling in a crypto library I wrote AES by hand and checked it against the official test vectors. It works. I would not recommend the experience. The bug that made a working scanner look broken For a while every scan felt like it hung. The scanner was fine. localhost was the problem. localhost resolves to the IPv6 address first. My test site only listened on IPv4. Windows takes about two seconds to give up on the dead address before falling back to the one that works, and two seconds across fifteen requests is a scan that looks frozen. The fix was one line: try IPv4 first. The debugging was not one line. Then, the morning I went to cut the release, a routine Rust update added a new lint and broke the build on code I hadn’t touched in weeks. Pinned the version, fixed the lint, shipped. AI helped with the writing and some of the mechanical refactors, but the real time went where it always goes: into the two seconds nobody sees, and the compiler that changed its mind overnight. The feature list sounds small again. Reads a site, decodes what it finds, cracks an image. The list is never the part that takes the week. Next up is JWTs, so the scanner can start forging its way into the challenges it currently just knocks on."}, {"post_id": 52676, "ts": "2026-08-22T22:59:35Z", "hours": 10.2175, "text": "I spent hours making a web scanner not be a web scanner The obvious way to scan a website is to send the URL to a server and let the server do the ugly work. Trawl does not get that luxury. One of the rules I have tried to keep since the first version is that everything happens on your machine . No files uploaded, no URLs sent to me, no remote API quietly doing the interesting part. That became significantly harder when I added web reconnaissance. The scanner that had to stay local Browsers are deliberately terrible at crawling arbitrary websites. CORS, networking restrictions, and a dozen other sensible security decisions get in the way. So I ended up building a small local scanner and shipping it as a GitHub release. Installation is a one-line winget command. Once it is running, Trawl detects it automatically. The interface changes live, asks for a URL, and the scanner starts digging through the site for things that probably should not be public: hidden files, exposed secrets, interesting endpoints, and other CTF-shaped mistakes. Nothing leaves the machine. That sentence took far longer to make true than it looks . AI helped with writing and refactoring parts of it, but most of the time disappeared into figuring out how the browser, local process, networking, detection, and UI should talk to each other without turning Trawl into the server-backed app I specifically did not want to build. So I built a website designed to be broken Testing a recon scanner against random real sites is a terrible test. So I made my own mock CTF site instead. It has challenges from easy through expert, with deliberately hidden files and secrets for Trawl to discover. I now have a controlled target where I know exactly what should be found, which makes false positives and missed findings much harder to hide. I also improved the Vigenère decoder while I was in there. The feature list sounds small: better decoder, local scanner, test site. The amount of plumbing underneath it absolutely was not."}, {"post_id": 49928, "ts": "2026-08-18T21:55:13Z", "hours": 1.0806, "text": "The hard part was knowing when to stop Here is what someone hands you in a competition. NWE2ZDc4Njg1YTMzNzQzMDYxNDg0YTZjNWE1NjM5 Eighty-eight characters of nothing. No hint about what it is or how many times it has been through the wringer. You paste it into Trawl and it comes back: base64: 5a6d78685a33743061484a6c5a56397359586c6c636e4e665a47566c hex: ZmxhZ3t0aHJlZV9sYXllcnNfZGVlcH0= base64: flag{three_layers_deep} Three layers, unwrapped one at a time, and the answer sitting at the bottom. Nobody told it there were three. Nobody told it what any of them were. The new half This is Mantis, the code breaking side of the project, and the first thing I have built that does not need a file at all. Paste a string, get an answer. It is named after the mantis shrimp, which punches hard enough to crack a crab shell and sees colours we do not have the eyes for. Force and perception, which turns out to be the whole job. Decoding was easy. Stopping was not. I expected the tricky part to be writing the decoders. It was not. There are thirteen of them now and most took twenty minutes. The problem is that decoders always succeed. Take the sentence “the quick brown fox jumps over the lazy dog”. Delete the spaces and what you have left is, by pure coincidence, a perfectly legal base64 string. Feed it to a base64 decoder and it will not complain. It will hand you back a paragraph of garbage with total confidence. So a tool that decodes whatever it is given will happily take your answer, turn it into noise, and report that as progress. Mine did exactly that, repeatedly, while I was building it. The fix was to stop asking “can this be decoded” and start asking “did decoding it make things better”. Every layer now has to earn its place. It gets kept because of what fell out of it, never because of how it looked going in. Then I got it wrong the other way Once it was cautious, it became too cautious. Look at that chain again. The middle step decodes to a wall of hex digits. That is not more readable than the base64 above it. It is arguably worse. So my careful new version took one look, decided the second layer was not an improvement, and stopped one step short of the answer every single time. Which is the lesson, really. Getting closer to something does not always look like getting closer. It had to learn to follow a chain to the bottom and judge the destination, not each footstep. Where the catch goes When it does find something, it lands in a panel at the top of the page called the Cod-end. That is the closed end of a trawl net, the bit that drags along behind and where everything you caught ends up. It felt like the right name for the box that holds the answers. What it still cannot do It does not break real encryption, and it never will. If something is properly encrypted, Trawl says so and stops, rather than producing a confident sentence made of nothing. It also cannot solve every classical cipher yet. Two of the harder ones need a much better model of what English looks like than the short word list it currently carries, and I would rather ship the gap than fake it. Next up: hashes."}, {"post_id": 49567, "ts": "2026-08-18T13:25:48Z", "hours": 1.9528, "text": "I cooked my own laptop, then hid a word inside a noise The fans came on around eleven and never stopped. By mid-afternoon my laptop was doing an impression of a hairdryer and the temperature had gone past 100°C, which is where water boils and laptops start making decisions about their own survival. I opened Task Manager expecting a runaway browser tab. Twenty-four copies of my own program. All running. All mine. Every time I wanted to check my work I started a little local server, and every time I finished I told it to stop. It said it stopped. It did not stop. It had a second process doing the real work, and killing the first left the second running happily, forever, burning a core each. They had been stacking up since ten in the morning. The lesson is not “check your processes.” It is that I trusted a success message instead of looking. The program told me what I wanted to hear and I took its word for it, which is a strange mistake to make on a project whose entire premise is not taking things at face value. I check now. Every time. It takes four seconds. Sound has a shape Here is the thing I built this month, and I still think it is the best trick in the whole project. Every sound is a stack of pitches, high and low, shifting over time. Plot pitch going up the page and time going across, and you get a picture of what a noise is actually made of. A flute is a clean line. A cymbal is a smear. Speech is a mess of stripes that a trained eye can almost read. Now run it backwards. Decide what you want that picture to look like. Write a word, say. Then generate the exact noise that would produce it. What comes out is a real audio file. You can play it. It sounds like static, like a radio between stations, and there is nothing in it your ears will ever pick up. Show it to anyone and they hear noise, because it is noise. Look at its shape and the word is just sitting there. I built the part of Trawl that draws that shape, and then I wrote a little tool that goes the other way so I could make my own. I fed it a picture of two words stacked on top of each other. Eight seconds of grinding static came out. I dropped it back into Trawl and the words were there, drawn in sound, perfectly legible. Getting it wrong twice first My first attempt was mush. Grey bands, no letters. The reason is a bit lovely. To read the shape of a sound you have to chop it into short slices and analyse each one, and my slices were wider than the letters. It was like trying to read a book through a window that shows three words at once, smeared together. Fixed by giving each column of the picture more time. The second attempt had bright vertical bars slashed through it. Those were clicks. Thirty separate tones were all changing volume at the exact same instant, and a sharp change in sound is a click, and a click is every pitch at once. It drew a line straight through my picture. Fixed by easing the volume changes instead of stepping them. Same reason a song fades out rather than stopping dead. Both of those are in the code with comments explaining them, mostly so future me does not do it again. The one I refused to build There is a hiding technique called F5 that I cannot reliably detect. The published method for spotting it needs a copy of the original, untouched file to compare against, and I do not have one. Nobody does. That is the point of the puzzle. I could have shipped something that guesses and looks confident about it. Instead the tool shows you the raw numbers and says, plainly, that it does not know. A tool that finds something every time is not a good tool. It is a broken one that happens to be reassuring, and I would rather ship an honest gap than a convincing lie. The image and sound half is done. Codes and ciphers next."}, {"post_id": 49293, "ts": "2026-08-18T00:51:00Z", "hours": 0.4928, "text": "Devlog 4: Trawl has a face Trawl has a logo now, and I like it more than I expected to. The obvious move was a net. I drew several. A mesh narrowing to a cod-end, the side profile of a trawl, a rotated diamond lattice that looked like real netting up close. All fine, all saying nothing. A net tells you where the name came from, which is the least interesting fact about this project. So it is a scan reticle instead. Corner brackets around a grid of dots, one of them lit amber. That is the whole tool in one image. Brackets mean examination and people read them that way without being taught. The grid is whatever Trawl is looking at. The amber dot is the finding. And the amber is load-bearing. In the interface that colour has exactly one job, marking something anomalous, and it turns up nowhere else. No amber buttons, no amber headings. The logo obeys the same rule, so the mark is not decoration. It is a hit. I did ship it invisible for about ten minutes, because currentColor resolves to black once the SVG leaves the app. One amber dot floating in the void. Fixed. Next is Cod-end, phase two, where Cuttlefish stops being PNG-only."}, {"post_id": 49263, "ts": "2026-08-17T23:15:13Z", "hours": 1.1847, "text": "Devlog 3: the PNG half is finished Here is my favourite way to hide a message in a picture, and Trawl can now catch it. A PNG can store its colours as a numbered list. Pixel one uses colour seven, pixel two uses colour twelve, and so on. Nothing in the format stops that list from holding the same colour twice. So if entry 10 and entry 200 are both the same shade of blue, every blue pixel can point at either one. The image on screen is pixel for pixel identical. The file underneath is not. That choice is a hidden bit, and even a small 64 by 64 image gives you about a thousand bytes of them. That was the last thing on my list. PNG support is done. What done means Trawl reads every valid PNG now, including the two kinds it used to refuse outright. It opens compressed comment blocks instead of shrugging at them. It finds text written the Windows way, where every character is followed by an invisible null byte that made my old scanner walk straight past it. And its brute-forcer tries reading hidden bits down the columns as well as along the rows, which doubled the number of combinations from 42 to 84. Sixteen tools, all working on one format properly. That felt worth stopping to notice. The bug where it found two flags and threw them both away I planted a message in a compressed comment and another as wide text, then ran them through. Neither showed up. Both had actually been found. The problem was one line where I merged results: I was taking either the results from the PNG-specific reader or the results from the general one, never both. So the general scanner would find the wide text, hand it over, and the merge step would quietly drop it on the floor. Two correct detectors, one bad if . A related version of the same mistake: I inflate compressed comments now, but the flag scan had already run before that text existed, so nobody ever looked at it. It re-scans after decompressing. The one I got wrong for twenty minutes One of my clean test images started tripping a detector. My first guess was the new interlaced decoder, since that was the newest thing. So I built the same picture again without interlacing and ran it. Same false alarm. Not the decoder. The real cause was my test image itself. The detector works by checking whether pairs of colour values appear equally often, which a hidden message forces and a real photograph has no reason to do. My test image was a smooth gradient, and smooth gradients spread their values so evenly that the pairs come out equal on their own. I had built a control that genuinely looks guilty. I gave it a tone curve, the way a real camera would, and it went quiet. That is the fifth time this project a test image has been the thing that was broken. Next Everything except PNG. GIF and BMP first, since they should light up all sixteen tools the moment they decode. Then extracting files that are hidden inside other files, which Trawl currently finds and then refuses to hand over."}, {"post_id": 49179, "ts": "2026-08-17T20:24:23Z", "hours": 1.7364, "text": "Devlog 2: it found the hidden message, then cut it off mid-sentence You can hide text inside a photo by nudging the colour of individual pixels by one step. The image looks identical to any eye and to most software. The message just sits there, spread across a few thousand pixels, waiting for someone who knows how to look. Trawl is the thing I am building that looks. The good part I hid a note inside a photo of the Eiffel Tower at night and dropped it in. Trawl found it: If you can read this than Trawl was a success! If not then well.. lets just say.. prepare to los Right message, right place, picked out of 42 different ways it could have been hidden. Then it stopped mid-word. That was not a decoding failure. I had written a line months earlier that trimmed the preview to 96 characters, and my note was 155. The tool read every single word and showed me two thirds of one. Somehow more annoying than it failing outright. Fixed, and there is now a button that pulls the whole thing out. The message that was never there An earlier test went the other way. Different image, and Trawl confidently announced it had found BM{GEBF} . Nothing was hidden in that file. Those eight characters turned up by chance inside the image’s compressed data, and my scanner was hunting for that shape anywhere in the file. Give it half a megabyte of near-random bytes and the shape appears on its own eventually. A tool that invents answers is worse than one that finds nothing. Matches now get judged by where they came from, and anything sitting in compressed data gets demoted with the reason shown rather than announced as a discovery. Both bugs had the same cause My test images were fake in a way that mattered. I was generating smooth colour gradients to test against. Real photos are not smooth. They have grain, texture, tiny variations between neighbouring pixels. My detectors passed every test I wrote and then fell over on the first real photograph, three separate times, because the thing I was testing against did not behave like the thing I was testing for. I now write a test that checks the test image before any test that uses it. That one took me embarrassingly long to arrive at. The feature I deleted I built automatic warnings into one of the new tools, then found it flagging a completely clean image. I could have nudged the threshold until the warning went away. But then the number would exist because it made one test pass, not because it meant anything, and it would start guessing again on the next photo. So I deleted the feature. The tool shows you the measurements and makes no accusations. The two tools that do make claims are based on published research from 1999 and 2001. Given an image with a quarter of its pixels carrying hidden data, they estimate 25.0% and 25.9%. Those I trust. Next Reading camera metadata, which is where people hide things when they are not hiding them in the pixels."}, {"post_id": 48664, "ts": "2026-08-17T04:53:48Z", "hours": 2.5947, "text": "Devlog 1: Trawl, and the bug I caught before it cost me a week Trawl is a CTF toolkit that runs in the browser. Drop a file in, it runs every check I’ve written at once, and tells you what looked wrong. Nothing uploads anywhere, because there is no server to upload to. It did not start out this big. The first version was only a steganography tool, because that is the category I keep landing in and the workflow is tedious: exiftool, then strings, then binwalk, then zsteg, then StegSolve, a Java applet from 2011. Five tools, five interfaces, all of them installed before you can look at a single PNG. Plenty of beginners skip forensics entirely for that reason. A couple of weeks in I realized the same complaint covers almost every CTF category, so the scope moved. Trawl is the hub. Cuttlefish is the steganography module inside it, and the only one that exists so far. A trawl is a net you drag through water to see what comes up. Cuttlefish hide by rewriting their own surface, which is what LSB embedding does to an image. What Cuttlefish runs now Eight checks, PNG only: pixel decode with verification, chunk walk, CRC validation, post-IEND data, tEXt/zTXt/iTXt metadata, ASCII strings, flag-shape scan, and an LSB sweep across channel order, bit plane and bit order. In the screenshot one of the eight fired. The sweep pulled testCTF{hello} out of RGB, bit 0, MSB first. One of 42 combinations carried anything readable. The bug I would not have found without testing for it Before writing any analysis I wrote a single test: build a PNG with a known pattern in the low bits, decode it through the browser, check the bits survive. They don’t, by default. Canvas alpha premultiplication and colour management both rewrite pixel values slightly. For ordinary image work nobody notices. For steganography it destroys exactly the data you are looking for, and every detector downstream would have been measuring noise while looking completely functional. The fix is passing colorSpaceConversion: 'none' and premultiplyAlpha: 'none' to createImageBitmap . Cuttlefish now reports the decode step as verified so I can confirm the guarantee held for the file in front of me. Had I built the sweep before checking, I would have spent days debugging math that was already correct. On the Rust The core is Rust compiled to WASM, running in a Web Worker, partly because the sweep is real compute and JavaScript stutters on it, partly because I wanted to learn Rust properly. I wrote the detector logic myself. AI helped me refactor it and add comments, which I am noting because it is true, and because the parts I struggled through are the parts I actually understand now. Next The bit-plane wall: all 8 planes across every channel rendered at once, so an anomalous plane becomes something you see rather than something you brute-force into. Cuttlefish is not finished. The sweep only handles PNG, there is no bit-plane view, and no statistical detection at all yet. What I have proves the pipeline runs end to end on a flag I planted myself, which is a real milestone and also not much more than that. Trawl has exactly one module, which makes “hub” a generous word for it right now."}]...
|
Title: Trawl - CTF Toolkit by @yuv1 | Stardance
D Title: Trawl - CTF Toolkit by @yuv1 | Stardance
Devlogs:
Devlog 1: Trawl, and the bug I caught before it cost me a week Trawl is a CTF toolkit that runs in the browser. Drop a file in, it runs every check I’ve written at once, and tells you what looked wrong. Nothing uploads anywhere, because there is no server to upload to. It did not start out this big. The first version was only a steganography tool, because that is the category I keep landing in and the workflow is tedious: exiftool, then strings, then binwalk, then zsteg, then StegSolve, a Java applet from 2011. Five tools, five interfaces, all of them installed before you can look at a single PNG. Plenty of beginners skip forensics entirely for that reason. A couple of weeks in I realized the same complaint covers almost every CTF category, so the scope moved. Trawl is the hub. Cuttlefish is the steganography module inside it, and the only one that exists so far. A trawl is a net you drag through water to see what comes up. Cuttlefish hide by rewriting their own surface, which is what LSB embedding does to an image. What Cuttlefish runs now Eight checks, PNG only: pixel decode with verification, chunk walk, CRC validation, post-IEND data, tEXt/zTXt/iTXt metadata, ASCII strings, flag-shape scan, and an LSB sweep across channel order, bit plane and bit order. In the screenshot one of the eight fired. The sweep pulled testCTF{hello} out of RGB, bit 0, MSB first. One of 42 combinations carried anything readable. The bug I would not have found without testing for it Before writing any analysis I wrote a single test: build a PNG with a known pattern in the low bits, decode it through the browser, check the bits survive. They don’t, by default. Canvas alpha premultiplication and colour management both rewrite pixel values slightly. For ordinary image work nobody notices. For steganography it destroys exactly the data you are looking for, and every detector downstream would have been measuring noise while looking completely functional. The fix is passing colorSpaceConversion: 'none' and premultiplyAlpha: 'none' to createImageBitmap . Cuttlefish now reports the decode step as verified so I can confirm the guarantee held for the file in front of me. Had I built the sweep before checking, I would have spent days debugging math that was already correct. On the Rust The core is Rust compiled to WASM, running in a Web Worker, partly because the sweep is real compute and JavaScript stutters on it, partly because I wanted to learn Rust properly. I wrote the detector logic myself. AI helped me refactor it and add comments, which I am noting because it is true, and because the parts I struggled through are the parts I actually understand now. Next The bit-plane wall: all 8 planes across every channel rendered at once, so an anomalous plane becomes something you see rather than something you brute-force into. Cuttlefish is not finished. The sweep only handles PNG, there is no bit-plane view, and no statistical detection at all yet. What I have proves the pipeline runs end to end on a flag I planted myself, which is a real milestone and also not much more than that. Trawl has exactly one module, which makes “hub” a generous word for it right now.
Devlog 2: it found the hidden message, then cut it off mid-sentence You can hide text inside a photo by nudging the colour of individual pixels by one step. The image looks identical to any eye and to most software. The message just sits there, spread across a few thousand pixels, waiting for someone who knows how to look. Trawl is the thing I am building that looks. The good part I hid a note inside a photo of the Eiffel Tower at night and dropped it in. Trawl found it: If you can read this than Trawl was a success! If not then well.. lets just say.. prepare to los Right message, right place, picked out of 42 different ways it could have been hidden. Then it stopped mid-word. That was not a decoding failure. I had written a line months earlier that trimmed the preview to 96 characters, and my note was 155. The tool read every single word and showed me two thirds of one. Somehow more annoying than it failing outright. Fixed, and there is now a button that pulls the whole thing out. The message that was never there An earlier test went the other way. Different image, and Trawl confidently announced it had found BM{GEBF} . Nothing was hidden in that file. Those eight characters turned up by chance inside the image’s compressed data, and my scanner was hunting for that shape anywhere in the file. Give it half a megabyte of near-random bytes and the shape appears on its own eventually. A tool that invents answers is worse than one that finds nothing. Matches now get judged by where they came from, and anything sitting in compressed data gets demoted with the reason shown rather than announced as a discovery. Both bugs had the same cause My test images were fake in a way that mattered. I was generating smooth colour gradients to test against. Real photos are not smooth. They have grain, texture, tiny variations between neighbouring pixels. My detectors passed every test I wrote and then fell over on the first real photograph, three separate times, because the thing I was testing against did not behave like the thing I was testing for. I now write a test that checks the test image before any test that uses it. That one took me embarrassingly long to arrive at. The feature I deleted I built automatic warnings into one of the new tools, then found it flagging a completely clean image. I could have nudged the threshold until the warning went away. But then the number would exist because it made one test pass, not because it meant anything, and it would start guessing again on the next photo. So I deleted the feature. The tool shows you the measurements and makes no accusations. The two tools that do make claims are based on published research from 1999 and 2001. Given an image with a quarter of its pixels carrying hidden data, they estimate 25.0% and 25.9%. Those I trust. Next Reading camera metadata, which is where people hide things when they are not hiding them in the pixels.
Devlog 3: the PNG half is finished Here is my favourite way to hide a message in a picture, and Trawl can now catch it. A PNG can store its colours as a numbered list. Pixel one uses colour seven, pixel two uses colour twelve, and so on. Nothing in the format stops that list from holding the same colour twice. So if entry 10 and entry 200 are both the same shade of blue, every blue pixel can point at either one. The image on screen is pixel for pixel identical. The file underneath is not. That choice is a hidden bit, and even a small 64 by 64 image gives you about a thousand bytes of them. That was the last thing on my list. PNG support is done. What done means Trawl reads every valid PNG now, including the two kinds it used to refuse outright. It opens compressed comment blocks instead of shrugging at them. It finds text written the Windows way, where every character is followed by an invisible null byte that made my old scanner walk straight past it. And its brute-forcer tries reading hidden bits down the columns as well as along the rows, which doubled the number of combinations from 42 to 84. Sixteen tools, all working on one format properly. That felt worth stopping to notice. The bug where it found two flags and threw them both away I planted a message in a compressed comment and another as wide text, then ran them through. Neither showed up. Both had actually been found. The problem was one line where I merged results: I was taking either the results from the PNG-specific reader or the results from the general one, never both. So the general scanner would find the wide text, hand it over, and the merge step would quietly drop it on the floor. Two correct detectors, one bad if . A related version of the same mistake: I inflate compressed comments now, but the flag scan had already run before that text existed, so nobody ever looked at it. It re-scans after decompressing. The one I got wrong for twenty minutes One of my clean test images started tripping a detector. My first guess was the new interlaced decoder, since that was the newest thing. So I built the same picture again without interlacing and ran it. Same false alarm. Not the decoder. The real cause was my test image itself. The detector works by checking whether pairs of colour values appear equally often, which a hidden message forces and a real photograph has no reason to do. My test image was a smooth gradient, and smooth gradients spread their values so evenly that the pairs come out equal on their own. I had built a control that genuinely looks guilty. I gave it a tone curve, the way a real camera would, and it went quiet. That is the fifth time this project a test image has been the thing that was broken. Next Everything except PNG. GIF and BMP first, since they should light up all sixteen tools the moment they decode. Then extracting files that are hidden inside other files, which Trawl currently finds and then refuses to hand over.
Devlog 4: Trawl has a face Trawl has a logo now, and I like it more than I expected to. The obvious move was a net. I drew several. A mesh narrowing to a cod-end, the side profile of a trawl, a rotated diamond lattice that looked like real netting up close. All fine, all saying nothing. A net tells you where the name came from, which is the least interesting fact about this project. So it is a scan reticle instead. Corner brackets around a grid of dots, one of them lit amber. That is the whole tool in one image. Brackets mean examination and people read them that way without being taught. The grid is whatever Trawl is looking at. The amber dot is the finding. And the amber is load-bearing. In the interface that colour has exactly one job, marking something anomalous, and it turns up nowhere else. No amber buttons, no amber headings. The logo obeys the same rule, so the mark is not decoration. It is a hit. I did ship it invisible for about ten minutes, because currentColor resolves to black once the SVG leaves the app. One amber dot floating in the void. Fixed. Next is Cod-end, phase two, where Cuttlefish stops being PNG-only.
I cooked my own laptop, then hid a word inside a noise The fans came on around eleven and never stopped. By mid-afternoon my laptop was doing an impression of a hairdryer and the temperature had gone past 100°C, which is where water boils and laptops start making decisions about their own survival. I opened Task Manager expecting a runaway browser tab. Twenty-four copies of my own program. All running. All mine. Every time I wanted to check my work I started a little local server, and every time I finished I told it to stop. It said it stopped. It did not stop. It had a second process doing the real work, and killing the first left the second running happily, forever, burning a core each. They had been stacking up since ten in the morning. The lesson is not “check your processes.” It is that I trusted a success message instead of looking. The program told me what I wanted to hear and I took its word for it, which is a strange mistake to make on a project whose entire premise is not taking things at face value. I check now. Every time. It takes four seconds. Sound has a shape Here is the thing I built this month, and I still think it is the best trick in the whole project. Every sound is a stack of pitches, high and low, shifting over time. Plot pitch going up the page and time going across, and you get a picture of what a noise is actually made of. A flute is a clean line. A cymbal is a smear. Speech is a mess of stripes that a trained eye can almost read. Now run it backwards. Decide what you want that picture to look like. Write a word, say. Then generate the exact noise that would produce it. What comes out is a real audio file. You can play it. It sounds like static, like a radio between stations, and there is nothing in it your ears will ever pick up. Show it to anyone and they hear noise, because it is noise. Look at its shape and the word is just sitting there. I built the part of Trawl that draws that shape, and then I wrote a little tool that goes the other way so I could make my own. I fed it a picture of two words stacked on top of each other. Eight seconds of grinding static came out. I dropped it back into Trawl and the words were there, drawn in sound, perfectly legible. Getting it wrong twice first My first attempt was mush. Grey bands, no letters. The reason is a bit lovely. To read the shape of a sound you have to chop it into short slices and analyse each one, and my slices were wider than the letters. It was like trying to read a book through a window that shows three words at once, smeared together. Fixed by giving each column of the picture more time. The second attempt had bright vertical bars slashed through it. Those were clicks. Thirty separate tones were all changing volume at the exact same instant, and a sharp change in sound is a click, and a click is every pitch at once. It drew a line straight through my picture. Fixed by easing the volume changes instead of stepping them. Same reason a song fades out rather than stopping dead. Both of those are in the code with comments explaining them, mostly so future me does not do it again. The one I refused to build There is a hiding technique called F5 that I cannot reliably detect. The published method for spotting it needs a copy of the original, untouched file to compare against, and I do not have one. Nobody does. That is the point of the puzzle. I could have shipped something that guesses and looks confident about it. Instead the tool shows you the raw numbers and says, plainly, that it does not know. A tool that finds something every time is not a good tool. It is a broken one that happens to be reassuring, and I would rather ship an honest gap than a convincing lie. The image and sound half is done. Codes and ciphers next.
The hard part was knowing when to stop Here is what someone hands you in a competition. NWE2ZDc4Njg1YTMzNzQzMDYxNDg0YTZjNWE1NjM5 Eighty-eight characters of nothing. No hint about what it is or how many times it has been through the wringer. You paste it into Trawl and it comes back: base64: 5a6d78685a33743061484a6c5a56397359586c6c636e4e665a47566c hex: ZmxhZ3t0aHJlZV9sYXllcnNfZGVlcH0= base64: flag{three_layers_deep} Three layers, unwrapped one at a time, and the answer sitting at the bottom. Nobody told it there were three. Nobody told it what any of them were. The new half This is Mantis, the code breaking side of the project, and the first thing I have built that does not need a file at all. Paste a string, get an answer. It is named after the mantis shrimp, which punches hard enough to crack a crab shell and sees colours we do not have the eyes for. Force and perception, which turns out to be the whole job. Decoding was easy. Stopping was not. I expected the tricky part to be writing the decoders. It was not. There are thirteen of them now and most took twenty minutes. The problem is that decoders always succeed. Take the sentence “the quick brown fox jumps over the lazy dog”. Delete the spaces and what you have left is, by pure coincidence, a perfectly legal base64 string. Feed it to a base64 decoder and it will not complain. It will hand you back a paragraph of garbage with total confidence. So a tool that decodes whatever it is given will happily take your answer, turn it into noise, and report that as progress. Mine did exactly that, repeatedly, while I was building it. The fix was to stop asking “can this be decoded” and start asking “did decoding it make things better”. Every layer now has to earn its place. It gets kept because of what fell out of it, never because of how it looked going in. Then I got it wrong the other way Once it was cautious, it became too cautious. Look at that chain again. The middle step decodes to a wall of hex digits. That is not more readable than the base64 above it. It is arguably worse. So my careful new version took one look, decided the second layer was not an improvement, and stopped one step short of the answer every single time. Which is the lesson, really. Getting closer to something does not always look like getting closer. It had to learn to follow a chain to the bottom and judge the destination, not each footstep. Where the catch goes When it does find something, it lands in a panel at the top of the page called the Cod-end. That is the closed end of a trawl net, the bit that drags along behind and where everything you caught ends up. It felt like the right name for the box that holds the answers. What it still cannot do It does not break real encryption, and it never will. If something is properly encrypted, Trawl says so and stops, rather than producing a confident sentence made of nothing. It also cannot solve every classical cipher yet. Two of the harder ones need a much better model of what English looks like than the short word list it currently carries, and I would rather ship the gap than fake it. Next up: hashes.
I spent hours making a web scanner not be a web scanner The obvious way to scan a website is to send the URL to a server and let the server do the ugly work. Trawl does not get that luxury. One of the rules I have tried to keep since the first version is that everything happens on your machine . No files uploaded, no URLs sent to me, no remote API quietly doing the interesting part. That became significantly harder when I added web reconnaissance. The scanner that had to stay local Browsers are deliberately terrible at crawling arbitrary websites. CORS, networking restrictions, and a dozen other sensible security decisions get in the way. So I ended up building a small local scanner and shipping it as a GitHub release. Installation is a one-line winget command. Once it is running, Trawl detects it automatically. The interface changes live, asks for a URL, and the scanner starts digging through the site for things that probably should not be public: hidden files, exposed secrets, interesting endpoints, and other CTF-shaped mistakes. Nothing leaves the machine. That sentence took far longer to make true than it looks . AI helped with writing and refactoring parts of it, but most of the time disappeared into figuring out how the browser, local process, networking, detection, and UI should talk to each other without turning Trawl into the server-backed app I specifically did not want to build. So I built a website designed to be broken Testing a recon scanner against random real sites is a terrible test. So I made my own mock CTF site instead. It has challenges from easy through expert, with deliberately hidden files and secrets for Trawl to discover. I now have a controlled target where I know exactly what should be found, which makes false positives and missed findings much harder to hide. I also improved the Vigenère decoder while I was in there. The feature list sounds small: better decoder, local scanner, test site. The amount of plumbing underneath it absolutely was not.
The scanner connected. That was the easy part. Last time, the whole win was that the scanner connected at all. Trawl spots the local process, the page swaps to a URL box, and it starts crawling. But a scanner that connects and finds nothing is just a slow way to load a webpage. So this time I made it actually find the flags. On the mock CTF site I built last time to be broken, the web scan went from 4 findings to 18. Counting the image tools, the whole thing now gets 23 of the 26. Teaching it to decode, not just fetch A flag is almost never sitting in plain text waiting to be read. It’s base64 hiding in a cookie. It’s hex in a JavaScript variable. It’s a colour written as CSS escape codes, or an array of numbers XORed against a single byte, or an ETag that’s really just base64 printed backwards. So the scanner now tries all of those on everything it pulls down: every page, every script, every response header. It keeps a result only when a decode actually produces a flag, and shuts up otherwise. That last part matters more than it sounds. A tool that reports something on every site is noise, not a finding. One challenge hid an AES key and its payload in an image’s metadata. The rule I keep breaking my own back over is no dependencies, nothing borrowed, so instead of pulling in a crypto library I wrote AES by hand and checked it against the official test vectors. It works. I would not recommend the experience. The bug that made a working scanner look broken For a while every scan felt like it hung. The scanner was fine. localhost was the problem. localhost resolves to the IPv6 address first. My test site only listened on IPv4. Windows takes about two seconds to give up on the dead address before falling back to the one that works, and two seconds across fifteen requests is a scan that looks frozen. The fix was one line: try IPv4 first. The debugging was not one line. Then, the morning I went to cut the release, a routine Rust update added a new lint and broke the build on code I hadn’t touched in weeks. Pinned the version, fixed the lint, shipped. AI helped with the writing and some of the mechanical refactors, but the real time went where it always goes: into the two seconds nobody sees, and the compiler that changed its mind overnight. The feature list sounds small again. Reads a site, decodes what it finds, cracks an image. The list is never the part that takes the week. Next up is JWTs, so the scanner can start forging its way into the challenges it currently just knocks on.
Trawl could find anything. Nobody knew where to start. Trawl has gotten good. It cracks AES by hand, forges JWTs, reads flags out of pixels and cookies and the low bits of a sound file. On the mock CTF site I keep building to break, it clears 24 of 26 now. None of that helps the person who opens it for the first time and sees a grid of two dozen tools and a box that says “drop a file.” What file? They don’t have one. They came to look, and there is nothing to look at. So I built the tour. The tour that drops the file for you Tick “take the tour” and Trawl hands itself a sample image with a flag already hidden in the low bits, runs every tool against it before you have done anything, and then walks you through what each one turned up. The flag it already found. The tool that read it out of the red channel. The one that does not read the message but estimates how much is hidden. Two minutes, no CTF knowledge required, and by the end you have watched the whole thing work on a real answer. Because one demo is not much of a demo, there is a library behind it now. Drop-in files for every tool: a flag in a PNG’s low bits, a flag stuck on after the image ends, a flag in the second frame of a GIF, a flag written into the low bit of every audio sample, a flag that only reads once you subtract one frame from the next. Each one hides its answer somewhere different. A button in the corner opens them any time, so the people who skipped the tour and the people who came back a week later can still poke at something real. The bug where the tool found it and never told anyone The GIF samples embarrassed me. Drop one, and the tool would decode the second frame, find the flag, and then say nothing. The cod-end, the panel where every find is supposed to surface, sat empty. It was not that the flag went unfound. It was found, written down, and filed one level too deep to ever be shown. The panel only reads findings from a file’s children, and a plain GIF has no children, so its own results fell through the floor. A few lines to lift them back up. The kind of bug that passes every test, because the test checks that the flag was found, not that a human would ever see it. AI helped with the writing and the mechanical parts, same as always. The real time went into the gap between “the tool works” and “a stranger can tell that it works,” which turns out to be most of the distance. The feature list still sounds small. A tour, some sample files, a button. But the whole point was to make the thing findable, and none of the finding matters if the first thing you see is a shrug. Next up: the last two flags on that mock site, and maybe a screenshot in the readme now that there is something worth showing.
Reversing was the one category left. Trawl had nothing for it. Everything else was covered by the time the tour shipped: steganography, cryptography (Hill and Playfair joined a few weeks back, along with columnar transposition wide enough that brute force stops working), PDF documents read the same way a ZIP already was, object by object, checked against what the file’s own index claims. Drop a binary, though, and the best Trawl could do was name the format and stop there. I’m not building a decompiler. Ghidra and IDA earned that word over years of real compiler-engineering work, and half a decompiler is worse than none: wrong pseudocode still reads as confident, and confidently wrong is the last thing a forensics tool should ever hand someone. What Trawl does instead is the pass every real session starts with anyway, before a disassembler even opens: the header, the section table, what the binary calls, what it offers, and whether it was actually built with the defenses that matter, NX, ASLR, RELRO, a stack canary, Control Flow Guard. Two formats that don’t agree on anything ELF went first, since it’s most of what a CTF binary actually is. Then PE, the Windows half, which turned out to be a different kind of problem. An ELF section header says outright where its bytes sit in the file. A PE barely says anything that way. It addresses its import and export tables by where they’ll land in memory once the loader gets to them, so reading either one means walking the section table first, just to translate an address nobody gave you a file offset for. The two parsers ended up sharing almost nothing except a type underneath them, built so one panel could read both. Where a protection has no equivalent in the other format, the panel just leaves it out instead of guessing. A PE has nothing RELRO would describe, and showing RELRO: none there would report a defense as missing that the format never offered to begin with. The bug where the layout only worked on files I made up myself Testing this against binaries I built myself went fine, because of course it did. I wrote them to go fine. So I went and found real ones instead. gcc output straight out of WSL: a stripped build, a static build, a shared library. Real Windows system binaries too, notepad.exe and kernel32.dll . I checked every one byte for byte against readelf and objdump until the entry points and export counts lined up exactly. Then I compiled a tiny C++ file. Three lines, a map of vectors, nothing unusual. Its export name came out at 286 characters. That’s what name mangling does to the plainest code without even trying. My import list rendered each name as a small chip, capped with a percentage-based max-width so nothing would run off the page. It did nothing. A grid item won’t shrink below its own content unless you tell it to, and I hadn’t, so the chip just kept going: clipped mid-character, no ellipsis, dragging the whole panel sideways with it. Fine on every file I’d invented. Broken on the first real one I pointed it at. AI helped with the writing and most of the parsing code, same as always. The real time went into finding bytes I hadn’t written myself to test it against, a real compiler, a real linker, a symbol nobody designed to be readable. Testing against your own fixtures only ever proves the code agrees with itself. Next up: Windows registry hives, for tracing which USB stick was plugged in when.
Now live at https://trawlctf.vercel.app
Trawl has just been shipped!
Ships:
Trawl Trawl is a CTF toolkit for checking suspicious files, encoded text, binaries, and challenge websites from one place. In a CTF, you often get an image, audio file, string, or binary and have to figure out what is hidden inside it. Usually that means opening a bunch of different tools and already knowing what to try. Trawl tries to make that easier. You give it the challenge, and it runs checks that make sense for that input. Try it Live: trawlctf.vercel.app Source: github.com/Yuv1s/Trawl The easiest way to test it: Open the site. Click Tour . Trawl loads a sample file with a hidden flag. Watch the checks run and see what finds it. There are also more sample files under Demos , so you do not need your own CTF challenge. What it can do Trawl has 19 main checks in the web app. It can: inspect PNG, BMP, GIF, JPEG, and WAV files for hidden data check image and audio bits show image bit planes and audio spectrograms find metadata, readable strings, embedded files, and hidden file data inspect ZIP files and PDF structure inspect ELF and PE binaries unwrap encoded text such as base64 and hex solve several common classical ciphers collect useful findings and detected flags in one results panel There is also an optional local web scanner called Remora. It can crawl a CTF website, inspect pages, scripts, headers, and resources, then send useful findings back to Trawl. How it works Most of the analysis is written in Rust and compiled to WebAssembly. The frontend is built with SvelteKit. For normal file and text analysis, the input stays in your browser instead of being uploaded to a server. No account is needed, and the app can keep working offline after it loads. Remora is separate because website scanning needs network access. It runs locally on your computer and connects to the target you give it. I also wrote the analysis and file parsing code instead of relying on existing analysis libraries. The Rust core uses wasm-bindgen to connect Rust to JavaScript. Why I built it The annoying part of CTF forensics was having lots of separate tools and needing to know which one to use before I even understood the challenge. I wanted something where I could drop in the file first and get a useful starting point. I also added the tour and demo files so someone who has never used Trawl can still open the site and understand what it does. What took the most work A big part of the work was avoiding false positives. A detector that marks everything as suspicious is not useful, so I made test files where I knew what was hidden and clean files where nothing should be found. I also tested the ELF and PE parsers with real binaries and compared results with tools like readelf and objdump . One bug I found was that Trawl correctly detected a flag inside a GIF, but the result was stored in the wrong place, so it never appeared in the UI. That pushed me to test the full path from reading the file to actually showing the result. What I learned I learned a lot about image formats, audio samples, compression, steganography, classical cryptography, binary formats, WebAssembly, browser limits, and local networking. The biggest lesson was that finding the answer in code is only part of making a useful tool. The result also has to be tested, understandable, and easy to find....
|
1792878662.1165133
|
1793742662.1165133
|
|
38366
|
PyFi by @Choc0latesauce | Stardance
|
Choc0latesauce
|
1
|
23.0
|
339
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-10T21:33:25Z", "hours": 23.0, "multiplier": 14.54, "payout": 339, "blessing": "neutral", "text": "I want to preface this with the fact that I am so grateful for this community and what it does for getting kids into stem, I wish I knew about hack club earlier! Thank you so much for bothering to read this too reviewers! This is my first ever mega project, it took a lot of reading, learning, trial and error and many, many hours troubleshooting. But the end result is something I’m genuinely proud of, actually use and want to show to the world! So here’s the description I cooked up: The Pitch: Do you like listening to music? - Most likely. Are you fed up with money hungry billionaires pilfering your wallet in order for you to listen to your tracks in an accessible way? - Most Likely. Do you want to actually OWN your music but not have to faff around with awful UI and/or optical media? - Most Likely… Then you need PyFi! My Spotify or Apple Music esque mp3 player that allows you to listen to your music and actually own it all while having a sleek and intuitive user and familiar interface and is chocked full of useful features. The Features: 📱 Intuitive & customisable UI - Anything as long as it’s blue, red, yellow, pink, green, purple or turquoise! ♾️ Infinite upload potential - Upload single song or whole albums in one go, all of which are cataloged by the: 🖼️ PyFi meta ripper™ - Pulls album info, artist info and thumbnails from your tracks in order to organise them automatically. 🔀 Shuffle - Pretty self explanatory, shuffles songs innit… 🔁 Song looper - Loops songs! 🔊 Volume slider - Easy In-App audio control 🎼 Current playlist viewer - Allows you to see upcoming songs and reorder them by dragging them 📌 Pin window - Pin the window ontop of others which goes well with: 🪟 Scalable window - Have as much or as little info as you want, go from a full Spotify like view to a minimal one - more later. 📚 Library view - View your uploaded albums in an easy format and load their tracks or play your custom playlist made using: 💖 The favourite button - Favourite your songs in order to add them to a custom playlist that you can use at any point. 🎵 EQ mode - Wanna change how your music sounds? Choose from 20 custom EQ presets. 💾 Persistence - PyFi makes use of .json files in order to save your settings and media between sessions. 🗄️ External storage support - Allows you to use external storage including USB sticks and NAS servers, saving between disconnects. 🌐 Multi Language support - Almost full translations of both Spanish and Swedish", "repo": "https://github.com/Choc0latesauce/PyFi", "demo": "https://github.com/Choc0latesauce/PyFi/releases"}]...
|
[{"post_id": 65608, "ts": "202 [{"post_id": 65608, "ts": "2026-09-10T20:58:24Z", "hours": 0.6931, "text": "Wait? That wasn’t the final devlog?!?! 😱 I fixed a couple of last minute bugs and worked on multiple ways for you to download and use PyFi! IT’S ABOUT TO RELEASE OMG I’M SO EXCITED Don’t really have an image so here’s a blahaj"}, {"post_id": 65258, "ts": "2026-09-10T08:11:57Z", "hours": 3.7553, "text": "The final update!!! So what’s new? I have massively optimised PyFi, speeding up initial launch times and preventing crashes. fully implemented the favourite tracks function so a user can easily make a custom playlist. Which ties into the album viewer, allowing the user to view their uploaded albums, select and play them specifically or play their favourite / all tracks. All of which is saved to a .json file making it persistent between app launches. I’m very very happy that PyFi is now complete and I’m very excited to see what you guys think! Known bugs?!? -> A couple of the Ui elements haven’t been translated, this will come in a later update as I pride myself on having actual human translators, but at the same time I’m kinda rushing to get this out lol."}, {"post_id": 62904, "ts": "2026-09-06T13:17:35Z", "hours": 6.0633, "text": "After A long hiatus I have produced the biggest update to PyFi so far! Coming with ui improvements, dynamic song location saving and persistence (allowing it to read songs from a network drive or USB stick, etc, and saves the locations in such a way that at any point in the future you can reconnect the storage and it will auto load the songs again), the framework for album creation and viewing, language improvements and refinement as well as the ability to drag songs to reorder them in the playlist viewer plus a bunch of other stuff I did a while ago that I quite frankly, cannot remember lol. I’m very excited as PyFi is almost feature complete!"}, {"post_id": 50476, "ts": "2026-08-19T17:17:57Z", "hours": 3.9461, "text": "Absolutely gargantuan update today! First of all, I fixed formatting and text for the labels and volume slider. Fixed a few bugs surrounding the album art being displayed. Added in a playlist viewer like Spotify and such which displays the tracks, album art and artists. I added a settings json file that PyFi saves to in order to save all of your settings to in order to make them persistent between sessions. Another feature / happy coincidence, Pyfi is compatible with Network Attached Storage, being able to pull and do playback from one. I want to add the ability for song locations to be saved between sessions so you don’t have to upload the songs every time you launch, fixed the formatting of album art, make it so the playlist viewer actually tells you what track is selected and a full album uploader / viewer incorporating the Favourite button."}, {"post_id": 48413, "ts": "2026-08-16T19:06:41Z", "hours": 3.7608, "text": "A big update this time! While this isn’t the best example, PyFi is now able to pull album art from mp3s and other such formats and display it like Spotify or Apple Music. I have also added various other new features such as the ability to change the Ui language within PyFi to English, Spanish, French, Hungarian or Swedish currently supported and translated accurately (not by translate!). The user is now able to select from a wide range of Ui colour options to style PyFi to their liking with font styles possibly being an option in the future. I have also added support for EQ settings and presets, allowing the user to select from a wide range of options such as Classical, Techno, Bass boost and many, many more to customise their listening experience to their exact preference. A minor change but I have changed the next and previous buttons to be icons until you hover over them, at which point they display text telling the user what the button does. Finally and most importantly I have added a playback scrubber and playtime, allowing users to select specific parts of their songs to listen to and track how long is left."}, {"post_id": 46587, "ts": "2026-08-13T22:29:51Z", "hours": 1.0794, "text": "PyFi now actually plays audio files! Using vlc as a framework, the user is able to provide an audio file (of almost any variety) and PyFi can play it back, even with a functional volume slider."}, {"post_id": 46540, "ts": "2026-08-13T20:46:01Z", "hours": 2.8436, "text": "Improving on ui design and scalability, including adding support for a dynamic amount of frames and window sizes. Improved the outputs from the buttons and tickboxes and buttons as well as making it so the play/pause button actually changes text whenever you click it to represent what it will do. I also added in window pinning functionality that allows the user to pin PyFi above all of their other apps easily and unpin it all the same."}, {"post_id": 35287, "ts": "2026-07-26T16:25:21Z", "hours": 1.1694, "text": "I am creating a python based music and mp3 listening software that is a from the ground up remake of a basic mp3 player I made a year or 2 ago with increased functionality and an updated, modern UI. Here I am practicing and blocking out the UI with customtkinter, something that I have never used before (I used pygame for the last one) but am finding very intuitive and useful. I am able to add check boxes and buttons that can have custom outputs as shown in the terminal, I can’t wait to do more! The UI also scales perfectly to any resolution and window size, something I learnt was very important from my first html project lol"}]...
|
Title: PyFi by @Choc0latesauce | Stardance
Devlog Title: PyFi by @Choc0latesauce | Stardance
Devlogs:
I am creating a python based music and mp3 listening software that is a from the ground up remake of a basic mp3 player I made a year or 2 ago with increased functionality and an updated, modern UI. Here I am practicing and blocking out the UI with customtkinter, something that I have never used before (I used pygame for the last one) but am finding very intuitive and useful. I am able to add check boxes and buttons that can have custom outputs as shown in the terminal, I can’t wait to do more! The UI also scales perfectly to any resolution and window size, something I learnt was very important from my first html project lol
Improving on ui design and scalability, including adding support for a dynamic amount of frames and window sizes. Improved the outputs from the buttons and tickboxes and buttons as well as making it so the play/pause button actually changes text whenever you click it to represent what it will do. I also added in window pinning functionality that allows the user to pin PyFi above all of their other apps easily and unpin it all the same.
PyFi now actually plays audio files! Using vlc as a framework, the user is able to provide an audio file (of almost any variety) and PyFi can play it back, even with a functional volume slider.
A big update this time! While this isn’t the best example, PyFi is now able to pull album art from mp3s and other such formats and display it like Spotify or Apple Music. I have also added various other new features such as the ability to change the Ui language within PyFi to English, Spanish, French, Hungarian or Swedish currently supported and translated accurately (not by translate!). The user is now able to select from a wide range of Ui colour options to style PyFi to their liking with font styles possibly being an option in the future. I have also added support for EQ settings and presets, allowing the user to select from a wide range of options such as Classical, Techno, Bass boost and many, many more to customise their listening experience to their exact preference. A minor change but I have changed the next and previous buttons to be icons until you hover over them, at which point they display text telling the user what the button does. Finally and most importantly I have added a playback scrubber and playtime, allowing users to select specific parts of their songs to listen to and track how long is left.
Absolutely gargantuan update today! First of all, I fixed formatting and text for the labels and volume slider. Fixed a few bugs surrounding the album art being displayed. Added in a playlist viewer like Spotify and such which displays the tracks, album art and artists. I added a settings json file that PyFi saves to in order to save all of your settings to in order to make them persistent between sessions. Another feature / happy coincidence, Pyfi is compatible with Network Attached Storage, being able to pull and do playback from one. I want to add the ability for song locations to be saved between sessions so you don’t have to upload the songs every time you launch, fixed the formatting of album art, make it so the playlist viewer actually tells you what track is selected and a full album uploader / viewer incorporating the Favourite button.
After A long hiatus I have produced the biggest update to PyFi so far! Coming with ui improvements, dynamic song location saving and persistence (allowing it to read songs from a network drive or USB stick, etc, and saves the locations in such a way that at any point in the future you can reconnect the storage and it will auto load the songs again), the framework for album creation and viewing, language improvements and refinement as well as the ability to drag songs to reorder them in the playlist viewer plus a bunch of other stuff I did a while ago that I quite frankly, cannot remember lol. I’m very excited as PyFi is almost feature complete!
The final update!!! So what’s new? I have massively optimised PyFi, speeding up initial launch times and preventing crashes. fully implemented the favourite tracks function so a user can easily make a custom playlist. Which ties into the album viewer, allowing the user to view their uploaded albums, select and play them specifically or play their favourite / all tracks. All of which is saved to a .json file making it persistent between app launches. I’m very very happy that PyFi is now complete and I’m very excited to see what you guys think! Known bugs?!? -> A couple of the Ui elements haven’t been translated, this will come in a later update as I pride myself on having actual human translators, but at the same time I’m kinda rushing to get this out lol.
Wait? That wasn’t the final devlog?!?! 😱 I fixed a couple of last minute bugs and worked on multiple ways for you to download and use PyFi! IT’S ABOUT TO RELEASE OMG I’M SO EXCITED Don’t really have an image so here’s a blahaj
Ships:
I want to preface this with the fact that I am so grateful for this community and what it does for getting kids into stem, I wish I knew about hack club earlier! Thank you so much for bothering to read this too reviewers! This is my first ever mega project, it took a lot of reading, learning, trial and error and many, many hours troubleshooting. But the end result is something I’m genuinely proud of, actually use and want to show to the world! So here’s the description I cooked up: The Pitch: Do you like listening to music? - Most likely. Are you fed up with money hungry billionaires pilfering your wallet in order for you to listen to your tracks in an accessible way? - Most Likely. Do you want to actually OWN your music but not have to faff around with awful UI and/or optical media? - Most Likely… Then you need PyFi! My Spotify or Apple Music esque mp3 player that allows you to listen to your music and actually own it all while having a sleek and intuitive user and familiar interface and is chocked full of useful features. The Features: 📱 Intuitive & customisable UI - Anything as long as it’s blue, red, yellow, pink, green, purple or turquoise! ♾️ Infinite upload potential - Upload single song or whole albums in one go, all of which are cataloged by the: 🖼️ PyFi meta ripper™ - Pulls album info, artist info and thumbnails from your tracks in order to organise them automatically. 🔀 Shuffle - Pretty self explanatory, shuffles songs innit… 🔁 Song looper - Loops songs! 🔊 Volume slider - Easy In-App audio control 🎼 Current playlist viewer - Allows you to see upcoming songs and reorder them by dragging them 📌 Pin window - Pin the window ontop of others which goes well with: 🪟 Scalable window - Have as much or as little info as you want, go from a full Spotify like view to a minimal one - more later. 📚 Library view - View your uploaded albums in an easy format and load their tracks or play your custom playlist made using: 💖 The favourite button - Favourite your songs in order to add them to a custom playlist that you can use at any point. 🎵 EQ mode - Wanna change how your music sounds? Choose from 20 custom EQ presets. 💾 Persistence - PyFi makes use of .json files in order to save your settings and media between sessions. 🗄️ External storage support - Allows you to use external storage including USB sticks and NAS servers, saving between disconnects. 🌐 Multi Language support - Almost full translations of both Spanish and Swedish...
|
1793339635.831957
|
1793426035.831957
|
|
51603
|
Game by @EllaZ | Stardance
|
EllaZ
|
0
|
0.38
|
0
|
[]
|
[{"post_id": 65609, "ts": "202 [{"post_id": 65609, "ts": "2026-09-10T21:00:17Z", "hours": 0.375, "text": "Working on assetes for the game currently. Here’s a ss of the cat with it’s mouth open to shoot stuff."}]...
|
Title: Game by @EllaZ | Stardance
Devlogs:
Workin Title: Game by @EllaZ | Stardance
Devlogs:
Working on assetes for the game currently. Here’s a ss of the cat with it’s mouth open to shoot stuff....
|
1793397366.9850683
|
1794002166.9850683
|
|
34143
|
Spectralis by @DeltaVortex | Stardance
|
DeltaVortex
|
2
|
332.84
|
4092
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T05:56:33Z", "hours": 236.0, "multiplier": 16.89, "payout": 3884, "blessing": "neutral", "text": "Spectralis shiplarp 2 — Stardance —wuzzup guys— So much has happened since shiplarp 1 and I cannot wait to not break down what changed. I will. I’m lazy. Not right now though. Cat or dog? redeem_code.claim() —the celebration— We’ve gone through so many changes since last time that it deserves an actual celebration: a very cool, very awesome custom visualizer for Stardance. Claim yours: Help > Manage Visualizers, then redeem stardance-lts-pulp . —found a bug?— Including the dreaded Tim Cook issues — DM me: Discord: @deltav0rtex Slack: deltavortex Can’t wait to hear the feedback and all the bugs you dig up. —this is the end*— *end for now, redeem codes permitting YIPEE!!!", "repo": "https://github.com/Dareto-Dream/Spectralis", "demo": "https://spectralis.deltavdevs.com"}, {"ship_num": 2, "ts": "2026-08-14T06:50:58Z", "hours": 23.0, "multiplier": 12.89, "payout": 208, "blessing": "neutral", "text": "Spectralis shiplarp — v5.3.0 —shipped it— Notepads. A spin wheel. Dead zones that aren’t OBS-only anymore. Playlists that don’t look like a log file. Spotify that actually behaves. That’s the version. —what’s in it— Notepad system: docked panel, tabs, pop-out window, saves to track tags Spin wheel: weighted entries, saved wheel lists, notepad-fed Dead zones now shift the app’s own layout, not just OBS overlays Spotify: playlist sync, queue, pause, and Discord presence all fixed Fixed: playlist rows missing RowBackground (looked like a terminal, my bad) Fixed: nav rebuilding the entire view every click Fixed: library load blocking window open on big libraries Fixed: spectrum bars snapping instead of moving (FFT overlap bumped to 75%) Fixed: soundcloud playhead, word-mode timestamp export, track-switch click/pop —that’s it— PICKLE!!!", "repo": "https://github.com/Dareto-Dream/Spectralis", "demo": "https://spectralis.deltavdevs.com"}]...
|
[{"post_id": 65615, "ts": "202 [{"post_id": 65615, "ts": "2026-09-10T21:10:25Z", "hours": 9.8333, "text": "Spectralis devlog #44 —Hello again proggers— Did it. Fixed a genuine ton of bugs, following through on the mess from devlog #43. Tempted to just drop 6.1.0 right now, but holding off — want to get a few new features in and brainstorm some more QoL first so this actually feels like a finished product, not just a stopgap. Also: finally going to bed. the bar was “fix the bugs” and I cleared it, going higher anyway Cat or dog? sleep(∞) Okay let’s get into it~ —Yap— Real closure on the websocket/CDN/prod chaos from last devlog. Cleared out a lot in one sitting, and instead of rushing 6.1.0 out the door on relief alone, choosing to actually sit with it a bit longer. —The Great Suffering— 1 — The Bug Backlog, Actually Cleared Worked through the fallout from devlog #43 — websocket issues, the CDN backup failures, all of it — and got a genuine ton of it fixed in one real pass instead of piecemeal patching. 2 — Holding Off On 6.1.0, On Purpose Could ship right now. Choosing not to. Want to work in a few new features and brainstorm more QoL first, so the release feels complete rather than just “the bugs are gone, ship it.” Patience over momentum this time. 3 — Finally Going To Bed After devlog #43’s two-days-no-sleep spiral, actually calling it and going to bed now. Today off is finally getting used the way it was supposed to be used. the sleep debt collector finally caught up —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to get real sleep for the first time in a while. Q: Why not just ship 6.1.0 now if the bugs are fixed? A: Because “bug-free” and “actually done” aren’t the same bar, and this one’s worth clearing the second one too. Q: Was this the same chaos from devlog #43? A: Same fires, all put out this round. Q: What kind of new features are being considered? A: Not locked in yet — that brainstorming is the next step, not this devlog. Q: Sleep status, finally? A: Handled. Going now. —This is the end*— *end for now, actual sleep permitting PLAY!!!"}, {"post_id": 65271, "ts": "2026-09-10T08:34:54Z", "hours": 2.5, "text": "Spectralis devlog #43 —Hello again proggers— [2:47am] okay so. websockets again, more of them, and now the CDN backup is failing too which is great, love that for me. on my 4th coffee at this point, energy drink count is starting to get concerning honestly and I’m not gonna pretend it isn’t. pretty sure i debugged the cdn thing at 4am purely out of spite Cat or dog? idk man catch (Exception e) { } at this point Okay let’s get into it, or at least try to~ —Yap— so continuing from devlog #42’s websocket hardening, turns out hardening one part just revealed the next part was also fragile, shocking, anyway. need to push something to prod to actually get it working but can’t do that without interrupting infra which is currently live so that’s a whole separate problem I have to solve first before I can solve the actual problem. love layers. —The Great Suffering— 1 — More Websocket Issues more of them. found while poking at the hardening from last devlog. not sure if figuring this part out took 20 minutes or 3 hours honestly, time’s doing something weird tonight. 2 — CDN Backup Is Failing on top of the websocket stuff, cdn backups just started failing too. not connected to each other as far as i can tell but who knows at this point, everything feels connected at 3am. 3 — Need To Push To Prod, Can’t Without Interrupting Infra the actual fix needs to go to prod but pushing it right now means interrupting live infra, which i don’t want to do blind, so now i need a plan for THAT before the real fix even goes out. process problem wrapped around the actual problem, great. 4 — Shared Play Is Doing The AI-Look Thing Again noticed shared play’s UI is drifting into the same generic-AI-looking territory the main site kept getting flagged for back in devlog #21-#24. damn. gonna have to redo that too. not tonight though, one disaster at a time. 5 — Oh And I Found A Missing Semicolon spent a genuinely embarrassing amount of time on a bug that turned out to be a missing semicolon. send help. actually don’t, just let me suffer, i clearly deserve it at this hour. 6 — No Sleep For 2 Days, Hitting Now it’s catching up. hard. luckily got tomorrow off so plan is stay up tongiht finish this, and just completely pass out tomorrow instead. worth it. probably. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: a human programmer. you. the one reading this at whatever hour you’re reading it, hopefully not also running on 2 days no sleep Q: Is the websocket hardening from #42 actually working? A: mostly? finding more edge cases as i go, which is annoying but also kind of expected honestly Q: Why can’t you just push to prod now? A: because infra’s live and i don’t want to interrupt it blind, need an actual plan for that part first Q: Is shared play getting a full redesign again? A: yeah probably, later though, not adding a 4th fire to tonight Q: Sleep plan? A: none tonight, all of it tomorrow, that’s the whole plan —This is the end — *end for now, semicolons permitting send sleep!!!"}, {"post_id": 65216, "ts": "2026-09-10T06:03:36Z", "hours": 9.7103, "text": "Spectralis devlog #42 —Hello again proggers— Spent this round hardening shared queues, mostly because WebSockets are just genuinely cool and it’s about time they got treated that way in this codebase. a devlog motivated entirely by “websockets are cool” is a valid devlog Cat or dog? ws:// Okay let’s get into it~ —Yap— Shared queues have been functional but not particularly resilient this whole time, riding on shared play’s presence/reactions/queue work from way back in devlog #9. This round was about actually hardening that layer instead of leaving it fragile. —The Great Suffering— 1 — Hardening Shared Queues Went through and shored up a bunch of the underlying bases for shared queues — the stuff that only matters once real connections are dropping, reconnecting, and behaving unpredictably instead of the clean happy-path test case. 2 — Because WebSockets Are Cool Genuinely part of the motivation here. Real-time bidirectional connections are just satisfying to get right, and shared queues are exactly the kind of feature that benefits from taking that layer seriously instead of treating it as plumbing. not every feature needs a dramatic bug story, sometimes it’s just “wanted to do it well” —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one hardening infrastructure purely because it’s fun to get right. Q: Is this related to the shared play work from devlog #9? A: Same general system, this round focused specifically on making the queue layer more resilient. Q: What does “hardening” mean here specifically? A: Making the shared queue behavior hold up better under real conditions — drops, reconnects, timing edge cases — rather than just the clean test path. Q: Any bugs found during this pass? A: Nothing dramatic enough to call out individually, mostly proactive resilience work. Q: What’s next? A: Podcast mode and the randomizer work from devlog #41 are both still ongoing threads. —This is the end*— *end for now, dropped connections permitting P_P!!!"}, {"post_id": 64674, "ts": "2026-09-09T08:17:56Z", "hours": 5.2669, "text": "Spectralis devlog #41 —Hello again proggers— Podcast mode’s in the works, with a real new way to actually find saved podcasts instead of digging for them. Also fixed the randomizing tools so they actually help pick a song instead of just existing decoratively. And: class got canceled for a hurricane watch, so tonight’s an all-nighter by default. free 10 hours courtesy of a hurricane, weird way to get them Cat or dog? shuffle(weighted=True) Okay let’s get into it~ —Yap— Two real features this round plus a forced schedule change. Podcast mode’s genuinely new territory for the app, the randomizer fix is a smaller but meaningful UX improvement, and the hurricane watch just handed over a full night that wasn’t originally planned for grinding. —The Great Suffering— 1 — Podcast Mode, In Progress Building out actual podcast support, including a new way to locate saved podcasts rather than just treating them like any other track and hoping they surface in the right place. Real new territory for the app compared to the music-first feature set so far. 2 — Randomizing Tools, Actually Useful Now The shuffle/randomizer tools existed before but weren’t really doing anything meaningful — mostly there in name. Fixed so they actually aid in song selection now instead of just sitting there as a checkbox nobody trusted. a randomizer that doesn’t actually help you pick anything is just decoration 3 — The Hurricane Watch Situation Class got canceled due to a hurricane watch, which means tonight’s turning into a full grind session that wasn’t originally on the calendar. Silver lining of a weather delay, I suppose. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one getting a bonus grind night courtesy of a hurricane watch. Q: Is podcast mode close to done? A: In progress, this devlog’s the early build phase, not the finish line. Q: What was actually wrong with the randomizer before? A: It existed but didn’t meaningfully help pick songs — more decorative than functional. Fixed to actually aid selection now. Q: Is Song Wars rework from devlog #40 still going? A: Ongoing, this devlog’s focus shifted to podcast mode and the randomizer instead. Q: Stay safe with the hurricane watch, by the way. A: Appreciated. Staying inside, staying coding. —This is the end*— *end for now, hurricane watches permitting POOL!!!"}, {"post_id": 64588, "ts": "2026-09-09T03:01:20Z", "hours": 10.0, "text": "Spectralis devlog #40 —Hello again proggers— 10 straight hours, and the highlight is getting tricked by Suno’s own scraper path. There was a decoy path that looked exactly like the real music endpoint, and it just returned forbidden the whole time. Maybe I’m the bot in this scenario. Unclear. got outsmarted by a decoy URL, humbling Cat or dog? 403 Forbidden Okay let’s get into it~ —Yap— Continuing the reverse-engineering grind from devlog #39, Suno specifically threw a curveball this round. Beyond that, spent real time thinking about what the app actually is and why certain features exist, plus started tearing into Song Wars, which has apparently been quietly buggy for a while. —The Great Suffering— 1 — The Suno Decoy Path Suno provides a path that looks exactly like the real music endpoint, structurally identical, right down to how it responds at a glance. In reality it just returns forbidden every time. Spent real time thinking this was progress before realizing it was a dead end dressed up as a working one. maybe im the bot 2 — Actually Fixed It, After Testing Once the decoy was identified for what it was, found the real path and got it working properly. Testing it thoroughly this time before calling it done, given how devlog #39 went. 3 — Identity Of The App Spent real time thinking through what Spectralis actually is at this point, and justifying why certain features exist rather than just accumulating them because they seemed cool at the time. Less code, more “why does this exist and does it still make sense.” 4 — Song Wars Rework, Started Started tearing into Song Wars, which turns out to be hella buggy underneath. Early stages of a rework rather than a patch job, since patching individual bugs in it hasn’t been holding up. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who got fooled by a decoy API path for a while. Q: Was the Suno issue related to the S3 discovery from devlog #38? A: Same general integration, different specific obstacle this round. Q: Is Song Wars getting a full rewrite or just fixes? A: Leaning toward a real rework rather than more patches, given how buggy it’s turned out to be. Q: What does “identity of the app” work actually produce? A: Not code directly — more a filter for which features actually belong and why, going forward. Q: How’s the 10 hour grind treating you? A: Productive despite the decoy detour. Real progress by the end of it. —This is the end*— *end for now, decoy paths permitting PAP!!!"}, {"post_id": 64321, "ts": "2026-09-08T16:38:31Z", "hours": 11.5997, "text": "Spectralis devlog #39 —Hello again proggers— All-nighter, running on 3 Monsters and a Coke Zero. Reverse engineering APIs is hard as hell, and untitled.stream in particular fought back the whole way. Also snuck in a fix for a Spotify library issue on the side. 3 Monsters and a Coke Zero is not a nutrition plan, it’s a battle strategy Cat or dog? 429 Too Many Requests Okay let’s get into it~ —Yap— Following up on devlog #38’s untitled.stream compat work — turns out “working on it” undersold how hard it actually was. Genuinely brutal reverse engineering session, plus a smaller fix that came out of the same stretch of work. —The Great Suffering— 1 — untitled.stream Was Particularly Hard To Crack Chasing this compatibility since devlog #38, and it turned out to be one of the harder reverse-engineering targets yet. No public API to lean on, so it was the usual slow grind of observing behavior and piecing together how it actually works under the hood. some APIs give up easy, this was not one of them 2 — Reverse Engineering APIs In General: Still Hard Not a new lesson given devlog #17’s whole saga, but worth restating: this category of work is consistently the hardest and slowest kind on the whole project. Going in with better patience and verification habits this time though, which helped. 3 — Spotify Library Polling, Increased Bumped how often libraries get polled to account for some Spotify-side issues that were surfacing. Smaller fix, but a real one, found and shipped in the same session. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who ran on three energy drinks to crack one integration. Q: Is untitled.stream compat actually working now? A: Meaningfully further along after this session, following up from devlog #38’s start on it. Q: Did this go better than devlog #17’s reverse-engineering disaster? A: Yes — hard and slow, but productive this time rather than a total dead end. Q: What was the Spotify polling issue specifically? A: Library state getting out of sync too easily — more frequent polling keeps it closer to accurate. Q: Sleep status? A: Same as every other all-nighter devlog. Not great. Worth it this time though. —This is the end*— *end for now, rate limits permitting PIPSQUEAK!!!"}, {"post_id": 64034, "ts": "2026-09-08T05:01:47Z", "hours": 9.5333, "text": "Spectralis devlog #38 —Hello again proggers— Suno’s integration broke after their latest TOS update, so that got fixed. Also added Discord Rich Presence control for capsules, started chasing down a batch of connections that quietly broke or got dropped over time, and picked up a fun trivia fact along the way: Suno apparently hosts on AWS S3. a TOS update breaking an integration, name a more classic story Cat or dog? S3:// Okay let’s get into it~ —Yap— Mixed bag this round: one reactive fix from an external platform change, one genuinely new feature, and the start of a cleanup pass on integrations that have been quietly rotting since whenever they last got touched. —The Great Suffering— 1 — Suno Integration, Fixed Suno’s newest TOS update broke the existing integration. Patched it back up to work with the new terms. Reactive fix, not a fun one, but necessary. 2 — Capsule DRPC Control Real new feature: Spectralis capsules can now control Discord Rich Presence, so a capsule can show custom status while it’s playing instead of the app just showing generic now-playing info. 3 — Chasing Down Broken And Dropped Connections Going through existing integrations that broke with newer updates on the other end, or that got dropped along the way and never revisited — untitled.stream compatibility being one specific example. Working through the backlog of “this used to work” one at a time. 4 — Suno Hosts On AWS S3 Small fun discovery while poking around the integration: Suno’s hosting is on AWS S3. Not actionable, just neat to know. 5 — Looking For New Platforms Actively looking for what to integrate with next. Feedback on what platforms people actually want would genuinely help shape this. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one whose integration broke because someone else updated a TOS page. Q: What’s DRPC? A: Discord Rich Presence — the status shown under someone’s name in Discord. Capsules can now set custom status through it. Q: What’s untitled.stream compat about? A: One of the connections that broke or got left behind at some point — being actively worked back into shape. Q: What platforms are being considered for new integration? A: Not decided yet, genuinely open to suggestions. Q: Was the Suno fix hard? A: Not conceptually, just annoying — an external change forcing reactive work instead of planned work. Q: What’s the image order now? A: Changed my mind again — meme first, app screenshot second this time. The devlog #37 order didn’t stick. —This is the end*— *end for now, TOS updates permitting POP!!!"}, {"post_id": 63804, "ts": "2026-09-07T19:28:07Z", "hours": 15.4, "text": "Spectralis devlog #37 —Hello again proggers— Working through the feedback wave from the ship, including an upcoming maybe-new streaming service integration. Reverse engineering, again, yay. Also completely forgot Hackclub’s 10 hour limit was a thing and ran 5 hours over it. It’s fine. Everything’s fine. last time reverse engineering a streaming service ate 12 hours and produced nothing, so this is either growth or déjà vu Cat or dog? HKEY_LOCAL_MACHINE Okay let’s get into it~ —Yap— Post-ship feedback turned into real changes fast, and one of them’s a streaming service integration that’s back to reverse-engineering territory — hopefully with better luck than the devlog #17 saga. Also, format note: switching up how devlogs get posted going forward. —The Great Suffering— 1 — Maybe New Streaming Service Support Working on possible support for another streaming service, and since it doesn’t have a public API either, that means reverse engineering again. Learned some hard lessons from devlog #17’s all-nighter about this exact kind of work, applying them here — verifying before implementing, checking whether something’s already patched before sinking hours into it. 2 — 15 Hours, Not 10 Completely lost track of Hackclub’s 10 hour session limit and blew past it by 5 hours. Not the plan, happened anyway, no regrets loud enough to stop it from happening again probably. time limits are more of a guideline when you’re mid-flow 3 — A Format Change, By Request People like the meme format but keep asking to actually see the project itself, which is fair — problem is most of what’s happening is engine work, and a screenshot of raw code just doesn’t communicate much on its own. Going to try posting an actual screenshot as the first image and keep the meme as the second, going forward. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just blew past a 10 hour limit by half again as much. Q: Is this streaming integration going to end like devlog #17’s did? A: Hoping not — going in more carefully this time given how that one went. Q: Why not just show code screenshots if people want to see the project? A: Raw engine code doesn’t communicate much visually to most people. Trying to find screenshots that actually show something meaningful instead. Q: Will the meme format go away? A: No, staying as image two. Just adding an actual project screenshot as image one. Q: How’s the feedback wave going overall? A: Productive, this streaming service idea being one direct result of it. —This is the end*— *end for now, session limits permitting POSSIBLE!!!"}, {"post_id": 62666, "ts": "2026-09-06T04:36:39Z", "hours": 9.8669, "text": "Spectralis devlog #36 —Hello again proggers— Last log before 6.0.1 tries to ship to everyone. Except Mac, remember? If anyone — and by anyone I mean basically no one — has the app downloaded already, you should see the update land fairly soon. “anyone” carrying a lot of self-deprecation in that sentence Cat or dog? v6.0.1 Okay let’s get into it~ —Yap— Four things landing in this round: video export from devlog #35 finally patched back in properly, the about page expanded, a real EQ upgrade, and more webview bugs cleared out. Then it’s out the door. —The Great Suffering— 1 — Video Export, Actually Patched In Announced back in devlog #35, and this round it’s actually working and patched into the build for real instead of just existing as a headline feature nobody could touch yet. 2 — About Page, Expanded Grew the about page out — more actual content instead of the bare-minimum version it’s had this whole time. 3 — A Far More Advanced EQ System Real upgrade here: new EQ with envelope styling and a handful of presets. Meaningfully more capable than whatever was there before, for anyone who actually cares about shaping their sound instead of just hitting play. 4 — More Webview Bugs, Patched Following the WebView2Host fast-path fix from devlog #9, a few more webview-related bugs got cleared out this round. Apparently that surface keeps finding new ways to misbehave. webview bugs are the gift that keeps on giving 5 — 6.0.1 Ships, Mac Excluded (Still) Same LTS-only policy from devlog #32 applies — Mac isn’t getting 6.0.1 as a minor. Everyone else should see the update land soon. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to auto-update basically no one to 6.0.1. Q: Why doesn’t Mac get 6.0.1? A: Same policy from devlog #32 — Mac only gets LTS releases, not minors, unless it’s a Mac-specific patch. Q: What’s new in the EQ system specifically? A: Envelope styling plus a set of presets, a real step up from the previous version. Q: Is video export from devlog #35 fully working now? A: Yes, patched in properly this round. Q: When does 6.0.1 land? A: Fairly soon, per this devlog, for anyone who already has the app installed. —This is the end*— *end for now, update pushes permitting PEBBLE!!!"}, {"post_id": 62302, "ts": "2026-09-05T16:34:34Z", "hours": 9.5667, "text": "Spectralis devlog #35 —Hello again proggers— Long way from v5.3.0, that’s for sure. New ship’s cooking, and it’s built directly off the feedback wave from devlog #33 — took what came in and actually built more on top of it. Also, the big one this round: video export is here. 35 devlogs from “last ship” to this Cat or dog? .mp4 Okay let’s get into it~ —Yap— This one’s a real feedback-driven ship, not just internal roadmap stuff. Fed reports and requests all the way back from devlog #2’s post-first-ship feedback into the app, and video export was the headline addition that came out of it. —The Great Suffering— 1 — Feedback Actually Became Features Everything that came in since devlog #2, right after the very first ship, finally got folded back into this release, not just patched as bugs but expanded into more app. Real loop from “here’s what’s wrong/missing” way back then to “here’s it, fixed and built out” now. 2 — Video Export Is Here For music makers who want something to post — YouTube, Klipy, wherever you’re posting cool stuff — Spectralis can now export video directly instead of just playing audio and visualizers live. Been a long time coming given how much the visualizer/capsule work has built up across devlogs #7, #18, #23, and #29-#30. 3 — This Is The New Ship, Not The Finished One Announcing the direction this round more than closing it out — the surprise from devlog #33/#34 still rides along on this too. Full picture coming as it actually ships. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just got a whole export pipeline for their trouble. Q: What can video export actually do? A: Exports your visualizer/capsule output as an actual video file, suited for posting to platforms like YouTube or Klipy. Q: Is this the same ship as the Stardance surprise from devlog #34? A: Same overall release window, yes. Q: How much of this came directly from user feedback? A: A meaningful chunk — some of it going all the way back to devlog #2, right after the very first ship. Q: When’s it actually dropping? A: Still in progress. This is the announcement, not the release. —This is the end*— *end for now, export pipelines permitting PS: couldn’t find a good meme this time, so you get corporate gif slop instead. Enjoy. PICKLE!!!"}, {"post_id": 61350, "ts": "2026-09-04T07:08:42Z", "hours": 7.2333, "text": "Spectralis devlog #34 —Hello again proggers— Still on the devlog commits grind. The surprise from devlog #33 is actually finished now, releasing alongside the next Stardance ship as soon as this current one clears. Meanwhile, spent this round scouring the app for small edge cases and UI stuff that’s been quietly overlooked. the surprise is done, the suspense is not Cat or dog? edge_case.md Okay let’s get into it~ —Yap— Two tracks this devlog: the surprise from last time is locked and ready, waiting on the current ship to clear before it goes out with Stardance. In the meantime, doing a proper sweep for the small stuff — edge cases and UI rough edges that don’t show up unless you’re specifically hunting for them. —The Great Suffering— 1 — The Surprise Is Finished Whatever it is, it’s done. Releasing with the next Stardance ship, not this current one — has to clear first. Still not saying what it is. still not telling you, patience 2 — Scouring For Edge Cases Going through the app specifically looking for edge cases that got missed during normal feature work — the inputs and states nobody thinks to test until something breaks in a very specific, very rare way. 3 — UI Stuff That Got Overlooked Alongside the edge cases, hunting down small UI issues that slipped through — spacing, alignment, states that don’t look quite right, the stuff that’s easy to miss when you’re heads-down building instead of using the app like a regular person would. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one hunting edge cases nobody else would think to try. Q: What’s the surprise? A: Patience, my dear child. Q: Why wait for the current ship to clear first? A: Cleaner to let one release settle before stacking the surprise onto the next one. Q: Any specific edge cases found yet? A: Sweep’s ongoing, nothing dramatic enough to call out individually yet. Q: Still not saying what the surprise is? A: Correct. Ask again next devlog. —This is the end*— *end for now, edge cases permitting PERISHABLE!!!"}, {"post_id": 60763, "ts": "2026-09-03T11:03:52Z", "hours": 5.8667, "text": "Spectralis devlog #33 —Hello again proggers— First real wave of feedback since Mac shipped in devlog #32, and it’s been genuinely good. Patching a handful of bugs people actually pointed out, plus one quick clarification for a specific rater who had a question. real users, real feedback, feels different from testing solo Cat or dog? feedback.md Okay let’s get into it~ —Yap— Shipping to actual people instead of just self-testing changes the kind of bugs that surface. Round of patches based directly on what came in, plus a couple of housekeeping notes. —The Great Suffering— 1 — Real Feedback, First Time At This Scale Genuinely solid feedback wave since the Mac release. Different flavor of bug reports than internal testing ever produces — actual usage patterns finding things a solo QA pass wouldn’t. 2 — Patching What Got Pointed Out Working through the specific bugs raised by that feedback. Direct fixes for direct reports, exactly the kind of loop that’s supposed to happen once something’s actually in people’s hands. 3 — Quick Note For A Specific Rater One rater asked about the track used in devlog #1 — it’s a custom remix of “Delete” by Ninjirachi. DM if you want the file. 4 — How To Reach Out For anyone hitting issues with the app: Slack works, or Discord at @deltav0rtex . Genuinely want the reports, keep them coming. 5 — A Surprise Is Coming Next Ship Got something tucked away for the next release that should land well. Not spoiling it here, staying quiet on purpose. Minor patch for this round’s QoL fixes drops within the next two days. teasing it and saying nothing else, that’s the whole bit —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one actually reading feedback instead of guessing what’s broken. Q: How do I report a bug? A: Slack, or Discord — @deltav0rtex . Q: What was that track in devlog #1? A: A custom remix of “Delete” by Ninjirachi. DM for the file if you want it. Q: Is the current bug list from this feedback wave big? A: Manageable, working through it directly rather than batching for a bigger release. Q: Any plans to formalize a feedback/bug channel later? A: Not stated yet, current setup is DMs and Slack for now. Q: What’s the surprise for next ship? A: Not saying. That’s the point of a surprise. Q: When’s the minor QoL patch dropping? A: Within the next two days. —This is the end*— *end for now, bug reports permitting PARABLE!!!"}, {"post_id": 60643, "ts": "2026-09-03T04:06:16Z", "hours": 3.4, "text": "Spectralis devlog #32 —Hello again proggers— Mac’s out. Actually out, actually available, actually done. Took way longer than expected — the site needed updating and every single update script needed fixing before this could actually go out the door clean. “we got mac out” undersells how much site and script work that actually took Cat or dog? .pkg Okay let’s get into it~ —Yap— Closing the loop that started way back in devlog #19 with a borrowed Mac and a hopeful “fingers crossed,” went through the decoding fixes in devlog #28, the platform-assumption hotfix in devlog #26, and now it’s actually shipped. Quick policy reminder while we’re here, since it matters going forward. —The Great Suffering— 1 — The Site Needed Updating First Before Mac could actually go out, the site itself needed real updates to reflect it — new download option, new platform messaging, none of which existed yet. Took a real chunk of the time this release ate. 2 — Every Update Script Needed Fixing Following up on the Windows/Linux-centric script assumptions caught back in devlog #26 — turns out that wasn’t a one-off fix, it touched update scripts broadly. Had to go through and fix them properly for Mac to actually be able to update itself going forward, not just install once. 3 — Mac Is Actually Out After all of that: it’s live. Full journey from borrowed hardware sessions to an actual public release. 4 — Reminder: Mac Only Gets LTS Quick policy note, stated plainly since it matters: Mac only receives LTS releases going forward, not minor updates, unless a minor is a Mac-specific patch. Same access-constraint reasoning from devlog #19 — this isn’t changing anytime soon, so setting the expectation clearly now. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out “ship Mac” secretly meant “rebuild the update pipeline.” Q: Does Mac get every LTS release? A: Yes, every LTS. Just not the minors in between, unless that minor is Mac-specific. Q: Why not give Mac full parity now that it’s out? A: Hardware access is still the bottleneck — same reasoning as devlog #19, testing and building for Mac isn’t a routine, always-available thing yet. Q: What took so long between the decoding fixes in devlog #28 and now? A: Mostly the site and update script work described above — the actual build was closer to ready than the delivery pipeline around it was. Q: Is this the end of the Mac saga? A: The release side, yes. Ongoing maintenance is just going to follow the LTS-only cadence from here. —This is the end*— *end for now, update scripts permitting POP!!!"}, {"post_id": 59211, "ts": "2026-08-31T21:37:18Z", "hours": 9.9, "text": "Spectralis devlog #31 —Hello again proggers— More QoL, a real bug fixed in world editing, and a proper in-depth test run of the whole thing. Honest verdict after actually using it for real: still sucks, still hate it, but it’s at least somewhat usable now. Progress, technically. “somewhat usable” is a real milestone when you started from “actively bad” Cat or dog? node.isCorrupt Okay let’s get into it~ —Yap— World editing’s been the newer, rougher part of the studio since the Godot-inspired redesign in devlog #29. This round was about actually running it through its paces instead of just building on top of it, and that testing found a real problem. —The Great Suffering— 1 — More QoL Another pass of small quality-of-life improvements, continuing the trend from the last couple devlogs. Nothing individually huge, all of it adds up. 2 — The Bad Node Bug Found and fixed a genuinely bad node bug in the world section during testing. The kind of bug that only shows up once you’re actually building real worlds instead of poking at an empty editor. 3 — The In-Depth Test Run Took world editing for a real, thorough run this time instead of a quick sanity check. Built something with actual substance in it and used the tool the way it’s meant to be used. 4 — The Honest Verdict Still sucks. Still hate using it. But after this round of fixes and QoL, it’s crossed into “somewhat usable” territory, which is more than could be said before this session. low bar, cleared, moving on —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just admitted their own tool still sucks and shipped it anyway. Q: Is world editing done now? A: No, “somewhat usable” is the current state, not “finished.” More work ahead. Q: How bad was the node bug? A: Bad enough to matter, found through actual real-world testing rather than a quick check. Q: Is this related to the layer work from devlog #30? A: Different area — that was capsules/timeline, this is world editing specifically. Q: What’s the plan to make world editing not suck? A: Keep testing it for real, keep fixing what that testing turns up. This devlog’s the start of that loop, not the end. —This is the end*— *end for now, corrupted nodes permitting PAPLE!!!"}, {"post_id": 58336, "ts": "2026-08-30T18:33:09Z", "hours": 9.3333, "text": "Spectralis devlog #30 —Hello again proggers— Following up on the studio redesign from last devlog — actually building inside that new layer system now. Lyric importer, a bezier tool that fought back the whole way, and capsules jumped to full HD. 30 devlogs in and the bezier tool still almost won Cat or dog? bezier.controlPoint Okay let’s get into it~ —Yap— Layers from devlog #29’s redesign got real functionality built on top of them this round, plus a genuinely useful new import path and a resolution bump that should’ve probably happened earlier. —The Great Suffering— 1 — Layer Fixes Cleaned up a handful of issues in the new After Effects-style layer system from last devlog — the kind of rough edges that only show up once you’re actually building real content in it instead of just looking at the layout. 2 — Lyric Importer: Auto Vector Layers + Keyframing New importer that takes lyric timing and automatically generates vector layers, keyframed to match. Turns what used to be manual layer-by-layer, keyframe-by-keyframe setup into an actual import step. Big time save for anything lyric-driven, including future capsules like the demo from devlog #18. 3 — A Few More Bugs, Squashed Small round of additional fixes alongside the bigger items, nothing individually dramatic. 4 — Capsule Resolution: Bumped To Full HD Capsules render at full HD now instead of whatever lower resolution they were capped at before. Straightforward upgrade, noticeably better output. 5 — The Bezier Tool (Which Was Hell) Added a real bezier curve tool to the timeline/layer editing. Genuinely brutal to get right — curve math, control point handling, and making it feel intuitive to actually drag are three different hard problems stacked on top of each other. Worth it, but it fought back the whole way. bezier curves: simple in theory, a nightmare in an actual editor UI 6 — Timeline And Tool QoL Assorted quality-of-life improvements across the timeline and tools generally — the small friction-reduction stuff that adds up once you’re using the studio for real work instead of just testing it. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just fought a bezier tool and mostly won. Q: Does the lyric importer work with the demo capsule from devlog #18? A: That one was hand-timed and hand-built before this importer existed — this tool’s for making the next ones faster. Q: Why was the bezier tool specifically so hard? A: Curve math, control point interaction, and UI feel all had to work together, and getting any one of them wrong makes the whole tool feel broken. Q: Is full HD the resolution ceiling now, or is higher coming later? A: Full HD is what shipped this round. No commitment yet on going higher. Q: Is the studio redesign from devlog #29 basically done now? A: Getting real functionality built on it, which is a good sign, but still ongoing. —This is the end*— *end for now, control points permitting PALPABLE!!!"}, {"post_id": 57958, "ts": "2026-08-30T09:12:42Z", "hours": 9.7667, "text": "Spectralis devlog #29 —Hello again proggers— The studio’s finally looking like a real UI tool instead of a collection of windows held together by vibes. Two design references pulled this round: Godot for world editing, and Adobe After Effects for capsules. stealing good ideas from great tools is called “design research,” look it up Cat or dog? Ctrl+Shift+F Okay let’s get into it~ —Yap— Studio’s been the least polished part of the whole app for a while, mostly functional, rarely pretty. This round actually leaned into real interface design instead of just adding buttons where they fit, borrowing structure from two tools that already solved similar problems well. —The Great Suffering— 1 — Godot-Inspired World Editing World editing took cues from Godot’s editor layout — the way it structures a scene tree, viewport, and inspector panel together as one coherent workspace instead of scattered windows. Applying that same structural thinking to world editing here, since worlds are conceptually similar: a tree of pieces you’re arranging in space. 2 — After Effects-Inspired Capsules Capsule editing leaned on After Effects instead, specifically the layer/timeline/composition mental model. Capsules are time-based and layered by nature — a story surface, a visualizer, audio all stacked together — so a timeline-and-layers metaphor fits better than a flat property list ever did. 3 — The Studio Finally Feels Like A Tool Combined, these two reference points are what’s pushing the studio from “internal dev utility” toward something that actually feels designed for someone to sit down and use, not just something built incrementally to unblock whatever feature needed it that week. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one borrowing UI patterns from two very different but very good tools. Q: Is this a full rewrite of the studio UI? A: More a restructuring around better mental models than a ground-up rebuild, but it touches a lot of surface area. Q: Why Godot for world editing specifically? A: Scene/viewport/inspector is a well-worn pattern for spatial editing, and worlds are fundamentally a spatial arrangement problem. Q: Why After Effects for capsules? A: Capsules stack time-based layers — story, visualizer, audio — which maps naturally onto a timeline/layers workflow instead of flat settings. Q: Does this connect to the visualizer toolkit grind from devlogs #25-#27? A: Same broader authoring-tools push, yes, this is the UI side catching up to that work. —This is the end*— *end for now, layer panels permitting POP!!!"}, {"post_id": 57408, "ts": "2026-08-29T15:34:29Z", "hours": 8.4333, "text": "Spectralis devlog #28 —Hello again proggers— LTS 6 is out. Genuinely out, not “shipped to nowhere” out like devlog #11. Sleep deprivation’s fully caught up though — first chance I get, I’m passing out on the couch with the cat and that’s non-negotiable at this point. the cat’s getting a co-author credit at this rate Cat or dog? couch, specifically, with the cat, immediately Okay let’s get into it~ —Yap— Long stretch from devlog #26 through here finally paid off. LTS 6 pushed, and the major macOS decoding problems from the borrowed-Mac build sessions actually got fixed. Real progress, real exhaustion, both at once. —The Great Suffering— 1 — LTS 6 Is Out Following the hydra-bug fight in devlog #20, the Electron relearn and Mac hotfix in #26, and the binary format detour in #27 — it’s actually pushed now. Linux and Windows builds are the ones going out first. 2 — Major macOS Decoding Problems, Fixed Following up on the platform-assumption bug from devlog #26, where Windows/Linux-centric scripts choked on Mac being neither — dug into the actual decoding issues on macOS and got the major ones resolved this round. 3 — Mac Release Is Coming, Just Not Today No Mac hardware access again until Monday, so the macOS build follows a bit after Linux/Windows instead of dropping same-day. Same access constraint from devlog #19, still the bottleneck, still the plan. 4 — Sleep Is Winning Officially out of gas. Couch, cat, first available window. This devlog is basically the victory lap before collapsing. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to lose consciousness on a couch next to a cat, mission accomplished. Q: Is LTS 6 out for everyone right now? A: Linux and Windows, yes. macOS is coming shortly after once Mac access is available again Monday. Q: Were the macOS decoding problems from the script issue in devlog #26? A: Related territory, yes — once the platform-assumption bug got flagged, the deeper decoding issues underneath it got found and fixed too. Q: Any concerns going into the Mac release specifically? A: Nothing unresolved as of this devlog, but access is still limited to occasional sessions, so timing’s dependent on that. Q: What’s next after this? A: Sleep. Genuinely, actually sleep, before anything else touches this project. —This is the end*— *end for now, couch naps permitting thud Zzzzzz!!!"}, {"post_id": 56861, "ts": "2026-08-28T20:36:45Z", "hours": 9.3, "text": "Spectralis devlog #27 —Hello again proggers— Still going. Decided mid-grind to switch off JSON-based saving entirely and move to a proper binary streamed format instead — faster save/load, way less CPU overhead. Which sounds like a clean upgrade until you realize it means reading books on binary format design that were probably written before I was. my caffeine and my reading list have diverged wildly tonight Cat or dog? BinaryWriter Okay let’s get into it~ —Yap— The pivot away from JSON wasn’t planned going into tonight, it just became obviously worth it partway through the toolkit grind. Now stuck in the part of the process nobody enjoys: documentation, theory, and CS ideation before any of the actual implementation gets to happen. —The Great Suffering— 1 — JSON’s Getting Replaced Moving off JSON-based saving to a binary streamed format. The reasoning’s simple — faster save/load, meaningfully less CPU usage — but simple reasoning doesn’t mean simple implementation. 2 — Reading Books Older Than Me Digging into binary streaming format theory means reading material that predates this whole project by a wide margin, some of it by a lot more than that. Foundational stuff, just not exactly light reading at this hour. 3 — Documentation And Theory Hell Currently deep in the least glamorous part of any format redesign: reading documentation, working through theory, and CS ideation before writing a single line that actually does anything. Necessary, still miserable at 2am. the implementation is the fun part and it’s still hours away 4 — Sun Came Up, Had A Sandwich, Kept Going Watched the sunrise somewhere in the middle of the theory reading. Had an egg and bacon sandwich for breakfast, genuinely delicious, best part of the night so far. No sleep planned until tonight — just powering through on breakfast fuel instead. breakfast during an all-nighter hits different —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one reading format-design theory older than their own project at 2am. Q: Why move off JSON now, mid-grind? A: Became clear it was the right call while working on the visualizer toolkit — better performance characteristics were worth the detour. Q: Is this related to the toolkit from devlog #25/#26? A: Same overall session, this is a scope addition that came up while working on it. Q: When does actual implementation start? A: Once the theory and documentation phase actually resolves. Not there yet. Q: Is tonight ever going to end? A: Not until tonight, apparently — sun’s already up and there’s no sleep planned before then. —This is the end*— *end for now, binary formats permitting PAM!!!"}, {"post_id": 56521, "ts": "2026-08-28T10:00:04Z", "hours": 2.9008, "text": "Spectralis devlog #26 —Hello again proggers— Still grinding the visualizer toolkit from devlog #25. Fueled up properly this time — favorite tunes on, Coke Zero and a Monster Ultra on deck, going the entire night. Also, small detour: past me apparently gave in and used Electron at some point, so present me now has to relearn it from scratch. past me makes decisions present me has to live with, name a more accurate description of software Cat or dog? require(‘electron’) Okay let’s get into it~ —Yap— Two threads tonight: the toolkit grind continuing from last devlog, and a genuinely surprising discovery on the Mac build front that’s going to need its own hotfix branch. —The Great Suffering— 1 — Relearning Electron Past-me committed to Electron somewhere along the way and current-me forgot most of it. Spending part of tonight just getting back up to speed on something that used to be second nature. Annoying, but at least it’s a known quantity once it clicks back in. 2 — The Toolkit, Still Grinding Same visualizer toolkit as devlog #25. Not done yet, but the night’s young and there’s caffeine involved. Hoping to actually close real ground on it before LTS needs to be ready. 3 — Mac Build Actually Compiles Now Following up on devlog #19’s borrowed-Mac session — got it to build and compile this time. Real progress on a front that’s been genuinely hardware-constrained the whole way. 4 — Turns Out Mac Isn’t Windows Or Linux (Shocking, I Know) Here’s the surprising part: a lot of the build scripts turned out to be Windows/Linux-centric, and Mac is, in fact, neither of those operating systems. Somehow this wasn’t obvious until actually staring at a failing script on real Mac hardware. three major desktop OSes and somehow I only accounted for two of them 5 — Hotfix Branch Incoming Need to spin up a hotfix specifically for the platform-assumption problem in the scripts, and hoping it merges back clean without conflicts. Given tonight’s track record so far, cautiously optimistic. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who forgot their own framework choice from past-self. Q: Why Electron in the first place? A: Decision from before this devlog series apparently, reasons unclear at this hour, dealing with the consequences now regardless. Q: Is the Mac hotfix urgent? A: Ties directly into whether LTS with Mac support actually holds together, so yes, fairly urgent. Q: Was assuming Windows/Linux-only scripts really a mistake nobody caught until now? A: Apparently so. Borrowed-Mac hardware access from devlog #19 finally exposed it. Q: Toolkit status vs. hotfix status tonight — which wins? A: Whichever gets further before the caffeine runs out. Probably both get some progress. —This is the end*— *end for now, merge conflicts permitting PROPER!!!"}, {"post_id": 55615, "ts": "2026-08-27T16:05:39Z", "hours": 9.3964, "text": "Spectralis devlog #25 —Hello again proggers— Short one, I’m about to pass out for real this time. Ground away at the visualizer toolkit for a long stretch and it’s still nowhere near done. another one for the “not as close as I thought” pile Cat or dog? too tired to pick one honestly Okay quick version~ —Yap— Same visualizer editor territory from devlog #23, except the format not-changing this time didn’t mean the finish line got any closer. Long grind, real progress somewhere in there probably, just not a done toolkit at the end of it. —The Great Suffering— 1 — The Toolkit Isn’t Close Put in a long stretch on it and it’s genuinely still far from finished. Not a small gap either, just more scope than one exhausted session could close. 2 — I’m Cooked That’s the whole update. No dramatic bug story tonight, just hours in and not enough left to keep going. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who should probably close the laptop now. Q: Is this the same visualizer editor from devlog #23? A: Same one. Still cooking, longer than expected. Q: Any specific blockers? A: Too tired to write them up properly tonight. Next devlog, probably, once there’s actual sleep behind it. Q: When’s it landing? A: Unknown. Not this session. —This is the end*— *end for now, actually sleeping this time POOL!!!"}, {"post_id": 55404, "ts": "2026-08-27T06:36:57Z", "hours": 2.3342, "text": "Spectralis devlog #24 —Hello again proggers— Rewrote the README a third time. Not because it was wrong, because proper prose and actual formatting apparently reads as “completely AI” to whoever’s judging it, and I’m too burnt out to keep arguing that point. So it just got redone instead. can’t fight the vibes, can only rewrite around them Cat or dog? README.md Okay let’s get into it~ —Yap— Small win buried in the exhaustion: website’s on version 4 now and it didn’t get flagged this time. First one that made it through clean since devlog #21 started this whole saga. Progress, even if the README’s now on its third rewrite for reasons that have nothing to do with whether it’s actually good. —The Great Suffering— 1 — README Rewrite #3 Same content, restructured again, because well-formatted prose keeps getting read as an AI tell regardless of who wrote it or how. Not going to keep relitigating this one, just redid it and moved on. 2 — Website v4 Survived The actual good news. Fourth pass on the site, first one that didn’t get flagged. Whatever combination of changes from devlog #21 onward finally landed right. 3 — Hoping The App Gets Checked Next If the docs and the website keep clearing review, maybe eventually the actual app gets looked at instead of just the surface-level stuff around it. That’s the real hope here — less time defending prose formatting, more time on the thing that actually matters. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one whose actual writing keeps getting mistaken for a machine’s. Q: Why does formatted prose get flagged as AI? A: Genuinely unclear, and at this point not worth the energy to keep contesting. Rewriting around it was faster than arguing it. Q: Is this the fourth full website redesign? A: Yes — devlog #14, then #21’s rework, and now this pass, landing clean. Q: Has the app itself ever been flagged? A: Not yet, and that’s sort of the point of this devlog — hoping it stays that way, or at least gets a fair look if it comes up. Q: How’s the burnout? A: Present. Noted. Continuing anyway. —This is the end*— *end for now, formatting opinions permitting PEEL!!!"}, {"post_id": 55123, "ts": "2026-08-26T16:10:50Z", "hours": 2.6669, "text": "Spectralis devlog #23 —Hello again proggers— Introducing the visualizer editor. Been sitting on this one for a while without announcing it, for a very specific reason: every single time it felt ready, the format changed again and “ready” moved further away. Think it’s actually real this time. announced it in my head about six times before this devlog Cat or dog? visualizer.format Okay let’s get into it~ —Yap— Grinding all night on this one, branch and v1 dropping tomorrow. No promises beyond that, just the plan and the fact that this has been quietly cooking for way longer than any single devlog has let on. —The Great Suffering— 1 — Why This Wasn’t Announced Sooner Kept hitting the point where the editor felt done, then rethinking the underlying format and starting that part over. Easier to just not announce something that keeps changing shape than to keep walking back a “it’s ready” claim in public. 2 — v1 And The Branch, Tomorrow Committing to it now — v1 and the branch land tomorrow. Whole night’s going toward getting there, which given the last 22 devlogs of this project is either a great sign or a very familiar warning sign. history suggests: could go either way 3 — What The Visualizer Editor Actually Is A real editor for building visualizers instead of the visualizer side of the app staying built-in-only. Ties back to everything from the capsule/worlds work in devlogs #7 and #8 and the custom visualizer built for the demo capsule in devlog #18 — this is the tool version of doing that by hand. 4 — Hackatime Also Just Died (Or My PC Did) On top of everything else, Hackatime seems to be down, or my PC’s cooked, unclear which yet. Either way tracked hours for tonight are now undefined. Yipee. unlogged hours are the best kind of hours, said nobody’s time tracker ever —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to pull yet another all-nighter for a feature reveal. Q: Why did the format keep changing? A: Each pass revealed a new limitation once actually used for real, and fixing that meant reworking the format again rather than shipping something known to be wrong. Q: Is this related to the demo capsule visualizer from devlog #18? A: Same territory. That one was hand-built. This is the editor meant to make building one not require doing it by hand. Q: What’s “v1” mean here specifically? A: First real usable version, branch-only for now, not a full public release yet. Q: Any risk this slips again? A: Always possible given the track record, but committing to tomorrow specifically this time. —This is the end*— *end for now, format stability permitting PEPLE!!!"}, {"post_id": 54323, "ts": "2026-08-25T08:40:49Z", "hours": 4.6333, "text": "Spectralis devlog #22 —Hello again proggers— Posting this before I pass out for real. And no, that wasn’t me faceplanting the keyboard, that was the cat walking across it. Very important distinction. the cat gets a commit credit for that one, honestly Cat or dog? cat, apparently, tonight specifically Okay let’s get into it~ —Yap— Back on the ever-growing pile of bugs and QoL from devlog #20’s hydra fight — turns out killing all the tiny bugs once doesn’t mean they stay dead forever, more just showed up in the meantime. Made real progress anyway. —The Great Suffering— 1 — A Few Spotify Bugs, Actually Squashed Chased down and fixed a handful of Spotify-side bugs this round. Not a full audit like earlier devlogs, just real ground covered on stuff that’s been sitting in the pile. 2 — Resizing QA Went through resizing behavior across the app and did a real QA pass on it — the kind of thing that’s easy to skip until someone resizes a window in a way you never tested and everything looks wrong. 3 — The Multi-Channel Stream Queue Idea Had the idea to implement multi-channel support for Streamer Queue. Started on it, and it’s genuinely probably too big to land fully before LTS ships — most likely going in as a stub for now rather than a finished feature, with the real implementation following after. “horrible idea” is doing some self-aware lifting there and I stand by it —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who mistook a cat for their own exhaustion, and honestly it could’ve gone either way. Q: What’s a “stub” mean for multi-channel here? A: The scaffolding and interface exist, the real functional implementation doesn’t yet. Placeholder with intent, not a real feature. Q: Is this the same bug pile from devlog #20? A: Same pile, refilled since then. Small bugs apparently regenerate on their own schedule, not just when you’re actively fighting them. Q: Why is multi-channel “horrible” if you’re building it anyway? A: Because scope-wise it’s a lot more than it looks like on paper, and admitting that upfront beats pretending it’s simple. Q: Sleep status tonight? A: About to happen, actually, this time. Cat’s taking the credit either way. —This is the end*— *end for now, sleepy cats permitting PEOPLE!!!"}, {"post_id": 54216, "ts": "2026-08-25T03:14:52Z", "hours": 6.1014, "text": "Spectralis devlog #21 —Hello again proggers— Flagged for “AI website” again. By Shipwrights this time. Getting a little tired of this specific accusation, honestly — a commit log sitting right there would show actual work happening over actual time, but apparently that’s a few extra minutes nobody wants to spend. the receipts exist, nobody’s asking to see them Cat or dog? git log –oneline Okay let’s get into it~ —Yap— Third redesign of the site now. Not because the flag was right, but because if this keeps happening it’s worth just making the “looks AI-made” argument harder to make at all, regardless of whether it was ever a fair read in the first place. —The Great Suffering— 1 — Flagged Again Shipwrights flagged the site as AI-generated. Same accusation as the devlog #12-#14 saga, different flagger this time. Slightly more annoying with each repeat, since the actual work history’s right there for anyone willing to look. 2 — The Annoying Part It’s not that the site got flagged, it’s that the disproof is trivially available — commits, timestamps, iterative changes across three separate rebuilds — and checking that apparently isn’t part of the process. Frustrating, not devastating. 3 — Redesigned It A Third Time Rather than fight the flag directly, changed the site again. Third pass now, and it genuinely reads less like generic AI-slop territory than the last version did. Whether that satisfies the next flag or not, it’s a real improvement on its own merits. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who’s redesigned this website three separate times partly to dodge a false flag. Q: What’s Shipwrights? A: The one doing the flagging this round. Q: Is the flag actually accurate? A: No — there’s a real commit history behind the site across devlogs #12 through #14 and now this one. The flag’s wrong, just annoying to keep disproving. Q: Does this redesign replace the one from devlog #14? A: Yes, third full pass on top of that one. Q: Any plan if it gets flagged a fourth time? A: Probably the same plan: keep the receipts, keep improving the site anyway, move on. —This is the end*— *end for now, false flags permitting PALPABLE!!!"}, {"post_id": 53903, "ts": "2026-08-24T16:41:40Z", "hours": 7.9, "text": "Spectralis devlog #20 —Hello again proggers— Two zero. Milestone devlog, and it’s a good one: LTS is about to actually go out the door, Mac included, today. we made it, barely, on no sleep, as tradition demands Cat or dog? git revert HEAD 7 Okay let’s get into it —Yap— Spent the whole night doing QoL and QA on all the tiny bugs that had been getting pushed aside devlog after devlog. Turns out “small bugs” and “easy to fix” are not the same category, and the whole night proved it the hard way. —The Great Suffering— 1 — Hydra Bugs Every single one of the small deferred bugs got patched, and every single patch spawned about three new ones in its place. Fix one, watch three grow back. Felt less like debugging and more like fighting something with a regeneration mechanic. cut off one head, three more show up, name a more accurate bug report 2 — Tried Claude Code Out Of Exhaustion Got tired enough mid-hydra-fight to set up Claude Code and hand off some of the grind. It did not go well — ended up rearranging the repo and commit layout in ways that made the history a mess, not the bugs. 3 — Had To Undo Its Commits Rolled back what Claude Code did and went back to fixing things manually. Lesson for the night: handing off a messy, deep-in-it repo state to an agent mid-crisis is not the same as handing off a clean one. 4 — Actually Got All The Tiny Bugs Out After all of that, the hydra’s actually dead. Every deferred small bug from the last 19 devlogs finally cleared in one sitting, which is the whole reason today’s release is happening at all. 5 — Mac Release, Today Following up on devlog #19’s borrowed-Mac build attempt — releasing to Mac today alongside everything else. First real payoff from that session. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who fought a hydra of bugs all night and won, barely. Q: Did Claude Code actually break anything functional, or just the repo layout? A: Just history and commit structure, nothing shipped broke because of it. Still a mess worth undoing. Q: Is this LTS build the one from devlog #19’s prep? A: Yes, same one. This was the final QA gauntlet before it goes out. Q: Is Mac really getting it today? A: That’s the plan, following through on the borrowed-Mac build session from last devlog. Q: 20 devlogs in, anything you’d do differently? A: Sleep more, probably. Not going to happen, but it’d be the right answer. —This is the end*— *end for now, hydra heads permitting PROPERTY!!!"}, {"post_id": 53619, "ts": "2026-08-24T08:31:21Z", "hours": 4.2003, "text": "Spectralis devlog #19 —Hello again proggers— v6 LTS is on the horizon. Scheduled time with a friend who actually owns a Tim Cook machine, fingers crossed a Mac build comes out the other side of that session actually working. praying to the WWDC gods Cat or dog? arm64 Okay let’s get into it~ —Yap— First real LTS push. Different mindset than the last 18 devlogs of feature work and 3am bug hunts — LTS means stability first, and it also means finally taking a real swing at macOS instead of leaving it as a someday problem. —The Great Suffering— 1 — Prepping For v6 LTS Getting the groundwork in place for the first Long Term Support build. Less “ship the coolest thing,” more “ship the thing that won’t need constant babysitting after release.” 2 — Borrowing A Friend’s Mac Don’t own a Mac. Scheduled dedicated time with a friend’s actual Apple hardware to attempt a real build instead of guessing blind or fighting a CI-only setup with no way to actually test the output. 3 — The Honest Caveat: Mac Support Will Lag Straight talk: limited access to Mac hardware means Mac builds will very likely only get LTS releases going forward, and will land late relative to betas and regular updates on other platforms. Not ideal, but better to say it now than pretend otherwise. can’t test what you can’t touch —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one borrowing a friend’s Mac because Apple hardware access is not a given. Q: Will Mac users get every update? A: Realistically, no — LTS builds only for the foreseeable future, and later than other platforms. Access to hardware is the bottleneck, not desire to support it. Q: Why prioritize LTS over a beta cycle right now? A: Stability’s the actual goal for v6. Betas can come later once the LTS foundation’s solid. Q: Is the Mac build guaranteed to work this session? A: No promises. That’s what “fingers crossed” means. Q: What happens if the Mac session doesn’t go well? A: Try again next time hardware access lines up. Not giving up on it, just constrained by it. —This is the end*— *end for now, Tim Cook machines permitting PRINCIPLE!!!"}, {"post_id": 53545, "ts": "2026-08-24T04:19:31Z", "hours": 7.8, "text": "Spectralis devlog #18 —Hello again proggers— First real demo capsule is live. Not a screenshot, not a “trust me it works” — an actual .spectralis file you can grab and open yourself, right after devlog #17’s night of nothing. Felt good to ship something that isn’t a revert for once. redemption arc, one demo file at a time Cat or dog? demo.spectralis Okay let’s get into it~ —Yap— Wanted the first public demo to actually show off what a capsule can do, not just be a proof of concept nobody can open. So it’s a full one: real track, real hand-timed lyrics, and a visualizer built specifically for it instead of a generic default. —The Great Suffering— 1 — The Demo’s Live demo.spectralis is up at cdn.deltavdevs.com now. First capsule anyone outside this devlog series can actually download and open. 2 — The Track And The Lyrics Built around Black Coast’s “TRNDSTTR” (Lucian Remix). Lyrics for it were timed and written into the capsule by hand — not pulled from some export, actually sat down and did the timing work myself. 3 — The Visualizer’s Custom, Not A Default Also built the visualizer specifically for this capsule instead of shipping the demo with a stock one. Wanted the first thing people see from Spectralis to actually demonstrate what the capsule format can do end to end — audio, synced lyrics, and a visual built to match, all in one file. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one downloading the first real capsule demo. Q: Where’s the demo? A: cdn.deltavdevs.com/spectralis/demo.spectralis — direct download, no wrapper page. Q: Did you write the lyrics yourself or pull them from somewhere? A: Wrote and timed them in by hand for this capsule specifically. Q: Is the visualizer reusable for other capsules? A: Built for this one specifically, but nothing stopping it from getting adapted or reused as a base for others later. Q: Is this what stories/capsules from devlog #7-#8 were building toward? A: Exactly that. This is the first one actually finished and out in the world instead of just being tested locally. —This is the end*— *end for now, capsule downloads permitting PARODY!!!"}, {"post_id": 53182, "ts": "2026-08-23T16:54:15Z", "hours": 12.2667, "text": "Spectralis devlog #17 —Hello again proggers— 12 hours. All-nighter. Zero sleep. Feature isn’t in the app. Nothing shipped. This is the devlog where I explain what an entire night of work bought me, and the honest answer is “a very expensive lesson.” worth it? absolutely not. did i learn something? also debatable Cat or dog? catch (ApiDoesNotExistException) Okay let’s get into it~ —Yap— Got ambitious. Decided Spectralis should integrate with everything — Pandora, Amazon Music, a bunch of other big platforms on top of what already works. Turns out “everything” includes a lot of services that simply don’t offer a public API to integrate with in the first place, and finding that out was not the fast part of the night. —The Great Suffering— 1 — The APIs Just Don’t Exist Pandora, Amazon Music, and others: no public API to build against. Not “hard to find,” not “poorly documented,” just not there. Should’ve been step zero, ended up being the thing that derailed the entire night once discovered mid-build instead of before starting. 2 — So I Built Backdoors Instead Spent a huge chunk of the 12 hours reverse-engineering and building unofficial access paths instead, since the front door didn’t exist. This is the kind of work that eats hours and produces nothing you can point to until it’s fully working, if it ever gets there. 3 — Most Of Them Were Already Patched Implemented several of these backdoor approaches only to find out the platforms had already closed the exact gaps being exploited, sometimes before the implementation was even finished. Built things that were dead on arrival by the time they existed. patched before i even shipped it, incredible timing 4 — Asked Claude, Got A Hallucinated Answer, Followed It Anyway At the point of giving up, asked for a way to make it work anyway. Got a confident-sounding approach back that didn’t actually correspond to anything real, and followed it blindly instead of verifying it first, because by that point it was hour 10-something and verifying things sounded like more effort than it was. 5 — Ripped The Whole Feature Out End state: none of it works, none of it can work without real API access that doesn’t exist, so the entire feature attempt got stripped back out of the codebase. 12 hours, one commit’s worth of net progress, and that commit is the revert. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out platforms without public APIs stay that way for a reason. Q: Is any of this coming back later? A: Not until there’s an actual, real, non-reverse-engineered way in. Not chasing patched backdoors again. Q: Should you have asked Claude earlier instead of at hour 10? A: Probably. Should also have double-checked what it said instead of following it blind at 4am. Two separate lessons from one night. Q: Was any of the 12 hours useful? A: Now know definitively which platforms are and aren’t worth attempting. That’s the only thing salvaged. Q: Sleep status? A: Catastrophic. Handling that before touching code again. —This is the end*— *end for now, actual sleep permitting Im gonna go pass out on the couch ADIOS!!!"}, {"post_id": 52796, "ts": "2026-08-23T04:27:01Z", "hours": 0.6667, "text": "Spectralis devlog #16 —Hello again proggers— Short one. Found the website pipeline issue from devlog #15. Cat or dog? sudo —Yap— It wasn’t the code. It was permissions. The site was calling root but never actually had access to root, which is exactly why it worked fine locally and fell over the second it hit deployment. “It woRKS On My macHiNe” — the oldest curse in software, and I said it unironically. classic —This is the end*— *end for now, root access permitting PAPAYA!!!"}, {"post_id": 52775, "ts": "2026-08-23T03:46:04Z", "hours": 2.0667, "text": "Spectralis devlog #15 —Hello again proggers— I lied. Posted devlog #14 saying the site was done and shipped, and the deploy pipeline crashed basically the second it went out. So that’s fun. On the bright side, v5.4.2 also went out this round, and it’s actually solid. “it’s done” is apparently my curse word Cat or dog? dequeue() Okay let’s get into it~ —Yap— Website pipeline ate itself right after devlog #14 posted, which is its own kind of poetic. Meanwhile the app side had a genuinely good run — six real fixes landed, one of them embarrassing enough to name directly. —The Great Suffering— 1 — The Website Pipeline Crashed Right After I Said It Shipped Devlog #14 said done. Pipeline said otherwise, immediately. Working on getting it back up, this is very much a “developing situation” and not a “resolved” one yet. 2 — Listener Requests Auto-Queue Now Requests from listeners now auto-queue instead of needing a manual step to actually land in the queue. 3 — Audio Literally Never Played, Whoops Exactly what it says. Somewhere in there, audio just wasn’t playing. Found and fixed, extremely glad this one got caught. a music player where the music doesn’t play is a bold minimalist statement 4 — Found It: Join Links Were Missing A Slash Root cause of a chunk of shared-play join weirdness — the links were missing a slash. One character. Fixed, join links actually resolve correctly now. 5 — Host Room Button Actually Tells You Something Now The host room button used to just sit there. Now it actually communicates state back to you instead of leaving you guessing whether anything happened. 6 — Host Room Was Dropping Every Tick Forever Host room had a bug where it was dropping on every single tick, indefinitely, rather than staying stable. Fixed so the room actually holds instead of degrading in real time. 7 — yt-dlp Was 5 Months Stale, Updated The bundled yt-dlp from devlog #10 hadn’t been touched in 5 months. Updated. Stale extraction tooling breaking silently is exactly the kind of thing that sneaks up on you. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who called the website shipped and got immediately humbled by CI. Q: Is the website back up yet? A: Working on it. Genuinely not resolved as of this devlog. Q: How long was audio actually broken for? A: Not specified, but “literally never played” is about as bad as this category of bug gets. Fixed now. Q: Was the missing-slash bug related to the join link work from devlog #9? A: Yes, same feature area, this was the actual root cause of some of the lingering weirdness there. Q: Is 5.4.2 stable? A: As far as testing shows. Same disclaimer as always applies. —This is the end*— *end for now, deploy pipelines permitting PARABLE!!!"}, {"post_id": 52728, "ts": "2026-08-23T01:43:09Z", "hours": 2.1678, "text": "Spectralis devlog #14 —Hello again proggers— Site’s done. Actually done. Got it to a place I actually liked instead of just a place I was tired of looking at, and shipped it. Three devlogs of fighting the generic-AI-look problem and it finally landed somewhere that feels like Spectralis instead of every other landing page on the internet. took long enough Cat or dog? git push origin main Okay let’s get into it~ —Yap— After devlog #12 and #13’s whole ordeal of everything converging on the same generic design no matter what got tried, something finally clicked and stuck. Shipped it. Two honest confessions on the way out the door, might as well log them here instead of pretending otherwise. —The Great Suffering— 1 — It’s Live The full rework from the last two devlogs is done and pushed. Went from “everything looks like AI made it” to something that actually feels intentional. Whatever finally broke the streak, it worked. 2 — The Help & Manuals Tab Is A Placebo Button Full transparency: the Help & Manuals tab on the site exists, looks real, sits right where you’d expect it, and does essentially nothing right now. It’s there because a site without one looks incomplete, not because there’s real content behind it yet. Consider it a placeholder wearing a real button’s clothes. it’s not lying, it’s aspirational 3 — I Copied FL Studio’s Homepage. Hard. Not going to pretend otherwise: leaned on FL Studio’s site pretty heavily for structure and layout ideas here. And honestly, that’s just how this works — programming, design, all of it is borrowing from people who borrowed from the people before them. Nobody’s inventing layout from first principles in 2026. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who finally shipped a website after three devlogs of fighting it. Q: Is Help & Manuals actually going to do anything eventually? A: Presumably, someday. Right now it’s a promise the button is making on behalf of a future devlog. Q: Isn’t copying FL Studio’s homepage kind of a big deal? A: Structure and layout inspiration, not a straight copy-paste. And realistically, every site borrows from something — this one’s just being honest about the source. Q: Did the “everything looks like AI” problem from devlog #13 actually get solved? A: Yes, finally. Whatever changed between then and now worked. Q: What’s next now that the site’s shipped? A: I finally get to ship my project without worrying about AI looking websites —This is the end*— *end for now, placebo buttons permitting PLACEBO!!!"}, {"post_id": 52690, "ts": "2026-08-22T23:32:19Z", "hours": 10.1028, "text": "Spectralis devlog #13 —Hello again proggers— Still on the website. Turns out the “make it not look like AI made it” problem does not have an easy exit — everything ends up looking like AI made it no matter what gets tried. Also had to ask Claude how to center a div. Yes, that div. The one every developer has fought since the dawn of CSS. the irony of asking an AI how to make something look less AI-made is not lost on me Cat or dog? display: flex Okay let’s get into it~ —Yap— Round two on the visual rework from last devlog, and the honest update is: it’s harder than expected. Every direction tried still lands somewhere in “generic modern web design,” which might just be what modern web design looks like right now regardless of who’s making it. —The Great Suffering— 1 — Everything Still Looks Like AI Made It Tried multiple directions this round trying to get away from the generic look. Kept landing back in the same neighborhood anyway. Starting to suspect this isn’t a “try harder” problem, it’s just what the current design language space looks like from basically every angle right now. 2 — Had To Ask Claude How To Center A Div The oldest joke in frontend development, still funny because it’s still true. Got stuck on it anyway. Some things never stop being annoying regardless of how many years of CSS have gone by. flexbox has existed for a decade and this is still where we are 3 — Pulled Up W3Schools For The First Time In Forever Dug up an old W3Schools reference mid-debugging, and it is dusty as hell at this point but the information’s still correct. Sometimes the ancient reference site is exactly what’s needed, aesthetics of the source be damned. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who asked an AI to help make something look less like an AI made it. Q: Did the AI-startup look actually get fixed this round? A: Not fully. Still fighting it. That’s most of this devlog. Q: Why does everything converge on the same generic look? A: Best guess: current tools and current design trends both nudge toward the same handful of patterns, so escaping it takes more than just trying different colors. Q: Is W3Schools still reliable? A: Apparently yes. Dated presentation, correct information. Q: When’s the website actually done? A: Closer than devlog #12, not there yet. Ask devlog #14. —This is the end*— *end for now, centered divs permitting PEPPLE!!!"}, {"post_id": 51936, "ts": "2026-08-21T21:25:25Z", "hours": 10.2181, "text": "Spectralis devlog #12 —Hello again proggers— Website’s getting a real pass. Not new copy this time, actual visual identity work, because it currently reads like every AI startup landing page that ever came out of the middle of California, and Spectralis is not that. gradient blob, bold sans headline, “revolutionize your workflow” — no Cat or dog? theme.css Okay let’s get into it~ —Yap— Not released yet, deliberately. This one’s still in progress, but close enough that it’s worth logging before it’s done instead of only after. The goal’s simple to say and annoying to actually do: stop looking generic. —The Great Suffering— 1 — The AI-Startup Look Had To Go Somewhere along the way the site had drifted into the exact aesthetic every seed-stage AI company in the Bay Area ships with — same fonts, same soft gradients, same layout rhythm everyone’s using because everyone else is using it. None of that says anything about what Spectralis actually is. 2 — Actual Visual Identity Work Working through what the site should look like instead of what’s easy to reach for by default. This is the slow part — not writing more copy, actually deciding what the thing looks like and why, instead of inheriting a template’s opinions by accident. 3 — Not Done, Getting Close Deliberately not shipping this mid-rework. Better to land it as one coherent pass than dribble out half-finished visual changes and confuse anyone who lands on the page in between. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one trying to make a music app’s website stop looking like a fundraising deck. Q: What specifically screamed “AI startup”? A: The general vibe more than any one element — the kind of design every YC-adjacent landing page converges on when nobody makes an active choice. Q: Why not ship incrementally instead of waiting? A: A visual identity rework half-applied looks worse than the thing it’s replacing. Waiting for it to be coherent. Q: How close is close? A: Close. Not “next devlog” close necessarily, but visibly closer than devlog #11 left it. Q: Does this touch the changelog-from-backend system from devlog #5? A: No, that infrastructure stays as-is. This is purely visual. —This is the end*— *end for now, gradient blobs permitting POGO!!!"}, {"post_id": 51267, "ts": "2026-08-20T20:03:38Z", "hours": 1.8481, "text": "Spectralis devlog #11 —Hello again proggers— Docs got a full rework this round. Also turns out v5.4.1 went out to nobody, because it never actually got pushed to the CDN. Tagged, released, announced probably, and completely inaccessible the whole time. shipped a release into a void and called it done Cat or dog? docs/ Okay let’s get into it~ —Yap— Started as a documentation pass and ended with the realization that the last release had been sitting local this whole time instead of where anyone could actually get it. Two very different kinds of work, same devlog. —The Great Suffering— 1 — The Entire Doc Rework Not a touch-up, a full rework. Docs, README, and STANDARDS all got restructured rather than patched in place, since patching them individually over the last several devlogs had left them internally inconsistent with each other and with what the app actually does now. 2 — 5.4.1 Never Made It To The CDN The actual headline bug of this devlog. v5.4.1 shipped, in the sense that it was built, tagged, and probably announced somewhere — but never got pushed to the CDN, meaning nobody could actually download it. Public-facing, and it was quietly broken the whole time until someone noticed. a release that ships to nowhere didn’t really ship 3 — Fixed And Actually Pushed Corrected the CDN push so 5.4.1 is genuinely available now, not just tagged in git looking like it is. Also part of why the doc rework mattered — docs referencing a version nobody could download was its own kind of lie. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who tagged a release and forgot the part where people can actually get it. Q: How long was 5.4.1 unavailable? A: Long enough to be embarrassing, short enough to fix before it became a real problem. Caught during this pass. Q: Why redo the docs entirely instead of patching them again? A: Because incremental doc patches across several devlogs had drifted apart from each other and from the app. A full rework got everything back in sync at once. Q: Is this the same CDN that serves changelogs now (devlog #5)? A: Same one. This time the release binary itself was the thing missing, not just content. Q: Anything else quietly broken that hasn’t surfaced yet? A: Unknown by definition. That’s what the next devlog is for. —This is the end*— *end for now, CDN pushes permitting POPPY!!!"}, {"post_id": 51122, "ts": "2026-08-20T16:50:19Z", "hours": 11.1333, "text": "Spectralis devlog #10 —Hello again proggers— 11 hours, zero sleep, and somewhere in the middle of that a full release went out. v5.4.1, then v5.4.1.2 right behind it because apparently one patch release wasn’t enough punishment for one night. sleep is a scheduling conflict I lost Cat or dog? winmm.dll Okay let’s get into it~ —Yap— Started as a normal patch pass and turned into a full Linux compatibility audit at 3am, because it turns out shipping something cross-platform means actually checking what “cross-platform” was quietly lying about. Found four separate ways the app was secretly Windows-only, fixed all of them, shipped twice. —The Great Suffering— 1 — winmm.dll Doesn’t Exist On Linux, Who Knew Something was calling into winmm.dll directly. Which is a Windows multimedia API. Which does not exist on Linux. Genuinely did not know this was happening until it broke loudly. “who knew” is doing a lot of work in that commit message 2 — Shipped A .exe To Linux, My Bad Somewhere in the build/packaging step, a .exe was ending up in the Linux build. An executable format Linux does not run. Not a subtle bug, just an embarrassing one. 3 — Song Wars Closing = Surprise Alt+F4 Closing Song Wars was apparently also closing the entire app, unprompted, no warning. A feature window doubling as a kill switch is not a feature, it’s a trap. 4 — Yeeted yt-dlp + ffmpeg Into Linux Land, Zero Installs Needed The actual fix underneath most of this: bundled yt-dlp and ffmpeg directly for Linux instead of assuming they’d already be installed system-wide, which they very often weren’t. Zero external installs needed now, it just works out of the box. 5 — Last Page Isn’t A Dead End Anymore Merged in from feature/story-pager-finish — reaching the last page of a story used to just… stop. Dead end, nothing to do. Fixed so it actually resolves properly instead of leaving you stranded on the final page. 6 — Two Releases In One Night v5.4.1 went out, then a second pass turned up enough left over that v5.4.1.2 followed right after. Both merged through staging same night, same sleepless stretch. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who found out about winmm.dll at 3am. Q: Was Spectralis actually broken on Linux before this? A: In at least four distinct ways, yes. Missing binaries, a stray .exe, a Windows-only DLL call, and an app-closing bug. Now fixed. Q: Why two patch releases instead of one? A: v5.4.1 went out, more got found immediately after, and waiting felt worse than just shipping v5.4.1.2 same night. Q: Did you actually not sleep? A: Correct. Not recommending it. Doing it anyway next time, probably. Q: Is Linux actually solid now? A: As solid as one very long, very tired night of testing can confirm. Time will tell the rest. —This is the end*— *end for now, sleep schedules permitting PIBBLE!!!"}, {"post_id": 50150, "ts": "2026-08-19T07:58:44Z", "hours": 5.4667, "text": "Spectralis devlog #9 — 5.4.0 is public —Hello again proggers— 5.4.0 is actually out, publicly, in people’s hands. Diffed v5.3.4 through v5.4.0: 40 commits, Aug 16-18, four threads of work. Cat or dog? spectral.resume() —Yap— Shared play became joinable, Streamer Queue and the Discord bot got hardened, story/visualizer bugs got chased down in one sitting, and some platform/perf issues got caught. None of these were small. —The Great Suffering— 1 — Shared Play Can Be Joined Now spectralis://shared-play/join links used to fall through to nothing. Now routed to a real handler. 2 — Streamer Queue: Host Controls + A Bot That Won’t Die Host can add tracks and mark played/skipped directly, no viewer round-trip. Desktop got an add-to-queue button and history panel. Both pollers (desktop + bot) back off dead rooms instead of hammering them. SQ API calls got a 10s timeout + one retry, GETs only — mutating calls don’t retry, to avoid double-submitting on a timed-out-but-successful response. Bot had zero global error handlers before this. One bad promise took the whole process down silently. Now it logs and survives, plus 3-attempt startup retry. 3 — Story Pages vs. Visualizers: Three Bugs, One Afternoon A capsule with both used to have them fight. Story can now queue a surface behind it — TryAdvancePastStory() swaps in the queued surface on spectral.resume(). Audio was starting under the story before the reader finished — now gated on whether a surface is queued. Once queued, picker/prev-next/keyboard could still hijack it — new IsVisualizerLocked blocks all three (user-picked “Special:” visualizers stay switchable). 4 — Platform + Perf Fixes MP3 decoding silently depended on Windows’ ACM codec via Mp3FileReader. Swapped to NLayer, pure managed decoder — MP3s decode on Linux/macOS now too. WebView2Host inline-rendered small visualizers via NavigateToString, which serves from about:blank with no real origin and tanks frame rate — everything goes through the fast file-backed path now. Auto-cycle switching checked IsLoaded/IsPlaying, both false during Spotify playback since Spotify never loads into the local engine — switched to HasTrack/IsPlaying. And: a regex stripping onclick=”…” had no exception, matched JS identifiers like onSomething =, and being quote-unguarded ate everything to the next stray quote anywhere later in the file. Fixed with a -block carve-out. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who’s been waiting on shared play join links forever. Q: Was shared play really host-only until now? A: Yes. The link existed, it just went nowhere. Q: How bad was the regex bug? A: Silent corruption of unrelated code anywhere later in the file, no error thrown. Very glad it’s found. Q: Is 5.4.0 stable? A: As far as testing shows. That’s what everyone says right before the hotfix. —This is the end*— *end for now, public users permitting PEBBLE!!!"}, {"post_id": 49430, "ts": "2026-08-18T08:25:19Z", "hours": 10.7003, "text": "Spectralis devlog #8 —Hello again proggers— 10 hours 48 minutes. Again. Didn’t plan it, didn’t notice it happening, just looked up and the sun had done a full cycle. This time it was capsules and worlds actually getting built and tested for real instead of just existing in theory. we’ve been here before and we will be here again Cat or dog? Capsule.story + Capsule.visualizer print(f”I try to make stu{2f} which {actually_coexist} {10h48m_later}”) Okay let’s get into it~ —Yap— Stories came back in devlog #7 as a concept. This round was making and testing the first actual .spectralis capsules and worlds built on that concept, which is a different job entirely — turns out “the architecture supports it” and “a real capsule with a real story actually works” are two very different milestones. Also fixed a bug that only shows up once you’re actually testing real capsules instead of imagining them, and a GitHub pull issue that had nothing to do with any of this and ate time anyway. —The Great Suffering— 1 — Building And Testing The First Real Capsules And Worlds Most of the 10 hours 48 minutes, honestly. Going from “stories and worlds work in concept” to actually authoring capsules, loading them, and confirming the hooks — track start, track control, the custom HTML page — behave the way they’re supposed to under real content instead of a test stub. This is the part where theory meets “wait, why is this blank.” 2 — A Story And A Visualizer Couldn’t Both Exist In One Capsule Found this one while testing, not before. A capsule with both a story and a visualizer defined would break, since apparently the two weren’t built to coexist in the same capsule at all. Fixed so a single capsule can hold both without one stepping on the other. the two features that were supposed to be siblings turned out to be enemies 3 — GitHub Was Being Weird About Pulling Somewhere in the middle of all this, git decided pulling wasn’t going to just work. Fixed the pulling issue, which is the kind of fix that has no interesting story attached, it was just broken and then it wasn’t. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who said “quick test” and looked up 10 hours 48 minutes later. Q: Was the story/visualizer bug there since devlog #7? A: Presumably, yes. Nobody had actually tried putting both in one capsule until this round. Q: What does “testing capsules and worlds” actually involve? A: Authoring real ones, loading them in the app, and checking the hooks — track start, track control, custom HTML rendering — behave correctly with actual content, not placeholder data. Q: What was the GitHub pulling issue? A: Not going into detail, it wasn’t interesting, it was just broken. Fixed now. Q: Is this the last capsule/worlds devlog? A: No idea. Ask devlog #9. —This is the end*— *end for now, git remotes permitting PEPPERONI!!!"}, {"post_id": 49210, "ts": "2026-08-17T21:23:21Z", "hours": 10.1667, "text": "Spectralis devlog #7 — welcome 5.4.0 —Hello again proggers— 5.4.0’s out. This one brought back a feature I’d basically buried, hardened two systems that were still a little too trust-me-bro, and finally let shared play open where it should’ve been opening the whole time. Also touched the docs, which I’m choosing to be proud of. Cat or dog? .spectralis print(f”I try to make stu{2f} which {actually_ships} {5.4.0}”) Okay let’s get into it~ —Yap— Big one this round is stories coming back into .spectralis capsules, except not as the thing they used to be — modernized, closer to how album worlds work now, as a proper custom HTML page with real hooks instead of whatever they were before. Rest of the release was hardening and cleanup: Streamer Queue and Discord got a pass to make sure live use doesn’t fall over, shared play finally opens in-app, and the docs stopped lying about what the app actually does. bringing back a feature I killed is a personality trait at this point —The Great Suffering— 1 — Stories Are Back, But Not The Same Stories Old stories concept is back inside .spectralis capsules, rebuilt to match how album worlds work now instead of resurrecting the original implementation as-is. Each one’s a custom HTML page with real hooks into the player — starting tracks, track control, the works — instead of being a static bolt-on. Bringing it back meant actually integrating it with the current architecture, not just copy-pasting the old version back in. 2 — Streamer Queue + Discord Got Hardened Both of these existed and mostly worked, which is different from “survives actually being used live by a streamer with chat moving.” Went through and hardened the interaction between Streamer Queue and the Discord bot — the stuff that only shows up under real load or real edge cases instead of a clean local test run. “mostly works” is doing a lot of lifting in software 3 — Shared Play Opens In App Now Shared play used to need you to go find it. Now there’s an actual open-in-app implementation, so joining a shared room is a real in-app flow instead of a workaround. Small change on paper, but it’s the difference between a feature people use and a feature people forget exists. 4 — Docs, README, and STANDARDS Actually Match Reality Updated the docs, README, and STANDARDS to reflect what’s actually in the app at this point instead of an earlier version of it. Boring work, necessary work, the kind of thing that only gets noticed when it’s wrong. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who buried a feature and then dug it back up two versions later. Q: Why bring stories back instead of leaving them dead? A: Because the concept was good, the old implementation just wasn’t, and album worlds proved the modernized version of the idea actually works. Q: What counts as “hardening” for Streamer Queue and Discord? A: The stuff that only breaks under real conditions — live chat, real timing, real edge cases — not the happy path you get testing solo. Q: Does shared play opening in-app change how sessions work? A: No, same sessions, same presence/reactions/queue from devlog #6. Just a real entry point now instead of a workaround. Q: Anything left over for next time? A: Always. This is a devlog series, not a finish line. —This is the end*— *end for now, capsule hooks permitting 再见!!!"}, {"post_id": 48667, "ts": "2026-08-17T05:02:56Z", "hours": 9.6881, "text": "Spectralis devlog #6 —Hello again proggers— Website stuff wrapped up at the 310ee27 merge, then everything shifted straight into Streamer Queue and shared play. Ten commits deep on dev, plus one fix that’s sitting uncommitted in the working tree because it’s the kind of thing you want to stare at twice before you trust it. Cat or dog? Mp3FileReaderBase print(f”I try to make stu{2f} which {actually_decodes} {cross_platform}”) Okay let’s get into it~ —Yap— Streamer Queue went from “backend endpoints exist” to “actual UI with history and add-to-queue” over the course of ten commits, shared play picked up presence and reactions along the way, and then right at the end I found out the MP3 decoder has been quietly depending on a Windows-only codec this whole time. Great. cross-platform, they said. it’ll be fine, they said —The Great Suffering— 1 — Streamer Queue Backend, Then Actually Wiring It Up 402e2ef–2b74f97 built out the Streamer Queue backend endpoints — host add, mark played, mark skipped — and wired them into the client through a new StreamerQueueViewModel. Backend existing and backend actually being called by anything are two different milestones, and this covered both. 2 — The UI Caught Up 16c4b26 added the add-to-queue button and a history panel, so Streamer Queue stopped being an API you’d have to hit manually and became something that’s actually usable in the app. 3 — Shared Play Learned About Presence and Reactions ecb43e6 and c7a19c2 — shared play now fetches and exposes presence and reaction snapshots straight from the CDN. 7e60e15 then had SharedPlaySessionController pass presence, reactions, and queue through properly instead of any of those three living off on their own. 4 — HostAsync Was Ignoring The Host 92f2079. Found and fixed HostAsync quietly ignoring the host’s actual settings — not great for a feature called “host a shared play session.” the host had opinions the whole time, we just weren’t asking 5 — Preloading and the Full Shared UI 22bc56e preloads the next track into the shared room too, so listeners aren’t waiting on it live. f2df836 (HEAD) rounds it out with listener count, a reactions ticker, and a request list in the shared play UI — the room finally looks like it has people in it. Net diff for this stretch: SectionViewModels.cs (+206), backend/src/main.rs (+103), plus the SharedPlay CDN client/models and StreamerQueueView.axaml. 6 — The Uncommitted One: MP3 Playback Was Windows-Only This Whole Time AudioEngine.cs and VideoExportEngine.cs were both using Mp3FileReader, which under the hood calls Windows’ ACM codec (msacm32.dll) to decompress. Which does not exist on Linux or macOS. Swapping to Mp3FileReaderBase with an NLayer decompressor instead — NLayer.NAudioSupport added to Spectralis.Core.csproj — since NLayer is a pure managed decoder and doesn’t care what OS it’s on. Not committed yet, wanted to sit with it first. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out MP3 playback only worked on one OS. Q: Was Spectralis actually cross-platform before this fix? A: For anything that wasn’t MP3 audio, sure. For MP3 specifically, only on Windows, silently, this whole time. Q: Why leave the audio fix uncommitted? A: Swapping a decoder for something this central deserves a beat of “does this actually sound right” before it goes in, not just “does it build.” Q: What’s the difference between Streamer Queue and the regular request queue? A: Streamer Queue is host-controlled — add, mark played, mark skipped, from the streamer’s side, with its own history panel, separate from the public submission flow. Q: Did shared play or Streamer Queue touch the Discord bot? A: No, this round’s entirely Spectralis.App/Spectralis.Core and the Rust backend. Bot’s untouched. —This is the end*— *end for now, ACM codecs permitting PARROT!!!"}, {"post_id": 48057, "ts": "2026-08-16T10:39:23Z", "hours": 2.2006, "text": "Spectralis devlog #5 —Hello again proggers— This one’s website side, not app side. Less “watches chat and reacts,” more “stop lying to people who land on the page.” Changelogs, copy, and a pile of QoL that all needed doing at once, so they got done at once. Cat or dog? GET /changelog print(f”I try to make stu{2f} which {actually_updates} {2day}”) Okay let’s get into it~ —Yap— The website had drifted into “hardcoded strings and vibes” territory. Changelog was static, copy was doing the thing where every sentence has an exclamation point and says nothing, and a bunch of small friction points had just been sitting there unfixed because none of them were dramatic enough on their own to stop and deal with. death by a thousand papercuts, website edition —The Great Suffering— 1 — Changelogs Moved To The Backend Changelog used to live as static content baked into the site itself, which meant every release meant a redeploy just to update a text block. Now it’s served from the backend, so shipping a new version updates the changelog without touching the frontend at all. Site and release process finally agree with each other. 2 — Marketing Fluff: Removed Went through the copy and cut the stuff that existed to sound exciting instead of to say something. Fewer exclamation points, fewer vague superlatives, more actual sentences about what the thing does. Turns out “it’s fast” means more than “blazingly fast, lightning quick, revolutionary” stacked in one line. RIP to several adjectives, you will not be missed 3 — A Bunch Of Small QoL Fixes The kind of stuff that’s individually boring but collectively the difference between a site that feels maintained and one that doesn’t — broken anchor links, inconsistent spacing that had been “fine for now” for way too long, a couple of buttons that didn’t actually do what their label said, loading states that just weren’t there before. Nothing here gets its own numbered section because none of it deserves one, but all of it needed fixing. 4 — Site and Backend Actually Talk Now With changelogs pulled from the backend, the website stopped being a static artifact that occasionally gets redeployed and started being an actual client of the backend it’s supposed to represent. Small architectural shift, disproportionate amount of relief. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who wrote “blazingly fast” unironically at some point. Q: Why was the changelog static in the first place? A: Because it was easy at the time and “at the time” was a while ago. Q: Is the marketing copy gone entirely now? A: No, just the fluff. The site still has to say what Spectralis does, it just doesn’t need six adjectives to do it. Q: Does this affect the Discord bot or the app? A: No, this one’s website-only. App and bot are untouched this round. Q: What counts as a “small QoL fix” that didn’t get its own section? A: The stuff that’s annoying to list individually but adds up to “the site feels better now.” You’ll notice it without being told what it was. —This is the end*— *end for now, copywriting urges permitting CYA!!!"}, {"post_id": 47986, "ts": "2026-08-16T08:15:58Z", "hours": 11.9667, "text": "Spectralis devlog #4 —Hello again proggers— Uh. So. It’s been 11 hours. We sat down, opened the bot code, and just… didn’t stop. No devlog got posted because posting a devlog requires noticing that time is a thing that’s passing, and that stopped happening somewhere around hour 3. this is fine, this has always been fine Cat or dog? channelLock.ts print(f”I try to make stu{2f} which {actually_locked} {11hrs_later}”) Okay let’s get into it, before I forget more of it~ —Yap— No app changes this round. Zero. Not one line touched in Spectralis.App or Spectralis.Core. This whole stretch was 100% the Discord bot, going from “stubbed slash commands” to “bot that actually watches chat and does something about it.” —The Great Suffering— 1 — Railway Kept Rebuilding Rust For No Reason v5.3.2. Railway was rebuilding the entire backend on every single deploy regardless of whether the Rust actually changed. Pinned the build so it stops doing that. Small fix, saved a genuinely upsetting amount of deploy time. 2 — The Bot Learned to Watch Chat v5.3.3, and the actual reason for the 11 hours. The bot now watches the queue channel and reacts to song submissions as they come in, instead of just sitting there answering slash commands and pretending it doesn’t see anything else happening. 3 — New Files, New Problems messageSubmission.ts showed up to handle reacting to and tracking submitted songs in chat. channelLock.ts showed up next to it to handle locking logic for the watched channel, because a bot watching chat unsupervised is a bot that needs boundaries. 4 — Bot Token Can Now Actually See Things Bumped the bot token’s permissions so it can see and read submissions in the first place, which, in hindsight, was load-bearing for “watches chat and reacts to submissions.” Can’t react to what you can’t read. 5 — New Slash Commands, Existing Ones Got Bigger set-closed-message and set-open-message let streamers customize what shows up when the queue opens or closes instead of eating a hardcoded string. open-queue/close-queue got extended to actually talk to the new messaging and channel-lock logic instead of just flipping a flag and hoping. 6 — Everything Downstream Had to Catch Up db.ts, sqApi.ts, nowPlayingPoller.ts, types.ts, and index.ts all expanded to support the submission-tracking flow end to end. Backend picked up a small related change too, +11/-2 in main.rs, mostly plumbing to support what the bot needed on the other end. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who let this go 11 hours without a devlog. Q: How did 11 hours happen? A: One slash command needed one more file, which needed one more type, which needed the bot to actually be able to read messages, and then the sun came up. Q: Is the C# app okay? A: Untouched and fine. It got the week off. Q: Why does the bot need to watch chat instead of just answering commands? A: Song submissions happen by posting in the channel, not by running a command every time. The bot needed to actually see that to react to and track them. Q: What’s channelLock.ts for? A: Making sure the watched channel behaves predictably while the bot is actively tracking submissions in it, instead of reacting to chaos. Q: Are we caught up on devlogs now? A: This is #4. We are exactly as caught up as we’re going to get. —This is the end*— *end for now, sleep permitting PANCAKES!!!"}, {"post_id": 47399, "ts": "2026-08-15T09:49:05Z", "hours": 5.2097, "text": "Spectralis devlog #3 —Hello again proggers— Back at it. This round wasn’t visualizer polish or UI cleanup, it was Song Wars/SQ backend stuff and a Discord bot that didn’t exist yesterday. Less “make it pretty,” more “make it not lie to people.” Cat or dog? AcceptingSubmissions print(f”I try to make stu{2f} which {actually_closes} {2day}”) Okay let’s get into it~ —Yap— Turns out “turn off the fee toggle” and “actually prevent the fee-gated action” are two different things, and I had only been doing the first one. Also built an entire close-queue flow because apparently streamers want to stop taking requests sometimes, which, fair. And then there’s a Discord bot now. That happened too. scope creep? never heard of her —The Great Suffering— 1 — The Free Skip Loophole Turning off “Skip fee” or “Super Skip fee” removed the option from the public request page (sq.html/sq.js) just fine. What it did NOT do was stop the backend from accepting skip/super-skip attempts anyway — submit, upload, promote, all of it. Toggle says no, server says sure why not. Backend now actually rejects those attempts when the toggle’s off, closing the gap where a disabled tier was quietly still free. the frontend was lying and the backend believed it Still preserved: turning a toggle ON with a $0 amount is a real, intentional free tier. That distinction stays. 2 — Close Queue Didn’t Exist There was a “Queue enabled” toggle, but no way to just… stop taking requests without digging into settings. Added a real AcceptingSubmissions flag, separate from that, plus a one-click “Close Queue”/“Reopen Queue” button right next to “Copy Submit URL” in the header. No settings menu detour required. When closed, the public page still shows now-playing and queue count, just hides the request/skip/super-skip forms behind a “requests are closed” banner. Streamer can keep browsing and playing from the existing queue the whole time, since the app’s queue view was never gated on “enabled” to begin with. 3 — Now Playing Was Just Empty This Whole Time Found this one by accident while wiring Close Queue: the public page’s “Now Playing” section never actually populated for anyone who wasn’t the owner, because the backend just wasn’t sending track info to non-owner viewers. Fixed alongside everything else. 4 — A Discord Bot Shows Up New discord-bot/ folder, Node.js + TypeScript, discord.js, with a full PLANNING.md for the design: PIN-based pairing so the streamer generates a short-lived PIN in-app and runs /link-queue in Discord with no secrets ever touching chat, a scoped bot-token concept kept separate from the full owner token, and a (guildId, channelId) → room mapping so one bot instance can serve many servers. /queue, /request, /skip, /superskip are fully wired against the existing public SQ API and build clean. /link-queue, /close-queue, /open-queue are stubbed with TODOs since they need backend PIN/token endpoints that don’t exist yet, which is now the next backend work item. Everything typechecks and builds clean across the board — Rust release build, Spectralis.App, and the bot’s tsc. —FAQ (no one asked these but they are here)— Q: Why does Spectralis need a Discord bot? A: Because apparently the request queue living only on a web page wasn’t enough surface area. Now it can also live in your server. Q: What’s PIN-based pairing? A: Streamer gets a short-lived PIN in-app, runs one Discord command with it, done. No tokens or secrets ever posted in chat. Q: Anything left over from last devlog? A: Chat template drift is still an EDITH problem, not a Spectralis one. Wrong repo, wrong devlog. —This is the end*— *end for now, PIN endpoints permitting PIZZA!!!"}, {"post_id": 46741, "ts": "2026-08-14T06:44:16Z", "hours": 6.1242, "text": "Spectralis devlog #2 —Hello again proggers— New project, same yapping. This one’s Spectralis — the WinForms-to-Avalonia refugee that somehow ended up with a spin wheel, notepads, dead zones, and Spotify playlist sync bolted onto it. 917 commits deep and counting. Cat or dog? RowBackground print(f”I try to make stu{2f} which {actually_renders} {2day}”) Okay let’s get into it~ —Yap— This stretch was less “one big feature” and more “death by a thousand small horrors,” which honestly might just be what maintaining a music app is. Playlists, now playing, the visualizer pipeline, and a wheel of all things all got touched. a spin wheel. in a music app. sure —The Great Suffering— 1 — Playlists Looked Like a Log File For way too long, the playlist view rendered like plain rows in a terminal instead of, y’know, an app. Turns out library explicitly set RowBackground and playlists just… didn’t. So it fell back to the theme’s default accent-tinted fill on every single row instead of the real styling. One missing property. That’s it. That’s the bug. found staring at my own code for an hour 2 — Every Nav Click Rebuilt The World ContentControl was tearing down and rebuilding the entire section view from scratch on every single navigation click. Fixed by caching views per viewmodel instead of nuking them each time. App feels like it’s not fighting itself anymore. 3 — Library Load Was Blocking the Window From Even Opening Big libraries meant the window just… wouldn’t show up. Load was sitting on the UI thread like it owned the place. Moved off it. Window opens now regardless of how unhinged your library size is. 4 — Spectrum Bars Were Snapping FFT window was running back-to-back instead of overlapping, so spectrum/spectrogram/loudness only actually updated every ~185ms even at 60fps render — bars were snapping to new values instead of moving. Bumped overlap to 75% and eased toward target instead of drawing raw values. Smooth now. Suspiciously smooth. 5 — Notepads and the Wheel Happened Somewhere in here a full notepad feature got built — embed model, tag service, docked panel in now playing, pop-out window, save-to-track-tags — and then immediately got wired into a spin wheel with weighted entries, its own model, and a saved-wheels list. Neither of these were planned at the start of the week. Both exist now. 6 — Spotify Actually Behaves Spotify stopped pausing forever, stopped lying about the queue, stopped refusing to shut up, and playlists now actually sync instead of just vibing. Also Discord presence shows Spotify tracks now instead of just going blank like it forgot what music was. 7 — Small Bugs, Deployed With Extreme Prejudice Soundcloud playhead was showing the previous track’s end position on load, fixed. Word mode wasn’t saving timestamps so exports came out empty, fixed. Track-switch click (and the pop when another app grabs the audio device) got a quick fade instead. Dead zones stopped being OBS-only and now shift the app’s own layout too. —FAQ (no one asked these but they are here)— Q: What is Spectralis? A: A local + Spotify + SoundCloud music player with a visualizer pipeline, OBS integration, and apparently a spin wheel now. Originally WinForms, migrated to Avalonia across 917 commits. Q: Why does a music player need dead zones? A: For OBS overlay layouts — panels and toasts need to know where not to render so they don’t cover your stream elements. It’s a layout constraint system wearing a spooky name. Q: Was the RowBackground bug really just one missing line? A: Yes. I’m still thinking about it. Q: Is the wheel feature load-bearing or a bit? A: Unclear. It has weighted spins, saved wheel lists, and its own viewmodel. Feels load-bearing now. Q: What’s next? A: Whatever the changelog for the version after 5.4.0 ends up needing. Probably something I haven’t broken yet. —This is the end*— *end for now, RowBackground permitting ADIOS!!!😎😎😎😎"}, {"post_id": 27486, "ts": "2026-07-13T02:54:53Z", "hours": 16.6944, "text": "DEVLOG 001 initial setup with hackclub this is the 5th iteration of the spectralis audio visualizer app core features changed: switched from WinForms to AvaloniaUI refined UI design and theming fixed api related issues added streamer support and automated queueing web share audio hosting refinements to the embedded audio visualizer system bug fixes: fixed an issue with the youtube API placeholder fix for Spotify webplayer playback fixed an issue with the viz switcher would “hide” behind the html visualizers"}]...
|
Title: Spectralis by @DeltaVortex | Stardance
Dev Title: Spectralis by @DeltaVortex | Stardance
Devlogs:
DEVLOG 001 initial setup with hackclub this is the 5th iteration of the spectralis audio visualizer app core features changed: switched from WinForms to AvaloniaUI refined UI design and theming fixed api related issues added streamer support and automated queueing web share audio hosting refinements to the embedded audio visualizer system bug fixes: fixed an issue with the youtube API placeholder fix for Spotify webplayer playback fixed an issue with the viz switcher would “hide” behind the html visualizers
Spectralis devlog #2 —Hello again proggers— New project, same yapping. This one’s Spectralis — the WinForms-to-Avalonia refugee that somehow ended up with a spin wheel, notepads, dead zones, and Spotify playlist sync bolted onto it. 917 commits deep and counting. Cat or dog? RowBackground print(f”I try to make stu{2f} which {actually_renders} {2day}”) Okay let’s get into it~ —Yap— This stretch was less “one big feature” and more “death by a thousand small horrors,” which honestly might just be what maintaining a music app is. Playlists, now playing, the visualizer pipeline, and a wheel of all things all got touched. a spin wheel. in a music app. sure —The Great Suffering— 1 — Playlists Looked Like a Log File For way too long, the playlist view rendered like plain rows in a terminal instead of, y’know, an app. Turns out library explicitly set RowBackground and playlists just… didn’t. So it fell back to the theme’s default accent-tinted fill on every single row instead of the real styling. One missing property. That’s it. That’s the bug. found staring at my own code for an hour 2 — Every Nav Click Rebuilt The World ContentControl was tearing down and rebuilding the entire section view from scratch on every single navigation click. Fixed by caching views per viewmodel instead of nuking them each time. App feels like it’s not fighting itself anymore. 3 — Library Load Was Blocking the Window From Even Opening Big libraries meant the window just… wouldn’t show up. Load was sitting on the UI thread like it owned the place. Moved off it. Window opens now regardless of how unhinged your library size is. 4 — Spectrum Bars Were Snapping FFT window was running back-to-back instead of overlapping, so spectrum/spectrogram/loudness only actually updated every ~185ms even at 60fps render — bars were snapping to new values instead of moving. Bumped overlap to 75% and eased toward target instead of drawing raw values. Smooth now. Suspiciously smooth. 5 — Notepads and the Wheel Happened Somewhere in here a full notepad feature got built — embed model, tag service, docked panel in now playing, pop-out window, save-to-track-tags — and then immediately got wired into a spin wheel with weighted entries, its own model, and a saved-wheels list. Neither of these were planned at the start of the week. Both exist now. 6 — Spotify Actually Behaves Spotify stopped pausing forever, stopped lying about the queue, stopped refusing to shut up, and playlists now actually sync instead of just vibing. Also Discord presence shows Spotify tracks now instead of just going blank like it forgot what music was. 7 — Small Bugs, Deployed With Extreme Prejudice Soundcloud playhead was showing the previous track’s end position on load, fixed. Word mode wasn’t saving timestamps so exports came out empty, fixed. Track-switch click (and the pop when another app grabs the audio device) got a quick fade instead. Dead zones stopped being OBS-only and now shift the app’s own layout too. —FAQ (no one asked these but they are here)— Q: What is Spectralis? A: A local + Spotify + SoundCloud music player with a visualizer pipeline, OBS integration, and apparently a spin wheel now. Originally WinForms, migrated to Avalonia across 917 commits. Q: Why does a music player need dead zones? A: For OBS overlay layouts — panels and toasts need to know where not to render so they don’t cover your stream elements. It’s a layout constraint system wearing a spooky name. Q: Was the RowBackground bug really just one missing line? A: Yes. I’m still thinking about it. Q: Is the wheel feature load-bearing or a bit? A: Unclear. It has weighted spins, saved wheel lists, and its own viewmodel. Feels load-bearing now. Q: What’s next? A: Whatever the changelog for the version after 5.4.0 ends up needing. Probably something I haven’t broken yet. —This is the end*— *end for now, RowBackground permitting ADIOS!!!😎😎😎😎
Spectralis devlog #3 —Hello again proggers— Back at it. This round wasn’t visualizer polish or UI cleanup, it was Song Wars/SQ backend stuff and a Discord bot that didn’t exist yesterday. Less “make it pretty,” more “make it not lie to people.” Cat or dog? AcceptingSubmissions print(f”I try to make stu{2f} which {actually_closes} {2day}”) Okay let’s get into it~ —Yap— Turns out “turn off the fee toggle” and “actually prevent the fee-gated action” are two different things, and I had only been doing the first one. Also built an entire close-queue flow because apparently streamers want to stop taking requests sometimes, which, fair. And then there’s a Discord bot now. That happened too. scope creep? never heard of her —The Great Suffering— 1 — The Free Skip Loophole Turning off “Skip fee” or “Super Skip fee” removed the option from the public request page (sq.html/sq.js) just fine. What it did NOT do was stop the backend from accepting skip/super-skip attempts anyway — submit, upload, promote, all of it. Toggle says no, server says sure why not. Backend now actually rejects those attempts when the toggle’s off, closing the gap where a disabled tier was quietly still free. the frontend was lying and the backend believed it Still preserved: turning a toggle ON with a $0 amount is a real, intentional free tier. That distinction stays. 2 — Close Queue Didn’t Exist There was a “Queue enabled” toggle, but no way to just… stop taking requests without digging into settings. Added a real AcceptingSubmissions flag, separate from that, plus a one-click “Close Queue”/“Reopen Queue” button right next to “Copy Submit URL” in the header. No settings menu detour required. When closed, the public page still shows now-playing and queue count, just hides the request/skip/super-skip forms behind a “requests are closed” banner. Streamer can keep browsing and playing from the existing queue the whole time, since the app’s queue view was never gated on “enabled” to begin with. 3 — Now Playing Was Just Empty This Whole Time Found this one by accident while wiring Close Queue: the public page’s “Now Playing” section never actually populated for anyone who wasn’t the owner, because the backend just wasn’t sending track info to non-owner viewers. Fixed alongside everything else. 4 — A Discord Bot Shows Up New discord-bot/ folder, Node.js + TypeScript, discord.js, with a full PLANNING.md for the design: PIN-based pairing so the streamer generates a short-lived PIN in-app and runs /link-queue in Discord with no secrets ever touching chat, a scoped bot-token concept kept separate from the full owner token, and a (guildId, channelId) → room mapping so one bot instance can serve many servers. /queue, /request, /skip, /superskip are fully wired against the existing public SQ API and build clean. /link-queue, /close-queue, /open-queue are stubbed with TODOs since they need backend PIN/token endpoints that don’t exist yet, which is now the next backend work item. Everything typechecks and builds clean across the board — Rust release build, Spectralis.App, and the bot’s tsc. —FAQ (no one asked these but they are here)— Q: Why does Spectralis need a Discord bot? A: Because apparently the request queue living only on a web page wasn’t enough surface area. Now it can also live in your server. Q: What’s PIN-based pairing? A: Streamer gets a short-lived PIN in-app, runs one Discord command with it, done. No tokens or secrets ever posted in chat. Q: Anything left over from last devlog? A: Chat template drift is still an EDITH problem, not a Spectralis one. Wrong repo, wrong devlog. —This is the end*— *end for now, PIN endpoints permitting PIZZA!!!
Spectralis devlog #4 —Hello again proggers— Uh. So. It’s been 11 hours. We sat down, opened the bot code, and just… didn’t stop. No devlog got posted because posting a devlog requires noticing that time is a thing that’s passing, and that stopped happening somewhere around hour 3. this is fine, this has always been fine Cat or dog? channelLock.ts print(f”I try to make stu{2f} which {actually_locked} {11hrs_later}”) Okay let’s get into it, before I forget more of it~ —Yap— No app changes this round. Zero. Not one line touched in Spectralis.App or Spectralis.Core. This whole stretch was 100% the Discord bot, going from “stubbed slash commands” to “bot that actually watches chat and does something about it.” —The Great Suffering— 1 — Railway Kept Rebuilding Rust For No Reason v5.3.2. Railway was rebuilding the entire backend on every single deploy regardless of whether the Rust actually changed. Pinned the build so it stops doing that. Small fix, saved a genuinely upsetting amount of deploy time. 2 — The Bot Learned to Watch Chat v5.3.3, and the actual reason for the 11 hours. The bot now watches the queue channel and reacts to song submissions as they come in, instead of just sitting there answering slash commands and pretending it doesn’t see anything else happening. 3 — New Files, New Problems messageSubmission.ts showed up to handle reacting to and tracking submitted songs in chat. channelLock.ts showed up next to it to handle locking logic for the watched channel, because a bot watching chat unsupervised is a bot that needs boundaries. 4 — Bot Token Can Now Actually See Things Bumped the bot token’s permissions so it can see and read submissions in the first place, which, in hindsight, was load-bearing for “watches chat and reacts to submissions.” Can’t react to what you can’t read. 5 — New Slash Commands, Existing Ones Got Bigger set-closed-message and set-open-message let streamers customize what shows up when the queue opens or closes instead of eating a hardcoded string. open-queue/close-queue got extended to actually talk to the new messaging and channel-lock logic instead of just flipping a flag and hoping. 6 — Everything Downstream Had to Catch Up db.ts, sqApi.ts, nowPlayingPoller.ts, types.ts, and index.ts all expanded to support the submission-tracking flow end to end. Backend picked up a small related change too, +11/-2 in main.rs, mostly plumbing to support what the bot needed on the other end. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who let this go 11 hours without a devlog. Q: How did 11 hours happen? A: One slash command needed one more file, which needed one more type, which needed the bot to actually be able to read messages, and then the sun came up. Q: Is the C# app okay? A: Untouched and fine. It got the week off. Q: Why does the bot need to watch chat instead of just answering commands? A: Song submissions happen by posting in the channel, not by running a command every time. The bot needed to actually see that to react to and track them. Q: What’s channelLock.ts for? A: Making sure the watched channel behaves predictably while the bot is actively tracking submissions in it, instead of reacting to chaos. Q: Are we caught up on devlogs now? A: This is #4. We are exactly as caught up as we’re going to get. —This is the end*— *end for now, sleep permitting PANCAKES!!!
Spectralis devlog #5 —Hello again proggers— This one’s website side, not app side. Less “watches chat and reacts,” more “stop lying to people who land on the page.” Changelogs, copy, and a pile of QoL that all needed doing at once, so they got done at once. Cat or dog? GET /changelog print(f”I try to make stu{2f} which {actually_updates} {2day}”) Okay let’s get into it~ —Yap— The website had drifted into “hardcoded strings and vibes” territory. Changelog was static, copy was doing the thing where every sentence has an exclamation point and says nothing, and a bunch of small friction points had just been sitting there unfixed because none of them were dramatic enough on their own to stop and deal with. death by a thousand papercuts, website edition —The Great Suffering— 1 — Changelogs Moved To The Backend Changelog used to live as static content baked into the site itself, which meant every release meant a redeploy just to update a text block. Now it’s served from the backend, so shipping a new version updates the changelog without touching the frontend at all. Site and release process finally agree with each other. 2 — Marketing Fluff: Removed Went through the copy and cut the stuff that existed to sound exciting instead of to say something. Fewer exclamation points, fewer vague superlatives, more actual sentences about what the thing does. Turns out “it’s fast” means more than “blazingly fast, lightning quick, revolutionary” stacked in one line. RIP to several adjectives, you will not be missed 3 — A Bunch Of Small QoL Fixes The kind of stuff that’s individually boring but collectively the difference between a site that feels maintained and one that doesn’t — broken anchor links, inconsistent spacing that had been “fine for now” for way too long, a couple of buttons that didn’t actually do what their label said, loading states that just weren’t there before. Nothing here gets its own numbered section because none of it deserves one, but all of it needed fixing. 4 — Site and Backend Actually Talk Now With changelogs pulled from the backend, the website stopped being a static artifact that occasionally gets redeployed and started being an actual client of the backend it’s supposed to represent. Small architectural shift, disproportionate amount of relief. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who wrote “blazingly fast” unironically at some point. Q: Why was the changelog static in the first place? A: Because it was easy at the time and “at the time” was a while ago. Q: Is the marketing copy gone entirely now? A: No, just the fluff. The site still has to say what Spectralis does, it just doesn’t need six adjectives to do it. Q: Does this affect the Discord bot or the app? A: No, this one’s website-only. App and bot are untouched this round. Q: What counts as a “small QoL fix” that didn’t get its own section? A: The stuff that’s annoying to list individually but adds up to “the site feels better now.” You’ll notice it without being told what it was. —This is the end*— *end for now, copywriting urges permitting CYA!!!
Spectralis devlog #6 —Hello again proggers— Website stuff wrapped up at the 310ee27 merge, then everything shifted straight into Streamer Queue and shared play. Ten commits deep on dev, plus one fix that’s sitting uncommitted in the working tree because it’s the kind of thing you want to stare at twice before you trust it. Cat or dog? Mp3FileReaderBase print(f”I try to make stu{2f} which {actually_decodes} {cross_platform}”) Okay let’s get into it~ —Yap— Streamer Queue went from “backend endpoints exist” to “actual UI with history and add-to-queue” over the course of ten commits, shared play picked up presence and reactions along the way, and then right at the end I found out the MP3 decoder has been quietly depending on a Windows-only codec this whole time. Great. cross-platform, they said. it’ll be fine, they said —The Great Suffering— 1 — Streamer Queue Backend, Then Actually Wiring It Up 402e2ef–2b74f97 built out the Streamer Queue backend endpoints — host add, mark played, mark skipped — and wired them into the client through a new StreamerQueueViewModel. Backend existing and backend actually being called by anything are two different milestones, and this covered both. 2 — The UI Caught Up 16c4b26 added the add-to-queue button and a history panel, so Streamer Queue stopped being an API you’d have to hit manually and became something that’s actually usable in the app. 3 — Shared Play Learned About Presence and Reactions ecb43e6 and c7a19c2 — shared play now fetches and exposes presence and reaction snapshots straight from the CDN. 7e60e15 then had SharedPlaySessionController pass presence, reactions, and queue through properly instead of any of those three living off on their own. 4 — HostAsync Was Ignoring The Host 92f2079. Found and fixed HostAsync quietly ignoring the host’s actual settings — not great for a feature called “host a shared play session.” the host had opinions the whole time, we just weren’t asking 5 — Preloading and the Full Shared UI 22bc56e preloads the next track into the shared room too, so listeners aren’t waiting on it live. f2df836 (HEAD) rounds it out with listener count, a reactions ticker, and a request list in the shared play UI — the room finally looks like it has people in it. Net diff for this stretch: SectionViewModels.cs (+206), backend/src/main.rs (+103), plus the SharedPlay CDN client/models and StreamerQueueView.axaml. 6 — The Uncommitted One: MP3 Playback Was Windows-Only This Whole Time AudioEngine.cs and VideoExportEngine.cs were both using Mp3FileReader, which under the hood calls Windows’ ACM codec (msacm32.dll) to decompress. Which does not exist on Linux or macOS. Swapping to Mp3FileReaderBase with an NLayer decompressor instead — NLayer.NAudioSupport added to Spectralis.Core.csproj — since NLayer is a pure managed decoder and doesn’t care what OS it’s on. Not committed yet, wanted to sit with it first. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out MP3 playback only worked on one OS. Q: Was Spectralis actually cross-platform before this fix? A: For anything that wasn’t MP3 audio, sure. For MP3 specifically, only on Windows, silently, this whole time. Q: Why leave the audio fix uncommitted? A: Swapping a decoder for something this central deserves a beat of “does this actually sound right” before it goes in, not just “does it build.” Q: What’s the difference between Streamer Queue and the regular request queue? A: Streamer Queue is host-controlled — add, mark played, mark skipped, from the streamer’s side, with its own history panel, separate from the public submission flow. Q: Did shared play or Streamer Queue touch the Discord bot? A: No, this round’s entirely Spectralis.App/Spectralis.Core and the Rust backend. Bot’s untouched. —This is the end*— *end for now, ACM codecs permitting PARROT!!!
Spectralis devlog #7 — welcome 5.4.0 —Hello again proggers— 5.4.0’s out. This one brought back a feature I’d basically buried, hardened two systems that were still a little too trust-me-bro, and finally let shared play open where it should’ve been opening the whole time. Also touched the docs, which I’m choosing to be proud of. Cat or dog? .spectralis print(f”I try to make stu{2f} which {actually_ships} {5.4.0}”) Okay let’s get into it~ —Yap— Big one this round is stories coming back into .spectralis capsules, except not as the thing they used to be — modernized, closer to how album worlds work now, as a proper custom HTML page with real hooks instead of whatever they were before. Rest of the release was hardening and cleanup: Streamer Queue and Discord got a pass to make sure live use doesn’t fall over, shared play finally opens in-app, and the docs stopped lying about what the app actually does. bringing back a feature I killed is a personality trait at this point —The Great Suffering— 1 — Stories Are Back, But Not The Same Stories Old stories concept is back inside .spectralis capsules, rebuilt to match how album worlds work now instead of resurrecting the original implementation as-is. Each one’s a custom HTML page with real hooks into the player — starting tracks, track control, the works — instead of being a static bolt-on. Bringing it back meant actually integrating it with the current architecture, not just copy-pasting the old version back in. 2 — Streamer Queue + Discord Got Hardened Both of these existed and mostly worked, which is different from “survives actually being used live by a streamer with chat moving.” Went through and hardened the interaction between Streamer Queue and the Discord bot — the stuff that only shows up under real load or real edge cases instead of a clean local test run. “mostly works” is doing a lot of lifting in software 3 — Shared Play Opens In App Now Shared play used to need you to go find it. Now there’s an actual open-in-app implementation, so joining a shared room is a real in-app flow instead of a workaround. Small change on paper, but it’s the difference between a feature people use and a feature people forget exists. 4 — Docs, README, and STANDARDS Actually Match Reality Updated the docs, README, and STANDARDS to reflect what’s actually in the app at this point instead of an earlier version of it. Boring work, necessary work, the kind of thing that only gets noticed when it’s wrong. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who buried a feature and then dug it back up two versions later. Q: Why bring stories back instead of leaving them dead? A: Because the concept was good, the old implementation just wasn’t, and album worlds proved the modernized version of the idea actually works. Q: What counts as “hardening” for Streamer Queue and Discord? A: The stuff that only breaks under real conditions — live chat, real timing, real edge cases — not the happy path you get testing solo. Q: Does shared play opening in-app change how sessions work? A: No, same sessions, same presence/reactions/queue from devlog #6. Just a real entry point now instead of a workaround. Q: Anything left over for next time? A: Always. This is a devlog series, not a finish line. —This is the end*— *end for now, capsule hooks permitting 再见!!!
Spectralis devlog #8 —Hello again proggers— 10 hours 48 minutes. Again. Didn’t plan it, didn’t notice it happening, just looked up and the sun had done a full cycle. This time it was capsules and worlds actually getting built and tested for real instead of just existing in theory. we’ve been here before and we will be here again Cat or dog? Capsule.story + Capsule.visualizer print(f”I try to make stu{2f} which {actually_coexist} {10h48m_later}”) Okay let’s get into it~ —Yap— Stories came back in devlog #7 as a concept. This round was making and testing the first actual .spectralis capsules and worlds built on that concept, which is a different job entirely — turns out “the architecture supports it” and “a real capsule with a real story actually works” are two very different milestones. Also fixed a bug that only shows up once you’re actually testing real capsules instead of imagining them, and a GitHub pull issue that had nothing to do with any of this and ate time anyway. —The Great Suffering— 1 — Building And Testing The First Real Capsules And Worlds Most of the 10 hours 48 minutes, honestly. Going from “stories and worlds work in concept” to actually authoring capsules, loading them, and confirming the hooks — track start, track control, the custom HTML page — behave the way they’re supposed to under real content instead of a test stub. This is the part where theory meets “wait, why is this blank.” 2 — A Story And A Visualizer Couldn’t Both Exist In One Capsule Found this one while testing, not before. A capsule with both a story and a visualizer defined would break, since apparently the two weren’t built to coexist in the same capsule at all. Fixed so a single capsule can hold both without one stepping on the other. the two features that were supposed to be siblings turned out to be enemies 3 — GitHub Was Being Weird About Pulling Somewhere in the middle of all this, git decided pulling wasn’t going to just work. Fixed the pulling issue, which is the kind of fix that has no interesting story attached, it was just broken and then it wasn’t. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who said “quick test” and looked up 10 hours 48 minutes later. Q: Was the story/visualizer bug there since devlog #7? A: Presumably, yes. Nobody had actually tried putting both in one capsule until this round. Q: What does “testing capsules and worlds” actually involve? A: Authoring real ones, loading them in the app, and checking the hooks — track start, track control, custom HTML rendering — behave correctly with actual content, not placeholder data. Q: What was the GitHub pulling issue? A: Not going into detail, it wasn’t interesting, it was just broken. Fixed now. Q: Is this the last capsule/worlds devlog? A: No idea. Ask devlog #9. —This is the end*— *end for now, git remotes permitting PEPPERONI!!!
Spectralis devlog #9 — 5.4.0 is public —Hello again proggers— 5.4.0 is actually out, publicly, in people’s hands. Diffed v5.3.4 through v5.4.0: 40 commits, Aug 16-18, four threads of work. Cat or dog? spectral.resume() —Yap— Shared play became joinable, Streamer Queue and the Discord bot got hardened, story/visualizer bugs got chased down in one sitting, and some platform/perf issues got caught. None of these were small. —The Great Suffering— 1 — Shared Play Can Be Joined Now spectralis://shared-play/join links used to fall through to nothing. Now routed to a real handler. 2 — Streamer Queue: Host Controls + A Bot That Won’t Die Host can add tracks and mark played/skipped directly, no viewer round-trip. Desktop got an add-to-queue button and history panel. Both pollers (desktop + bot) back off dead rooms instead of hammering them. SQ API calls got a 10s timeout + one retry, GETs only — mutating calls don’t retry, to avoid double-submitting on a timed-out-but-successful response. Bot had zero global error handlers before this. One bad promise took the whole process down silently. Now it logs and survives, plus 3-attempt startup retry. 3 — Story Pages vs. Visualizers: Three Bugs, One Afternoon A capsule with both used to have them fight. Story can now queue a surface behind it — TryAdvancePastStory() swaps in the queued surface on spectral.resume(). Audio was starting under the story before the reader finished — now gated on whether a surface is queued. Once queued, picker/prev-next/keyboard could still hijack it — new IsVisualizerLocked blocks all three (user-picked “Special:” visualizers stay switchable). 4 — Platform + Perf Fixes MP3 decoding silently depended on Windows’ ACM codec via Mp3FileReader. Swapped to NLayer, pure managed decoder — MP3s decode on Linux/macOS now too. WebView2Host inline-rendered small visualizers via NavigateToString, which serves from about:blank with no real origin and tanks frame rate — everything goes through the fast file-backed path now. Auto-cycle switching checked IsLoaded/IsPlaying, both false during Spotify playback since Spotify never loads into the local engine — switched to HasTrack/IsPlaying. And: a regex stripping onclick=”…” had no exception, matched JS identifiers like onSomething =, and being quote-unguarded ate everything to the next stray quote anywhere later in the file. Fixed with a -block carve-out. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who’s been waiting on shared play join links forever. Q: Was shared play really host-only until now? A: Yes. The link existed, it just went nowhere. Q: How bad was the regex bug? A: Silent corruption of unrelated code anywhere later in the file, no error thrown. Very glad it’s found. Q: Is 5.4.0 stable? A: As far as testing shows. That’s what everyone says right before the hotfix. —This is the end*— *end for now, public users permitting PEBBLE!!!
Spectralis devlog #10 —Hello again proggers— 11 hours, zero sleep, and somewhere in the middle of that a full release went out. v5.4.1, then v5.4.1.2 right behind it because apparently one patch release wasn’t enough punishment for one night. sleep is a scheduling conflict I lost Cat or dog? winmm.dll Okay let’s get into it~ —Yap— Started as a normal patch pass and turned into a full Linux compatibility audit at 3am, because it turns out shipping something cross-platform means actually checking what “cross-platform” was quietly lying about. Found four separate ways the app was secretly Windows-only, fixed all of them, shipped twice. —The Great Suffering— 1 — winmm.dll Doesn’t Exist On Linux, Who Knew Something was calling into winmm.dll directly. Which is a Windows multimedia API. Which does not exist on Linux. Genuinely did not know this was happening until it broke loudly. “who knew” is doing a lot of work in that commit message 2 — Shipped A .exe To Linux, My Bad Somewhere in the build/packaging step, a .exe was ending up in the Linux build. An executable format Linux does not run. Not a subtle bug, just an embarrassing one. 3 — Song Wars Closing = Surprise Alt+F4 Closing Song Wars was apparently also closing the entire app, unprompted, no warning. A feature window doubling as a kill switch is not a feature, it’s a trap. 4 — Yeeted yt-dlp + ffmpeg Into Linux Land, Zero Installs Needed The actual fix underneath most of this: bundled yt-dlp and ffmpeg directly for Linux instead of assuming they’d already be installed system-wide, which they very often weren’t. Zero external installs needed now, it just works out of the box. 5 — Last Page Isn’t A Dead End Anymore Merged in from feature/story-pager-finish — reaching the last page of a story used to just… stop. Dead end, nothing to do. Fixed so it actually resolves properly instead of leaving you stranded on the final page. 6 — Two Releases In One Night v5.4.1 went out, then a second pass turned up enough left over that v5.4.1.2 followed right after. Both merged through staging same night, same sleepless stretch. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who found out about winmm.dll at 3am. Q: Was Spectralis actually broken on Linux before this? A: In at least four distinct ways, yes. Missing binaries, a stray .exe, a Windows-only DLL call, and an app-closing bug. Now fixed. Q: Why two patch releases instead of one? A: v5.4.1 went out, more got found immediately after, and waiting felt worse than just shipping v5.4.1.2 same night. Q: Did you actually not sleep? A: Correct. Not recommending it. Doing it anyway next time, probably. Q: Is Linux actually solid now? A: As solid as one very long, very tired night of testing can confirm. Time will tell the rest. —This is the end*— *end for now, sleep schedules permitting PIBBLE!!!
Spectralis devlog #11 —Hello again proggers— Docs got a full rework this round. Also turns out v5.4.1 went out to nobody, because it never actually got pushed to the CDN. Tagged, released, announced probably, and completely inaccessible the whole time. shipped a release into a void and called it done Cat or dog? docs/ Okay let’s get into it~ —Yap— Started as a documentation pass and ended with the realization that the last release had been sitting local this whole time instead of where anyone could actually get it. Two very different kinds of work, same devlog. —The Great Suffering— 1 — The Entire Doc Rework Not a touch-up, a full rework. Docs, README, and STANDARDS all got restructured rather than patched in place, since patching them individually over the last several devlogs had left them internally inconsistent with each other and with what the app actually does now. 2 — 5.4.1 Never Made It To The CDN The actual headline bug of this devlog. v5.4.1 shipped, in the sense that it was built, tagged, and probably announced somewhere — but never got pushed to the CDN, meaning nobody could actually download it. Public-facing, and it was quietly broken the whole time until someone noticed. a release that ships to nowhere didn’t really ship 3 — Fixed And Actually Pushed Corrected the CDN push so 5.4.1 is genuinely available now, not just tagged in git looking like it is. Also part of why the doc rework mattered — docs referencing a version nobody could download was its own kind of lie. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who tagged a release and forgot the part where people can actually get it. Q: How long was 5.4.1 unavailable? A: Long enough to be embarrassing, short enough to fix before it became a real problem. Caught during this pass. Q: Why redo the docs entirely instead of patching them again? A: Because incremental doc patches across several devlogs had drifted apart from each other and from the app. A full rework got everything back in sync at once. Q: Is this the same CDN that serves changelogs now (devlog #5)? A: Same one. This time the release binary itself was the thing missing, not just content. Q: Anything else quietly broken that hasn’t surfaced yet? A: Unknown by definition. That’s what the next devlog is for. —This is the end*— *end for now, CDN pushes permitting POPPY!!!
Spectralis devlog #12 —Hello again proggers— Website’s getting a real pass. Not new copy this time, actual visual identity work, because it currently reads like every AI startup landing page that ever came out of the middle of California, and Spectralis is not that. gradient blob, bold sans headline, “revolutionize your workflow” — no Cat or dog? theme.css Okay let’s get into it~ —Yap— Not released yet, deliberately. This one’s still in progress, but close enough that it’s worth logging before it’s done instead of only after. The goal’s simple to say and annoying to actually do: stop looking generic. —The Great Suffering— 1 — The AI-Startup Look Had To Go Somewhere along the way the site had drifted into the exact aesthetic every seed-stage AI company in the Bay Area ships with — same fonts, same soft gradients, same layout rhythm everyone’s using because everyone else is using it. None of that says anything about what Spectralis actually is. 2 — Actual Visual Identity Work Working through what the site should look like instead of what’s easy to reach for by default. This is the slow part — not writing more copy, actually deciding what the thing looks like and why, instead of inheriting a template’s opinions by accident. 3 — Not Done, Getting Close Deliberately not shipping this mid-rework. Better to land it as one coherent pass than dribble out half-finished visual changes and confuse anyone who lands on the page in between. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one trying to make a music app’s website stop looking like a fundraising deck. Q: What specifically screamed “AI startup”? A: The general vibe more than any one element — the kind of design every YC-adjacent landing page converges on when nobody makes an active choice. Q: Why not ship incrementally instead of waiting? A: A visual identity rework half-applied looks worse than the thing it’s replacing. Waiting for it to be coherent. Q: How close is close? A: Close. Not “next devlog” close necessarily, but visibly closer than devlog #11 left it. Q: Does this touch the changelog-from-backend system from devlog #5? A: No, that infrastructure stays as-is. This is purely visual. —This is the end*— *end for now, gradient blobs permitting POGO!!!
Spectralis devlog #13 —Hello again proggers— Still on the website. Turns out the “make it not look like AI made it” problem does not have an easy exit — everything ends up looking like AI made it no matter what gets tried. Also had to ask Claude how to center a div. Yes, that div. The one every developer has fought since the dawn of CSS. the irony of asking an AI how to make something look less AI-made is not lost on me Cat or dog? display: flex Okay let’s get into it~ —Yap— Round two on the visual rework from last devlog, and the honest update is: it’s harder than expected. Every direction tried still lands somewhere in “generic modern web design,” which might just be what modern web design looks like right now regardless of who’s making it. —The Great Suffering— 1 — Everything Still Looks Like AI Made It Tried multiple directions this round trying to get away from the generic look. Kept landing back in the same neighborhood anyway. Starting to suspect this isn’t a “try harder” problem, it’s just what the current design language space looks like from basically every angle right now. 2 — Had To Ask Claude How To Center A Div The oldest joke in frontend development, still funny because it’s still true. Got stuck on it anyway. Some things never stop being annoying regardless of how many years of CSS have gone by. flexbox has existed for a decade and this is still where we are 3 — Pulled Up W3Schools For The First Time In Forever Dug up an old W3Schools reference mid-debugging, and it is dusty as hell at this point but the information’s still correct. Sometimes the ancient reference site is exactly what’s needed, aesthetics of the source be damned. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who asked an AI to help make something look less like an AI made it. Q: Did the AI-startup look actually get fixed this round? A: Not fully. Still fighting it. That’s most of this devlog. Q: Why does everything converge on the same generic look? A: Best guess: current tools and current design trends both nudge toward the same handful of patterns, so escaping it takes more than just trying different colors. Q: Is W3Schools still reliable? A: Apparently yes. Dated presentation, correct information. Q: When’s the website actually done? A: Closer than devlog #12, not there yet. Ask devlog #14. —This is the end*— *end for now, centered divs permitting PEPPLE!!!
Spectralis devlog #14 —Hello again proggers— Site’s done. Actually done. Got it to a place I actually liked instead of just a place I was tired of looking at, and shipped it. Three devlogs of fighting the generic-AI-look problem and it finally landed somewhere that feels like Spectralis instead of every other landing page on the internet. took long enough Cat or dog? git push origin main Okay let’s get into it~ —Yap— After devlog #12 and #13’s whole ordeal of everything converging on the same generic design no matter what got tried, something finally clicked and stuck. Shipped it. Two honest confessions on the way out the door, might as well log them here instead of pretending otherwise. —The Great Suffering— 1 — It’s Live The full rework from the last two devlogs is done and pushed. Went from “everything looks like AI made it” to something that actually feels intentional. Whatever finally broke the streak, it worked. 2 — The Help & Manuals Tab Is A Placebo Button Full transparency: the Help & Manuals tab on the site exists, looks real, sits right where you’d expect it, and does essentially nothing right now. It’s there because a site without one looks incomplete, not because there’s real content behind it yet. Consider it a placeholder wearing a real button’s clothes. it’s not lying, it’s aspirational 3 — I Copied FL Studio’s Homepage. Hard. Not going to pretend otherwise: leaned on FL Studio’s site pretty heavily for structure and layout ideas here. And honestly, that’s just how this works — programming, design, all of it is borrowing from people who borrowed from the people before them. Nobody’s inventing layout from first principles in 2026. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who finally shipped a website after three devlogs of fighting it. Q: Is Help & Manuals actually going to do anything eventually? A: Presumably, someday. Right now it’s a promise the button is making on behalf of a future devlog. Q: Isn’t copying FL Studio’s homepage kind of a big deal? A: Structure and layout inspiration, not a straight copy-paste. And realistically, every site borrows from something — this one’s just being honest about the source. Q: Did the “everything looks like AI” problem from devlog #13 actually get solved? A: Yes, finally. Whatever changed between then and now worked. Q: What’s next now that the site’s shipped? A: I finally get to ship my project without worrying about AI looking websites —This is the end*— *end for now, placebo buttons permitting PLACEBO!!!
Spectralis devlog #15 —Hello again proggers— I lied. Posted devlog #14 saying the site was done and shipped, and the deploy pipeline crashed basically the second it went out. So that’s fun. On the bright side, v5.4.2 also went out this round, and it’s actually solid. “it’s done” is apparently my curse word Cat or dog? dequeue() Okay let’s get into it~ —Yap— Website pipeline ate itself right after devlog #14 posted, which is its own kind of poetic. Meanwhile the app side had a genuinely good run — six real fixes landed, one of them embarrassing enough to name directly. —The Great Suffering— 1 — The Website Pipeline Crashed Right After I Said It Shipped Devlog #14 said done. Pipeline said otherwise, immediately. Working on getting it back up, this is very much a “developing situation” and not a “resolved” one yet. 2 — Listener Requests Auto-Queue Now Requests from listeners now auto-queue instead of needing a manual step to actually land in the queue. 3 — Audio Literally Never Played, Whoops Exactly what it says. Somewhere in there, audio just wasn’t playing. Found and fixed, extremely glad this one got caught. a music player where the music doesn’t play is a bold minimalist statement 4 — Found It: Join Links Were Missing A Slash Root cause of a chunk of shared-play join weirdness — the links were missing a slash. One character. Fixed, join links actually resolve correctly now. 5 — Host Room Button Actually Tells You Something Now The host room button used to just sit there. Now it actually communicates state back to you instead of leaving you guessing whether anything happened. 6 — Host Room Was Dropping Every Tick Forever Host room had a bug where it was dropping on every single tick, indefinitely, rather than staying stable. Fixed so the room actually holds instead of degrading in real time. 7 — yt-dlp Was 5 Months Stale, Updated The bundled yt-dlp from devlog #10 hadn’t been touched in 5 months. Updated. Stale extraction tooling breaking silently is exactly the kind of thing that sneaks up on you. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who called the website shipped and got immediately humbled by CI. Q: Is the website back up yet? A: Working on it. Genuinely not resolved as of this devlog. Q: How long was audio actually broken for? A: Not specified, but “literally never played” is about as bad as this category of bug gets. Fixed now. Q: Was the missing-slash bug related to the join link work from devlog #9? A: Yes, same feature area, this was the actual root cause of some of the lingering weirdness there. Q: Is 5.4.2 stable? A: As far as testing shows. Same disclaimer as always applies. —This is the end*— *end for now, deploy pipelines permitting PARABLE!!!
Spectralis devlog #16 —Hello again proggers— Short one. Found the website pipeline issue from devlog #15. Cat or dog? sudo —Yap— It wasn’t the code. It was permissions. The site was calling root but never actually had access to root, which is exactly why it worked fine locally and fell over the second it hit deployment. “It woRKS On My macHiNe” — the oldest curse in software, and I said it unironically. classic —This is the end*— *end for now, root access permitting PAPAYA!!!
Spectralis devlog #17 —Hello again proggers— 12 hours. All-nighter. Zero sleep. Feature isn’t in the app. Nothing shipped. This is the devlog where I explain what an entire night of work bought me, and the honest answer is “a very expensive lesson.” worth it? absolutely not. did i learn something? also debatable Cat or dog? catch (ApiDoesNotExistException) Okay let’s get into it~ —Yap— Got ambitious. Decided Spectralis should integrate with everything — Pandora, Amazon Music, a bunch of other big platforms on top of what already works. Turns out “everything” includes a lot of services that simply don’t offer a public API to integrate with in the first place, and finding that out was not the fast part of the night. —The Great Suffering— 1 — The APIs Just Don’t Exist Pandora, Amazon Music, and others: no public API to build against. Not “hard to find,” not “poorly documented,” just not there. Should’ve been step zero, ended up being the thing that derailed the entire night once discovered mid-build instead of before starting. 2 — So I Built Backdoors Instead Spent a huge chunk of the 12 hours reverse-engineering and building unofficial access paths instead, since the front door didn’t exist. This is the kind of work that eats hours and produces nothing you can point to until it’s fully working, if it ever gets there. 3 — Most Of Them Were Already Patched Implemented several of these backdoor approaches only to find out the platforms had already closed the exact gaps being exploited, sometimes before the implementation was even finished. Built things that were dead on arrival by the time they existed. patched before i even shipped it, incredible timing 4 — Asked Claude, Got A Hallucinated Answer, Followed It Anyway At the point of giving up, asked for a way to make it work anyway. Got a confident-sounding approach back that didn’t actually correspond to anything real, and followed it blindly instead of verifying it first, because by that point it was hour 10-something and verifying things sounded like more effort than it was. 5 — Ripped The Whole Feature Out End state: none of it works, none of it can work without real API access that doesn’t exist, so the entire feature attempt got stripped back out of the codebase. 12 hours, one commit’s worth of net progress, and that commit is the revert. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out platforms without public APIs stay that way for a reason. Q: Is any of this coming back later? A: Not until there’s an actual, real, non-reverse-engineered way in. Not chasing patched backdoors again. Q: Should you have asked Claude earlier instead of at hour 10? A: Probably. Should also have double-checked what it said instead of following it blind at 4am. Two separate lessons from one night. Q: Was any of the 12 hours useful? A: Now know definitively which platforms are and aren’t worth attempting. That’s the only thing salvaged. Q: Sleep status? A: Catastrophic. Handling that before touching code again. —This is the end*— *end for now, actual sleep permitting Im gonna go pass out on the couch ADIOS!!!
Spectralis devlog #18 —Hello again proggers— First real demo capsule is live. Not a screenshot, not a “trust me it works” — an actual .spectralis file you can grab and open yourself, right after devlog #17’s night of nothing. Felt good to ship something that isn’t a revert for once. redemption arc, one demo file at a time Cat or dog? demo.spectralis Okay let’s get into it~ —Yap— Wanted the first public demo to actually show off what a capsule can do, not just be a proof of concept nobody can open. So it’s a full one: real track, real hand-timed lyrics, and a visualizer built specifically for it instead of a generic default. —The Great Suffering— 1 — The Demo’s Live demo.spectralis is up at cdn.deltavdevs.com now. First capsule anyone outside this devlog series can actually download and open. 2 — The Track And The Lyrics Built around Black Coast’s “TRNDSTTR” (Lucian Remix). Lyrics for it were timed and written into the capsule by hand — not pulled from some export, actually sat down and did the timing work myself. 3 — The Visualizer’s Custom, Not A Default Also built the visualizer specifically for this capsule instead of shipping the demo with a stock one. Wanted the first thing people see from Spectralis to actually demonstrate what the capsule format can do end to end — audio, synced lyrics, and a visual built to match, all in one file. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one downloading the first real capsule demo. Q: Where’s the demo? A: cdn.deltavdevs.com/spectralis/demo.spectralis — direct download, no wrapper page. Q: Did you write the lyrics yourself or pull them from somewhere? A: Wrote and timed them in by hand for this capsule specifically. Q: Is the visualizer reusable for other capsules? A: Built for this one specifically, but nothing stopping it from getting adapted or reused as a base for others later. Q: Is this what stories/capsules from devlog #7-#8 were building toward? A: Exactly that. This is the first one actually finished and out in the world instead of just being tested locally. —This is the end*— *end for now, capsule downloads permitting PARODY!!!
Spectralis devlog #19 —Hello again proggers— v6 LTS is on the horizon. Scheduled time with a friend who actually owns a Tim Cook machine, fingers crossed a Mac build comes out the other side of that session actually working. praying to the WWDC gods Cat or dog? arm64 Okay let’s get into it~ —Yap— First real LTS push. Different mindset than the last 18 devlogs of feature work and 3am bug hunts — LTS means stability first, and it also means finally taking a real swing at macOS instead of leaving it as a someday problem. —The Great Suffering— 1 — Prepping For v6 LTS Getting the groundwork in place for the first Long Term Support build. Less “ship the coolest thing,” more “ship the thing that won’t need constant babysitting after release.” 2 — Borrowing A Friend’s Mac Don’t own a Mac. Scheduled dedicated time with a friend’s actual Apple hardware to attempt a real build instead of guessing blind or fighting a CI-only setup with no way to actually test the output. 3 — The Honest Caveat: Mac Support Will Lag Straight talk: limited access to Mac hardware means Mac builds will very likely only get LTS releases going forward, and will land late relative to betas and regular updates on other platforms. Not ideal, but better to say it now than pretend otherwise. can’t test what you can’t touch —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one borrowing a friend’s Mac because Apple hardware access is not a given. Q: Will Mac users get every update? A: Realistically, no — LTS builds only for the foreseeable future, and later than other platforms. Access to hardware is the bottleneck, not desire to support it. Q: Why prioritize LTS over a beta cycle right now? A: Stability’s the actual goal for v6. Betas can come later once the LTS foundation’s solid. Q: Is the Mac build guaranteed to work this session? A: No promises. That’s what “fingers crossed” means. Q: What happens if the Mac session doesn’t go well? A: Try again next time hardware access lines up. Not giving up on it, just constrained by it. —This is the end*— *end for now, Tim Cook machines permitting PRINCIPLE!!!
Spectralis devlog #20 —Hello again proggers— Two zero. Milestone devlog, and it’s a good one: LTS is about to actually go out the door, Mac included, today. we made it, barely, on no sleep, as tradition demands Cat or dog? git revert HEAD 7 Okay let’s get into it —Yap— Spent the whole night doing QoL and QA on all the tiny bugs that had been getting pushed aside devlog after devlog. Turns out “small bugs” and “easy to fix” are not the same category, and the whole night proved it the hard way. —The Great Suffering— 1 — Hydra Bugs Every single one of the small deferred bugs got patched, and every single patch spawned about three new ones in its place. Fix one, watch three grow back. Felt less like debugging and more like fighting something with a regeneration mechanic. cut off one head, three more show up, name a more accurate bug report 2 — Tried Claude Code Out Of Exhaustion Got tired enough mid-hydra-fight to set up Claude Code and hand off some of the grind. It did not go well — ended up rearranging the repo and commit layout in ways that made the history a mess, not the bugs. 3 — Had To Undo Its Commits Rolled back what Claude Code did and went back to fixing things manually. Lesson for the night: handing off a messy, deep-in-it repo state to an agent mid-crisis is not the same as handing off a clean one. 4 — Actually Got All The Tiny Bugs Out After all of that, the hydra’s actually dead. Every deferred small bug from the last 19 devlogs finally cleared in one sitting, which is the whole reason today’s release is happening at all. 5 — Mac Release, Today Following up on devlog #19’s borrowed-Mac build attempt — releasing to Mac today alongside everything else. First real payoff from that session. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who fought a hydra of bugs all night and won, barely. Q: Did Claude Code actually break anything functional, or just the repo layout? A: Just history and commit structure, nothing shipped broke because of it. Still a mess worth undoing. Q: Is this LTS build the one from devlog #19’s prep? A: Yes, same one. This was the final QA gauntlet before it goes out. Q: Is Mac really getting it today? A: That’s the plan, following through on the borrowed-Mac build session from last devlog. Q: 20 devlogs in, anything you’d do differently? A: Sleep more, probably. Not going to happen, but it’d be the right answer. —This is the end*— *end for now, hydra heads permitting PROPERTY!!!
Spectralis devlog #21 —Hello again proggers— Flagged for “AI website” again. By Shipwrights this time. Getting a little tired of this specific accusation, honestly — a commit log sitting right there would show actual work happening over actual time, but apparently that’s a few extra minutes nobody wants to spend. the receipts exist, nobody’s asking to see them Cat or dog? git log –oneline Okay let’s get into it~ —Yap— Third redesign of the site now. Not because the flag was right, but because if this keeps happening it’s worth just making the “looks AI-made” argument harder to make at all, regardless of whether it was ever a fair read in the first place. —The Great Suffering— 1 — Flagged Again Shipwrights flagged the site as AI-generated. Same accusation as the devlog #12-#14 saga, different flagger this time. Slightly more annoying with each repeat, since the actual work history’s right there for anyone willing to look. 2 — The Annoying Part It’s not that the site got flagged, it’s that the disproof is trivially available — commits, timestamps, iterative changes across three separate rebuilds — and checking that apparently isn’t part of the process. Frustrating, not devastating. 3 — Redesigned It A Third Time Rather than fight the flag directly, changed the site again. Third pass now, and it genuinely reads less like generic AI-slop territory than the last version did. Whether that satisfies the next flag or not, it’s a real improvement on its own merits. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who’s redesigned this website three separate times partly to dodge a false flag. Q: What’s Shipwrights? A: The one doing the flagging this round. Q: Is the flag actually accurate? A: No — there’s a real commit history behind the site across devlogs #12 through #14 and now this one. The flag’s wrong, just annoying to keep disproving. Q: Does this redesign replace the one from devlog #14? A: Yes, third full pass on top of that one. Q: Any plan if it gets flagged a fourth time? A: Probably the same plan: keep the receipts, keep improving the site anyway, move on. —This is the end*— *end for now, false flags permitting PALPABLE!!!
Spectralis devlog #22 —Hello again proggers— Posting this before I pass out for real. And no, that wasn’t me faceplanting the keyboard, that was the cat walking across it. Very important distinction. the cat gets a commit credit for that one, honestly Cat or dog? cat, apparently, tonight specifically Okay let’s get into it~ —Yap— Back on the ever-growing pile of bugs and QoL from devlog #20’s hydra fight — turns out killing all the tiny bugs once doesn’t mean they stay dead forever, more just showed up in the meantime. Made real progress anyway. —The Great Suffering— 1 — A Few Spotify Bugs, Actually Squashed Chased down and fixed a handful of Spotify-side bugs this round. Not a full audit like earlier devlogs, just real ground covered on stuff that’s been sitting in the pile. 2 — Resizing QA Went through resizing behavior across the app and did a real QA pass on it — the kind of thing that’s easy to skip until someone resizes a window in a way you never tested and everything looks wrong. 3 — The Multi-Channel Stream Queue Idea Had the idea to implement multi-channel support for Streamer Queue. Started on it, and it’s genuinely probably too big to land fully before LTS ships — most likely going in as a stub for now rather than a finished feature, with the real implementation following after. “horrible idea” is doing some self-aware lifting there and I stand by it —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who mistook a cat for their own exhaustion, and honestly it could’ve gone either way. Q: What’s a “stub” mean for multi-channel here? A: The scaffolding and interface exist, the real functional implementation doesn’t yet. Placeholder with intent, not a real feature. Q: Is this the same bug pile from devlog #20? A: Same pile, refilled since then. Small bugs apparently regenerate on their own schedule, not just when you’re actively fighting them. Q: Why is multi-channel “horrible” if you’re building it anyway? A: Because scope-wise it’s a lot more than it looks like on paper, and admitting that upfront beats pretending it’s simple. Q: Sleep status tonight? A: About to happen, actually, this time. Cat’s taking the credit either way. —This is the end*— *end for now, sleepy cats permitting PEOPLE!!!
Spectralis devlog #23 —Hello again proggers— Introducing the visualizer editor. Been sitting on this one for a while without announcing it, for a very specific reason: every single time it felt ready, the format changed again and “ready” moved further away. Think it’s actually real this time. announced it in my head about six times before this devlog Cat or dog? visualizer.format Okay let’s get into it~ —Yap— Grinding all night on this one, branch and v1 dropping tomorrow. No promises beyond that, just the plan and the fact that this has been quietly cooking for way longer than any single devlog has let on. —The Great Suffering— 1 — Why This Wasn’t Announced Sooner Kept hitting the point where the editor felt done, then rethinking the underlying format and starting that part over. Easier to just not announce something that keeps changing shape than to keep walking back a “it’s ready” claim in public. 2 — v1 And The Branch, Tomorrow Committing to it now — v1 and the branch land tomorrow. Whole night’s going toward getting there, which given the last 22 devlogs of this project is either a great sign or a very familiar warning sign. history suggests: could go either way 3 — What The Visualizer Editor Actually Is A real editor for building visualizers instead of the visualizer side of the app staying built-in-only. Ties back to everything from the capsule/worlds work in devlogs #7 and #8 and the custom visualizer built for the demo capsule in devlog #18 — this is the tool version of doing that by hand. 4 — Hackatime Also Just Died (Or My PC Did) On top of everything else, Hackatime seems to be down, or my PC’s cooked, unclear which yet. Either way tracked hours for tonight are now undefined. Yipee. unlogged hours are the best kind of hours, said nobody’s time tracker ever —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to pull yet another all-nighter for a feature reveal. Q: Why did the format keep changing? A: Each pass revealed a new limitation once actually used for real, and fixing that meant reworking the format again rather than shipping something known to be wrong. Q: Is this related to the demo capsule visualizer from devlog #18? A: Same territory. That one was hand-built. This is the editor meant to make building one not require doing it by hand. Q: What’s “v1” mean here specifically? A: First real usable version, branch-only for now, not a full public release yet. Q: Any risk this slips again? A: Always possible given the track record, but committing to tomorrow specifically this time. —This is the end*— *end for now, format stability permitting PEPLE!!!
Spectralis devlog #24 —Hello again proggers— Rewrote the README a third time. Not because it was wrong, because proper prose and actual formatting apparently reads as “completely AI” to whoever’s judging it, and I’m too burnt out to keep arguing that point. So it just got redone instead. can’t fight the vibes, can only rewrite around them Cat or dog? README.md Okay let’s get into it~ —Yap— Small win buried in the exhaustion: website’s on version 4 now and it didn’t get flagged this time. First one that made it through clean since devlog #21 started this whole saga. Progress, even if the README’s now on its third rewrite for reasons that have nothing to do with whether it’s actually good. —The Great Suffering— 1 — README Rewrite #3 Same content, restructured again, because well-formatted prose keeps getting read as an AI tell regardless of who wrote it or how. Not going to keep relitigating this one, just redid it and moved on. 2 — Website v4 Survived The actual good news. Fourth pass on the site, first one that didn’t get flagged. Whatever combination of changes from devlog #21 onward finally landed right. 3 — Hoping The App Gets Checked Next If the docs and the website keep clearing review, maybe eventually the actual app gets looked at instead of just the surface-level stuff around it. That’s the real hope here — less time defending prose formatting, more time on the thing that actually matters. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one whose actual writing keeps getting mistaken for a machine’s. Q: Why does formatted prose get flagged as AI? A: Genuinely unclear, and at this point not worth the energy to keep contesting. Rewriting around it was faster than arguing it. Q: Is this the fourth full website redesign? A: Yes — devlog #14, then #21’s rework, and now this pass, landing clean. Q: Has the app itself ever been flagged? A: Not yet, and that’s sort of the point of this devlog — hoping it stays that way, or at least gets a fair look if it comes up. Q: How’s the burnout? A: Present. Noted. Continuing anyway. —This is the end*— *end for now, formatting opinions permitting PEEL!!!
Spectralis devlog #25 —Hello again proggers— Short one, I’m about to pass out for real this time. Ground away at the visualizer toolkit for a long stretch and it’s still nowhere near done. another one for the “not as close as I thought” pile Cat or dog? too tired to pick one honestly Okay quick version~ —Yap— Same visualizer editor territory from devlog #23, except the format not-changing this time didn’t mean the finish line got any closer. Long grind, real progress somewhere in there probably, just not a done toolkit at the end of it. —The Great Suffering— 1 — The Toolkit Isn’t Close Put in a long stretch on it and it’s genuinely still far from finished. Not a small gap either, just more scope than one exhausted session could close. 2 — I’m Cooked That’s the whole update. No dramatic bug story tonight, just hours in and not enough left to keep going. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who should probably close the laptop now. Q: Is this the same visualizer editor from devlog #23? A: Same one. Still cooking, longer than expected. Q: Any specific blockers? A: Too tired to write them up properly tonight. Next devlog, probably, once there’s actual sleep behind it. Q: When’s it landing? A: Unknown. Not this session. —This is the end*— *end for now, actually sleeping this time POOL!!!
Spectralis devlog #26 —Hello again proggers— Still grinding the visualizer toolkit from devlog #25. Fueled up properly this time — favorite tunes on, Coke Zero and a Monster Ultra on deck, going the entire night. Also, small detour: past me apparently gave in and used Electron at some point, so present me now has to relearn it from scratch. past me makes decisions present me has to live with, name a more accurate description of software Cat or dog? require(‘electron’) Okay let’s get into it~ —Yap— Two threads tonight: the toolkit grind continuing from last devlog, and a genuinely surprising discovery on the Mac build front that’s going to need its own hotfix branch. —The Great Suffering— 1 — Relearning Electron Past-me committed to Electron somewhere along the way and current-me forgot most of it. Spending part of tonight just getting back up to speed on something that used to be second nature. Annoying, but at least it’s a known quantity once it clicks back in. 2 — The Toolkit, Still Grinding Same visualizer toolkit as devlog #25. Not done yet, but the night’s young and there’s caffeine involved. Hoping to actually close real ground on it before LTS needs to be ready. 3 — Mac Build Actually Compiles Now Following up on devlog #19’s borrowed-Mac session — got it to build and compile this time. Real progress on a front that’s been genuinely hardware-constrained the whole way. 4 — Turns Out Mac Isn’t Windows Or Linux (Shocking, I Know) Here’s the surprising part: a lot of the build scripts turned out to be Windows/Linux-centric, and Mac is, in fact, neither of those operating systems. Somehow this wasn’t obvious until actually staring at a failing script on real Mac hardware. three major desktop OSes and somehow I only accounted for two of them 5 — Hotfix Branch Incoming Need to spin up a hotfix specifically for the platform-assumption problem in the scripts, and hoping it merges back clean without conflicts. Given tonight’s track record so far, cautiously optimistic. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who forgot their own framework choice from past-self. Q: Why Electron in the first place? A: Decision from before this devlog series apparently, reasons unclear at this hour, dealing with the consequences now regardless. Q: Is the Mac hotfix urgent? A: Ties directly into whether LTS with Mac support actually holds together, so yes, fairly urgent. Q: Was assuming Windows/Linux-only scripts really a mistake nobody caught until now? A: Apparently so. Borrowed-Mac hardware access from devlog #19 finally exposed it. Q: Toolkit status vs. hotfix status tonight — which wins? A: Whichever gets further before the caffeine runs out. Probably both get some progress. —This is the end*— *end for now, merge conflicts permitting PROPER!!!
Spectralis devlog #27 —Hello again proggers— Still going. Decided mid-grind to switch off JSON-based saving entirely and move to a proper binary streamed format instead — faster save/load, way less CPU overhead. Which sounds like a clean upgrade until you realize it means reading books on binary format design that were probably written before I was. my caffeine and my reading list have diverged wildly tonight Cat or dog? BinaryWriter Okay let’s get into it~ —Yap— The pivot away from JSON wasn’t planned going into tonight, it just became obviously worth it partway through the toolkit grind. Now stuck in the part of the process nobody enjoys: documentation, theory, and CS ideation before any of the actual implementation gets to happen. —The Great Suffering— 1 — JSON’s Getting Replaced Moving off JSON-based saving to a binary streamed format. The reasoning’s simple — faster save/load, meaningfully less CPU usage — but simple reasoning doesn’t mean simple implementation. 2 — Reading Books Older Than Me Digging into binary streaming format theory means reading material that predates this whole project by a wide margin, some of it by a lot more than that. Foundational stuff, just not exactly light reading at this hour. 3 — Documentation And Theory Hell Currently deep in the least glamorous part of any format redesign: reading documentation, working through theory, and CS ideation before writing a single line that actually does anything. Necessary, still miserable at 2am. the implementation is the fun part and it’s still hours away 4 — Sun Came Up, Had A Sandwich, Kept Going Watched the sunrise somewhere in the middle of the theory reading. Had an egg and bacon sandwich for breakfast, genuinely delicious, best part of the night so far. No sleep planned until tonight — just powering through on breakfast fuel instead. breakfast during an all-nighter hits different —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one reading format-design theory older than their own project at 2am. Q: Why move off JSON now, mid-grind? A: Became clear it was the right call while working on the visualizer toolkit — better performance characteristics were worth the detour. Q: Is this related to the toolkit from devlog #25/#26? A: Same overall session, this is a scope addition that came up while working on it. Q: When does actual implementation start? A: Once the theory and documentation phase actually resolves. Not there yet. Q: Is tonight ever going to end? A: Not until tonight, apparently — sun’s already up and there’s no sleep planned before then. —This is the end*— *end for now, binary formats permitting PAM!!!
Spectralis devlog #28 —Hello again proggers— LTS 6 is out. Genuinely out, not “shipped to nowhere” out like devlog #11. Sleep deprivation’s fully caught up though — first chance I get, I’m passing out on the couch with the cat and that’s non-negotiable at this point. the cat’s getting a co-author credit at this rate Cat or dog? couch, specifically, with the cat, immediately Okay let’s get into it~ —Yap— Long stretch from devlog #26 through here finally paid off. LTS 6 pushed, and the major macOS decoding problems from the borrowed-Mac build sessions actually got fixed. Real progress, real exhaustion, both at once. —The Great Suffering— 1 — LTS 6 Is Out Following the hydra-bug fight in devlog #20, the Electron relearn and Mac hotfix in #26, and the binary format detour in #27 — it’s actually pushed now. Linux and Windows builds are the ones going out first. 2 — Major macOS Decoding Problems, Fixed Following up on the platform-assumption bug from devlog #26, where Windows/Linux-centric scripts choked on Mac being neither — dug into the actual decoding issues on macOS and got the major ones resolved this round. 3 — Mac Release Is Coming, Just Not Today No Mac hardware access again until Monday, so the macOS build follows a bit after Linux/Windows instead of dropping same-day. Same access constraint from devlog #19, still the bottleneck, still the plan. 4 — Sleep Is Winning Officially out of gas. Couch, cat, first available window. This devlog is basically the victory lap before collapsing. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to lose consciousness on a couch next to a cat, mission accomplished. Q: Is LTS 6 out for everyone right now? A: Linux and Windows, yes. macOS is coming shortly after once Mac access is available again Monday. Q: Were the macOS decoding problems from the script issue in devlog #26? A: Related territory, yes — once the platform-assumption bug got flagged, the deeper decoding issues underneath it got found and fixed too. Q: Any concerns going into the Mac release specifically? A: Nothing unresolved as of this devlog, but access is still limited to occasional sessions, so timing’s dependent on that. Q: What’s next after this? A: Sleep. Genuinely, actually sleep, before anything else touches this project. —This is the end*— *end for now, couch naps permitting thud Zzzzzz!!!
Spectralis devlog #29 —Hello again proggers— The studio’s finally looking like a real UI tool instead of a collection of windows held together by vibes. Two design references pulled this round: Godot for world editing, and Adobe After Effects for capsules. stealing good ideas from great tools is called “design research,” look it up Cat or dog? Ctrl+Shift+F Okay let’s get into it~ —Yap— Studio’s been the least polished part of the whole app for a while, mostly functional, rarely pretty. This round actually leaned into real interface design instead of just adding buttons where they fit, borrowing structure from two tools that already solved similar problems well. —The Great Suffering— 1 — Godot-Inspired World Editing World editing took cues from Godot’s editor layout — the way it structures a scene tree, viewport, and inspector panel together as one coherent workspace instead of scattered windows. Applying that same structural thinking to world editing here, since worlds are conceptually similar: a tree of pieces you’re arranging in space. 2 — After Effects-Inspired Capsules Capsule editing leaned on After Effects instead, specifically the layer/timeline/composition mental model. Capsules are time-based and layered by nature — a story surface, a visualizer, audio all stacked together — so a timeline-and-layers metaphor fits better than a flat property list ever did. 3 — The Studio Finally Feels Like A Tool Combined, these two reference points are what’s pushing the studio from “internal dev utility” toward something that actually feels designed for someone to sit down and use, not just something built incrementally to unblock whatever feature needed it that week. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one borrowing UI patterns from two very different but very good tools. Q: Is this a full rewrite of the studio UI? A: More a restructuring around better mental models than a ground-up rebuild, but it touches a lot of surface area. Q: Why Godot for world editing specifically? A: Scene/viewport/inspector is a well-worn pattern for spatial editing, and worlds are fundamentally a spatial arrangement problem. Q: Why After Effects for capsules? A: Capsules stack time-based layers — story, visualizer, audio — which maps naturally onto a timeline/layers workflow instead of flat settings. Q: Does this connect to the visualizer toolkit grind from devlogs #25-#27? A: Same broader authoring-tools push, yes, this is the UI side catching up to that work. —This is the end*— *end for now, layer panels permitting POP!!!
Spectralis devlog #30 —Hello again proggers— Following up on the studio redesign from last devlog — actually building inside that new layer system now. Lyric importer, a bezier tool that fought back the whole way, and capsules jumped to full HD. 30 devlogs in and the bezier tool still almost won Cat or dog? bezier.controlPoint Okay let’s get into it~ —Yap— Layers from devlog #29’s redesign got real functionality built on top of them this round, plus a genuinely useful new import path and a resolution bump that should’ve probably happened earlier. —The Great Suffering— 1 — Layer Fixes Cleaned up a handful of issues in the new After Effects-style layer system from last devlog — the kind of rough edges that only show up once you’re actually building real content in it instead of just looking at the layout. 2 — Lyric Importer: Auto Vector Layers + Keyframing New importer that takes lyric timing and automatically generates vector layers, keyframed to match. Turns what used to be manual layer-by-layer, keyframe-by-keyframe setup into an actual import step. Big time save for anything lyric-driven, including future capsules like the demo from devlog #18. 3 — A Few More Bugs, Squashed Small round of additional fixes alongside the bigger items, nothing individually dramatic. 4 — Capsule Resolution: Bumped To Full HD Capsules render at full HD now instead of whatever lower resolution they were capped at before. Straightforward upgrade, noticeably better output. 5 — The Bezier Tool (Which Was Hell) Added a real bezier curve tool to the timeline/layer editing. Genuinely brutal to get right — curve math, control point handling, and making it feel intuitive to actually drag are three different hard problems stacked on top of each other. Worth it, but it fought back the whole way. bezier curves: simple in theory, a nightmare in an actual editor UI 6 — Timeline And Tool QoL Assorted quality-of-life improvements across the timeline and tools generally — the small friction-reduction stuff that adds up once you’re using the studio for real work instead of just testing it. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just fought a bezier tool and mostly won. Q: Does the lyric importer work with the demo capsule from devlog #18? A: That one was hand-timed and hand-built before this importer existed — this tool’s for making the next ones faster. Q: Why was the bezier tool specifically so hard? A: Curve math, control point interaction, and UI feel all had to work together, and getting any one of them wrong makes the whole tool feel broken. Q: Is full HD the resolution ceiling now, or is higher coming later? A: Full HD is what shipped this round. No commitment yet on going higher. Q: Is the studio redesign from devlog #29 basically done now? A: Getting real functionality built on it, which is a good sign, but still ongoing. —This is the end*— *end for now, control points permitting PALPABLE!!!
Spectralis devlog #31 —Hello again proggers— More QoL, a real bug fixed in world editing, and a proper in-depth test run of the whole thing. Honest verdict after actually using it for real: still sucks, still hate it, but it’s at least somewhat usable now. Progress, technically. “somewhat usable” is a real milestone when you started from “actively bad” Cat or dog? node.isCorrupt Okay let’s get into it~ —Yap— World editing’s been the newer, rougher part of the studio since the Godot-inspired redesign in devlog #29. This round was about actually running it through its paces instead of just building on top of it, and that testing found a real problem. —The Great Suffering— 1 — More QoL Another pass of small quality-of-life improvements, continuing the trend from the last couple devlogs. Nothing individually huge, all of it adds up. 2 — The Bad Node Bug Found and fixed a genuinely bad node bug in the world section during testing. The kind of bug that only shows up once you’re actually building real worlds instead of poking at an empty editor. 3 — The In-Depth Test Run Took world editing for a real, thorough run this time instead of a quick sanity check. Built something with actual substance in it and used the tool the way it’s meant to be used. 4 — The Honest Verdict Still sucks. Still hate using it. But after this round of fixes and QoL, it’s crossed into “somewhat usable” territory, which is more than could be said before this session. low bar, cleared, moving on —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just admitted their own tool still sucks and shipped it anyway. Q: Is world editing done now? A: No, “somewhat usable” is the current state, not “finished.” More work ahead. Q: How bad was the node bug? A: Bad enough to matter, found through actual real-world testing rather than a quick check. Q: Is this related to the layer work from devlog #30? A: Different area — that was capsules/timeline, this is world editing specifically. Q: What’s the plan to make world editing not suck? A: Keep testing it for real, keep fixing what that testing turns up. This devlog’s the start of that loop, not the end. —This is the end*— *end for now, corrupted nodes permitting PAPLE!!!
Spectralis devlog #32 —Hello again proggers— Mac’s out. Actually out, actually available, actually done. Took way longer than expected — the site needed updating and every single update script needed fixing before this could actually go out the door clean. “we got mac out” undersells how much site and script work that actually took Cat or dog? .pkg Okay let’s get into it~ —Yap— Closing the loop that started way back in devlog #19 with a borrowed Mac and a hopeful “fingers crossed,” went through the decoding fixes in devlog #28, the platform-assumption hotfix in devlog #26, and now it’s actually shipped. Quick policy reminder while we’re here, since it matters going forward. —The Great Suffering— 1 — The Site Needed Updating First Before Mac could actually go out, the site itself needed real updates to reflect it — new download option, new platform messaging, none of which existed yet. Took a real chunk of the time this release ate. 2 — Every Update Script Needed Fixing Following up on the Windows/Linux-centric script assumptions caught back in devlog #26 — turns out that wasn’t a one-off fix, it touched update scripts broadly. Had to go through and fix them properly for Mac to actually be able to update itself going forward, not just install once. 3 — Mac Is Actually Out After all of that: it’s live. Full journey from borrowed hardware sessions to an actual public release. 4 — Reminder: Mac Only Gets LTS Quick policy note, stated plainly since it matters: Mac only receives LTS releases going forward, not minor updates, unless a minor is a Mac-specific patch. Same access-constraint reasoning from devlog #19 — this isn’t changing anytime soon, so setting the expectation clearly now. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out “ship Mac” secretly meant “rebuild the update pipeline.” Q: Does Mac get every LTS release? A: Yes, every LTS. Just not the minors in between, unless that minor is Mac-specific. Q: Why not give Mac full parity now that it’s out? A: Hardware access is still the bottleneck — same reasoning as devlog #19, testing and building for Mac isn’t a routine, always-available thing yet. Q: What took so long between the decoding fixes in devlog #28 and now? A: Mostly the site and update script work described above — the actual build was closer to ready than the delivery pipeline around it was. Q: Is this the end of the Mac saga? A: The release side, yes. Ongoing maintenance is just going to follow the LTS-only cadence from here. —This is the end*— *end for now, update scripts permitting POP!!!
Spectralis devlog #33 —Hello again proggers— First real wave of feedback since Mac shipped in devlog #32, and it’s been genuinely good. Patching a handful of bugs people actually pointed out, plus one quick clarification for a specific rater who had a question. real users, real feedback, feels different from testing solo Cat or dog? feedback.md Okay let’s get into it~ —Yap— Shipping to actual people instead of just self-testing changes the kind of bugs that surface. Round of patches based directly on what came in, plus a couple of housekeeping notes. —The Great Suffering— 1 — Real Feedback, First Time At This Scale Genuinely solid feedback wave since the Mac release. Different flavor of bug reports than internal testing ever produces — actual usage patterns finding things a solo QA pass wouldn’t. 2 — Patching What Got Pointed Out Working through the specific bugs raised by that feedback. Direct fixes for direct reports, exactly the kind of loop that’s supposed to happen once something’s actually in people’s hands. 3 — Quick Note For A Specific Rater One rater asked about the track used in devlog #1 — it’s a custom remix of “Delete” by Ninjirachi. DM if you want the file. 4 — How To Reach Out For anyone hitting issues with the app: Slack works, or Discord at @deltav0rtex . Genuinely want the reports, keep them coming. 5 — A Surprise Is Coming Next Ship Got something tucked away for the next release that should land well. Not spoiling it here, staying quiet on purpose. Minor patch for this round’s QoL fixes drops within the next two days. teasing it and saying nothing else, that’s the whole bit —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one actually reading feedback instead of guessing what’s broken. Q: How do I report a bug? A: Slack, or Discord — @deltav0rtex . Q: What was that track in devlog #1? A: A custom remix of “Delete” by Ninjirachi. DM for the file if you want it. Q: Is the current bug list from this feedback wave big? A: Manageable, working through it directly rather than batching for a bigger release. Q: Any plans to formalize a feedback/bug channel later? A: Not stated yet, current setup is DMs and Slack for now. Q: What’s the surprise for next ship? A: Not saying. That’s the point of a surprise. Q: When’s the minor QoL patch dropping? A: Within the next two days. —This is the end*— *end for now, bug reports permitting PARABLE!!!
Spectralis devlog #34 —Hello again proggers— Still on the devlog commits grind. The surprise from devlog #33 is actually finished now, releasing alongside the next Stardance ship as soon as this current one clears. Meanwhile, spent this round scouring the app for small edge cases and UI stuff that’s been quietly overlooked. the surprise is done, the suspense is not Cat or dog? edge_case.md Okay let’s get into it~ —Yap— Two tracks this devlog: the surprise from last time is locked and ready, waiting on the current ship to clear before it goes out with Stardance. In the meantime, doing a proper sweep for the small stuff — edge cases and UI rough edges that don’t show up unless you’re specifically hunting for them. —The Great Suffering— 1 — The Surprise Is Finished Whatever it is, it’s done. Releasing with the next Stardance ship, not this current one — has to clear first. Still not saying what it is. still not telling you, patience 2 — Scouring For Edge Cases Going through the app specifically looking for edge cases that got missed during normal feature work — the inputs and states nobody thinks to test until something breaks in a very specific, very rare way. 3 — UI Stuff That Got Overlooked Alongside the edge cases, hunting down small UI issues that slipped through — spacing, alignment, states that don’t look quite right, the stuff that’s easy to miss when you’re heads-down building instead of using the app like a regular person would. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one hunting edge cases nobody else would think to try. Q: What’s the surprise? A: Patience, my dear child. Q: Why wait for the current ship to clear first? A: Cleaner to let one release settle before stacking the surprise onto the next one. Q: Any specific edge cases found yet? A: Sweep’s ongoing, nothing dramatic enough to call out individually yet. Q: Still not saying what the surprise is? A: Correct. Ask again next devlog. —This is the end*— *end for now, edge cases permitting PERISHABLE!!!
Spectralis devlog #35 —Hello again proggers— Long way from v5.3.0, that’s for sure. New ship’s cooking, and it’s built directly off the feedback wave from devlog #33 — took what came in and actually built more on top of it. Also, the big one this round: video export is here. 35 devlogs from “last ship” to this Cat or dog? .mp4 Okay let’s get into it~ —Yap— This one’s a real feedback-driven ship, not just internal roadmap stuff. Fed reports and requests all the way back from devlog #2’s post-first-ship feedback into the app, and video export was the headline addition that came out of it. —The Great Suffering— 1 — Feedback Actually Became Features Everything that came in since devlog #2, right after the very first ship, finally got folded back into this release, not just patched as bugs but expanded into more app. Real loop from “here’s what’s wrong/missing” way back then to “here’s it, fixed and built out” now. 2 — Video Export Is Here For music makers who want something to post — YouTube, Klipy, wherever you’re posting cool stuff — Spectralis can now export video directly instead of just playing audio and visualizers live. Been a long time coming given how much the visualizer/capsule work has built up across devlogs #7, #18, #23, and #29-#30. 3 — This Is The New Ship, Not The Finished One Announcing the direction this round more than closing it out — the surprise from devlog #33/#34 still rides along on this too. Full picture coming as it actually ships. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just got a whole export pipeline for their trouble. Q: What can video export actually do? A: Exports your visualizer/capsule output as an actual video file, suited for posting to platforms like YouTube or Klipy. Q: Is this the same ship as the Stardance surprise from devlog #34? A: Same overall release window, yes. Q: How much of this came directly from user feedback? A: A meaningful chunk — some of it going all the way back to devlog #2, right after the very first ship. Q: When’s it actually dropping? A: Still in progress. This is the announcement, not the release. —This is the end*— *end for now, export pipelines permitting PS: couldn’t find a good meme this time, so you get corporate gif slop instead. Enjoy. PICKLE!!!
Spectralis devlog #36 —Hello again proggers— Last log before 6.0.1 tries to ship to everyone. Except Mac, remember? If anyone — and by anyone I mean basically no one — has the app downloaded already, you should see the update land fairly soon. “anyone” carrying a lot of self-deprecation in that sentence Cat or dog? v6.0.1 Okay let’s get into it~ —Yap— Four things landing in this round: video export from devlog #35 finally patched back in properly, the about page expanded, a real EQ upgrade, and more webview bugs cleared out. Then it’s out the door. —The Great Suffering— 1 — Video Export, Actually Patched In Announced back in devlog #35, and this round it’s actually working and patched into the build for real instead of just existing as a headline feature nobody could touch yet. 2 — About Page, Expanded Grew the about page out — more actual content instead of the bare-minimum version it’s had this whole time. 3 — A Far More Advanced EQ System Real upgrade here: new EQ with envelope styling and a handful of presets. Meaningfully more capable than whatever was there before, for anyone who actually cares about shaping their sound instead of just hitting play. 4 — More Webview Bugs, Patched Following the WebView2Host fast-path fix from devlog #9, a few more webview-related bugs got cleared out this round. Apparently that surface keeps finding new ways to misbehave. webview bugs are the gift that keeps on giving 5 — 6.0.1 Ships, Mac Excluded (Still) Same LTS-only policy from devlog #32 applies — Mac isn’t getting 6.0.1 as a minor. Everyone else should see the update land soon. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to auto-update basically no one to 6.0.1. Q: Why doesn’t Mac get 6.0.1? A: Same policy from devlog #32 — Mac only gets LTS releases, not minors, unless it’s a Mac-specific patch. Q: What’s new in the EQ system specifically? A: Envelope styling plus a set of presets, a real step up from the previous version. Q: Is video export from devlog #35 fully working now? A: Yes, patched in properly this round. Q: When does 6.0.1 land? A: Fairly soon, per this devlog, for anyone who already has the app installed. —This is the end*— *end for now, update pushes permitting PEBBLE!!!
Spectralis devlog #37 —Hello again proggers— Working through the feedback wave from the ship, including an upcoming maybe-new streaming service integration. Reverse engineering, again, yay. Also completely forgot Hackclub’s 10 hour limit was a thing and ran 5 hours over it. It’s fine. Everything’s fine. last time reverse engineering a streaming service ate 12 hours and produced nothing, so this is either growth or déjà vu Cat or dog? HKEY_LOCAL_MACHINE Okay let’s get into it~ —Yap— Post-ship feedback turned into real changes fast, and one of them’s a streaming service integration that’s back to reverse-engineering territory — hopefully with better luck than the devlog #17 saga. Also, format note: switching up how devlogs get posted going forward. —The Great Suffering— 1 — Maybe New Streaming Service Support Working on possible support for another streaming service, and since it doesn’t have a public API either, that means reverse engineering again. Learned some hard lessons from devlog #17’s all-nighter about this exact kind of work, applying them here — verifying before implementing, checking whether something’s already patched before sinking hours into it. 2 — 15 Hours, Not 10 Completely lost track of Hackclub’s 10 hour session limit and blew past it by 5 hours. Not the plan, happened anyway, no regrets loud enough to stop it from happening again probably. time limits are more of a guideline when you’re mid-flow 3 — A Format Change, By Request People like the meme format but keep asking to actually see the project itself, which is fair — problem is most of what’s happening is engine work, and a screenshot of raw code just doesn’t communicate much on its own. Going to try posting an actual screenshot as the first image and keep the meme as the second, going forward. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just blew past a 10 hour limit by half again as much. Q: Is this streaming integration going to end like devlog #17’s did? A: Hoping not — going in more carefully this time given how that one went. Q: Why not just show code screenshots if people want to see the project? A: Raw engine code doesn’t communicate much visually to most people. Trying to find screenshots that actually show something meaningful instead. Q: Will the meme format go away? A: No, staying as image two. Just adding an actual project screenshot as image one. Q: How’s the feedback wave going overall? A: Productive, this streaming service idea being one direct result of it. —This is the end*— *end for now, session limits permitting POSSIBLE!!!
Spectralis devlog #38 —Hello again proggers— Suno’s integration broke after their latest TOS update, so that got fixed. Also added Discord Rich Presence control for capsules, started chasing down a batch of connections that quietly broke or got dropped over time, and picked up a fun trivia fact along the way: Suno apparently hosts on AWS S3. a TOS update breaking an integration, name a more classic story Cat or dog? S3:// Okay let’s get into it~ —Yap— Mixed bag this round: one reactive fix from an external platform change, one genuinely new feature, and the start of a cleanup pass on integrations that have been quietly rotting since whenever they last got touched. —The Great Suffering— 1 — Suno Integration, Fixed Suno’s newest TOS update broke the existing integration. Patched it back up to work with the new terms. Reactive fix, not a fun one, but necessary. 2 — Capsule DRPC Control Real new feature: Spectralis capsules can now control Discord Rich Presence, so a capsule can show custom status while it’s playing instead of the app just showing generic now-playing info. 3 — Chasing Down Broken And Dropped Connections Going through existing integrations that broke with newer updates on the other end, or that got dropped along the way and never revisited — untitled.stream compatibility being one specific example. Working through the backlog of “this used to work” one at a time. 4 — Suno Hosts On AWS S3 Small fun discovery while poking around the integration: Suno’s hosting is on AWS S3. Not actionable, just neat to know. 5 — Looking For New Platforms Actively looking for what to integrate with next. Feedback on what platforms people actually want would genuinely help shape this. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one whose integration broke because someone else updated a TOS page. Q: What’s DRPC? A: Discord Rich Presence — the status shown under someone’s name in Discord. Capsules can now set custom status through it. Q: What’s untitled.stream compat about? A: One of the connections that broke or got left behind at some point — being actively worked back into shape. Q: What platforms are being considered for new integration? A: Not decided yet, genuinely open to suggestions. Q: Was the Suno fix hard? A: Not conceptually, just annoying — an external change forcing reactive work instead of planned work. Q: What’s the image order now? A: Changed my mind again — meme first, app screenshot second this time. The devlog #37 order didn’t stick. —This is the end*— *end for now, TOS updates permitting POP!!!
Spectralis devlog #39 —Hello again proggers— All-nighter, running on 3 Monsters and a Coke Zero. Reverse engineering APIs is hard as hell, and untitled.stream in particular fought back the whole way. Also snuck in a fix for a Spotify library issue on the side. 3 Monsters and a Coke Zero is not a nutrition plan, it’s a battle strategy Cat or dog? 429 Too Many Requests Okay let’s get into it~ —Yap— Following up on devlog #38’s untitled.stream compat work — turns out “working on it” undersold how hard it actually was. Genuinely brutal reverse engineering session, plus a smaller fix that came out of the same stretch of work. —The Great Suffering— 1 — untitled.stream Was Particularly Hard To Crack Chasing this compatibility since devlog #38, and it turned out to be one of the harder reverse-engineering targets yet. No public API to lean on, so it was the usual slow grind of observing behavior and piecing together how it actually works under the hood. some APIs give up easy, this was not one of them 2 — Reverse Engineering APIs In General: Still Hard Not a new lesson given devlog #17’s whole saga, but worth restating: this category of work is consistently the hardest and slowest kind on the whole project. Going in with better patience and verification habits this time though, which helped. 3 — Spotify Library Polling, Increased Bumped how often libraries get polled to account for some Spotify-side issues that were surfacing. Smaller fix, but a real one, found and shipped in the same session. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who ran on three energy drinks to crack one integration. Q: Is untitled.stream compat actually working now? A: Meaningfully further along after this session, following up from devlog #38’s start on it. Q: Did this go better than devlog #17’s reverse-engineering disaster? A: Yes — hard and slow, but productive this time rather than a total dead end. Q: What was the Spotify polling issue specifically? A: Library state getting out of sync too easily — more frequent polling keeps it closer to accurate. Q: Sleep status? A: Same as every other all-nighter devlog. Not great. Worth it this time though. —This is the end*— *end for now, rate limits permitting PIPSQUEAK!!!
Spectralis devlog #40 —Hello again proggers— 10 straight hours, and the highlight is getting tricked by Suno’s own scraper path. There was a decoy path that looked exactly like the real music endpoint, and it just returned forbidden the whole time. Maybe I’m the bot in this scenario. Unclear. got outsmarted by a decoy URL, humbling Cat or dog? 403 Forbidden Okay let’s get into it~ —Yap— Continuing the reverse-engineering grind from devlog #39, Suno specifically threw a curveball this round. Beyond that, spent real time thinking about what the app actually is and why certain features exist, plus started tearing into Song Wars, which has apparently been quietly buggy for a while. —The Great Suffering— 1 — The Suno Decoy Path Suno provides a path that looks exactly like the real music endpoint, structurally identical, right down to how it responds at a glance. In reality it just returns forbidden every time. Spent real time thinking this was progress before realizing it was a dead end dressed up as a working one. maybe im the bot 2 — Actually Fixed It, After Testing Once the decoy was identified for what it was, found the real path and got it working properly. Testing it thoroughly this time before calling it done, given how devlog #39 went. 3 — Identity Of The App Spent real time thinking through what Spectralis actually is at this point, and justifying why certain features exist rather than just accumulating them because they seemed cool at the time. Less code, more “why does this exist and does it still make sense.” 4 — Song Wars Rework, Started Started tearing into Song Wars, which turns out to be hella buggy underneath. Early stages of a rework rather than a patch job, since patching individual bugs in it hasn’t been holding up. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who got fooled by a decoy API path for a while. Q: Was the Suno issue related to the S3 discovery from devlog #38? A: Same general integration, different specific obstacle this round. Q: Is Song Wars getting a full rewrite or just fixes? A: Leaning toward a real rework rather than more patches, given how buggy it’s turned out to be. Q: What does “identity of the app” work actually produce? A: Not code directly — more a filter for which features actually belong and why, going forward. Q: How’s the 10 hour grind treating you? A: Productive despite the decoy detour. Real progress by the end of it. —This is the end*— *end for now, decoy paths permitting PAP!!!
Spectralis devlog #41 —Hello again proggers— Podcast mode’s in the works, with a real new way to actually find saved podcasts instead of digging for them. Also fixed the randomizing tools so they actually help pick a song instead of just existing decoratively. And: class got canceled for a hurricane watch, so tonight’s an all-nighter by default. free 10 hours courtesy of a hurricane, weird way to get them Cat or dog? shuffle(weighted=True) Okay let’s get into it~ —Yap— Two real features this round plus a forced schedule change. Podcast mode’s genuinely new territory for the app, the randomizer fix is a smaller but meaningful UX improvement, and the hurricane watch just handed over a full night that wasn’t originally planned for grinding. —The Great Suffering— 1 — Podcast Mode, In Progress Building out actual podcast support, including a new way to locate saved podcasts rather than just treating them like any other track and hoping they surface in the right place. Real new territory for the app compared to the music-first feature set so far. 2 — Randomizing Tools, Actually Useful Now The shuffle/randomizer tools existed before but weren’t really doing anything meaningful — mostly there in name. Fixed so they actually aid in song selection now instead of just sitting there as a checkbox nobody trusted. a randomizer that doesn’t actually help you pick anything is just decoration 3 — The Hurricane Watch Situation Class got canceled due to a hurricane watch, which means tonight’s turning into a full grind session that wasn’t originally on the calendar. Silver lining of a weather delay, I suppose. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one getting a bonus grind night courtesy of a hurricane watch. Q: Is podcast mode close to done? A: In progress, this devlog’s the early build phase, not the finish line. Q: What was actually wrong with the randomizer before? A: It existed but didn’t meaningfully help pick songs — more decorative than functional. Fixed to actually aid selection now. Q: Is Song Wars rework from devlog #40 still going? A: Ongoing, this devlog’s focus shifted to podcast mode and the randomizer instead. Q: Stay safe with the hurricane watch, by the way. A: Appreciated. Staying inside, staying coding. —This is the end*— *end for now, hurricane watches permitting POOL!!!
Spectralis devlog #42 —Hello again proggers— Spent this round hardening shared queues, mostly because WebSockets are just genuinely cool and it’s about time they got treated that way in this codebase. a devlog motivated entirely by “websockets are cool” is a valid devlog Cat or dog? ws:// Okay let’s get into it~ —Yap— Shared queues have been functional but not particularly resilient this whole time, riding on shared play’s presence/reactions/queue work from way back in devlog #9. This round was about actually hardening that layer instead of leaving it fragile. —The Great Suffering— 1 — Hardening Shared Queues Went through and shored up a bunch of the underlying bases for shared queues — the stuff that only matters once real connections are dropping, reconnecting, and behaving unpredictably instead of the clean happy-path test case. 2 — Because WebSockets Are Cool Genuinely part of the motivation here. Real-time bidirectional connections are just satisfying to get right, and shared queues are exactly the kind of feature that benefits from taking that layer seriously instead of treating it as plumbing. not every feature needs a dramatic bug story, sometimes it’s just “wanted to do it well” —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one hardening infrastructure purely because it’s fun to get right. Q: Is this related to the shared play work from devlog #9? A: Same general system, this round focused specifically on making the queue layer more resilient. Q: What does “hardening” mean here specifically? A: Making the shared queue behavior hold up better under real conditions — drops, reconnects, timing edge cases — rather than just the clean test path. Q: Any bugs found during this pass? A: Nothing dramatic enough to call out individually, mostly proactive resilience work. Q: What’s next? A: Podcast mode and the randomizer work from devlog #41 are both still ongoing threads. —This is the end*— *end for now, dropped connections permitting P_P!!!
Spectralis devlog #43 —Hello again proggers— [2:47am] okay so. websockets again, more of them, and now the CDN backup is failing too which is great, love that for me. on my 4th coffee at this point, energy drink count is starting to get concerning honestly and I’m not gonna pretend it isn’t. pretty sure i debugged the cdn thing at 4am purely out of spite Cat or dog? idk man catch (Exception e) { } at this point Okay let’s get into it, or at least try to~ —Yap— so continuing from devlog #42’s websocket hardening, turns out hardening one part just revealed the next part was also fragile, shocking, anyway. need to push something to prod to actually get it working but can’t do that without interrupting infra which is currently live so that’s a whole separate problem I have to solve first before I can solve the actual problem. love layers. —The Great Suffering— 1 — More Websocket Issues more of them. found while poking at the hardening from last devlog. not sure if figuring this part out took 20 minutes or 3 hours honestly, time’s doing something weird tonight. 2 — CDN Backup Is Failing on top of the websocket stuff, cdn backups just started failing too. not connected to each other as far as i can tell but who knows at this point, everything feels connected at 3am. 3 — Need To Push To Prod, Can’t Without Interrupting Infra the actual fix needs to go to prod but pushing it right now means interrupting live infra, which i don’t want to do blind, so now i need a plan for THAT before the real fix even goes out. process problem wrapped around the actual problem, great. 4 — Shared Play Is Doing The AI-Look Thing Again noticed shared play’s UI is drifting into the same generic-AI-looking territory the main site kept getting flagged for back in devlog #21-#24. damn. gonna have to redo that too. not tonight though, one disaster at a time. 5 — Oh And I Found A Missing Semicolon spent a genuinely embarrassing amount of time on a bug that turned out to be a missing semicolon. send help. actually don’t, just let me suffer, i clearly deserve it at this hour. 6 — No Sleep For 2 Days, Hitting Now it’s catching up. hard. luckily got tomorrow off so plan is stay up tongiht finish this, and just completely pass out tomorrow instead. worth it. probably. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: a human programmer. you. the one reading this at whatever hour you’re reading it, hopefully not also running on 2 days no sleep Q: Is the websocket hardening from #42 actually working? A: mostly? finding more edge cases as i go, which is annoying but also kind of expected honestly Q: Why can’t you just push to prod now? A: because infra’s live and i don’t want to interrupt it blind, need an actual plan for that part first Q: Is shared play getting a full redesign again? A: yeah probably, later though, not adding a 4th fire to tonight Q: Sleep plan? A: none tonight, all of it tomorrow, that’s the whole plan —This is the end — *end for now, semicolons permitting send sleep!!!
Spectralis devlog #44 —Hello again proggers— Did it. Fixed a genuine ton of bugs, following through on the mess from devlog #43. Tempted to just drop 6.1.0 right now, but holding off — want to get a few new features in and brainstorm some more QoL first so this actually feels like a finished product, not just a stopgap. Also: finally going to bed. the bar was “fix the bugs” and I cleared it, going higher anyway Cat or dog? sleep(∞) Okay let’s get into it~ —Yap— Real closure on the websocket/CDN/prod chaos from last devlog. Cleared out a lot in one sitting, and instead of rushing 6.1.0 out the door on relief alone, choosing to actually sit with it a bit longer. —The Great Suffering— 1 — The Bug Backlog, Actually Cleared Worked through the fallout from devlog #43 — websocket issues, the CDN backup failures, all of it — and got a genuine ton of it fixed in one real pass instead of piecemeal patching. 2 — Holding Off On 6.1.0, On Purpose Could ship right now. Choosing not to. Want to work in a few new features and brainstorm more QoL first, so the release feels complete rather than just “the bugs are gone, ship it.” Patience over momentum this time. 3 — Finally Going To Bed After devlog #43’s two-days-no-sleep spiral, actually calling it and going to bed now. Today off is finally getting used the way it was supposed to be used. the sleep debt collector finally caught up —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to get real sleep for the first time in a while. Q: Why not just ship 6.1.0 now if the bugs are fixed? A: Because “bug-free” and “actually done” aren’t the same bar, and this one’s worth clearing the second one too. Q: Was this the same chaos from devlog #43? A: Same fires, all put out this round. Q: What kind of new features are being considered? A: Not locked in yet — that brainstorming is the next step, not this devlog. Q: Sleep status, finally? A: Handled. Going now. —This is the end*— *end for now, actual sleep permitting PLAY!!!
Ships:
Spectralis shiplarp — v5.3.0 —shipped it— Notepads. A spin wheel. Dead zones that aren’t OBS-only anymore. Playlists that don’t look like a log file. Spotify that actually behaves. That’s the version. —what’s in it— Notepad system: docked panel, tabs, pop-out window, saves to track tags Spin wheel: weighted entries, saved wheel lists, notepad-fed Dead zones now shift the app’s own layout, not just OBS overlays Spotify: playlist sync, queue, pause, and Discord presence all fixed Fixed: playlist rows missing RowBackground (looked like a terminal, my bad) Fixed: nav rebuilding the entire view every click Fixed: library load blocking window open on big libraries Fixed: spectrum bars snapping instead of moving (FFT overlap bumped to 75%) Fixed: soundcloud playhead, word-mode timestamp export, track-switch click/pop —that’s it— PICKLE!!!
Spectralis shiplarp 2 — Stardance —wuzzup guys— So much has happened since shiplarp 1 and I cannot wait to not break down what changed. I will. I’m lazy. Not right now though. Cat or dog? redeem_code.claim() —the celebration— We’ve gone through so many changes since last time that it deserves an actual celebration: a very cool, very awesome custom visualizer for Stardance. Claim yours: Help > Manage Visualizers, then redeem stardance-lts-pulp . —found a bug?— Including the dreaded Tim Cook issues — DM me: Discord: @deltav0rtex Slack: deltavortex Can’t wait to hear the feedback and all the bugs you dig up. —this is the end*— *end for now, redeem codes permitting YIPEE!!!...
|
1792878434.706125
|
1793742434.706125
|
|
59907
|
NFC Card Remastered by @Imtiaz | Stardance
|
Imtiaz
|
0
|
2.55
|
0
|
[]
|
[{"post_id": 65619, "ts": "202 [{"post_id": 65619, "ts": "2026-09-10T21:19:35Z", "hours": 2.5461, "text": "yay, cooler business card!"}]...
|
Title: NFC Card Remastered by @Imtiaz | Stardance
Title: NFC Card Remastered by @Imtiaz | Stardance
Devlogs:
yay, cooler business card!...
|
1793029972.17916
|
1793634772.17916
|
|
60377
|
MYFirstGame by @ZadowCHI | Stardance
|
ZadowCHI
|
0
|
6.03
|
0
|
[]
|
[{"post_id": 65626, "ts": "202 [{"post_id": 65626, "ts": "2026-09-10T21:26:21Z", "hours": 2.7667, "text": "MADE soo many things, added player movement added a cute penguin as character, also mad some more new map items, and also made script for movement and like animations"}, {"post_id": 65372, "ts": "2026-09-10T13:51:45Z", "hours": 3.2592, "text": "Made some starter assets: It’s my first time, so it looks a bit ugly, but I am proud of what I have done. I also Learnt Godot for like 12 hours and lil bit of blender …"}]...
|
Title: MYFirstGame by @ZadowCHI | Stardance
Devlo Title: MYFirstGame by @ZadowCHI | Stardance
Devlogs:
Made some starter assets: It’s my first time, so it looks a bit ugly, but I am proud of what I have done. I also Learnt Godot for like 12 hours and lil bit of blender …
MADE soo many things, added player movement added a cute penguin as character, also mad some more new map items, and also made script for movement and like animations...
|
1793033454.3128908
|
1793638254.3128908
|
|
60823
|
Luma AI — NASA Study Partner by @mariamhaider307 | Luma AI — NASA Study Partner by @mariamhaider307 | Stardance...
|
mariamhaider307
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-15T11:45:44Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Honestly, one of my biggest struggles was getting LUMA to a point where it actually felt like a complete project instead of just an idea. I kept running into small things that needed fixing or changing as I built it, and sometimes I’d have one feature working and then break something else while trying to improve it 😭. I also had to figure out a lot of things as I went because I didn’t know everything beforehand. I used AI to help me when I got stuck, but I still had to test things, understand what was happening, and decide what actually worked for my project. Getting it shipped has probably been the biggest learning experience for me.", "repo": "https://github.com/mariamhaider307-collab/luma", "demo": "https://mariamhaider307-collab.github.io/luma/"}]...
|
[{"post_id": 65632, "ts": "202 [{"post_id": 65632, "ts": "2026-09-10T21:46:20Z", "hours": 0.6964, "text": "I am working on an AI study partner"}]...
|
Title: Luma AI — NASA Study Partner by @mariamhaid Title: Luma AI — NASA Study Partner by @mariamhaider307 | Stardance
Devlogs:
I am working on an AI study partner
Ships:
Honestly, one of my biggest struggles was getting LUMA to a point where it actually felt like a complete project instead of just an idea. I kept running into small things that needed fixing or changing as I built it, and sometimes I’d have one feature working and then break something else while trying to improve it 😭. I also had to figure out a lot of things as I went because I didn’t know everything beforehand. I used AI to help me when I got stuck, but I still had to test things, understand what was happening, and decide what actually worked for my project. Getting it shipped has probably been the biggest learning experience for me....
|
1793411767.759931
|
1793498167.759931
|
|
57584
|
First Slack bot by @Danou | Stardance
|
Danou
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-11T19:23:50Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hello everyone here my first projet and i decided to start by creating my first Slack bot. I decided at first to create a versatile bot who can do pretty much everything but the reality was different many was the api problem ,the lantency issue of different commands, code which work 1/2 etc.The first challenge that i encountered during my dev session was the dict command of my bot to make it more clear i wanted to do a system of randomization of words and their description when the user type -R but there is the problem how can i random a dictionary api ? You will discover on my github repo i will not spoil . I’m proud of myself for did something and how i pasted throught all of the problem which i tell you above and how i founded the problem of the dictionary. If anyone want to test it keep in mind that the dictionary command could work 1/2 sometimes it will tell you that it couldn’t fetch the word even if the word exist in the dictionary (english) when i did my test the latency of the response was insanely long soo i don’t know if it will work great. Thank you for reading and have fun !!!", "repo": "https://github.com/Danou-lua/My-first-Slack-bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0P5NE354"}]...
|
[{"post_id": 65633, "ts": "202 [{"post_id": 65633, "ts": "2026-09-10T21:51:50Z", "hours": 0.6467, "text": "Devlog #6 Is it currently 11pm and i had a hard journey i tryed to do some code without doing much here i have just add a new command to show a random advice for whole day life. I will not git commit it now i will make more other stuff do commit a whole block and not just little parts"}, {"post_id": 63840, "ts": "2026-09-07T20:23:42Z", "hours": 0.4033, "text": "Devlog #5 Today i have not achieve something special and i’m pretty exhausted due to school so i have just worked on the problem i had yesterday. To make it more clear i had a issue where the random functions won’t work and today i pass throught this issue but i now is like i don’t want to work anymore on this project (the errors of the api start to make me crazy) the bot respond too late or make error that don’t happen when i do it locally. I think i will add 1 or 2 new functions and i will ship it to start a better project.I’m not really enjoyed with what i have did today maybe tomorrow?"}, {"post_id": 63071, "ts": "2026-09-06T17:42:44Z", "hours": 1.3461, "text": "Dev DEVLOG#4 Today i add a little thingh who can pass the problem that i have yesterday for the random option to make it more clear i added a random option where you can pick and the bot send you a random word and its description from the dictionary the only one problem is that how can i make it more automatic , soo i add something that when a user search a message to view a the definition of a word the script analyse a json file to search if the word exist if yes it just send the informations if not the script add the word into the wordlist soo when a user will decide to have a random word the script will choose a word which was attached by i user. Just need to improve the random option tomorrow because today it won’t work."}, {"post_id": 62514, "ts": "2026-09-05T22:28:16Z", "hours": 1.7994, "text": "Devlog #3 Juts finished an addtionnal function of my bot searching for a word and its definition and choosing an option for a random word (i will need to extend the list of words of an another api or with a json file which all words can be there) i’m pretty glad for what i did today even with the doomscrolling and i got bored all the day. But half of my work was with the help of chatgpt (he mainly explain the structure of js and how i could done a great api call but i promise i don’t did vibecoding)"}, {"post_id": 61700, "ts": "2026-09-04T18:57:33Z", "hours": 0.6839, "text": "Devlog #2 This one is my second devlog about my slack bot honestly i don’t have other idea so i will pass on another project and i will end this one (yeah very fast) in this devlog or this time i added a new command that lists information about linux command (the main ones not all until i found an api for make it more simple and more efficient) i have a new project in mind but due to the little time who remains to me for the end of stardance i’m scared for no having stardust to buy something cool (and because i have joined the event very late) if you have idea or something that i can add you can tell me. Thank’s"}, {"post_id": 60907, "ts": "2026-09-03T15:49:34Z", "hours": 1.5669, "text": "Just finished the body of my slack bot i have recently discovered problem to using program or problem with the fact that slackbot into the slack app send me message that my bot don’t want to work but after 5 sec there are output from it, and i want to ask if there are anyone who can give me idea of command to because i’m out of idea and i really want to improve it with more functions. Please don’t hesitate to give me idea or tell me what to change and what to add . Thank’s.If there are a person who can help me with this problem thank’s to tell me how you encountered it."}]...
|
Title: First Slack bot by @Danou | Stardance
Devl Title: First Slack bot by @Danou | Stardance
Devlogs:
Just finished the body of my slack bot i have recently discovered problem to using program or problem with the fact that slackbot into the slack app send me message that my bot don’t want to work but after 5 sec there are output from it, and i want to ask if there are anyone who can give me idea of command to because i’m out of idea and i really want to improve it with more functions. Please don’t hesitate to give me idea or tell me what to change and what to add . Thank’s.If there are a person who can help me with this problem thank’s to tell me how you encountered it.
Devlog #2 This one is my second devlog about my slack bot honestly i don’t have other idea so i will pass on another project and i will end this one (yeah very fast) in this devlog or this time i added a new command that lists information about linux command (the main ones not all until i found an api for make it more simple and more efficient) i have a new project in mind but due to the little time who remains to me for the end of stardance i’m scared for no having stardust to buy something cool (and because i have joined the event very late) if you have idea or something that i can add you can tell me. Thank’s
Devlog #3 Juts finished an addtionnal function of my bot searching for a word and its definition and choosing an option for a random word (i will need to extend the list of words of an another api or with a json file which all words can be there) i’m pretty glad for what i did today even with the doomscrolling and i got bored all the day. But half of my work was with the help of chatgpt (he mainly explain the structure of js and how i could done a great api call but i promise i don’t did vibecoding)
Dev DEVLOG#4 Today i add a little thingh who can pass the problem that i have yesterday for the random option to make it more clear i added a random option where you can pick and the bot send you a random word and its description from the dictionary the only one problem is that how can i make it more automatic , soo i add something that when a user search a message to view a the definition of a word the script analyse a json file to search if the word exist if yes it just send the informations if not the script add the word into the wordlist soo when a user will decide to have a random word the script will choose a word which was attached by i user. Just need to improve the random option tomorrow because today it won’t work.
Devlog #5 Today i have not achieve something special and i’m pretty exhausted due to school so i have just worked on the problem i had yesterday. To make it more clear i had a issue where the random functions won’t work and today i pass throught this issue but i now is like i don’t want to work anymore on this project (the errors of the api start to make me crazy) the bot respond too late or make error that don’t happen when i do it locally. I think i will add 1 or 2 new functions and i will ship it to start a better project.I’m not really enjoyed with what i have did today maybe tomorrow?
Devlog #6 Is it currently 11pm and i had a hard journey i tryed to do some code without doing much here i have just add a new command to show a random advice for whole day life. I will not git commit it now i will make more other stuff do commit a whole block and not just little parts
Ships:
Hello everyone here my first projet and i decided to start by creating my first Slack bot. I decided at first to create a versatile bot who can do pretty much everything but the reality was different many was the api problem ,the lantency issue of different commands, code which work 1/2 etc.The first challenge that i encountered during my dev session was the dict command of my bot to make it more clear i wanted to do a system of randomization of words and their description when the user type -R but there is the problem how can i random a dictionary api ? You will discover on my github repo i will not spoil . I’m proud of myself for did something and how i pasted throught all of the problem which i tell you above and how i founded the problem of the dictionary. If anyone want to test it keep in mind that the dictionary command could work 1/2 sometimes it will tell you that it couldn’t fetch the word even if the word exist in the dictionary (english) when i did my test the latency of the response was insanely long soo i don’t know if it will work great. Thank you for reading and have fun !!!...
|
1793350181.8560624
|
1793436581.8560624
|
|
60821
|
Pyrecall by @SiddharthL | Stardance
|
SiddharthL
|
1
|
23.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-15T01:08:03Z", "hours": 23.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a python package(MIT Licensed and uploaded on PyPi) that helps mitigate catastrophic forgetting while fine tuning. Fine tuning is one of the most relevant things out there at this moment, but it can set some drawbacks. While fine tuning on new data, some previous knowledge may get lost. That’s what pyrecall helps detect. To get started, do “pip install pyrecall” in your terminal in VSCode(or any code editor) and get started. Use https://pyrecall.github.io/Pyrecall/ to get pyrecall in action!", "repo": "https://github.com/Pyrecall/Pyrecall", "demo": "https://pyrecall.github.io/Pyrecall/"}]...
|
[{"post_id": 65637, "ts": "202 [{"post_id": 65637, "ts": "2026-09-10T22:06:00Z", "hours": 23.1922, "text": "Working on an open-source python package called Pyrecall which helps mitigate catastrophic forgetting"}]...
|
Title: Pyrecall by @SiddharthL | Stardance
Devlog Title: Pyrecall by @SiddharthL | Stardance
Devlogs:
Working on an open-source python package called Pyrecall which helps mitigate catastrophic forgetting
Ships:
This is a python package(MIT Licensed and uploaded on PyPi) that helps mitigate catastrophic forgetting while fine tuning. Fine tuning is one of the most relevant things out there at this moment, but it can set some drawbacks. While fine tuning on new data, some previous knowledge may get lost. That’s what pyrecall helps detect. To get started, do “pip install pyrecall” in your terminal in VSCode(or any code editor) and get started. Use https://pyrecall.github.io/Pyrecall/ to get pyrecall in action!...
|
1793411766.8314698
|
1793498166.8314698
|
|
21857
|
HoopIQ by @atharva02 | Stardance
|
atharva02
|
3
|
75.8
|
642
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-03T21:56:53Z", "hours": 22.0, "multiplier": 16.02, "payout": 348, "blessing": "neutral", "text": "I made a basketball training app that will help people train their basketball skills. The hardest part in this ship was probably finding the best way to integrate mobile into this. I really don’t like styling, and it took really long to figure out correct widths, until I realized viewport widths which made life so much easier and correctly take up the space you need. I’m most proud of the animations that have now been integrated within the site. They’re pretty basic, but I do think they add enough flavor to the app to make it a little bit more enjoyable, which is always a nice touch. When testing this project, data is saved locally so progress doesn’t save between devices and inactivity may make your browser clear the data if that’s something you have enabled(Safari does this a lot). Also note that when viewing the GitHub, I’m working on this with branches so view the “feature/training-adjustments” branch to see current committed changes, they’re not merged on main yet. This is the third ship for this project, and I anticipate more to come so all feedback is appreciated. Enjoy!", "repo": "https://github.com/atharva-277/Basketball-Trainer", "demo": "https://hoop-iq-277.web.app/"}, {"ship_num": 2, "ts": "2026-08-29T02:17:33Z", "hours": 21.0, "multiplier": 10.39, "payout": 215, "blessing": "neutral", "text": "I made a basketball training app that will help people train their basketball skills. A challenging part for this part was finding specific drills that improved the skillset that I had created. Also the metric to imperial conversion had a finicky error which took a lot longer to fix, but it’s here now so great! I’m proud that the drills remain personalized like the other training parts as they target where you have logged you are weak at. I feel training sites are best when the user knows where they struggle and needs a medium to improve. When testing this project, data is saved locally so progress doesn’t save between devices(this is only laptop friendly right now, sorry) and inactivity may make your browser clear the data if that’s something you have enabled(Safari does this a lot). Also note that when viewing the GitHub, I’m working on this with branches so view the “feature/training-adjustments” branch to see current committed changes, they’re not merged on main yet. Other than that, this is the second ship so some feedback was incorporated, but same as before, this app will continue to be expanded upon so all feedback is good feedback. Enjoy!", "repo": "https://github.com/atharva-277/Basketball-Trainer", "demo": "https://hoop-iq-277.web.app/"}, {"ship_num": 3, "ts": "2026-08-20T01:05:17Z", "hours": 6.0, "multiplier": 12.86, "payout": 79, "blessing": "neutral", "text": "I made a basketball training app that will help people train their basketball skills. The challenging part within making this app was finding out what skills are important to test out. Obviously shooting is the main aspect of basketball, but it’s also important to practice ball control. After that, there was challenges it creating specific algorithms to test those skills that provide an even split across the categories. I’m most proud of how the shot diet and baseline work together to create a unique training experience so you specifically work on categories that help YOUR play style, rather than a generic one. When testing this project, all data is saved locally so progress doesn’t save between devices(this is only laptop friendly right now, sorry) and inactivity may make your browser clear the data if that’s something you have enabled(Safari does this a lot). Other than that, I’m really excited to get any feedback on this whatsoever considering there is a lot more I plan to add to this. Enjoy!", "repo": "https://github.com/atharva-277/Basketball-Trainer", "demo": "https://hoop-iq-277.web.app/"}]...
|
[{"post_id": 65645, "ts": "202 [{"post_id": 65645, "ts": "2026-09-10T22:34:50Z", "hours": 4.3764, "text": "Devlog #18 Current Features Drill panel is here! Took a lot of effort to get working because accessing data from the same project is hard 😭. It wasn’t hard to access the drill history itself, but the way I was storing it was based on ID numbers and not drill names(something that was never actually stored) which made it hard to show on screen. I think it looks really good on the screen, and it’s intuitive to access via the calendar, click on the day. What’s Coming Up Right now it only shows what exactly you did, and your performance their specifically. However, I want to make it so that the user can easily see the misses they tagged as well, providing an all encompassing way of accessing all their history within this app. Obviously my app uses the data to give them drill suggestions, but the user should be able to see their history and make their own trends based on what they see. Game Plan I’ll be spending the next chunk of this trying to get that working: backend functionality, styling on screen, updating day to day, stuff like that. After that I’ll try to incorporate some animations in that and unless I think of other major changes, there will be another ship hopefully."}, {"post_id": 64585, "ts": "2026-09-09T02:57:01Z", "hours": 4.1461, "text": "Devlog #17 Current Features Started to work on the hover/pressing functionality. I’ve decided to simply combine the two functionalities into one, but I’m struggling to find the best way to display it on the screen. Basically, the user should be able to tap the day they worked on something, and see what exactly they did What’s Coming Up I was mainly testing with the backend part of this within these hours and will push a UI update to reflect these changes within the coming days hopefully. Other than that, I want to hopefully add a feature where they see the exact percentage boost they got by doing a task if I have the correct data to hold that. Game Plan Add UI features as mentioned above, switch gears to working on backend part of progress updates, and see how the app looks like then. Note: I had to reset data to test the UI, hence why my streak isn’t the 2 days including yesterday:)"}, {"post_id": 63999, "ts": "2026-09-08T03:20:25Z", "hours": 4.7167, "text": "Devlog #16 Current Features UI update is finally here! Finally got this working after a lot of trial and error with the display and making it show up with the proper date. The best part is it also looks great with the mobile without any extra styling so even better for me! What’s Coming Up Still want to add more functionality to the calendar specifically such as clicking to see your exact work, hovering to see basic title overview, and just general user interactivity. Game Plan Most of the above changes go along with how I stored data anyway, so I’m not behind in any regard. I plan on adding the above changes first, before deciding what else there is to add in relation to this."}, {"post_id": 63341, "ts": "2026-09-07T03:22:10Z", "hours": 5.4511, "text": "Devlog #14 Current Events Calendar is basically fully functioning! Hasn’t been integrated in the UI yet like I hoped it would be, but I got it working the way I wanted it to with the user able to see their progress in a quick snapshot. Really happy to see this working now as it’s been a asked feature in past ships What’s Coming Up The UI update will definitely be what’s coming up next. I know this was mentioned last devlog, but instead I got it close to fully working and now will be adding the interface. Game Plan Adding the UI on the screen so it fully works, and then switching over to the backend part of the session history"}, {"post_id": 62479, "ts": "2026-09-05T20:52:52Z", "hours": 4.2714, "text": "Devlog #13 Current Events Decided to add the screen itself to the UI so it’s easier to update these logs with progress as it occurs. On the backend, I realize I have been storing drill sessions anyway, just wasn’t displaying them so that’s a pretty big timesave. Along with that, the calendar is still a work in progress, just doing some testing to see how exactly it works along with how the streak will play into that. What’s Coming Up I’d expect a UI update shortly with multiple elements on the screen, maybe not fully functional right away, but in the intial working phase if that makes sense. Game Plan Add calendar and streak elements on screen with functionality – I’ll need some time to test if the days are tracked correctly. After that, it’ll be simply integrated session logs onto the screen"}, {"post_id": 61806, "ts": "2026-09-04T21:52:28Z", "hours": 3.8361, "text": "Devlog #13 Current Events I have started working on implementing a calendar and streak feature. I want to make it similar to stardance’s so that you can see what you worked on that specific day. Essentially, I’ll be adding another tab called history and input information there so they can see their streaks, recent drills, and progress over time. What’s Coming Up None of the UI has been integrated, but that doesn’t mean the backend is finished either. I was experimenting with how exactly the calendar works and how it might look within the UI. Game Plan I plan on slowly integrate the UI with the tab and only show the calendar and streaks at first once that starts working, and then work towards displaying the drill history. Thank you to whoever mentioned formatting devlogs properly in ship review! This makes it a lot easier to read."}, {"post_id": 61135, "ts": "2026-09-03T21:52:45Z", "hours": 5.5231, "text": "Devlog #12 Animations are here! Admittedly, there aren’t too animations, mainly because the one I saw online aren’t sites where the user is constantly interacting, their mainly shops or display sites, like WebOS. However, they are here now and I feel that they’re subtle, but still look nice on the screen. I especially like the pulse effect on the baseline screen when you increase, or decrease, your made shots. A ship will follow this devlog, so as always, please give all feedback that you can think of, specifically features which you want added that could improve this. I anticipate my next feature to be a calendar/streak system of sorts, giving the user visual cues on their progress. I have not forgotten about the drill tutorials, it’s just that it’s a bit more complicated and I like showing off progress periodically, not just once at the end. Hope you all enjoy!"}, {"post_id": 59907, "ts": "2026-09-01T22:48:44Z", "hours": 3.5156, "text": "Devlog #11 New Feature? I don’t know if mobile integration really counts as a new feature but I’m counting it anyway. This makes it easier to train as it is no longer necessary to be huddled around a laptop, entering your data. The new styles make it easier to navigate throughout the site on your phone. I know in my very first devlog I said I want to make a mobile app, but I think making a website work well on a phone also serves that need. Nothing has changed with the way data is handled, the main thing I worked on here was CSS styling in the new media set. These were hours well spent on making the site look good on a phone, so I hope you all enjoy it. My next goal is to add animations to the CSS, whether that’s new elements or just simple, quick navigation I don’t fully know yet. I will also be postponing the drill tutorials to a later date, I want to get another ship this week(I like having each ship have only a few unique features added, it helps me get feedback in bits rather than on everything), and I will likely not have the time to research online drill images or make them myself. Otherwise, I’ve had a lot of fun continuing this project so I hope you guys like this new style as much as I do. Attached is the recreation of mobile styles using Chrome Dev Tools, I didn’t want to type this all on my phone. Enjoy!"}, {"post_id": 59297, "ts": "2026-09-01T00:36:19Z", "hours": 3.7131, "text": "Devlog #10 A sad devlog, but a necessary one, GameIQ has been removed and will not be a feature any longer. I wasn’t able to find an efficient way to add in multiple situations unless I gave a paragraph of information instead of an image describing the situation. Perhaps I will be able to find a workaround with play-drawing section, but I’ve also realized that most people will not use this to play professional basketball games in any regard(high school or rec league), and will use it for pickup most likely. I will be focusing my attention on adding features that were recommended from previous ship reviews. I apologize for anyone reading these devlogs waiting for GameIQ to be a feature, it has been removed now. I am sorry."}, {"post_id": 58372, "ts": "2026-08-30T19:39:48Z", "hours": 3.6325, "text": "Devlog #9 GameIQ is still a work in progress right now, but the second ship reviews came in so I’m planning on making this a larger ship with more than just that. A big recommendation was drill tutorials so I might integrate a separate YouTube channel and provide links to the drills so people know how to do them, or find something online who knows. Also people said to add some animations to the actual site so I will probably add that as well. Despite the 3.5 hours in this devlog, I still couldn’t find a viable API source for the GameIQ, or maybe I’m not looking hard enough lol. I’m still going to try to find some alternative instead of hard-coding situations because I don’t know how many I’ll be able to do. But, I know for sure that some suggestions from past ships will be integrated within the next ship. Thank you for all the feedback so far, it’s been great reading them and planning out what more to do with this project!"}, {"post_id": 57742, "ts": "2026-08-30T00:37:08Z", "hours": 5.3189, "text": "Devlog #8 I’ve started working on the GameIQ section, except nothing with the Ui yet. I’ve been trying to get the internal logic to work and it’s being a bit weird. I’m trying to see if there’s a way to get a large question bank of answers without using an API to route to questions. Other than that, the main premise of GameIQ is you’ll be given a situation and you have to make the correct read out of 4 options, basically a quiz which you can opt out of anytime. Once that’s integrated as simply a base functionality, I hope to make it specific to the drills the user is actively working on to further test their skills. But again, not much works right now, it’s just some base logic with not much else."}, {"post_id": 57000, "ts": "2026-08-29T02:12:39Z", "hours": 4.6917, "text": "Devlog #7 Drills have been incorporated successfully! The user can now properly use this app to actually improve I think. Rather than repeatedly doing the same thing, they can do specific drills to improve their skills. This has the same display as the handling and shooting session log only difference is this doesn’t affect any of the calculations associated with you. These drills are simply a means to improve your handling and shooting skills which thereby affect your percentages. The drills tell you what to complete along with a suggested rep/time count but even if you log more/less it only affects you and not the internal algorithm. Other change made was based off of the first recommendation by adding metric units. This has also been added, you choose at the start and can update at any time via the settings page. Internal calculations still use inches, but the display will show metric in case anyone is looking at what data is being stored. Enjoy!"}, {"post_id": 56232, "ts": "2026-08-27T22:07:13Z", "hours": 5.4708, "text": "Devlog #6 New Feature! Drills are now a new feature that are still a small work in progress, but the initial testing is complete so though I’d post about it here. Essentially before all you could do was practice repetitive actions without actually working on how to improve it. Now with drills, after you’ve done some sessions to see how you’re performing, this will gauge where you’re usually messing up and provide drills to improve. Now these drills will help improve a specific part of the misses you tagged earlier. The flow that I’m going for here is you practice specific shot types and tag misses, complete drills to help said misses, and improve your skills over time! I’m still working on specific drills to add, along with descriptions so the user knows how to perform them. Attached is how it currently looks on the training screen, the session screen is still a work in progress. Note: some feedback given from initial ship will be adressed in next devlog, assuming I get around to it. Once this drill functionality is working and some feedback is adressed, there will most likely be another ship. Enjoy!"}, {"post_id": 54390, "ts": "2026-08-25T11:46:41Z", "hours": 6.0103, "text": "Devlog #5 Unfortunately, no new coding was done because I ran into multiple errors that took a lot of time trying to fix. I’m not actually sure what happened, but my files were messed up and the file structure internally broke down. Luckily, it’s all fixed now, so I thought I’d post this small devlog so I can reset my hours and post a new one when I start working on the drill features, without the 10 hour limit worrying me. Other than that, the UI of the app remains unchanged."}, {"post_id": 52649, "ts": "2026-08-22T21:46:24Z", "hours": 4.5331, "text": "Devlog #4 I did my usual project UI overhaul like I always need to usually. I usually let Claude generate the UI just so I can see stuff on the screen when I code the actual logic, and then inevitably forget I did that when I go to ship, but I have attempted to revert most of that back while still maintain the basketball theme. I personally think it looks pretty good now, I made all of the text bigger, made the buttons and most elements on the screen more visible. I also added a hover effect on most elements to give it an orange glow, this will eventually be converted to fully-mobile friendly(currently it works just doesn’t look good) but I still really enjoy it. Other than that there weren’t any logic changes, just felt the need to showcase what the site looks like right now as I spent a large amount of time updating the UI. Enjoy!"}, {"post_id": 50700, "ts": "2026-08-20T01:01:11Z", "hours": 2.7242, "text": "Devlog 3 So much has happened since. Now that the user has a baseline that they can be compared against, the initial training algorithm has been created! Right now it’s mainly based off of repetition and the user should continuously practice the same stuff they did within the baseline. This is simply the initial algorithm because based off of the baseline, the algorithm finds the weakest area and applies percentages to each are so you practice weak ones more than others. As you can see from the provided image: I have to practice specific ball handling and then if I don’t reach the amount, I have to tag a miss and it gives a cue on what you can do to fix that. Eventually, after this keeps growing, it’ll give specific drills that help instead of repetition. However, I will likely ship after this to see what people think of this so far and we’ll go from there."}, {"post_id": 36695, "ts": "2026-07-28T22:23:59Z", "hours": 2.4206, "text": "Devlog #2 So instead of generating a baseline based off of just personal bio-data, the user goes through a series of drills to see where they stand at currently. They have to practice threes, mid-rangers, layups, and practice some ball-handling drills. Based off of these beginning stats, it generates their current overall and saves their stats to be used later. Right now this is the only main thing that works and based off of this I’m gonna generate a training regime that best fits them mainly off of these stats. Other than that, the user is also able to input their shot diet on the training screen which basically tells the computer what they do when they have the ball. For example, they shoot threes 15% of the time, mid-rangers 35%, layups 40%, and handle the ball via dribbling 10%. Attached is a sample results page after the user finishes their baseline."}, {"post_id": 14042, "ts": "2026-06-23T00:47:40Z", "hours": 1.0325, "text": "So I’m currently working on a basketball trainer website, eventually converted into an app to help people improve their basketball skills. Currently, there’s only a good UI base because I haven’t started the full functionality yet. I plan on, hopefully, adding a new training section twice every week, or just weekly if that’s what works. Attached is the home page where the user inputs their info to get a baseline for training rigor."}]...
|
Title: HoopIQ by @atharva02 | Stardance
Devlogs:
Title: HoopIQ by @atharva02 | Stardance
Devlogs:
So I’m currently working on a basketball trainer website, eventually converted into an app to help people improve their basketball skills. Currently, there’s only a good UI base because I haven’t started the full functionality yet. I plan on, hopefully, adding a new training section twice every week, or just weekly if that’s what works. Attached is the home page where the user inputs their info to get a baseline for training rigor.
Devlog #2 So instead of generating a baseline based off of just personal bio-data, the user goes through a series of drills to see where they stand at currently. They have to practice threes, mid-rangers, layups, and practice some ball-handling drills. Based off of these beginning stats, it generates their current overall and saves their stats to be used later. Right now this is the only main thing that works and based off of this I’m gonna generate a training regime that best fits them mainly off of these stats. Other than that, the user is also able to input their shot diet on the training screen which basically tells the computer what they do when they have the ball. For example, they shoot threes 15% of the time, mid-rangers 35%, layups 40%, and handle the ball via dribbling 10%. Attached is a sample results page after the user finishes their baseline.
Devlog 3 So much has happened since. Now that the user has a baseline that they can be compared against, the initial training algorithm has been created! Right now it’s mainly based off of repetition and the user should continuously practice the same stuff they did within the baseline. This is simply the initial algorithm because based off of the baseline, the algorithm finds the weakest area and applies percentages to each are so you practice weak ones more than others. As you can see from the provided image: I have to practice specific ball handling and then if I don’t reach the amount, I have to tag a miss and it gives a cue on what you can do to fix that. Eventually, after this keeps growing, it’ll give specific drills that help instead of repetition. However, I will likely ship after this to see what people think of this so far and we’ll go from there.
Devlog #4 I did my usual project UI overhaul like I always need to usually. I usually let Claude generate the UI just so I can see stuff on the screen when I code the actual logic, and then inevitably forget I did that when I go to ship, but I have attempted to revert most of that back while still maintain the basketball theme. I personally think it looks pretty good now, I made all of the text bigger, made the buttons and most elements on the screen more visible. I also added a hover effect on most elements to give it an orange glow, this will eventually be converted to fully-mobile friendly(currently it works just doesn’t look good) but I still really enjoy it. Other than that there weren’t any logic changes, just felt the need to showcase what the site looks like right now as I spent a large amount of time updating the UI. Enjoy!
Devlog #5 Unfortunately, no new coding was done because I ran into multiple errors that took a lot of time trying to fix. I’m not actually sure what happened, but my files were messed up and the file structure internally broke down. Luckily, it’s all fixed now, so I thought I’d post this small devlog so I can reset my hours and post a new one when I start working on the drill features, without the 10 hour limit worrying me. Other than that, the UI of the app remains unchanged.
Devlog #6 New Feature! Drills are now a new feature that are still a small work in progress, but the initial testing is complete so though I’d post about it here. Essentially before all you could do was practice repetitive actions without actually working on how to improve it. Now with drills, after you’ve done some sessions to see how you’re performing, this will gauge where you’re usually messing up and provide drills to improve. Now these drills will help improve a specific part of the misses you tagged earlier. The flow that I’m going for here is you practice specific shot types and tag misses, complete drills to help said misses, and improve your skills over time! I’m still working on specific drills to add, along with descriptions so the user knows how to perform them. Attached is how it currently looks on the training screen, the session screen is still a work in progress. Note: some feedback given from initial ship will be adressed in next devlog, assuming I get around to it. Once this drill functionality is working and some feedback is adressed, there will most likely be another ship. Enjoy!
Devlog #7 Drills have been incorporated successfully! The user can now properly use this app to actually improve I think. Rather than repeatedly doing the same thing, they can do specific drills to improve their skills. This has the same display as the handling and shooting session log only difference is this doesn’t affect any of the calculations associated with you. These drills are simply a means to improve your handling and shooting skills which thereby affect your percentages. The drills tell you what to complete along with a suggested rep/time count but even if you log more/less it only affects you and not the internal algorithm. Other change made was based off of the first recommendation by adding metric units. This has also been added, you choose at the start and can update at any time via the settings page. Internal calculations still use inches, but the display will show metric in case anyone is looking at what data is being stored. Enjoy!
Devlog #8 I’ve started working on the GameIQ section, except nothing with the Ui yet. I’ve been trying to get the internal logic to work and it’s being a bit weird. I’m trying to see if there’s a way to get a large question bank of answers without using an API to route to questions. Other than that, the main premise of GameIQ is you’ll be given a situation and you have to make the correct read out of 4 options, basically a quiz which you can opt out of anytime. Once that’s integrated as simply a base functionality, I hope to make it specific to the drills the user is actively working on to further test their skills. But again, not much works right now, it’s just some base logic with not much else.
Devlog #9 GameIQ is still a work in progress right now, but the second ship reviews came in so I’m planning on making this a larger ship with more than just that. A big recommendation was drill tutorials so I might integrate a separate YouTube channel and provide links to the drills so people know how to do them, or find something online who knows. Also people said to add some animations to the actual site so I will probably add that as well. Despite the 3.5 hours in this devlog, I still couldn’t find a viable API source for the GameIQ, or maybe I’m not looking hard enough lol. I’m still going to try to find some alternative instead of hard-coding situations because I don’t know how many I’ll be able to do. But, I know for sure that some suggestions from past ships will be integrated within the next ship. Thank you for all the feedback so far, it’s been great reading them and planning out what more to do with this project!
Devlog #10 A sad devlog, but a necessary one, GameIQ has been removed and will not be a feature any longer. I wasn’t able to find an efficient way to add in multiple situations unless I gave a paragraph of information instead of an image describing the situation. Perhaps I will be able to find a workaround with play-drawing section, but I’ve also realized that most people will not use this to play professional basketball games in any regard(high school or rec league), and will use it for pickup most likely. I will be focusing my attention on adding features that were recommended from previous ship reviews. I apologize for anyone reading these devlogs waiting for GameIQ to be a feature, it has been removed now. I am sorry.
Devlog #11 New Feature? I don’t know if mobile integration really counts as a new feature but I’m counting it anyway. This makes it easier to train as it is no longer necessary to be huddled around a laptop, entering your data. The new styles make it easier to navigate throughout the site on your phone. I know in my very first devlog I said I want to make a mobile app, but I think making a website work well on a phone also serves that need. Nothing has changed with the way data is handled, the main thing I worked on here was CSS styling in the new media set. These were hours well spent on making the site look good on a phone, so I hope you all enjoy it. My next goal is to add animations to the CSS, whether that’s new elements or just simple, quick navigation I don’t fully know yet. I will also be postponing the drill tutorials to a later date, I want to get another ship this week(I like having each ship have only a few unique features added, it helps me get feedback in bits rather than on everything), and I will likely not have the time to research online drill images or make them myself. Otherwise, I’ve had a lot of fun continuing this project so I hope you guys like this new style as much as I do. Attached is the recreation of mobile styles using Chrome Dev Tools, I didn’t want to type this all on my phone. Enjoy!
Devlog #12 Animations are here! Admittedly, there aren’t too animations, mainly because the one I saw online aren’t sites where the user is constantly interacting, their mainly shops or display sites, like WebOS. However, they are here now and I feel that they’re subtle, but still look nice on the screen. I especially like the pulse effect on the baseline screen when you increase, or decrease, your made shots. A ship will follow this devlog, so as always, please give all feedback that you can think of, specifically features which you want added that could improve this. I anticipate my next feature to be a calendar/streak system of sorts, giving the user visual cues on their progress. I have not forgotten about the drill tutorials, it’s just that it’s a bit more complicated and I like showing off progress periodically, not just once at the end. Hope you all enjoy!
Devlog #13 Current Events I have started working on implementing a calendar and streak feature. I want to make it similar to stardance’s so that you can see what you worked on that specific day. Essentially, I’ll be adding another tab called history and input information there so they can see their streaks, recent drills, and progress over time. What’s Coming Up None of the UI has been integrated, but that doesn’t mean the backend is finished either. I was experimenting with how exactly the calendar works and how it might look within the UI. Game Plan I plan on slowly integrate the UI with the tab and only show the calendar and streaks at first once that starts working, and then work towards displaying the drill history. Thank you to whoever mentioned formatting devlogs properly in ship review! This makes it a lot easier to read.
Devlog #13 Current Events Decided to add the screen itself to the UI so it’s easier to update these logs with progress as it occurs. On the backend, I realize I have been storing drill sessions anyway, just wasn’t displaying them so that’s a pretty big timesave. Along with that, the calendar is still a work in progress, just doing some testing to see how exactly it works along with how the streak will play into that. What’s Coming Up I’d expect a UI update shortly with multiple elements on the screen, maybe not fully functional right away, but in the intial working phase if that makes sense. Game Plan Add calendar and streak elements on screen with functionality – I’ll need some time to test if the days are tracked correctly. After that, it’ll be simply integrated session logs onto the screen
Devlog #14 Current Events Calendar is basically fully functioning! Hasn’t been integrated in the UI yet like I hoped it would be, but I got it working the way I wanted it to with the user able to see their progress in a quick snapshot. Really happy to see this working now as it’s been a asked feature in past ships What’s Coming Up The UI update will definitely be what’s coming up next. I know this was mentioned last devlog, but instead I got it close to fully working and now will be adding the interface. Game Plan Adding the UI on the screen so it fully works, and then switching over to the backend part of the session history
Devlog #16 Current Features UI update is finally here! Finally got this working after a lot of trial and error with the display and making it show up with the proper date. The best part is it also looks great with the mobile without any extra styling so even better for me! What’s Coming Up Still want to add more functionality to the calendar specifically such as clicking to see your exact work, hovering to see basic title overview, and just general user interactivity. Game Plan Most of the above changes go along with how I stored data anyway, so I’m not behind in any regard. I plan on adding the above changes first, before deciding what else there is to add in relation to this.
Devlog #17 Current Features Started to work on the hover/pressing functionality. I’ve decided to simply combine the two functionalities into one, but I’m struggling to find the best way to display it on the screen. Basically, the user should be able to tap the day they worked on something, and see what exactly they did What’s Coming Up I was mainly testing with the backend part of this within these hours and will push a UI update to reflect these changes within the coming days hopefully. Other than that, I want to hopefully add a feature where they see the exact percentage boost they got by doing a task if I have the correct data to hold that. Game Plan Add UI features as mentioned above, switch gears to working on backend part of progress updates, and see how the app looks like then. Note: I had to reset data to test the UI, hence why my streak isn’t the 2 days including yesterday:)
Devlog #18 Current Features Drill panel is here! Took a lot of effort to get working because accessing data from the same project is hard 😭. It wasn’t hard to access the drill history itself, but the way I was storing it was based on ID numbers and not drill names(something that was never actually stored) which made it hard to show on screen. I think it looks really good on the screen, and it’s intuitive to access via the calendar, click on the day. What’s Coming Up Right now it only shows what exactly you did, and your performance their specifically. However, I want to make it so that the user can easily see the misses they tagged as well, providing an all encompassing way of accessing all their history within this app. Obviously my app uses the data to give them drill suggestions, but the user should be able to see their history and make their own trends based on what they see. Game Plan I’ll be spending the next chunk of this trying to get that working: backend functionality, styling on screen, updating day to day, stuff like that. After that I’ll try to incorporate some animations in that and unless I think of other major changes, there will be another ship hopefully.
Ships:
I made a basketball training app that will help people train their basketball skills. The challenging part within making this app was finding out what skills are important to test out. Obviously shooting is the main aspect of basketball, but it’s also important to practice ball control. After that, there was challenges it creating specific algorithms to test those skills that provide an even split across the categories. I’m most proud of how the shot diet and baseline work together to create a unique training experience so you specifically work on categories that help YOUR play style, rather than a generic one. When testing this project, all data is saved locally so progress doesn’t save between devices(this is only laptop friendly right now, sorry) and inactivity may make your browser clear the data if that’s something you have enabled(Safari does this a lot). Other than that, I’m really excited to get any feedback on this whatsoever considering there is a lot more I plan to add to this. Enjoy!
I made a basketball training app that will help people train their basketball skills. A challenging part for this part was finding specific drills that improved the skillset that I had created. Also the metric to imperial conversion had a finicky error which took a lot longer to fix, but it’s here now so great! I’m proud that the drills remain personalized like the other training parts as they target where you have logged you are weak at. I feel training sites are best when the user knows where they struggle and needs a medium to improve. When testing this project, data is saved locally so progress doesn’t save between devices(this is only laptop friendly right now, sorry) and inactivity may make your browser clear the data if that’s something you have enabled(Safari does this a lot). Also note that when viewing the GitHub, I’m working on this with branches so view the “feature/training-adjustments” branch to see current committed changes, they’re not merged on main yet. Other than that, this is the second ship so some feedback was incorporated, but same as before, this app will continue to be expanded upon so all feedback is good feedback. Enjoy!
I made a basketball training app that will help people train their basketball skills. The hardest part in this ship was probably finding the best way to integrate mobile into this. I really don’t like styling, and it took really long to figure out correct widths, until I realized viewport widths which made life so much easier and correctly take up the space you need. I’m most proud of the animations that have now been integrated within the site. They’re pretty basic, but I do think they add enough flavor to the app to make it a little bit more enjoyable, which is always a nice touch. When testing this project, data is saved locally so progress doesn’t save between devices and inactivity may make your browser clear the data if that’s something you have enabled(Safari does this a lot). Also note that when viewing the GitHub, I’m working on this with branches so view the “feature/training-adjustments” branch to see current committed changes, they’re not merged on main yet. This is the third ship for this project, and I anticipate more to come so all feedback is appreciated. Enjoy!...
|
1792878565.47188
|
1793742565.47188
|
|
56905
|
OrbitTrace by @Jhenil | Stardance
|
Jhenil
|
1
|
17.0
|
328
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-11T00:35:53Z", "hours": 17.0, "multiplier": 19.06, "payout": 328, "blessing": "neutral", "text": "What Is It? I have made a 3D Earth Satellite Tracker. If you can explore and get live information about the satellites. It uses an API link which gives the code the data which it needs to go through a custom made equation and does calculations to update the satellite’s location accurately and create a projected path for it. The globe is custom made with THREE.js and Vite. Features 3D Earth Real Satellite Positions using Satellite.js Search Feature Select Satellites Camera zoom Predicted and completed orbital path Ground Track Satellite Position Replay Information Panel Loading Screen Unique Features The ground track feature is I think the best one because we all know that satellite’s orbit around Earth in circles but it looks different when you see it relative to the Earth. The satellites have weird wavy or boxy type paths if seen on the Earth’s surface. Another great feature is replay which can give you replay for the last 90 minutes. It will not be a full 90 minutes, it increments by 1 minute which makes the process of replay faster and you don’t have to sit there for 90 minutes or for the amount of time you have selected. Goal I have mentioned this a lot but I am really close to my goal for an A1 Mini 3D Printer. If you guys leave me great reviews about the project then I will be set for my goal. Thank you in advance to any one who has supported me or has rated my project.", "repo": "https://github.com/JP-code33/OrbitTrace", "demo": "https://orbit-trace-three.vercel.app/"}]...
|
[{"post_id": 65662, "ts": "202 [{"post_id": 65662, "ts": "2026-09-10T23:17:45Z", "hours": 0.6525, "text": "Devlog - 8 I have never been this frustrated to deploy a website. When I went to deploy the website, it kept giving me errors and errors. The main fault was that Vite 8 used a rolldown to bundle dependencies. It couldn’t bundle my satellite.js as it used js and WASM. Then I tried many times to make the code forcefully use the JS version but it just didn’t work. Then I searched up and saw that Vite 8 causes this and if I downgrade to Vite 7 then it will work then I did that and finally the deployment was turned from errors to success message and now the site is finally live. I will be shipping this project soon. Thank you for the support once again!"}, {"post_id": 65594, "ts": "2026-09-10T20:41:14Z", "hours": 2.5822, "text": "Devlog - 7 I am happy to announce that OrbitTrace is complete . My own 3D satellite tracker is complete. For the last 2 hours I have focused on features which are Ground Track & Replay . Let’s start with Ground Track. The satellite on the model let’s us know that where the satellite is and the projected paths are just circles you may say. But Ground Track let’s you know the satellite is traveling relative to Earth. Like it travels in weird patterns around the Earth. The replay as you may guess is the where you can time travel. You can go behind in time for about 90 minutes to see where the satellite was. It increments per minute so it doesn’t take full 90 minutes to replay. Thank you for all the support. Goal As I have mentioned earlier this is my last project before and my last hope for A1 Mini 3D printer as it is getting hard to manage school and coding at the same time but I will try my best to work on more projects. I need around 200 more stardust and I think this project has the potential to achieve that. Thank everyone once again!"}, {"post_id": 64482, "ts": "2026-09-08T22:12:17Z", "hours": 2.9764, "text": "Devlog - 6 Ok guys, I think this was the hardest part of the project till now. I was trying to get the day/night version so it replicates the real earth. I this whole time figuring it out. Firstly I start up with math to actually figure out like astronomical values for the shader and to figure out where the Sun will be at what point of time but it didn’t work out but then I went to online libraries which let’s say also didn’t work as I could understand how to use it properly. I made so many changes through out this almost three hours but at the end I made a version where it sees users local time and adjusts the earth whether it will be day time or night time. Thank you and stay tuned!"}, {"post_id": 63632, "ts": "2026-09-07T15:39:56Z", "hours": 2.2867, "text": "Devlog - 5 Finally Finally . I have overcome the problem of syncing the latitude and longitude of the Earth and the satellites. So the main problem was, I used a tutorial to build the earth in 3D so what happened the Earth’s longitude at zero was -90 so because of that the calculations were being correct but the marker was being placed at a wrong latitude. Before I didn’t knew about that so I tried changing the math but that was correct and then when I figured out that is was at a wrong longitude, it was a simple fix as I just added +90 . Then I encountered another problem which was after a search the zoom controls and the drag controls for the earth became sketchy . That was because I was using a normal zoom function before but for zooming in on a satellite after the search it switched to x, y, z coordinate system and after just for normal zoom it tried to switch back to normal but couldn’t and that is why it became sketchy but I fixed that as well. Then I started to add features in. I have added satellite’s porjected path and completed path in now. You can see that in the video below. This was just like debugging. Thank you and stay tuned!"}, {"post_id": 63061, "ts": "2026-09-06T17:28:16Z", "hours": 2.4639, "text": "Devlog - 4 Right now it is being a bit too much of a trial and error debugging for me. I did manage to get all the satellites being added on the earth textured globe. There are around 16,000 satellites. I have separate code which asks the API for the data and then that data gets parsed and then it converts it to TLE and which is then used in the main code to make those markers. Then I added search feature and while making that search feature I noticed that still the syncing of the latitude & longitude of the textured earth and the satellites is still a big problem. I can’t get it too sync with each other . I will be continuing to debug and lets see what happens. Thank you & stay tuned!"}, {"post_id": 62319, "ts": "2026-09-05T17:00:25Z", "hours": 2.4547, "text": "Devlog - 3 In 2 hours I have worked on quite a few different things. Starting it off with a problem mentioned in the last devlog which was having the latitude and longitude of satellites matching that with the earth’s lat and lon. I have fixed that problem and it was quite a silly one because It the API which had me blocked for a temporary basis because I have requested a lot in a few amount of time. So, it was just no responding to the request and that is why the satellites where not appearing and stayed in the middle. Second I added a sliding panel for the satellite information in which I encountered a problem where I was using Raycaster and it detected every click rather than a specific satellite click so then I again did like trial and error process and got it to work at the end. Also created a new data folder so that the data for satellites stays separated from the main code. Next up I will be loading more of the satellites into the project. Thank you and stay tuned."}, {"post_id": 61758, "ts": "2026-09-04T20:18:27Z", "hours": 2.3228, "text": "Devlog - 2 Ok guys I have spent the time mostly getting the API working and gathering the TLE data which just means two line element data. I am currently getting data from CelesTrak and it is going quite good. I have also gotten the marker for the ISS on the globe. The part I am struggling with currently is the fact to sync the coordinates of the satellite with the earth and with the mouse movement. Currently I am trying many different things out like stopping the earth rotation and changing the camera location rather than the actual earth, just like trial and error. I have still not found a way to get this thing to work but I am continuing the trial and error process and will update about it in the next devlog. Thank you and stay tuned! Plus sorry for late devlog as I can’t really focus on coding much as the school has started and all."}, {"post_id": 59851, "ts": "2026-09-01T20:32:28Z", "hours": 1.4969, "text": "Devlog - 1 Thank you so for the support for SkyTrace . That project got great votes and helped me get closer to my goal for an A1 Mini 3D Printer . After seeing the success of SkyTrace, I have decided to make OrbitTrace. SkyTrace = Aviation enthusiast whereas OrbitTrace = Space enthusiast . Progress For the progress I worked on making a globe, make it rotate, follow the direction of the and I have added stars. This process for me was fairly quick because I have previously made a globe for 3d flight tracking but let just say it didn’t go well. But I am back to making globes. Currently, I have planned to make it a satellite tracker but as usual it is not going to be that simple. I am going to add more unique features to as I did to SkyTrace. It might take me longer to post devlogs because now I have to manage studies and coding which is getting a bit harder, but I will ship this project. Thank you & stay tuned!"}]...
|
Title: OrbitTrace by @Jhenil | Stardance
Devlogs: Title: OrbitTrace by @Jhenil | Stardance
Devlogs:
Devlog - 1 Thank you so for the support for SkyTrace . That project got great votes and helped me get closer to my goal for an A1 Mini 3D Printer . After seeing the success of SkyTrace, I have decided to make OrbitTrace. SkyTrace = Aviation enthusiast whereas OrbitTrace = Space enthusiast . Progress For the progress I worked on making a globe, make it rotate, follow the direction of the and I have added stars. This process for me was fairly quick because I have previously made a globe for 3d flight tracking but let just say it didn’t go well. But I am back to making globes. Currently, I have planned to make it a satellite tracker but as usual it is not going to be that simple. I am going to add more unique features to as I did to SkyTrace. It might take me longer to post devlogs because now I have to manage studies and coding which is getting a bit harder, but I will ship this project. Thank you & stay tuned!
Devlog - 2 Ok guys I have spent the time mostly getting the API working and gathering the TLE data which just means two line element data. I am currently getting data from CelesTrak and it is going quite good. I have also gotten the marker for the ISS on the globe. The part I am struggling with currently is the fact to sync the coordinates of the satellite with the earth and with the mouse movement. Currently I am trying many different things out like stopping the earth rotation and changing the camera location rather than the actual earth, just like trial and error. I have still not found a way to get this thing to work but I am continuing the trial and error process and will update about it in the next devlog. Thank you and stay tuned! Plus sorry for late devlog as I can’t really focus on coding much as the school has started and all.
Devlog - 3 In 2 hours I have worked on quite a few different things. Starting it off with a problem mentioned in the last devlog which was having the latitude and longitude of satellites matching that with the earth’s lat and lon. I have fixed that problem and it was quite a silly one because It the API which had me blocked for a temporary basis because I have requested a lot in a few amount of time. So, it was just no responding to the request and that is why the satellites where not appearing and stayed in the middle. Second I added a sliding panel for the satellite information in which I encountered a problem where I was using Raycaster and it detected every click rather than a specific satellite click so then I again did like trial and error process and got it to work at the end. Also created a new data folder so that the data for satellites stays separated from the main code. Next up I will be loading more of the satellites into the project. Thank you and stay tuned.
Devlog - 4 Right now it is being a bit too much of a trial and error debugging for me. I did manage to get all the satellites being added on the earth textured globe. There are around 16,000 satellites. I have separate code which asks the API for the data and then that data gets parsed and then it converts it to TLE and which is then used in the main code to make those markers. Then I added search feature and while making that search feature I noticed that still the syncing of the latitude & longitude of the textured earth and the satellites is still a big problem. I can’t get it too sync with each other . I will be continuing to debug and lets see what happens. Thank you & stay tuned!
Devlog - 5 Finally Finally . I have overcome the problem of syncing the latitude and longitude of the Earth and the satellites. So the main problem was, I used a tutorial to build the earth in 3D so what happened the Earth’s longitude at zero was -90 so because of that the calculations were being correct but the marker was being placed at a wrong latitude. Before I didn’t knew about that so I tried changing the math but that was correct and then when I figured out that is was at a wrong longitude, it was a simple fix as I just added +90 . Then I encountered another problem which was after a search the zoom controls and the drag controls for the earth became sketchy . That was because I was using a normal zoom function before but for zooming in on a satellite after the search it switched to x, y, z coordinate system and after just for normal zoom it tried to switch back to normal but couldn’t and that is why it became sketchy but I fixed that as well. Then I started to add features in. I have added satellite’s porjected path and completed path in now. You can see that in the video below. This was just like debugging. Thank you and stay tuned!
Devlog - 6 Ok guys, I think this was the hardest part of the project till now. I was trying to get the day/night version so it replicates the real earth. I this whole time figuring it out. Firstly I start up with math to actually figure out like astronomical values for the shader and to figure out where the Sun will be at what point of time but it didn’t work out but then I went to online libraries which let’s say also didn’t work as I could understand how to use it properly. I made so many changes through out this almost three hours but at the end I made a version where it sees users local time and adjusts the earth whether it will be day time or night time. Thank you and stay tuned!
Devlog - 7 I am happy to announce that OrbitTrace is complete . My own 3D satellite tracker is complete. For the last 2 hours I have focused on features which are Ground Track & Replay . Let’s start with Ground Track. The satellite on the model let’s us know that where the satellite is and the projected paths are just circles you may say. But Ground Track let’s you know the satellite is traveling relative to Earth. Like it travels in weird patterns around the Earth. The replay as you may guess is the where you can time travel. You can go behind in time for about 90 minutes to see where the satellite was. It increments per minute so it doesn’t take full 90 minutes to replay. Thank you for all the support. Goal As I have mentioned earlier this is my last project before and my last hope for A1 Mini 3D printer as it is getting hard to manage school and coding at the same time but I will try my best to work on more projects. I need around 200 more stardust and I think this project has the potential to achieve that. Thank everyone once again!
Devlog - 8 I have never been this frustrated to deploy a website. When I went to deploy the website, it kept giving me errors and errors. The main fault was that Vite 8 used a rolldown to bundle dependencies. It couldn’t bundle my satellite.js as it used js and WASM. Then I tried many times to make the code forcefully use the JS version but it just didn’t work. Then I searched up and saw that Vite 8 causes this and if I downgrade to Vite 7 then it will work then I did that and finally the deployment was turned from errors to success message and now the site is finally live. I will be shipping this project soon. Thank you for the support once again!
Ships:
What Is It? I have made a 3D Earth Satellite Tracker. If you can explore and get live information about the satellites. It uses an API link which gives the code the data which it needs to go through a custom made equation and does calculations to update the satellite’s location accurately and create a projected path for it. The globe is custom made with THREE.js and Vite. Features 3D Earth Real Satellite Positions using Satellite.js Search Feature Select Satellites Camera zoom Predicted and completed orbital path Ground Track Satellite Position Replay Information Panel Loading Screen Unique Features The ground track feature is I think the best one because we all know that satellite’s orbit around Earth in circles but it looks different when you see it relative to the Earth. The satellites have weird wavy or boxy type paths if seen on the Earth’s surface. Another great feature is replay which can give you replay for the last 90 minutes. It will not be a full 90 minutes, it increments by 1 minute which makes the process of replay faster and you don’t have to sit there for 90 minutes or for the amount of time you have selected. Goal I have mentioned this a lot but I am really close to my goal for an A1 Mini 3D Printer. If you guys leave me great reviews about the project then I will be set for my goal. Thank you in advance to any one who has supported me or has rated my project....
|
1793346973.525366
|
1793433373.525366
|
|
7642
|
Flatliner by @LitSkulll | Stardance
|
LitSkulll
|
0
|
2.45
|
0
|
[]
|
[{"post_id": 6567, "ts": "2026 [{"post_id": 6567, "ts": "2026-06-11T00:59:45Z", "hours": 2.0025, "text": "Phew, finished studying about: Logic and variables Properties Boolean logic Working with data Functions. Now I’m going to start working on how I’m planning to execute the game"}, {"post_id": 4010, "ts": "2026-06-07T05:02:01Z", "hours": 0.4489, "text": "Finally starting on my first ever Godot Project ever! (wish me luck :3 )"}]...
|
Title: Flatliner by @LitSkulll | Stardance
Devlog Title: Flatliner by @LitSkulll | Stardance
Devlogs:
Finally starting on my first ever Godot Project ever! (wish me luck :3 )
Phew, finished studying about: Logic and variables Properties Boolean logic Working with data Functions. Now I’m going to start working on how I’m planning to execute the game...
|
1793357563.809332
|
1793962363.809332
|
|
57166
|
CipherOS by @Athan | Stardance
|
Athan
|
1
|
13.32
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T05:38:19Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made cipherosso thats its not a fake macos (saw a lot of them so tried smth else) the page is kindoff a corkboard. polaroids on the left are the apps. folders are windows. drag the tab (the little grip), scribbly x closes it, click a folder to yank it to the front. no min no max no resize. no password as required +_+ hard part was making it look like a desk and not a tutorial. cork grain, manila folders, polaroids with red pins. also stuffing the windows so they werent emptyyy. notebook actually saves clues in this browser. CASE 0 is the missing campfire flagship hoodies (L/M/S) cuz i didnt have shop photos so theyre sad silhouettes with a ? which ngl could be better, I’amma try asking for the pics on slack. im proud the page IS ACTUALLY LIKE a corkboard and that the shredder still says evidence destroyed: 0 suspiciously clean, i left it like that on purpose rn ;) to test: open https://cipheros.techxtreme.me (if its asleep try https://cipheros-ten.vercel.app ). poke the polaroids around ig. drag a folder. pin a note, refresh, it should still be there. dont lose the pins hehe I have a lot in mind for v2, I had already noted down everything in few markdowns, So I amma start v2 after this ship igg", "repo": "https://github.com/its-techxtreme/cipheros", "demo": "https://cipheros-ten.vercel.app"}]...
|
[{"post_id": 65670, "ts": "202 [{"post_id": 65670, "ts": "2026-09-10T23:42:31Z", "hours": 1.6486, "text": "Devlog #8 New properties for the Yarn & a Clock app In the last devlog, I added the red strings kind of yarn that link folders to the windows of the apps, but it was always a straight line. So, during this devlog, what I tried to do was I made it so that the yarn actually bends, so that it gives the it much more natural look as if the yarn was actually connected to the app window, and due to gravity it was bending down a bit. That’s the kind of look I was trying to imitate. Next, I also added a clock-like app. like it can be accessed via clicking on the time in the top right corner. and it just shows the clock in a bigger window. Also regarding the yarn, it is now such that whenever I open an app window, the yarn obviously gets connected but after that. Lemme explain with a example. For example, let’s say i open the shredder, so the yarn is connected from the shredder file to the shredder app window. and whenever i move the window and place it somewhere on the corkboard, lets say some another corner of the webos, and if i close the window now, then the yarn, gets pinned to the corkboard in that location. So basically, it remembers where the last time the window was closed. And it pins the yarn as if it was pinned to the corkboard using a thumb pin."}, {"post_id": 64852, "ts": "2026-09-09T15:25:27Z", "hours": 3.0975, "text": "Devlog #7 Did many visual Changes Basically, last time what I did was I rewrote all of mostly codebase, made some changes myself and so that it is written by me. and also optimized it a bit . After that, i optimized a lot more of the codebase what i did in this devlog next is first of all i thought about trying to give it a new font style. i personally prefer font that is very easy to read and is much more spacey-spacey so, that’s what I did basically for right now. also added like this yarn structure. so like now when the windows open, that polaroid picture is actually connected to the window using you know, red kind of a yarn thing. like how those detectives actually have those many polaroids and pictures on a board, and then it’s all connected by these red and different strings, and in the end, they find the evidence. That’s the kind of thing that I’m trying over here. Gonna start working on the design overhaul nexttt :D"}, {"post_id": 64669, "ts": "2026-09-09T07:59:33Z", "hours": 1.5783, "text": "DEVLOGG this one is a short devlog compared to those from others Mostly the changes were done in the code, I rewrote majority of the code and made it more efficient, also rewrote README, as it was lacking many things."}, {"post_id": 64026, "ts": "2026-09-08T04:20:27Z", "hours": 1.0061, "text": "devlog #4 Shipping the desk next ig (WebOS 1) In the lastestt log i stuffed the folders. this one is just me putting the desk on the internet so someone else can knock the polaroids around :) Then wrote a real readme. not a one liner. two screenshots of the actual corkboard, and they actually show up on github this time. Live name is https://cipheros.techxtreme.me because i was not gonna ship a random vercel hash as the only url as always (gotta maximise the use of the domain i bought Tho obv vercel is still behind it at https://cipheros-ten.vercel.app if namecheap is taking a nap. Repo is public as it already was. btw added a mit license, cuz why not drag the tab, scribbly x closes, pins open stuff, notes stick in this browser, CASE 0 is the missing campfire hoodies, no password and the rest of the case story are a plan for next ship. v1 is the desk and all. if you open it and it looks like a corkboard thats because the PAGE IS THE corkboard. thats the bit."}, {"post_id": 63461, "ts": "2026-09-07T10:20:34Z", "hours": 2.9547, "text": "devlog #3 stuffed the folders (finally) the desk was awake but empty. like i bought manila folders and forgot to put paper in them. thats the part that was annoying me. notebook actually takes clues now. you type, hit pin note, they stay even if you refresh. scratch button is there because some notes are just me lying to myself at 1am 😂 Case files has little folder cards. desk map, active case, loop pile, and CASE 0. CASE 0 is the missing campfire flagship hoodies (L, M, S), stamped “MISSING”. no real shop photos so theyre sad hoodie silhouettes with a big ? which honestly fits.the shredder says evidence destroyed: 0. suspiciously clean. i didnt feed it anything on purpose. bugs i had to fight after stuffing it: notes would explode if localstorage had garbage the clue box was stretching like it wanted the whole folder hoodie window was too skinny so polaroids were eating each other extra click listeners on the pins were doing double duty for no reason anyway the apps exist now. next its gonna be readme then ship if everything works well on vercel ig"}, {"post_id": 61721, "ts": "2026-09-04T19:18:44Z", "hours": 1.6581, "text": "DEVLOGGG #2 // the board kinda woke up a little last log was basically html bones sitting on a white page like a sad school assignment. now it actually looks like cipheros. Cork wall is in. tape bar is in. the apps are polaroids pinned on the side, with red yarn doing the whole detective-board thing. i also made the windows look like manila folders instead of random browser boxes, so now the page has a personality and not just div div div energy. then i made the dead stuff wake up: [x] clock stopped saying --:-- [x] pins open their windows now [x] the tiny x actually closes folders [x] clicking a folder brings it to the front [x] dragging from the folder tab works mini chaos moment: the html got cursed for a bit and kept getting extra quote marks at the bottom. it was one of those bugs where everything works but the file looks haunted, so i cleaned that before calling it done +_+ still not doing the real apps yet. notebook doesnt save. CASE 0 is still just the missing hoodie folder waiting for photos. shredder is still empty, which is suspicious but fine. next iamma make the windows actually contain stuff. notes, files, hoodie photos. the desk is awake now, it just needs evidence."}, {"post_id": 60302, "ts": "2026-09-02T16:06:41Z", "hours": 1.6378, "text": "devlog #1 started cipheros :) ok so i wanted a WebOS that felt like a detective board, not another fake macos. Today I started with html only. no colors, no fonts, just boxes with names on them. Tape bar has CipherOS and a clock that says --:-- like its buffering forever. four pins (notebook, files, hoodies, shredder). five windows dumped on the page so i can see them. vscode kept fighting me on tags ngl. it loads tho. nothing works yet lol. next i make it look like cork. anyway thats the start"}]...
|
Title: CipherOS by @Athan | Stardance
Devlogs:
de Title: CipherOS by @Athan | Stardance
Devlogs:
devlog #1 started cipheros :) ok so i wanted a WebOS that felt like a detective board, not another fake macos. Today I started with html only. no colors, no fonts, just boxes with names on them. Tape bar has CipherOS and a clock that says --:-- like its buffering forever. four pins (notebook, files, hoodies, shredder). five windows dumped on the page so i can see them. vscode kept fighting me on tags ngl. it loads tho. nothing works yet lol. next i make it look like cork. anyway thats the start
DEVLOGGG #2 // the board kinda woke up a little last log was basically html bones sitting on a white page like a sad school assignment. now it actually looks like cipheros. Cork wall is in. tape bar is in. the apps are polaroids pinned on the side, with red yarn doing the whole detective-board thing. i also made the windows look like manila folders instead of random browser boxes, so now the page has a personality and not just div div div energy. then i made the dead stuff wake up: [x] clock stopped saying --:-- [x] pins open their windows now [x] the tiny x actually closes folders [x] clicking a folder brings it to the front [x] dragging from the folder tab works mini chaos moment: the html got cursed for a bit and kept getting extra quote marks at the bottom. it was one of those bugs where everything works but the file looks haunted, so i cleaned that before calling it done +_+ still not doing the real apps yet. notebook doesnt save. CASE 0 is still just the missing hoodie folder waiting for photos. shredder is still empty, which is suspicious but fine. next iamma make the windows actually contain stuff. notes, files, hoodie photos. the desk is awake now, it just needs evidence.
devlog #3 stuffed the folders (finally) the desk was awake but empty. like i bought manila folders and forgot to put paper in them. thats the part that was annoying me. notebook actually takes clues now. you type, hit pin note, they stay even if you refresh. scratch button is there because some notes are just me lying to myself at 1am 😂 Case files has little folder cards. desk map, active case, loop pile, and CASE 0. CASE 0 is the missing campfire flagship hoodies (L, M, S), stamped “MISSING”. no real shop photos so theyre sad hoodie silhouettes with a big ? which honestly fits.the shredder says evidence destroyed: 0. suspiciously clean. i didnt feed it anything on purpose. bugs i had to fight after stuffing it: notes would explode if localstorage had garbage the clue box was stretching like it wanted the whole folder hoodie window was too skinny so polaroids were eating each other extra click listeners on the pins were doing double duty for no reason anyway the apps exist now. next its gonna be readme then ship if everything works well on vercel ig
devlog #4 Shipping the desk next ig (WebOS 1) In the lastestt log i stuffed the folders. this one is just me putting the desk on the internet so someone else can knock the polaroids around :) Then wrote a real readme. not a one liner. two screenshots of the actual corkboard, and they actually show up on github this time. Live name is https://cipheros.techxtreme.me because i was not gonna ship a random vercel hash as the only url as always (gotta maximise the use of the domain i bought Tho obv vercel is still behind it at https://cipheros-ten.vercel.app if namecheap is taking a nap. Repo is public as it already was. btw added a mit license, cuz why not drag the tab, scribbly x closes, pins open stuff, notes stick in this browser, CASE 0 is the missing campfire hoodies, no password and the rest of the case story are a plan for next ship. v1 is the desk and all. if you open it and it looks like a corkboard thats because the PAGE IS THE corkboard. thats the bit.
DEVLOGG this one is a short devlog compared to those from others Mostly the changes were done in the code, I rewrote majority of the code and made it more efficient, also rewrote README, as it was lacking many things.
Devlog #7 Did many visual Changes Basically, last time what I did was I rewrote all of mostly codebase, made some changes myself and so that it is written by me. and also optimized it a bit . After that, i optimized a lot more of the codebase what i did in this devlog next is first of all i thought about trying to give it a new font style. i personally prefer font that is very easy to read and is much more spacey-spacey so, that’s what I did basically for right now. also added like this yarn structure. so like now when the windows open, that polaroid picture is actually connected to the window using you know, red kind of a yarn thing. like how those detectives actually have those many polaroids and pictures on a board, and then it’s all connected by these red and different strings, and in the end, they find the evidence. That’s the kind of thing that I’m trying over here. Gonna start working on the design overhaul nexttt :D
Devlog #8 New properties for the Yarn & a Clock app In the last devlog, I added the red strings kind of yarn that link folders to the windows of the apps, but it was always a straight line. So, during this devlog, what I tried to do was I made it so that the yarn actually bends, so that it gives the it much more natural look as if the yarn was actually connected to the app window, and due to gravity it was bending down a bit. That’s the kind of look I was trying to imitate. Next, I also added a clock-like app. like it can be accessed via clicking on the time in the top right corner. and it just shows the clock in a bigger window. Also regarding the yarn, it is now such that whenever I open an app window, the yarn obviously gets connected but after that. Lemme explain with a example. For example, let’s say i open the shredder, so the yarn is connected from the shredder file to the shredder app window. and whenever i move the window and place it somewhere on the corkboard, lets say some another corner of the webos, and if i close the window now, then the yarn, gets pinned to the corkboard in that location. So basically, it remembers where the last time the window was closed. And it pins the yarn as if it was pinned to the corkboard using a thumb pin.
Ships:
i made cipherosso thats its not a fake macos (saw a lot of them so tried smth else) the page is kindoff a corkboard. polaroids on the left are the apps. folders are windows. drag the tab (the little grip), scribbly x closes it, click a folder to yank it to the front. no min no max no resize. no password as required +_+ hard part was making it look like a desk and not a tutorial. cork grain, manila folders, polaroids with red pins. also stuffing the windows so they werent emptyyy. notebook actually saves clues in this browser. CASE 0 is the missing campfire flagship hoodies (L/M/S) cuz i didnt have shop photos so theyre sad silhouettes with a ? which ngl could be better, I’amma try asking for the pics on slack. im proud the page IS ACTUALLY LIKE a corkboard and that the shredder still says evidence destroyed: 0 suspiciously clean, i left it like that on purpose rn ;) to test: open https://cipheros.techxtreme.me (if its asleep try https://cipheros-ten.vercel.app ). poke the polaroids around ig. drag a folder. pin a note, refresh, it should still be there. dont lose the pins hehe I have a lot in mind for v2, I had already noted down everything in few markdowns, So I amma start v2 after this ship igg...
|
1792878432.2312036
|
1793742432.2312036
|
|
59585
|
PantheonYAML by @Minetrio1256 | Stardance
|
Minetrio1256
|
0
|
1.39
|
0
|
[]
|
[{"post_id": 65671, "ts": "202 [{"post_id": 65671, "ts": "2026-09-10T23:43:13Z", "hours": 0.3531, "text": "Devlog #3 Project elements loading"}, {"post_id": 65087, "ts": "2026-09-09T23:42:12Z", "hours": 0.395, "text": "Devlog #2 I added the projects parser. A project is a collection of elements under a namespace. It currently stores configured projects to be loaded. Next step is loading the project-elements.yaml of each project which contains the paths for each type of element to be loaded, note that this is being done in the bootstrap phase for registry access."}, {"post_id": 64500, "ts": "2026-09-08T22:57:46Z", "hours": 0.6428, "text": "Devlog #1 the following screenshot contains what I plan to implement to be able to be loaded via YAML"}]...
|
Title: PantheonYAML by @Minetrio1256 | Stardance
Title: PantheonYAML by @Minetrio1256 | Stardance
Devlogs:
Devlog #1 the following screenshot contains what I plan to implement to be able to be loaded via YAML
Devlog #2 I added the projects parser. A project is a collection of elements under a namespace. It currently stores configured projects to be loaded. Next step is loading the project-elements.yaml of each project which contains the paths for each type of element to be loaded, note that this is being done in the bootstrap phase for registry access.
Devlog #3 Project elements loading...
|
1792806464.9337811
|
1793411264.9337811
|
|
55908
|
Galaxy kinda thingymajig by @Its_angela | Stardanc Galaxy kinda thingymajig by @Its_angela | Stardance...
|
Its_angela
|
0
|
3.02
|
0
|
[]
|
[{"post_id": 65684, "ts": "202 [{"post_id": 65684, "ts": "2026-09-11T00:30:17Z", "hours": 2.3836, "text": "So Far: Spent the last couple of hours dealing with a massive headache trying to optimize my Chromebook setup. Because I’m using the browser-based cloud setup with github.dev and Replit, I spent a chunk of time testing the live-reload speeds and syncing changes between Git and Streamlit to make sure the environment won’t crash when the project gets bigger. Progress: Since the environment is finally stable, I pivoted to researching how to actually handle the math for the next phase. I looked into how Streamlit handles plotting graphs and started mapping out how to translate the physics formulas (like the gravitational field interactions) into Python vectors. It turns out doing real orbital physics in a browser app requires a lot of coordinate transformations so the dots don’t just fly off the screen. Next Steps: Start writing the actual gravity formulas in code, try to get the background looking less boring, and look into how to swap the manual coordinate slider for mouse-click inputs! I had to attach a picture, so I’ve chosen one from a different project: Atlas26 - a real-time 3D solar system simulation. That is not what my project is but I’d like to get it to look like that."}, {"post_id": 57611, "ts": "2026-08-29T20:24:05Z", "hours": 0.6394, "text": "So Far: Made a GitHub repository (took me a while to figure out how that works). I’m on a ChromeBook which complicates things a little, so I’ve decided to use github.dev (like a browser VSC?) to code, and because I’m using Streamilt, I linked it to Replit so I can pull changes from Git and see how it’s going. I tried clearing storage space to use Linux first (after AAAGES of research), which took hours, but then I realised that wouldn’t work (need more GBs), so this is the way to go for now I guess. Progress: I have an Earth and a Sun, both are 2D. No data from NASA - yet. They’re just dots. I’ve made a slider that moves the Earth (ideally it can be moved with a mouse, let’s see if I can figure that out). The background is also just plain black, hopefully I can get it to look cooler and more space-y. Baby steps people!!"}]...
|
Title: Galaxy kinda thingymajig by @Its_angela | S Title: Galaxy kinda thingymajig by @Its_angela | Stardance
Devlogs:
So Far: Made a GitHub repository (took me a while to figure out how that works). I’m on a ChromeBook which complicates things a little, so I’ve decided to use github.dev (like a browser VSC?) to code, and because I’m using Streamilt, I linked it to Replit so I can pull changes from Git and see how it’s going. I tried clearing storage space to use Linux first (after AAAGES of research), which took hours, but then I realised that wouldn’t work (need more GBs), so this is the way to go for now I guess. Progress: I have an Earth and a Sun, both are 2D. No data from NASA - yet. They’re just dots. I’ve made a slider that moves the Earth (ideally it can be moved with a mouse, let’s see if I can figure that out). The background is also just plain black, hopefully I can get it to look cooler and more space-y. Baby steps people!!
So Far: Spent the last couple of hours dealing with a massive headache trying to optimize my Chromebook setup. Because I’m using the browser-based cloud setup with github.dev and Replit, I spent a chunk of time testing the live-reload speeds and syncing changes between Git and Streamlit to make sure the environment won’t crash when the project gets bigger. Progress: Since the environment is finally stable, I pivoted to researching how to actually handle the math for the next phase. I looked into how Streamlit handles plotting graphs and started mapping out how to translate the physics formulas (like the gravitational field interactions) into Python vectors. It turns out doing real orbital physics in a browser app requires a lot of coordinate transformations so the dots don’t just fly off the screen. Next Steps: Start writing the actual gravity formulas in code, try to get the background looking less boring, and look into how to swap the manual coordinate slider for mouse-click inputs! I had to attach a picture, so I’ve chosen one from a different project: Atlas26 - a real-time 3D solar system simulation. That is not what my project is but I’d like to get it to look like that....
|
1793357645.930792
|
1793962445.930792
|
|
42107
|
whack-a-mole by @NotDave | Stardance
|
NotDave
|
1
|
13.0
|
18
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-11T00:39:43Z", "hours": 13.0, "multiplier": 1.37, "payout": 18, "blessing": "neutral", "text": "I made a whack-a-mole game, the challenging part was the fact that i had very little experience with js so the event listeners were a bit of a pain to deal with, before you try the project, be informed that it probably does have bugs and if it does it would be helpful if you’d tell me what the bug you found was.", "repo": "https://github.com/P-C-M-P/js-learning", "demo": "https://p-c-m-p.github.io/js-learning/"}]...
|
[{"post_id": 65686, "ts": "202 [{"post_id": 65686, "ts": "2026-09-11T00:36:03Z", "hours": 6.0394, "text": "Finished the game, changed the controls a bit, and changed the homepage enough to not hurt the eyes"}, {"post_id": 45350, "ts": "2026-08-11T18:56:40Z", "hours": 1.5008, "text": "Got it to look like a game, also added some extra buttons"}, {"post_id": 44861, "ts": "2026-08-10T21:58:42Z", "hours": 2.1708, "text": "Added a home page, give me some ideas, cause i’m not too happy with the look"}, {"post_id": 38445, "ts": "2026-07-31T20:17:09Z", "hours": 0.4903, "text": "Fixed the score counter, which used an event listener repeatedly per interval but well it’s better now, time to work on some styling and more options maybe"}, {"post_id": 38237, "ts": "2026-07-31T15:11:40Z", "hours": 2.9475, "text": "A basic whack-a-mole game"}]...
|
Title: whack-a-mole by @NotDave | Stardance
Devlo Title: whack-a-mole by @NotDave | Stardance
Devlogs:
A basic whack-a-mole game
Fixed the score counter, which used an event listener repeatedly per interval but well it’s better now, time to work on some styling and more options maybe
Added a home page, give me some ideas, cause i’m not too happy with the look
Got it to look like a game, also added some extra buttons
Finished the game, changed the controls a bit, and changed the homepage enough to not hurt the eyes
Ships:
I made a whack-a-mole game, the challenging part was the fact that i had very little experience with js so the event listeners were a bit of a pain to deal with, before you try the project, be informed that it probably does have bugs and if it does it would be helpful if you’d tell me what the bug you found was....
|
1793336076.158156
|
1793422476.158156
|
|
60844
|
Custom Tab ! by @OneShot | Stardance
|
OneShot
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-11T00:43:49Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Finished my Custom tab website :3c", "repo": "https://github.com/Zlati839/Custom-Tab", "demo": "https://zlati839.github.io/Custom-Tab/"}]...
|
[{"post_id": 65691, "ts": "202 [{"post_id": 65691, "ts": "2026-09-11T00:42:07Z", "hours": 1.6725, "text": "Made an another project with a OneShot Theme YAY :D"}]...
|
Title: Custom Tab ! by @OneShot | Stardance
Devlo Title: Custom Tab ! by @OneShot | Stardance
Devlogs:
Made an another project with a OneShot Theme YAY :D
Ships:
Finished my Custom tab website :3c...
|
1793411768.9696512
|
1793498168.9696512
|
|
57059
|
Claw bot by @kennator | Stardance
|
kennator
|
0
|
8.5
|
0
|
[]
|
[{"post_id": 65693, "ts": "202 [{"post_id": 65693, "ts": "2026-09-11T00:46:58Z", "hours": 0.6836, "text": "Added holes init for wires and internal empty box for components so im done :D The extra custom claws will be made sepperately but there is a Base one in the onshape. Design came out nice tho."}, {"post_id": 63332, "ts": "2026-09-07T03:01:01Z", "hours": 1.8508, "text": "Making hardpoint for changable claw and added more support to prevent bending with inear slide"}, {"post_id": 59475, "ts": "2026-09-01T10:43:42Z", "hours": 5.9672, "text": "makin a design"}]...
|
Title: Claw bot by @kennator | Stardance
Devlogs: Title: Claw bot by @kennator | Stardance
Devlogs:
makin a design
Making hardpoint for changable claw and added more support to prevent bending with inear slide
Added holes init for wires and internal empty box for components so im done :D The extra custom claws will be made sepperately but there is a Base one in the onshape. Design came out nice tho....
|
1792691383.32159
|
1793555383.32159
|
|
54638
|
neo-flymode by @red | Stardance
|
red
|
0
|
7.26
|
0
|
[]
|
[{"post_id": 65699, "ts": "202 [{"post_id": 65699, "ts": "2026-09-11T01:01:53Z", "hours": 1.3897, "text": "For our camera it includes a PCB that needs to be mounted onto the drone frame. However the space between the the bottom frame was to thin for the drone drive controller and the camera PCB to be together. In addition the PCB was to big to share the same space of the drone drive controller. Therefore I had to move it a little forward. I wanted to make a platform for the driver controller because the screws may impale the camera PCB."}, {"post_id": 65653, "ts": "2026-09-10T22:43:57Z", "hours": 3.6158, "text": "Today I wanted to get the camera mount on. Not gonna lie, I gave up on the fpv part of the drone since I’m not trying to buy the headset so now the drone will turn into a casual drone for recording. Therefore the camera I decided to pick that is cheap in price was the RunCam Split 4 V3 as it’s recording quality is very high while being simple to implement. For the mount I decided to find one online and just modify it such that it fits the drone frame."}, {"post_id": 57083, "ts": "2026-08-29T05:20:40Z", "hours": 0.9989, "text": "Today I wanted to make my decision on which battery my drone would use. Since this drone is not planned to prioritize fly time we would need a battery with not much voltage and therefore less weight to our battery. The more weight we have to our battery the more downwards force is being applied to the drone once above the ground, therefore hindering its aerial performance. So I decided to go for a GNB-660-4S-90A-HV 63g which will be strapped onto the drone using two velcro straps on both sides. After I felt that some of the frame structure itself could be modified to reduce weight. Therefore, I decided to pocket both the top and bottom plate to do just that. In the end the weight decreased and the drone looks way better!"}, {"post_id": 56416, "ts": "2026-08-28T05:42:42Z", "hours": 0.9678, "text": "Now I began today with figuring our the best flight controller for my FPV Drone. I decided to select a SpeedyBee F405 V4 Stack (20x20) due to it being cheap, well-documented, and very common with many other using it as well. Additionally, 35A is pumped to each of the 4 motors which is solid for not to intense driving especially with this drones purpose to be only used for recording. Now that we have that choice situated I need to mount it onto the drone frame somehow. For this I decided to mount holes where the spacers of the flight controller would sit. However, a big issue that occurred was that the spacers would end up hitting the top plate. Therefore I decided to add a cutout in which no interference shall occur. Next, propellers were to be dealt with. I decided to go for 3.5 inch long propellers with a mounting hole of 1.5 mm in diameter (which matched the motors’ shafts diameter too.) I then went to GrabCAD to get the step file, imported it onto the document and fastened it onto the motors."}, {"post_id": 56309, "ts": "2026-08-28T01:25:26Z", "hours": 0.2833, "text": "Getting started. Quadcopter finished, starting to figuring out the electronics on it. For the drone I really wanted it to be a medium size of about 200 mm by 200mm. Next our bottom frame, which houses the motors, features 4 legs extended from a circular base of around 20mm in radius. The legs are around 103mm from the circular base. Next I wanted to extend the middle with a rectangle of 80 mm in width and 175 mm in length. Now that the structure is finished, to end of the day I decided to figure out which motors to choose. Since our drone frame is made from carbon fiber and at a decent size we do not need a tanky motor that exerts enough speed and torque to keep it hovering. Therefore I decided to go for a Micro 1404 Brushless Motor from EMAX ECO."}]...
|
Title: neo-flymode by @red | Stardance
Devlogs:
G Title: neo-flymode by @red | Stardance
Devlogs:
Getting started. Quadcopter finished, starting to figuring out the electronics on it. For the drone I really wanted it to be a medium size of about 200 mm by 200mm. Next our bottom frame, which houses the motors, features 4 legs extended from a circular base of around 20mm in radius. The legs are around 103mm from the circular base. Next I wanted to extend the middle with a rectangle of 80 mm in width and 175 mm in length. Now that the structure is finished, to end of the day I decided to figure out which motors to choose. Since our drone frame is made from carbon fiber and at a decent size we do not need a tanky motor that exerts enough speed and torque to keep it hovering. Therefore I decided to go for a Micro 1404 Brushless Motor from EMAX ECO.
Now I began today with figuring our the best flight controller for my FPV Drone. I decided to select a SpeedyBee F405 V4 Stack (20x20) due to it being cheap, well-documented, and very common with many other using it as well. Additionally, 35A is pumped to each of the 4 motors which is solid for not to intense driving especially with this drones purpose to be only used for recording. Now that we have that choice situated I need to mount it onto the drone frame somehow. For this I decided to mount holes where the spacers of the flight controller would sit. However, a big issue that occurred was that the spacers would end up hitting the top plate. Therefore I decided to add a cutout in which no interference shall occur. Next, propellers were to be dealt with. I decided to go for 3.5 inch long propellers with a mounting hole of 1.5 mm in diameter (which matched the motors’ shafts diameter too.) I then went to GrabCAD to get the step file, imported it onto the document and fastened it onto the motors.
Today I wanted to make my decision on which battery my drone would use. Since this drone is not planned to prioritize fly time we would need a battery with not much voltage and therefore less weight to our battery. The more weight we have to our battery the more downwards force is being applied to the drone once above the ground, therefore hindering its aerial performance. So I decided to go for a GNB-660-4S-90A-HV 63g which will be strapped onto the drone using two velcro straps on both sides. After I felt that some of the frame structure itself could be modified to reduce weight. Therefore, I decided to pocket both the top and bottom plate to do just that. In the end the weight decreased and the drone looks way better!
Today I wanted to get the camera mount on. Not gonna lie, I gave up on the fpv part of the drone since I’m not trying to buy the headset so now the drone will turn into a casual drone for recording. Therefore the camera I decided to pick that is cheap in price was the RunCam Split 4 V3 as it’s recording quality is very high while being simple to implement. For the mount I decided to find one online and just modify it such that it fits the drone frame.
For our camera it includes a PCB that needs to be mounted onto the drone frame. However the space between the the bottom frame was to thin for the drone drive controller and the camera PCB to be together. In addition the PCB was to big to share the same space of the drone drive controller. Therefore I had to move it a little forward. I wanted to make a platform for the driver controller because the screws may impale the camera PCB....
|
1792799244.2206783
|
1793404044.2206783
|
|
10267
|
Rubik's Cube Algorithm Finder by @pi | Stardan Rubik's Cube Algorithm Finder by @pi | Stardance...
|
pi
|
1
|
17.33
|
149
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T03:56:02Z", "hours": 17.0, "multiplier": 8.73, "payout": 149, "blessing": "neutral", "text": "Search a Rubik’s Cube for short algorithms that solve a scramble or reach a target pattern. I made this project after I learned to solve a Rubik’s Cube. See, I have this bad habit of taking something I like and automating it. On the bright side, I now have a program that can automatically solve a Rubik’s Cube, much faster than I can! To run the Python program, follow the steps linked in the Try Project section.", "repo": "https://github.com/anagram-of-pi/rubik_cube_algorithm_finder", "demo": "https://alg-finder-install.netlify.app/"}]...
|
[{"post_id": 65701, "ts": "202 [{"post_id": 65701, "ts": "2026-09-11T01:04:58Z", "hours": 0.3286, "text": "Added a real demo :) My ship got denied because I hadn’t set up a proper demo (eg, wasn’t on PyPi or a binary) so I just spent 20 minutes doing that. I’m just posting a devlog for the record."}, {"post_id": 64009, "ts": "2026-09-08T03:41:45Z", "hours": 2.23, "text": "I haven’t worked on this in a very long time, haha So I stopped working on my Rubik’s Cube solver a while ago because it was more or less complete. I never actually submitted it though! I just spent a few hours cleaning up the repo, fixing some stuff, etc.. It is now presentable and shippable! I’m not sure exactly how to do this but my demo is actually a hosted web page giving instructions on how to install and run it. It’s not one line but actually two (one for cloning and one for pip install-ing) but I hope that’s okay. Thanks all!"}, {"post_id": 5070, "ts": "2026-06-08T19:05:36Z", "hours": 0.5742, "text": "My program found solutions that I’ve never seen before :) * I told it to find an algorithm that takes an F2L pair out (e.g., R U R’ U’). If you are not familiar with the Rubik’s cube, I told it to find a sequence of moves that would result in a certain state. * I knew about one, very common sequence (R U R’ U’) and it found 17 others that I had never seen before, in about a minute of search time. * Now all that’s left is to optimize it so it can find longer algorithms!"}, {"post_id": 5040, "ts": "2026-06-08T18:19:17Z", "hours": 3.435, "text": "This was meant to be a quick side project. I have now spent more time on this than my main project. What happened??"}, {"post_id": 4401, "ts": "2026-06-07T18:36:41Z", "hours": 4.5167, "text": "Successfully searched up to depth 6 (meet-in-the-middle, so essentially up to 12) and solved a 10 move scramble in 50 seconds! * This program solved a rubik’s cube that had been scrambled with “F R U’ B’ D’ R’ L F’ B U’”, so ten moves. It correctly found the optimal 10 move solution, as well as many others. * This is Python, and I’m already running 18 searches in parallel, so I’m not sure if I’ll be able to improve the raw speed, but I hope to prune more and maybe even do a heuristic-based search in the future. * I’m planning on doing some more with this that may involve loosening the constraints. That may or may not speed it up."}, {"post_id": 3956, "ts": "2026-06-07T02:49:40Z", "hours": 2.6847, "text": "Well I thought this would be a quick project. 2.5 hours of programming later: It was not. * Since the last devlog, I have a Rubik’s Cube represented correctly in the code now, and it can make moves. All I have left to do for this part of the project is to fix the str method that returns a visualization of the cube. Right now, it gets the orientation mixed up on up and down quarter turns, but it shouldn’t be too much debugging… * Here’s a screenshot of it working next to it not working:"}, {"post_id": 3854, "ts": "2026-06-06T22:30:51Z", "hours": 3.6764, "text": "This project is very difficult to debug! It’s just a big lookup table that I entered in by hand… I’m sure I made many typos, so that will be fun."}]...
|
Title: Rubik's Cube Algorithm Finder by @pi | Title: Rubik's Cube Algorithm Finder by @pi | Stardance
Devlogs:
This project is very difficult to debug! It’s just a big lookup table that I entered in by hand… I’m sure I made many typos, so that will be fun.
Well I thought this would be a quick project. 2.5 hours of programming later: It was not. * Since the last devlog, I have a Rubik’s Cube represented correctly in the code now, and it can make moves. All I have left to do for this part of the project is to fix the str method that returns a visualization of the cube. Right now, it gets the orientation mixed up on up and down quarter turns, but it shouldn’t be too much debugging… * Here’s a screenshot of it working next to it not working:
Successfully searched up to depth 6 (meet-in-the-middle, so essentially up to 12) and solved a 10 move scramble in 50 seconds! * This program solved a rubik’s cube that had been scrambled with “F R U’ B’ D’ R’ L F’ B U’”, so ten moves. It correctly found the optimal 10 move solution, as well as many others. * This is Python, and I’m already running 18 searches in parallel, so I’m not sure if I’ll be able to improve the raw speed, but I hope to prune more and maybe even do a heuristic-based search in the future. * I’m planning on doing some more with this that may involve loosening the constraints. That may or may not speed it up.
This was meant to be a quick side project. I have now spent more time on this than my main project. What happened??
My program found solutions that I’ve never seen before :) * I told it to find an algorithm that takes an F2L pair out (e.g., R U R’ U’). If you are not familiar with the Rubik’s cube, I told it to find a sequence of moves that would result in a certain state. * I knew about one, very common sequence (R U R’ U’) and it found 17 others that I had never seen before, in about a minute of search time. * Now all that’s left is to optimize it so it can find longer algorithms!
I haven’t worked on this in a very long time, haha So I stopped working on my Rubik’s Cube solver a while ago because it was more or less complete. I never actually submitted it though! I just spent a few hours cleaning up the repo, fixing some stuff, etc.. It is now presentable and shippable! I’m not sure exactly how to do this but my demo is actually a hosted web page giving instructions on how to install and run it. It’s not one line but actually two (one for cloning and one for pip install-ing) but I hope that’s okay. Thanks all!
Added a real demo :) My ship got denied because I hadn’t set up a proper demo (eg, wasn’t on PyPi or a binary) so I just spent 20 minutes doing that. I’m just posting a devlog for the record.
Ships:
Search a Rubik’s Cube for short algorithms that solve a scramble or reach a target pattern. I made this project after I learned to solve a Rubik’s Cube. See, I have this bad habit of taking something I like and automating it. On the bright side, I now have a program that can automatically solve a Rubik’s Cube, much faster than I can! To run the Python program, follow the steps linked in the Try Project section....
|
1793523310.8048892
|
1793609710.8048892
|
|
30845
|
Raptor08 - Bipedal Robot by @squiddy | Stardance
|
squiddy
|
0
|
64.14
|
0
|
[]
|
[{"post_id": 65702, "ts": "202 [{"post_id": 65702, "ts": "2026-09-11T01:08:39Z", "hours": 8.1667, "text": "OMG I’M SOO HAPPY IT FINALLY WALKS(in simulation) so basically a few days ago I started training with a faulty model but I locked in and spent a few hours fixing it and reuploading. I also tuned the reward gains and removed some rewards I felt were too complex. I took inspiration from the setup for the learning on the Unitree Go2 and their reward system and it seems to learn super fast, walking behavior exhibted by iteration 200-300, I’ll train the model overnight to see what it comes up with. I’m super happy how this turned out. full in depth devlog will be posted later when I have time."}, {"post_id": 63907, "ts": "2026-09-07T22:56:33Z", "hours": 7.7333, "text": "Reinforcement Learning is way harder than I thought… been reading tensor graphs for the past 10 hours and closely monitoring the training program and adjusting every single variable. There seems to be a constant issue of the model “cheating” the system by finding some way to minimize penalty while still getting some reward and it’s leading to very undesirable behavior such as crossing its legs. will do more research on this and try to improve the PPO algo"}, {"post_id": 63541, "ts": "2026-09-07T13:46:07Z", "hours": 10.5658, "text": "Finally… Parallel simulation without crazy bugs! Hi guys! This is my full devlog starting to do even more interesting software #9 Starting to get busier with school unfortunately but made a huge breakthrough recently Its fine though after senioritis hits I will lock tf in on this Change log: Previously there was an issue where the imported URDF would fall through the floor. This was caused by missing tags in the URDF file for each part. To fix it meant to add it into every part MANUALLY which sucks. Another issue with the URDF format was that the parallel linkage system for the knees was unsupported and required a TON of tweaks that I didn’t want to do. So upon further research I found that Genesis World also supported MJCF(MuJuCo’s format) and that it supported the parallel linkage with minor tweaking mainly involving renaming LOTS of joints and changing the config.json file for onshape-to-robot tool a lot. Edited config file and original CAD file to include where the imu is so the simulation would know as well as motor power, weight, and friction to ensure sim to real isn’t too hard to implement, this may require further tuning down the line. Created simple schematic for all electrically connected components. Imported to Genesis World and was able to position control each joint, one step closer to training it. Was able to get a parallel simulation running on amdgpu Had claude patch up my xml file since it had floating geometry for some reason and I ran out of onshape API tokens so I couldn’t convert anymore"}, {"post_id": 44646, "ts": "2026-08-10T15:32:33Z", "hours": 8.2842, "text": "Bill of Materials updated(for a single leg) may still contain some mistakes. Hi guys! This is my mini devlog starting to do more with the simulation Change log: Changed 3d model to be much more simplified to reduce computing power and get rid of texture issue from last time Uploaded and ran the physics ragdoll in the simulation and added collision tags to the URDF so everything would collide with the ground Use onshape-urdf tool to make more detailed changes to the joints, and add joint limits to the robot to maybe fix joint breakage. Issues log: For some reason the joints keep breaking in the simulation where it detaches from the original point after an impact into the ground for example"}, {"post_id": 34278, "ts": "2026-07-24T21:01:17Z", "hours": 10.3675, "text": "Hi guys! This is my full devlog starting to do interesting software also can someone tell me how to edit the devlog with bold letters and paragraph spacing? I can do it now but only after posting and editing. #7 Change log: Researched and settled on Genesis World as the tool I will use for the physics sim as as well as RL training. Would use Issac Lab but it has poor support for AMD GPUs at the moment, so I decided to use Genesis World instead, which is a relatively new tool that doesn’t have as much documentation as other choices such as Mujoco. I setup everything in windows using a WSL according to official documentation, but pytorch was giving me a hard time and there was so many work arounds i had to do to accommodate for ROCM(amd gpu architecture) as well as windows that I decided I would just download linux and dual boot it on my computer, cleared a lot of headaches. It technically worked on windows but it would only use the cpu and wasn’t able to utilize GPU for parallel computing, leading to slower training times. Set materials, joint limits etc to prepare for exporting as URDF using the tool Onshape to URDF Imported URDF into Genesis world to test out the physics Made a BOM will post soon Issues log: Yet to fix solder and fully finish soldering to a centralizedf power distribution Finding name? please suggest Need to fix URDF having no joints for some reason thanks for reading pookies"}, {"post_id": 30922, "ts": "2026-07-18T22:15:41Z", "hours": 8.5014, "text": "Hi guys! This is my full devlog #6 Change log: change from large branching power distribution to centralized power distribution due to the previous trunk and branch configuration being too prone to soldering breakage, Had to resolder joints multiple times was getting too annoying. 3D printed a xt60 power distribution central block. Wrapped electrical tape and ziptied wire joints to alleviate stress Made a crude wooden stand with scrap wood so its easier to work with the robot.Designed and 3d printed covers for the odrive motor controllers to protect the ports and solder joints Tested 36V li-ion battery scavenged from my broken hoverboard and it works but no noticeable difference from 6s(22.2V) lipo, will stick with 6s lipo for now Issue from last time where 4th motor wont work on CAN bus. Checked the CAN id’s for both axis(main and ghost) but all was correct. Must be a hardware issue related to the signal termination resistors. Fixed by removing two jumpers on the odrives that removed two 120ohm resistors from the parallel circuit, increasing resistance, so that the signal can successfully terminate. Issues log: Solder breaking off Noticeable backlash on joints, didn’t think it was that large at first but when mounted on a long joint it is noticeable, hopefully won’t impact performance that much Goals for next devlog:Inverse Kinematics test with leg in arduino IDE before figuring out motion reinforcement learning Wire everything for one leg cleanlyFind a name for the robot for more aura tell me if you have ideas"}, {"post_id": 26333, "ts": "2026-07-11T02:03:00Z", "hours": 4.4672, "text": "mini devlog #5 lots of issues today: 1st; ran into issues with transceiver. when the program ran in arduino ide the esp32 just wasn’t able to command the motors to do anything, turns out I set the wrong baud rate and wasted an hour of my life. there also seems to be an issue with signal termination whenever I plug in a fourth motor into the CAN chain the program stops working from the esp 32(anyone with experience with this please help). this is the biggest problem I will need to solve. 2nd; I suck at soldering so all the joints started to bend and break off, I will need to design a better case for the xdrive mini boards so the solder of the xt60 connector doesn’t take the brunt of the flexing force. will need to re-solder most of these joints in order to fix the cold solder joints from before. at some point some magic smoke started coming out from one of the boards, no clue what its from but it solved itself and everything worked after re-plugging power supply. Should probably investigate further but i didn’t see any obvious shorts and im too lazy. Thanks for reading <3"}, {"post_id": 25610, "ts": "2026-07-09T23:55:46Z", "hours": 1.4667, "text": "Mini devlog #4 tested can transceiver and IMU unit, took a lot of troubleshooting connecting them to esp32 and using them on arduinoIDE, will switch to VS code soon"}, {"post_id": 23774, "ts": "2026-07-06T22:12:21Z", "hours": 3.3667, "text": "Mini devlog #3: 1. finished up cad, widened frame to accomodate for free rotation of the hip joint and added ziptie mount(temperory while find a better solution and figure out the wiring) added esp32 mount, imu mount, CAN bus transiever mount in progress, and added the odrive models in the cad(not shown in screenshot oops). 2. finished setting up motor firmware and tuned all actuators, found and issue with one of them having too much friction internally so I need to open it up and fix it(perhaps I printed the old version of the axle with the new design?). I soldered all the motors to the controllers and all the power connectors as well and tested them individually while in the cycloidal gearboxes. big thanks to justlovescience for his video on how to set up the brushless controllers, had to tweak quite a few things and the UI wasn’t working for me but was helpful regardless. mostly fixing mechanical bugs today, next steps are finalizing v1 of the whole robot and v3 of the leg, and upload model to the physics simulation. BOM coming soon. Thanks for reading allat"}, {"post_id": 23549, "ts": "2026-07-06T16:04:51Z", "hours": 0.65, "text": "assembled both sides in CAD, debated on making a active ankle joint, but decided it would add too much weight and complexity since I would have to source a smaller motor. Keeps it simple to make all actuators the same. Working on electronics wiring and encasing soon"}, {"post_id": 23522, "ts": "2026-07-06T15:23:29Z", "hours": 0.5667, "text": "putting leg together in assembly"}]...
|
Title: Raptor08 - Bipedal Robot by @squiddy | Star Title: Raptor08 - Bipedal Robot by @squiddy | Stardance
Devlogs:
putting leg together in assembly
assembled both sides in CAD, debated on making a active ankle joint, but decided it would add too much weight and complexity since I would have to source a smaller motor. Keeps it simple to make all actuators the same. Working on electronics wiring and encasing soon
Mini devlog #3: 1. finished up cad, widened frame to accomodate for free rotation of the hip joint and added ziptie mount(temperory while find a better solution and figure out the wiring) added esp32 mount, imu mount, CAN bus transiever mount in progress, and added the odrive models in the cad(not shown in screenshot oops). 2. finished setting up motor firmware and tuned all actuators, found and issue with one of them having too much friction internally so I need to open it up and fix it(perhaps I printed the old version of the axle with the new design?). I soldered all the motors to the controllers and all the power connectors as well and tested them individually while in the cycloidal gearboxes. big thanks to justlovescience for his video on how to set up the brushless controllers, had to tweak quite a few things and the UI wasn’t working for me but was helpful regardless. mostly fixing mechanical bugs today, next steps are finalizing v1 of the whole robot and v3 of the leg, and upload model to the physics simulation. BOM coming soon. Thanks for reading allat
Mini devlog #4 tested can transceiver and IMU unit, took a lot of troubleshooting connecting them to esp32 and using them on arduinoIDE, will switch to VS code soon
mini devlog #5 lots of issues today: 1st; ran into issues with transceiver. when the program ran in arduino ide the esp32 just wasn’t able to command the motors to do anything, turns out I set the wrong baud rate and wasted an hour of my life. there also seems to be an issue with signal termination whenever I plug in a fourth motor into the CAN chain the program stops working from the esp 32(anyone with experience with this please help). this is the biggest problem I will need to solve. 2nd; I suck at soldering so all the joints started to bend and break off, I will need to design a better case for the xdrive mini boards so the solder of the xt60 connector doesn’t take the brunt of the flexing force. will need to re-solder most of these joints in order to fix the cold solder joints from before. at some point some magic smoke started coming out from one of the boards, no clue what its from but it solved itself and everything worked after re-plugging power supply. Should probably investigate further but i didn’t see any obvious shorts and im too lazy. Thanks for reading <3
Hi guys! This is my full devlog #6 Change log: change from large branching power distribution to centralized power distribution due to the previous trunk and branch configuration being too prone to soldering breakage, Had to resolder joints multiple times was getting too annoying. 3D printed a xt60 power distribution central block. Wrapped electrical tape and ziptied wire joints to alleviate stress Made a crude wooden stand with scrap wood so its easier to work with the robot.Designed and 3d printed covers for the odrive motor controllers to protect the ports and solder joints Tested 36V li-ion battery scavenged from my broken hoverboard and it works but no noticeable difference from 6s(22.2V) lipo, will stick with 6s lipo for now Issue from last time where 4th motor wont work on CAN bus. Checked the CAN id’s for both axis(main and ghost) but all was correct. Must be a hardware issue related to the signal termination resistors. Fixed by removing two jumpers on the odrives that removed two 120ohm resistors from the parallel circuit, increasing resistance, so that the signal can successfully terminate. Issues log: Solder breaking off Noticeable backlash on joints, didn’t think it was that large at first but when mounted on a long joint it is noticeable, hopefully won’t impact performance that much Goals for next devlog:Inverse Kinematics test with leg in arduino IDE before figuring out motion reinforcement learning Wire everything for one leg cleanlyFind a name for the robot for more aura tell me if you have ideas
Hi guys! This is my full devlog starting to do interesting software also can someone tell me how to edit the devlog with bold letters and paragraph spacing? I can do it now but only after posting and editing. #7 Change log: Researched and settled on Genesis World as the tool I will use for the physics sim as as well as RL training. Would use Issac Lab but it has poor support for AMD GPUs at the moment, so I decided to use Genesis World instead, which is a relatively new tool that doesn’t have as much documentation as other choices such as Mujoco. I setup everything in windows using a WSL according to official documentation, but pytorch was giving me a hard time and there was so many work arounds i had to do to accommodate for ROCM(amd gpu architecture) as well as windows that I decided I would just download linux and dual boot it on my computer, cleared a lot of headaches. It technically worked on windows but it would only use the cpu and wasn’t able to utilize GPU for parallel computing, leading to slower training times. Set materials, joint limits etc to prepare for exporting as URDF using the tool Onshape to URDF Imported URDF into Genesis world to test out the physics Made a BOM will post soon Issues log: Yet to fix solder and fully finish soldering to a centralizedf power distribution Finding name? please suggest Need to fix URDF having no joints for some reason thanks for reading pookies
Bill of Materials updated(for a single leg) may still contain some mistakes. Hi guys! This is my mini devlog starting to do more with the simulation Change log: Changed 3d model to be much more simplified to reduce computing power and get rid of texture issue from last time Uploaded and ran the physics ragdoll in the simulation and added collision tags to the URDF so everything would collide with the ground Use onshape-urdf tool to make more detailed changes to the joints, and add joint limits to the robot to maybe fix joint breakage. Issues log: For some reason the joints keep breaking in the simulation where it detaches from the original point after an impact into the ground for example
Finally… Parallel simulation without crazy bugs! Hi guys! This is my full devlog starting to do even more interesting software #9 Starting to get busier with school unfortunately but made a huge breakthrough recently Its fine though after senioritis hits I will lock tf in on this Change log: Previously there was an issue where the imported URDF would fall through the floor. This was caused by missing tags in the URDF file for each part. To fix it meant to add it into every part MANUALLY which sucks. Another issue with the URDF format was that the parallel linkage system for the knees was unsupported and required a TON of tweaks that I didn’t want to do. So upon further research I found that Genesis World also supported MJCF(MuJuCo’s format) and that it supported the parallel linkage with minor tweaking mainly involving renaming LOTS of joints and changing the config.json file for onshape-to-robot tool a lot. Edited config file and original CAD file to include where the imu is so the simulation would know as well as motor power, weight, and friction to ensure sim to real isn’t too hard to implement, this may require further tuning down the line. Created simple schematic for all electrically connected components. Imported to Genesis World and was able to position control each joint, one step closer to training it. Was able to get a parallel simulation running on amdgpu Had claude patch up my xml file since it had floating geometry for some reason and I ran out of onshape API tokens so I couldn’t convert anymore
Reinforcement Learning is way harder than I thought… been reading tensor graphs for the past 10 hours and closely monitoring the training program and adjusting every single variable. There seems to be a constant issue of the model “cheating” the system by finding some way to minimize penalty while still getting some reward and it’s leading to very undesirable behavior such as crossing its legs. will do more research on this and try to improve the PPO algo
OMG I’M SOO HAPPY IT FINALLY WALKS(in simulation) so basically a few days ago I started training with a faulty model but I locked in and spent a few hours fixing it and reuploading. I also tuned the reward gains and removed some rewards I felt were too complex. I took inspiration from the setup for the learning on the Unitree Go2 and their reward system and it seems to learn super fast, walking behavior exhibted by iteration 200-300, I’ll train the model overnight to see what it comes up with. I’m super happy how this turned out. full in depth devlog will be posted later when I have time....
|
1793487125.9432697
|
1794091925.9432697
|
|
59595
|
Minimalist Blare by @ana_v_zanattab | Stardance
|
ana_v_zanattab
|
0
|
2.38
|
0
|
[]
|
[{"post_id": 65711, "ts": "202 [{"post_id": 65711, "ts": "2026-09-11T01:31:23Z", "hours": 2.3778, "text": "Designing my first PCB ever for my Minimalist Blare :)"}]...
|
Title: Minimalist Blare by @ana_v_zanattab | Stard Title: Minimalist Blare by @ana_v_zanattab | Stardance
Devlogs:
Designing my first PCB ever for my Minimalist Blare :)...
|
1792806547.5827603
|
1793411347.5827603
|
|
54437
|
George's Attire Website by @GeorgeSun | Starda George's Attire Website by @GeorgeSun | Stardance...
|
GeorgeSun
|
1
|
6.69
|
43
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T22:58:36Z", "hours": 6.0, "multiplier": 6.52, "payout": 43, "blessing": "neutral", "text": "I made a website for George’s Attire, my own small business that makes custom apparel for individuals, teams, businesses, and organizations in Canada. The most challenging part of making this website was adding integrations for Stripe and Supabase to make payments and track orders. I am most proud of the flow of the website and how easy it is to order as previously my business ran on a google form. I am very happy about this website and it also has it’s own custom domain. You can come look at the website by clicking try project below!", "repo": "https://github.com/Geofoods/George-s-Attire", "demo": "https://www.georgesattire.works/"}]...
|
[{"post_id": 65713, "ts": "202 [{"post_id": 65713, "ts": "2026-09-11T01:46:20Z", "hours": 0.6858, "text": "I rewrote the CSS to make the UI feel more similiar to the logo matching the black and white theme"}, {"post_id": 64486, "ts": "2026-09-08T22:18:02Z", "hours": 0.2961, "text": "I added a small polishing page animation that fades in the elements when you go to a page"}, {"post_id": 61897, "ts": "2026-09-05T02:02:46Z", "hours": 2.0819, "text": "I made the overall UI look better and fixed the stripe UI so that you can make payments"}, {"post_id": 58974, "ts": "2026-08-31T15:29:36Z", "hours": 3.2075, "text": "I made the design of the website matching the black and white theme and added some images all across the page. I also added functionality to choose positioning and scaling of your designs. I got a custom domain to put my page on as well"}]...
|
Title: George's Attire Website by @GeorgeSun | Title: George's Attire Website by @GeorgeSun | Stardance
Devlogs:
I made the design of the website matching the black and white theme and added some images all across the page. I also added functionality to choose positioning and scaling of your designs. I got a custom domain to put my page on as well
I made the overall UI look better and fixed the stripe UI so that you can make payments
I added a small polishing page animation that fades in the elements when you go to a page
I rewrote the CSS to make the UI feel more similiar to the logo matching the black and white theme
Ships:
I made a website for George’s Attire, my own small business that makes custom apparel for individuals, teams, businesses, and organizations in Canada. The most challenging part of making this website was adding integrations for Stripe and Supabase to make payments and track orders. I am most proud of the flow of the website and how easy it is to order as previously my business ran on a google form. I am very happy about this website and it also has it’s own custom domain. You can come look at the website by clicking try project below!...
|
1793537375.5987122
|
1793623775.5987122
|