RPGJS Studio API Skill
Use this skill to execute content-management tasks against an RPGJS Studio instance.
Inputs
- Check whether a local
RPGSTUDIO.mdfile exists in the current working directory. - If
RPGSTUDIO.mdexists, treat it as local project context and read it first. - Use it to recover persistent values such as:
BASE_URL- any other project-specific instructions relevant to API usage
- Do not recover, request, or persist a
projectId. The API key is scoped to the RPGJS Studio project, so work directly on the user's requested resource. - If
RPGSTUDIO.mddoes not exist, continue normally. - Resolve
BASE_URLfrom the user if provided. - Default
BASE_URLtohttps://rpgjs.studiowhen the user did not specify another host. - Read the API key from the environment variable
RPGSTUDIO_API_KEY.
Mandatory startup workflow
- Check whether
RPGSTUDIO_API_KEYexists before any API call. - When checking
RPGSTUDIO_API_KEY, never print its value in the terminal and never echo it back in the response. - If the variable is missing or empty, stop and tell the user to create an API key first on
${BASE_URL}/api-keys, then exportRPGSTUDIO_API_KEY. - Build authenticated requests with these headers:
-H "x-api-key:$RPGSTUDIO_API_KEY"
-H "Content-Type: application/json"
- Prefer
curlfor HTTP calls. Use another HTTP client only if there is a clear reason. - Fail fast on authentication errors. If the API returns an invalid-key style response,
401, or403, stop the task and tell the user to verify the key or contact support. - Read only the reference file that matches the user task:
references/database.mdreferences/maps.mdreferences/events.mdreferences/event-examples.mdreferences/blocks.mdreferences/media.mdreferences/settings.md
Local memory file
Use RPGSTUDIO.md as a lightweight local memory file for the current project.
- Read it at the start if it exists.
- Reuse values already stored there instead of asking again.
- After the task, update or create it with stable, non-secret context discovered during execution.
Typical contents:
- last used
BASE_URL - project-specific conventions or notes useful for future calls
Do not use RPGSTUDIO.md to select a project. The current RPGSTUDIO_API_KEY already identifies the target project, so proceed directly with the user's request.
Never store secrets in this file.
- Do not store
RPGSTUDIO_API_KEY. - Do not print
RPGSTUDIO_API_KEY. - Do not copy raw secret values into logs, terminal output, or markdown.
Request pattern
Define the base command once and reuse it:
BASE_URL="${BASE_URL:-https://rpgjs.studio}"
curl -sS \
-H "x-api-key:$RPGSTUDIO_API_KEY" \
-H "Content-Type: application/json"
For write operations, prefer:
curl -sS -X POST "$BASE_URL/..." \
-H "x-api-key:$RPGSTUDIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{...}'
Execution rules
- Start by identifying the resource domain, then load the matching reference file.
- Use REST semantics:
GET,POST,PUT,DELETE. - Resolve foreign keys before creation or update:
- Search media with
/api/media?query=<search>. - Search database records with
/api/database/:type?query=<search>. - If a matching dependency exists, reuse its returned
_id. - If not found, create it first, then continue with the returned
_id.
- Search media with
- Never call a project listing endpoint just to choose a project. The API key determines the project context.
- When the user asks to create game objects, send the smallest valid payload first, then enrich it only if the task requires more fields.
- Reuse IDs returned by the API instead of guessing them.
- When the user provides a database
_idfor a read, update, or delete task, callGET /api/database/:type/:idfirst and inspect the existing record before deciding the payload or reporting the content. - If an endpoint shape is uncertain, inspect the response from a nearby
GETendpoint first and adapt from that live payload. - Do not continue after an auth failure.
- If a missing dependency would require AI media generation, always call the unified media generation endpoint with
action: "estimate"first. - After the estimate, report the required credits to the user and ask for confirmation before calling
action: "execute". - Never start an AI media generation directly without this estimate and confirmation step.
- For
POST /api/maps/generate, rely onreferences/maps.mdfor the AI map generation workflow and endpoint-specific failure behavior. - Summarize the exact records created, updated, or deleted in the final response.
- When a task reveals stable project context such as
BASE_URLor local conventions, persist that non-secret context intoRPGSTUDIO.mdfor future runs.
Common checks
databasetask: read references/database.mdmaptask: read references/maps.mdeventtask: read references/events.mdevent exampletask: read references/event-examples.mdevent workflow blocktask: read references/blocks.mdmediatask: read references/media.mdsettingstask: read references/settings.md
Current schema notes
- Maps may expose a shader terrain
terrainLayerobject withversion: 1,mode: "control-texture", pixelwidth/height,tileSize,palette, andcontrolTexturemetadata. The control texture is RGBA8; terrain palette index is encoded asR + G * 256, optional light usesBwith128as neutral, andAstores terrain mask coverage for pixel brush strokes. Soft edges are computed from transition/blend metadata at render time. Legacy tile grids are normalized intotileSize x tileSizeblocks, but brush edits can update individual world pixels in the control texture. - Maps may expose a terrain morphology
terrainMorphologyLayerobject withversion: 1,mode: "terrain-morphology", pixelwidth/height,tileSize, andfeatures[]. Each feature is either{ kind: "hole", params, strokes }or{ kind: "wall", params, strokes }; strokes store world-pixelpoints[]andradius. Hole params supportdepth,roundness,roughness, optional facadetextureId, optional bottom-fillfillTextureId, andfillHeightclamped to0..100;textureIdis not used as the bottom-fill fallback. Wall params supportheight,roundness,roughness, and optional facadetextureId; the editor's wall smoothness control maps toroughness = 1 - smoothness. The brush tool modifies the terrain surface; hole/wall tools use the selected terrain texture as the vertical facade while the top surface remains the already-painted base terrain. The renderer merges hole/wall masks as signed terrain levels before drawing, so overlapping strokes are clipped or neutralized instead of being rendered as independent overlays. The editor renders morphology after the base terrain control texture and merges morphology strokes into terrain collision as blocking cells. PUT /api/maps/:mapIdsupports partial section updates. Omitted map fields are preserved, so prefer sending only changed sections:startX/startYfor start position,eventsfor placements,terrainMorphologyLayerfor morphology, terrain fields for terrain/control texture, element layer arrays for objects, and tileset params for media selection.- Maps may expose top-level lighting settings as
lighting: { sun: { enabled: boolean, intensity: number } }. The sun intensity is clamped to0..1; when enabled, runtime/editor integrations can use it to display automatic shadows for walls, characters, and elements. - Terrain media metadata exposes
sourceTexture, directrowsandcolumns,textureGrid: { columns, rows, tileSize? },terrainTextures[], andtransitions[]. EachterrainTextures[]entry is{ id, index, label, collision?, renderTileSize?, defaultRenderMode? };indexis the atlas-cell source of truth,collisionmarks painted map cells as blocking, andrenderTileSizecontrols the repeated texture size in map-editor world pixels, defaulting to the legacy320pattern size when absent.defaultRenderModesupportshard,fade,water, andcustom:hardis crisp,fadeuseswidth, the UIgrass edgepreset is stored asfadewithwidth: 12andcurve: "sharp"and renders as a grass fringe,wateris the stored generic liquid mode and keeps the atlas texture while deriving clipped tint, shoreline depth, static ripples, and edge glints from the atlas cell color so lava/swamp/acid/oil do not get a fixed blue outline, and unknowncustommodes fall back to an edge highlight unless theirshaderKeyis liquid-like.transitions[]stores exception rules{ from, to, mode, priority? }between terrain ids; it is not a generated Wang transition matrix. Studio terrain generation defaults to a4x4source texture atlas in the UI and persists the generated atlas directly; it no longer creates Wang/autotile output through the image-processing container. Generation requests can setmetadata.sourceTextureColumnsandmetadata.sourceTextureRows; Studio also sendsterrainAtlasColumns,terrainAtlasRows,terrainStyleId, andterrainStylePromptso the server prompt can build a shader-friendly seamless material atlas. Element set (tileset) generation can passmetadata.terrainReferenceImageandmetadata.terrainReferenceMediaIdto use an existing terrain image as a style-compatibility guide; the image data is execution-only and should not be persisted. - Project settings and database enemies both support combat animation spritesheet media IDs under
animations:attack,hurt,die, andcastSpell. - The RPGJS starter runtime uses these spritesheets in action battle: attack actions, damage/hurt feedback, delayed death removal, and skill/cast usage can temporarily switch to the configured spritesheet.
- Database enemies support action battle AI options under
behavior:enemyType,attackCooldown,visionRange,attackRange,dodgeChance,dodgeCooldown,fleeThreshold,attackPatterns,patrolWaypoints, andgroupBehavior. - Project settings and database enemies both support level-gated skill acquisition under
skills:{ skillId, level }. - Database skills support media IDs under
icon,animation, andsound. - Game/runtime code can read media data usable in the game with
GET /api/game/media/:mediaId; usereferences/media.mdfor details. - Media type changes should use
PUT /api/media/update/:mediaIdinstead of the metadata-only admin endpoint; this synchronizesmetadata.typewith the roottypefield. - Game map responses from
GET /api/game/maps/:mapIdhydrate eventparams.graphic,params.faceset,triggers[].graphic, andtriggers[].facesetas media objects when possible; usereferences/maps.mdfor the runtime response shape.
Source: RSamaium/RPG-JS — distributed by TomeVault.