GDAM
A package manager for Godot addons. Keep exact Release tags in one manifest and local development paths in their own file.
gdam init
gdam add @aviorstudio/gd-router
gdam installTHE STUDIO WORKBENCH
Tools that grew out of the games. Install the addons, check the scripts, and get back to the part you came to build.
A package manager for Godot addons. Keep exact Release tags in one manifest and local development paths in their own file.
gdam init
gdam add @aviorstudio/gd-router
gdam installCheck debug prints, stray pass statements, orphaned UIDs and indentation. Enable deeper checks when your project needs them.
gdlint init
gdlint
review before using -fix03 / ORIGINAL GAME ART
Spritesmith authors vector artwork in Python and exports it for the games. Its SVG export brings the same shapes to the web, at any size.
The Castle Drop dragon and Prizm crystal here are original frames from their game art.
GODOT 4 / MIT
Small addons, each with one job. Explore the source or find them on the GDAM registry.
Open the registry ↗Music and pooled sound effects
One GdAudio autoload: configure a looping music stream with fades and a persisted volume, register named samples, then play_sfx("click"). Effects play out of a player pool you size. Volume is written to a config file you name, so the settings UI stays in the game.
Environment and config loading
Typed OS environment lookups with defaults, .env parsing, and JSON config from a file or an HTTP endpoint. It deliberately does not decide which source wins when several are present. Client-side config is public either way, so nothing here is a place for secrets.
Pointer normalization and gestures
Mouse and touch collapse into one typed pointer stream, and a recognizer turns that into tap, double tap, long press, swipe, drag and pinch. Use the global autoload for one shared stream, or the two modules directly when a split-screen or editor scene needs its own thresholds.
HTTP, WebSocket and retry primitives
A callback JSON HTTP client that uses HTTPRequest natively and a JavaScriptBridge fetch bridge on web, plus a request pool, token-bucket rate limiting, deterministic retry backoff, ordered delta windows and a shared error catalog. Auth, sessions, matchmaking and reconnect policy are left to the game.
Object and node reuse
Acquire and return instances of any class instead of allocating per bullet, card or effect, with warm_pool to pre-allocate before gameplay and counters for created, reused, returned and disposed. Objects come back clean through a reset method or a callable you supply.
Local observability with a terminal dashboard
Timers, gauges and counters alongside logs, events and per-frame traces, all tagged with a context you push and pop. A localhost WebSocket server streams them live to a terminal UI. Metrics are in-memory and local — the point is to see the data before deciding whether any of it should leave the machine.
Ships gdobs, a Go terminal UINamed handles for web-export browser tests
The addon writes element positions, events and test state to browser globals during a web run; the CLI reads them over CDP so a test can click start_button instead of a coordinate. The CLI is strictly read-only — it never mutates browser or game state. Disabled builds no-op, so the calls are safe to leave in.
PocketBase auth and session primitives
Normalizes either a native {token, record} response or a backend proxy's {access_token, user} into one shape, then handles JWT expiry, persisted sessions and stable client IDs. Games keep HTTP transport and refresh policy; no superuser credential ever needs to reach the client.
A Redis client over RESP
SET with a TTL, GET, DEL, cursor-based scan_keys rather than KEYS, and both blocking and non-blocking connects — for tools, dedicated servers and local utilities. flushdb stays disabled until dangerous commands are explicitly enabled, and web exports cannot open raw TCP at all.
Layout that adapts to the viewport
Breakpoint classification, scale, margins and content width computed from a .tres config, plus layout, flex and grid nodes that run as @tool scripts so the result is visible while authoring rather than only at runtime. Take just the scale module if you already have containers of your own.
Editor-first screen routing
A GdRouter autoload owns the route table, params and history while a RouteHost node mounts the active screen under a persistent main scene. Routes auto-discover from *_screen/ folders while prototyping, or come from a committed route map so they are inspectable and reviewable in the editor.
Objects to dictionaries and back
Boundary conversion for saves, HTTP and WebSocket payloads and safe clones, with configurable class resolution, ignored properties and key normalization. It serializes script variables, not scene-tree state; cyclic graphs are unsupported, and reflection costs enough that it does not belong in a hot loop.
Supabase session helpers
JWT decoding and expiry checks, local session storage, and a stable client ID, without picking an auth UI or an HTTP client for you. It decodes tokens rather than verifying them, so refresh, revoke, encryption and server trust all stay deliberately on your side.
Event batching with no vendor attached
Build structured events — timestamp, level, context and subject IDs, message, metadata — queue them, and flush on a size or time threshold into whatever transport you already have. It picks no analytics vendor and opens no sockets, which is the entire design.