Render Blocking
thedaviddias/Front-End-Checklist
A skill your agent uses when auditing slow page loads, heavy assets, or rendering delays related to Eliminate render-blocking resources.
Show results as interactive UI inside Codeg's chat (cards, tables, tabs, accordions, badges, progress bars, simple forms) by writing a json-render spec code block in your reply.
$ npx skills add spacering-net/codeg --skill json-render -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install spacering-net/codeg json-render --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/spacering-net/codeg.git skills-src && mkdir -p .claude/skills && cp -r skills-src/src-tauri/genui/json-render .claude/skills/json-render && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "json-render" agent skill from https://github.com/spacering-net/codeg/tree/main/src-tauri/genui/json-render into .claude/skills/json-render/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "json-render", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/spacering-net/codeg/tree/main/src-tauri/genui/json-renderType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add spacering-net/codeg --skill json-render -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install spacering-net/codeg json-render --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/spacering-net/codeg.git skills-src && mkdir -p .agents/skills && cp -r skills-src/src-tauri/genui/json-render .agents/skills/json-render && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "json-render" agent skill from https://github.com/spacering-net/codeg/tree/main/src-tauri/genui/json-render into .agents/skills/json-render/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "json-render", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add spacering-net/codeg --skill json-render -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install spacering-net/codeg json-render --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/spacering-net/codeg.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/src-tauri/genui/json-render .cursor/skills/json-render && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "json-render" agent skill from https://github.com/spacering-net/codeg/tree/main/src-tauri/genui/json-render into .cursor/skills/json-render/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "json-render", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/spacering-net/codeg.git --path src-tauri/genui/json-render--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add spacering-net/codeg --skill json-render -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install spacering-net/codeg json-render --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/spacering-net/codeg.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/src-tauri/genui/json-render .gemini/skills/json-render && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "json-render" agent skill from https://github.com/spacering-net/codeg/tree/main/src-tauri/genui/json-render into .gemini/skills/json-render/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "json-render", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install spacering-net/codeg json-renderInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add spacering-net/codeg --skill json-render -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/spacering-net/codeg.git skills-src && mkdir -p .github/skills && cp -r skills-src/src-tauri/genui/json-render .github/skills/json-render && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "json-render" agent skill from https://github.com/spacering-net/codeg/tree/main/src-tauri/genui/json-render into .github/skills/json-render/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "json-render", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add spacering-net/codeg --skill json-render -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install spacering-net/codeg json-render --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/spacering-net/codeg.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/src-tauri/genui/json-render .opencode/skills/json-render && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "json-render" agent skill from https://github.com/spacering-net/codeg/tree/main/src-tauri/genui/json-render into .opencode/skills/json-render/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "json-render", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
json-renderShow results as interactive UI inside Codeg's chat (cards, tables, tabs, accordions, badges, progress bars, simple forms) by writing a json-render spec code block in your reply.
JSON Render is an agent skill from spacering-net/codeg. Show results as interactive UI inside Codeg's chat (cards, tables, tabs, accordions, badges, progress bars, simple forms) by writing a json-render spec code block in your reply. Use when the user invokes this skill or asks to see something as a card, table, dashboard or other visual layout in Codeg.
Its SKILL.md is about 6.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
The repository describes itself as: Collaborative multi-agent AI coding workspace: aggregate sessions from Claude Code, Codex, OpenCode, Pi, Grok Build, etc. Desktop app, self-hosted server, or Docker. The licence is Apache-2.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 05905cc. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are spec).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
JSON Render loads about 6.3k tokens when it runs. Until then it costs about 78 tokens; SKILL.md has 3,123 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from spacering-net/codeg at commit 05905cc, republished under its Apache-2.0 licence (© spacering-net). 3,123 words, ~6,297 tokens.
.claude/skills/json-render/SKILL.md (or your agent's skills folder).Codeg renders a ```spec code block in your reply as interactive UI inside the chat. Write the block directly in your reply message, never into a file. Use it when a visual layout genuinely helps (comparisons, status or progress summaries, structured results, checklists); answer in plain Markdown otherwise. The format reference follows.
OUTPUT FORMAT (text + JSONL, RFC 6902 JSON Patch):
You respond conversationally. When generating UI, first write a brief explanation (1-3 sentences), then output JSONL patch lines wrapped in a spec code fence. The JSONL lines use RFC 6902 JSON Patch operations to build a UI tree. Always wrap them in a spec fence block:
{"op":"add","path":"/root","value":"main"}
{"op":"add","path":"/elements/main","value":{"type":"Card","props":{"title":"Hello"},"children":[]}}If the user's message does not require a UI (e.g. a greeting or clarifying question), respond with text only — no JSONL. Each line is a JSON patch operation (add, remove, replace). Start with /root, then stream /elements and /state patches interleaved so the UI fills in progressively as it streams.
Example output (each line is a separate JSON object):
{"op":"add","path":"/root","value":"main"} {"op":"add","path":"/elements/main","value":{"type":"Card","props":{"title":"Overview","description":"Your account summary"},"children":["child-1","list"]}} {"op":"add","path":"/elements/child-1","value":{"type":"Stack","props":{"direction":"vertical","gap":"md"},"children":[]}} {"op":"add","path":"/elements/list","value":{"type":"Card","props":{"title":"Overview","description":"Your account summary"},"repeat":{"statePath":"/items","key":"id"},"children":["item"]}} {"op":"add","path":"/elements/item","value":{"type":"Stack","props":{"direction":"vertical","gap":"md"},"children":[]}} {"op":"add","path":"/state/items","value":[]} {"op":"add","path":"/state/items/0","value":{"id":"1","title":"First Item"}} {"op":"add","path":"/state/items/1","value":{"id":"2","title":"Second Item"}}
Note: state patches appear right after the elements that use them, so the UI fills in as it streams. ONLY use component types from the AVAILABLE COMPONENTS list below.
INITIAL STATE: Specs include a /state field to seed the state model. Components with { $bindState } or { $bindItem } read from and write to this state, and $state expressions read from it. CRITICAL: You MUST include state patches whenever your UI displays data via $state, $bindState, $bindItem, $item, or $index expressions, or uses repeat to iterate over arrays. Without state, these references resolve to nothing and repeat lists render zero items. Output state patches right after the elements that reference them, so the UI fills in progressively as it streams. Stream state progressively - output one patch per array item instead of one giant blob: For arrays: {"op":"add","path":"/state/posts/0","value":{"id":"1","title":"First Post",...}} then /state/posts/1, /state/posts/2, etc. For scalars: {"op":"add","path":"/state/newTodoText","value":""} Initialize the array first if needed: {"op":"add","path":"/state/posts","value":[]} When content comes from the state model, use { "$state": "/some/path" } dynamic props to display it instead of hardcoding the same value in both state and props. The state model is the single source of truth. Include realistic sample data in state. For blogs: 3-4 posts with titles, excerpts, authors, dates. For product lists: 3-5 items with names, prices, descriptions. Never leave arrays empty.
DYNAMIC LISTS (repeat field): Any element can have a top-level "repeat" field to render its children once per item in a state array: { "repeat": { "statePath": "/arrayPath", "key": "id" } }. The element itself renders once (as the container), and its children are expanded once per array item. "statePath" is the state array path. "key" is an optional field name on each item for stable React keys. For nested lists, an inner repeat can read an array from the enclosing item with { "statePath": { "$item": "field" } }. This form is valid only inside another repeat. Use an empty field to repeat over the enclosing item itself. Example: {"type":"Card","props":{"title":"Overview","description":"Your account summary"},"repeat":{"statePath":"/todos","key":"id"},"children":["todo-item"]} Inside children of a repeated element, use { "$item": "field" } to read a field from the current item, and { "$index": true } to get the current array index. For two-way binding to an item field use { "$bindItem": "completed" } on the appropriate prop. ALWAYS use the repeat field for lists backed by state arrays. NEVER hardcode individual elements for each array item. IMPORTANT: "repeat" is a top-level field on the element (sibling of type/props/children), NOT inside props.
ARRAY STATE ACTIONS: Use action "pushState" to append items to arrays. Params: { statePath: "/arrayPath", value: { ...item }, clearStatePath: "/inputPath" }. Values inside pushState can contain { "$state": "/statePath" } references to read current state (e.g. the text from an input field). Use "$id" inside a pushState value to auto-generate a unique ID. Example: on: { "press": { "action": "pushState", "params": { "statePath": "/todos", "value": { "id": "$id", "title": { "$state": "/newTodoText" }, "completed": false }, "clearStatePath": "/newTodoText" } } } Use action "removeState" to remove items from arrays by index. Params: { statePath: "/arrayPath", index: N }. Inside a repeated element's children, use { "$index": true } for the current item index. Action params support the same expressions as props: { "$item": "field" } resolves to the absolute state path, { "$index": true } resolves to the index number, and { "$state": "/path" } reads a value from state. For lists where users can add/remove items (todos, carts, etc.), use pushState and removeState instead of hardcoding with setState.
IMPORTANT: State paths use RFC 6901 JSON Pointer syntax (e.g. "/todos/0/title"). Do NOT use JavaScript-style dot notation (e.g. "/todos.length" is WRONG). To generate unique IDs for new items, use "$id" instead of trying to read array length.
AVAILABLE COMPONENTS (36):
<string>, rows: Array<Array<string>>, caption?: string } - Data table. columns: header labels. rows: 2D array of cell strings, e.g. [["Alice","admin"],["Bob","user"]].<string>, placeholder?: string, value?: string, checks?: Array<{ type: string, message: string, args?: Record<string, unknown> }>, validateOn?: "change" | "blur" | "submit" } - Dropdown select input. Use { $bindState } on value for binding. Use checks for validation. validateOn controls timing (default: change). [events: change]<string>, value?: string, checks?: Array<{ type: string, message: string, args?: Record<string, unknown> }>, validateOn?: "change" | "blur" | "submit" } - Radio button group. Use { $bindState } on value for binding. Use checks for validation. validateOn controls timing (default: change). [events: change]AVAILABLE ACTIONS:
EVENTS (the on field):
Elements can have an optional on field to bind events to actions. The on field is a top-level field on the element (sibling of type/props/children), NOT inside props.
Each key in on is an event name (from the component's supported events), and the value is an action binding: { "action": "<actionName>", "params": { ... } }.
Example: {"type":"Card","props":{"title":"Overview","description":"Your account summary"},"on":{"press":{"action":"setState","params":{"statePath":"/saved","value":true}}},"children":[]}
Action params can use dynamic references to read from state: { "$state": "/statePath" }.
IMPORTANT: Do NOT put action/actionParams inside props. Always use the on field for event bindings.
VISIBILITY CONDITIONS:
Elements can have an optional visible field to conditionally show/hide based on state. IMPORTANT: visible is a top-level field on the element object (sibling of type/props/children), NOT inside props.
Correct: {"type":"Card","props":{"title":"Overview","description":"Your account summary"},"visible":{"$state":"/activeTab","eq":"home"},"children":["..."]}
{ "$state": "/path" } - visible when state at path is truthy{ "$state": "/path", "not": true } - visible when state at path is falsy{ "$state": "/path", "eq": "value" } - visible when state equals value{ "$state": "/path", "neq": "value" } - visible when state does not equal value{ "$state": "/path", "gt": N } / gte / lt / lte - numeric comparisons"not": true to invert its result[condition, condition] - all conditions must be true (implicit AND){ "$and": [condition, condition] } - explicit AND (use when nesting inside $or){ "$or": [condition, condition] } - at least one must be true (OR)true / false - always visible/hiddenUse a component with on.press bound to setState to update state and drive visibility. Example: A Card with on: { "press": { "action": "setState", "params": { "statePath": "/activeTab", "value": "home" } } } sets state, then a container with visible: { "$state": "/activeTab", "eq": "home" } shows only when that tab is active.
For tab patterns where the first/default tab should be visible when no tab is selected yet, use $or to handle both cases: visible: { "$or": [{ "$state": "/activeTab", "eq": "home" }, { "$state": "/activeTab", "not": true }] }. This ensures the first tab is visible both when explicitly selected AND when /activeTab is not yet set.
DYNAMIC PROPS: Any prop value can be a dynamic expression that resolves based on state. Three forms are supported:
Read-only state: { "$state": "/statePath" } - resolves to the value at that state path (one-way read).
Example: "color": { "$state": "/theme/primary" } reads the color from state.
Two-way binding: { "$bindState": "/statePath" } - resolves to the value at the state path AND enables write-back. Use on form input props (value, checked, pressed, etc.).
Example: "value": { "$bindState": "/form/email" } binds the input value to /form/email.
Inside repeat scopes: "checked": { "$bindItem": "completed" } binds to the current item's completed field.
Conditional: { "$cond": <condition>, "$then": <value>, "$else": <value> } - evaluates the condition (same syntax as visibility conditions) and picks the matching value.
Example: "color": { "$cond": { "$state": "/activeTab", "eq": "home" }, "$then": "#007AFF", "$else": "#8E8E93" }
Use $bindState for form inputs (text fields, checkboxes, selects, sliders, etc.) and $state for read-only data display. Inside repeat scopes, use $bindItem for form inputs bound to the current item. Use dynamic props instead of duplicating elements with opposing visible conditions when only prop values differ.
{ "$template": "Hello, ${/name}!" } - interpolates references in the string. Absolute paths like ${/path} resolve against the state model. Bare names like ${field} resolve against the current repeat item first, then fall back to the state model at /<field>.
Example: "label": { "$template": "Items: ${/cart/count} | Total: ${/cart/total}" } renders "Items: 3 | Total: 42.00" when /cart/count is 3 and /cart/total is 42.00. Inside a repeat, { "$template": "${name} - ${email}" } reads name and email from each item.VALIDATION:
Form components that accept a checks prop support client-side validation.
Each check is an object: { "type": "<name>", "message": "...", "args": { ... } }
Built-in validation types:
Example: "checks": [{ "type": "required", "message": "Email is required" }, { "type": "email", "message": "Invalid email" }]
IMPORTANT: When using checks, the component must also have a { $bindState } or { $bindItem } on its value/checked prop for two-way binding. Always include validation checks on form inputs for a good user experience (e.g. required, email, minLength).
STATE WATCHERS:
Elements can have an optional watch field to react to state changes and trigger actions. The watch field is a top-level field on the element (sibling of type/props/children), NOT inside props.
Maps state paths (JSON Pointers) to action bindings. When the value at a watched path changes, the bound actions fire automatically.
Example (cascading select — country changes trigger city loading): {"type":"Select","props":{"value":{"$bindState":"/form/country"},"options":["US","Canada","UK"]},"watch":{"/form/country":{"action":"loadCities","params":{"country":{"$state":"/form/country"}}}},"children":[]}
Use watch for cascading dependencies where changing one field should trigger side effects (loading data, resetting dependent fields, computing derived values).
IMPORTANT: watch is a top-level field on the element (sibling of type/props/children), NOT inside props. Watchers only fire when the value changes, not on initial render.
RULES:
<root-key>"}<key>","value":{...}}<ComponentName>","props":{},"visible":{"$state":"/tab","eq":"home"},"children":[...]}.<ContainerComponent>", "props": {}, "repeat": { "statePath": "/posts", "key": "id" }, "children": ["post-card"] }. For a nested list stored on the enclosing item, use "repeat": { "statePath": { "$item": "comments" }, "key": "id" }. The $item statePath form is valid only inside another repeat. Replace <ContainerComponent> with an appropriate component from the AVAILABLE COMPONENTS list. Inside repeated children, use { "$item": "field" } to read a field from the current item, and { "$index": true } for the current array index. For two-way binding to an item field use { "$bindItem": "completed" }. Do NOT hardcode individual elements for each array item.© spacering-net, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in src-tauri/genui/json-render of spacering-net/codeg.
Open the folder on GitHubat commit 05905cc
JSON Render next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| JSON Render this skillspacering-net/codeg | 3.9k | — | ~6.3k | Automated safety check: Pass | Apache-2.0 | |
| Render Blockingthedaviddias/Front-End-Checklist | 74k | — | ~430 | Automated safety check: Pass | MIT | |
| Interaction To Next Paintthedaviddias/Front-End-Checklist | 74k | — | ~441 | Automated safety check: Pass | MIT | |
| RenderLeoYeAI/openclaw-master-skills | 2.2k | — | ~4.8k | Automated safety check: Pass | MIT | |
| Remotion Interactivityremotion-dev/remotion | 63k | 5 repos | ~4.8k | Automated safety check: Pass | Custom licence | |
| Firecrawl Interact Integrationfirecrawl/firecrawl | 190k | 1 repos | ~731 | Automated safety check: Pass | ISC |
thedaviddias/Front-End-Checklist
A skill your agent uses when auditing slow page loads, heavy assets, or rendering delays related to Eliminate render-blocking resources.
thedaviddias/Front-End-Checklist
A skill your agent uses when auditing slow page loads, heavy assets, or rendering delays related to Optimize interaction to next paint.
LeoYeAI/openclaw-master-skills
Deploy and operate apps on Render (Blueprint + one-click Dashboard deeplink, same flow as Codex render-deploy).
remotion-dev/remotion
Structure Remotion markup for interactivity. An agent skill from remotion-dev/remotion.
firecrawl/firecrawl
Guides adding Firecrawl's /interact endpoint to product code for pages that need clicks, forms, pagination or logged-in flows beyond plain scraping.
sickn33/agentic-awesome-skills
Open Markdown reliably in cmux panes and recover from blank rendered surfaces.
spacering-net/codeg
Perform comprehensive exploratory data analysis on scientific data files across 200+ file formats.
spacering-net/codeg
Structured hypothesis formulation from observations. An agent skill from spacering-net/codeg.
spacering-net/codeg
Structured manuscript/grant review with checklist-based evaluation.
spacering-net/codeg
Guided statistical analysis for research data - test selection, assumption checking, effect sizes, power analysis, Bayesian alternatives, and APA-formatted reporting.
spacering-net/codeg
Systematically evaluate scholarly work using the ScholarEval framework, providing structured assessment across research quality dimensions including problem formulation, methodology, analysis, and…
spacering-net/codeg
Create publication-quality scientific diagrams using Nano Banana 2 AI with smart iterative refinement.
Show results as interactive UI inside Codeg's chat (cards, tables, tabs, accordions, badges, progress bars, simple forms) by writing a json-render spec code block in your reply. JSON Render is an agent skill from spacering-net/codeg. Show results as interactive UI inside Codeg's chat (cards, tables, tabs, accordions, badges, progress bars, simple forms) by writing a json-render spec code block in your reply.
JSON Render fits situations like: the user invokes this skill; asks to see something as a card; other visual layout in Codeg.
Run `npx skills add spacering-net/codeg --skill json-render -a claude-code`. Or copy the skill folder (src-tauri/genui/json-render in spacering-net/codeg) into .claude/skills/json-render in your project. Claude Code loads it when a task matches its description.
Run `npx skills add spacering-net/codeg --skill json-render -a codex`. Or copy the skill folder (src-tauri/genui/json-render in spacering-net/codeg) into .agents/skills/json-render in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add spacering-net/codeg --skill json-render -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/json-render, .gemini/skills/json-render, .github/skills/json-render and .opencode/skills/json-render in your project.
SKILL.md names no scripts, command-line tools or credentials: JSON Render is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
JSON Render is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.3k tokens (SKILL.md is roughly 25k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with JSON Render: Render Blocking (thedaviddias/Front-End-Checklist, 74k stars), Interaction To Next Paint (thedaviddias/Front-End-Checklist, 74k stars), Render (LeoYeAI/openclaw-master-skills, 2.2k stars) and Remotion Interactivity (remotion-dev/remotion, 63k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
spacering-net (a GitHub organization) maintains it in spacering-net/codeg, which has 3,874 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 10, 2026.
Source: spacering-net/codeg on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.