Add New Package
remotion-dev/remotion
Add a new package to the Remotion monorepo, including package scaffolding, monorepo registration, documentation, build scripts, and release checklist updates.
Create or update TypeScript NodeTool nodes, decorated properties, process methods, and node packages.
$ npx skills add nodetool-ai/nodetool --skill nodetool-custom-node-developer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install nodetool-ai/nodetool nodetool-custom-node-developer --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/nodetool-ai/nodetool.git skills-src && mkdir -p .claude/skills && cp -r skills-src/packages/system-skills/nodetool-custom-node-developer .claude/skills/nodetool-custom-node-developer && 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 "nodetool-custom-node-developer" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/nodetool-custom-node-developer into .claude/skills/nodetool-custom-node-developer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nodetool-custom-node-developer", 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/nodetool-ai/nodetool/tree/main/packages/system-skills/nodetool-custom-node-developerType 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 nodetool-ai/nodetool --skill nodetool-custom-node-developer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install nodetool-ai/nodetool nodetool-custom-node-developer --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nodetool-ai/nodetool.git skills-src && mkdir -p .agents/skills && cp -r skills-src/packages/system-skills/nodetool-custom-node-developer .agents/skills/nodetool-custom-node-developer && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "nodetool-custom-node-developer" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/nodetool-custom-node-developer into .agents/skills/nodetool-custom-node-developer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nodetool-custom-node-developer", 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 nodetool-ai/nodetool --skill nodetool-custom-node-developer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install nodetool-ai/nodetool nodetool-custom-node-developer --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nodetool-ai/nodetool.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/packages/system-skills/nodetool-custom-node-developer .cursor/skills/nodetool-custom-node-developer && 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 "nodetool-custom-node-developer" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/nodetool-custom-node-developer into .cursor/skills/nodetool-custom-node-developer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nodetool-custom-node-developer", 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/nodetool-ai/nodetool.git --path packages/system-skills/nodetool-custom-node-developer--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 nodetool-ai/nodetool --skill nodetool-custom-node-developer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install nodetool-ai/nodetool nodetool-custom-node-developer --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nodetool-ai/nodetool.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/packages/system-skills/nodetool-custom-node-developer .gemini/skills/nodetool-custom-node-developer && 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 "nodetool-custom-node-developer" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/nodetool-custom-node-developer into .gemini/skills/nodetool-custom-node-developer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nodetool-custom-node-developer", 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 nodetool-ai/nodetool nodetool-custom-node-developerInstalls 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 nodetool-ai/nodetool --skill nodetool-custom-node-developer -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/nodetool-ai/nodetool.git skills-src && mkdir -p .github/skills && cp -r skills-src/packages/system-skills/nodetool-custom-node-developer .github/skills/nodetool-custom-node-developer && 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 "nodetool-custom-node-developer" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/nodetool-custom-node-developer into .github/skills/nodetool-custom-node-developer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nodetool-custom-node-developer", 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 nodetool-ai/nodetool --skill nodetool-custom-node-developer -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install nodetool-ai/nodetool nodetool-custom-node-developer --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nodetool-ai/nodetool.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/packages/system-skills/nodetool-custom-node-developer .opencode/skills/nodetool-custom-node-developer && 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 "nodetool-custom-node-developer" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/nodetool-custom-node-developer into .opencode/skills/nodetool-custom-node-developer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nodetool-custom-node-developer", 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.
nodetool-custom-node-developerCreate or update TypeScript NodeTool nodes, decorated properties, process methods, and node packages.
Nodetool Custom Node Developer is an agent skill from nodetool-ai/nodetool. Create or update TypeScript NodeTool nodes, decorated properties, process methods, and node packages.
Its SKILL.md is about 2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Media & Creative. It works with TypeScript and npm. The repository describes itself as: Agent-first Creative Workspace. The licence is AGPL-3.0.
Read from SKILL.md and the folder at commit 515bd28. 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.
Shell commands in SKILL.md call:
npmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm, which can reach the network depending on how they are called.
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.
Nodetool Custom Node Developer loads about 2k tokens when it runs. Until then it costs about 33 tokens; SKILL.md has 387 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 nodetool-ai/nodetool at commit 515bd28, republished under its AGPL-3.0 licence (© nodetool-ai). 387 words, ~1,967 tokens.
.claude/skills/nodetool-custom-node-developer/SKILL.md (or your agent's skills folder).You are a NodeTool node developer. You create TypeScript nodes that extend BaseNode from @nodetool-ai/node-sdk.
my-nodes/
├── package.json # depends on @nodetool-ai/node-sdk
├── tsconfig.json # extends ../../tsconfig.base.json
├── src/
│ ├── index.ts # exports registration function + ALL_NODES array
│ └── nodes/
│ ├── category-a.ts # node classes
│ └── category-b.ts
└── tests/
└── nodes.test.tsimport { BaseNode, prop } from "@nodetool-ai/node-sdk";
export class MyNode extends BaseNode {
// REQUIRED static fields
static readonly nodeType = "mypack.category.NodeName"; // namespace.category.Name
static readonly title = "Human-Readable Title";
static readonly description = "Brief description.\n search, keywords, here";
static readonly metadataOutputTypes = { output: "str" }; // declare all outputs
// Inputs via @prop decorator
@prop({ type: "str", default: "", title: "Input Text" })
declare input_text: any;
@prop({ type: "int", default: 10, min: 1, max: 100, title: "Count" })
declare count: any;
// Process method — MUST return all keys from metadataOutputTypes
async process(): Promise<Record<string, unknown>> {
const text = String(this.input_text ?? "");
const count = Number(this.count ?? 10);
return { output: text.repeat(count) };
}
}Property values and connected input values are assigned to instance fields
before process() is called, so always read inputs from this:
const value = this.field ?? defaultValue;this.field — resolved value (connection value if connected, else the
user-set property, else the @prop default)defaultValue — extra in-code fallback for null/undefinedDo not declare a process(inputs: Record<string, unknown>) parameter — the
runtime calls process(context?: ProcessingContext), so an inputs parameter
typed that way fails strict type-checking.
| Option | Type | Notes |
|---|---|---|
type | string | Required: "int", "float", "str", "bool", "list[any]", "image", "audio", "video", "document", "dataframe", "enum", "any" |
default | unknown | Default value |
title | string | Display name in UI |
description | string | Tooltip text |
min / max | number | Numeric bounds |
required | boolean | Validation flag |
values | (string|number)[] | Enum options |
static readonly metadataOutputTypes = { text: "str", confidence: "float" };
async process(): Promise<Record<string, unknown>> {
return { text: "result", confidence: 0.95 }; // ALL keys must be returned
}static readonly isStreamingOutput = true;
static readonly metadataOutputTypes = { output: "str" };
async *genProcess(): AsyncGenerator<Record<string, unknown>> {
for (const item of items) {
yield { output: item };
}
}static readonly syncMode = "on_any"; // fires on each incoming value
@prop({ type: "any", title: "Item" })
declare item: unknown;
private collected: unknown[] = [];
async initialize(): Promise<void> {
this.collected = []; // reset per run
}
async process(): Promise<Record<string, unknown>> {
this.collected.push(this.item);
return { output: this.collected };
}@prop({ type: "enum", values: ["low", "medium", "high"], default: "medium", title: "Quality" })
declare quality: any;static readonly requiredSettings = ["MY_API_KEY"];
async process(): Promise<Record<string, unknown>> {
// Resolved secrets are available via the `_secrets` getter.
const apiKey = this._secrets.MY_API_KEY || process.env.MY_API_KEY;
if (!apiKey) throw new Error("MY_API_KEY not configured");
// use apiKey...
}@prop({ type: "image", title: "Input Image" })
declare image: { uri?: string; data?: string } | undefined;
async process(): Promise<Record<string, unknown>> {
const img = this.image;
if (!img) throw new Error("No image provided");
// img.data is base64, img.uri is a URL
const resultData = await processImage(img);
return { output: { type: "image", data: resultData } }; // return base64
}async initialize(): Promise<void> { } // once at start of run
async preProcess(): Promise<void> { } // before each process() call
async finalize(): Promise<void> { } // after all processingstatic readonly isDynamic = true; // dynamic schema
static readonly supportsDynamicOutputs = true;
static readonly isStreamingInput = true;
static readonly basicFields = ["prompt", "model"]; // shown first in UIThe fastest start is the scaffolder, which generates a self-contained pack
(package.json with the nodetool manifest field, tsconfig, an example node, a
test, and a README):
npm run create:pack -- @myorg/my-nodes # in the nodetool repo
# or directly: node scripts/create-pack.mjs @myorg/my-nodes ./my-nodes// src/index.ts
import type { NodeClass, NodeRegistry } from "@nodetool-ai/node-sdk";
import { MyNode, OtherNode } from "./nodes/my-nodes.js";
export const ALL_NODES: readonly NodeClass[] = [MyNode, OtherNode];
export function register(registry: NodeRegistry): void {
for (const nodeClass of ALL_NODES) {
registry.register(nodeClass);
}
}The server auto-loads packs — no need to edit its source. Mark the package as a
pack with a nodetool field in package.json, naming the export above:
{
"name": "@myorg/my-nodes",
"main": "dist/index.js",
"nodetool": { "apiVersion": 1, "register": "register" }
}On startup the server scans installed dependencies, imports any package with a
nodetool field, and calls the named export with the registry. Install the
built pack where the server can resolve it (npm install <pack>, or npm link
for local dev) and restart. The export may be sync or async.
Trust model. Custom nodes run in-process as the server user (full
filesystem/network/secret access, no sandbox), so loading is gated. In
development unlisted packs load automatically; in production
(NODETOOL_ENV=production) only packs on the allowlist
(NODETOOL_PACKS_ALLOWLIST or ~/.config/nodetool/packs.json) load. Packs also
cannot register under reserved namespaces (nodetool., lib., provider names)
or shadow an existing node type. Only install packs you trust.
import { describe, it, expect } from "vitest";
import { MyNode } from "../src/nodes/my-nodes.js";
describe("MyNode", () => {
it("processes input", async () => {
// Constructor assigns properties to instance fields.
const node = new MyNode({ input_text: "hello", count: 3 });
const result = await node.process();
expect(result.output).toBe("hellohellohello");
});
});metadataOutputTypes must appear in the return objectthis.field (assigned before process()); do not add an inputs parameter to process()namespace.category.Name with dots as separatorsinitialize()requiredSettings array for proper UI prompting© nodetool-ai, AGPL-3.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 packages/system-skills/nodetool-custom-node-developer of nodetool-ai/nodetool.
Open the folder on GitHubat commit 515bd28
Nodetool Custom Node Developer 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 |
|---|---|---|---|---|---|---|
| Nodetool Custom Node Developer this skillnodetool-ai/nodetool | 556 | — | ~2k | Automated safety check: Pass | AGPL-3.0 | |
| Add New Packageremotion-dev/remotion | 62k | — | ~777 | Automated safety check: Notes | Custom licence | |
| MCP Server BuildershareAI-lab/learn-claude-code | 78k | 5 repos | ~1.2k | Automated safety check: Pass | MIT | |
| Install Anti-Slop Oxlint Rulesdmmulroy/anti-slop | 5.3k | 1 repos | ~2.2k | Automated safety check: Pass | MIT | |
| Link Workspace Packagesnomcopter/react-mosaic | 4.8k | 6 repos | ~760 | Automated safety check: Pass | Custom licence | |
| Logseq Plugin SDKlogseq/logseq | 45k | — | ~2.3k | Automated safety check: Pass | AGPL-3.0 |
remotion-dev/remotion
Add a new package to the Remotion monorepo, including package scaffolding, monorepo registration, documentation, build scripts, and release checklist updates.
shareAI-lab/learn-claude-code
Walks through building MCP servers in Python or TypeScript that expose tools, resources and prompts to Claude, with templates, registration and testing.
dmmulroy/anti-slop
Installs, updates or migrates the vendored anti-slop Oxlint plugin in a repository, keeping local rule changes and the plugin's license and provenance files.
nomcopter/react-mosaic
Link workspace packages in monorepos (npm, yarn, pnpm, bun).
logseq/logseq
Build, debug, or review Logseq plugins with the @logseq/libs SDK (TypeScript/JavaScript, iframe/shadow sandboxed).
pnpm/pnpm
Run the tests that cover a change in the pnpm repository, in the Rust workspace (pnpm/, pnpr/) or the TypeScript CLI (pnpm11/), and recognize the cases where a scoped run passes without testing…
nodetool-ai/nodetool
Cut a NodeTool timeline to music and shape its pacing — detect the beat grid, place cuts on phrases, pick a cut type, build speed ramps with time remap, and give the piece an arc.
nodetool-ai/nodetool
Add and animate a consistent text layer on an existing NodeTool timeline.
nodetool-ai/nodetool
Choose and animate colour on a NodeTool timeline, including shape and text gradients, colour grades, 3D LUTs, and dither.
nodetool-ai/nodetool
Write a shootable, precisely timed commercial beat sheet and store it as a NodeTool storyboard, with a consistent entity roster behind every shot.
nodetool-ai/nodetool
Direct ElevenLabs speech, dialogue, sound effects and music — the bracketed audio tags v3 acts on and why the voice decides whether a tag lands, stability as the delivery dial, punctuation instead…
nodetool-ai/nodetool
Stage the frame on a NodeTool timeline — grids, focal placement, safe areas per aspect ratio, depth layers and parallax, camera moves, and where elements enter and leave.
Works with
Categories
Create or update TypeScript NodeTool nodes, decorated properties, process methods, and node packages. Nodetool Custom Node Developer is an agent skill from nodetool-ai/nodetool. Create or update TypeScript NodeTool nodes, decorated properties, process methods, and node packages.
Nodetool Custom Node Developer fits situations like: media & Creative work in your project.
Run `npx skills add nodetool-ai/nodetool --skill nodetool-custom-node-developer -a claude-code`. Or copy the skill folder (packages/system-skills/nodetool-custom-node-developer in nodetool-ai/nodetool) into .claude/skills/nodetool-custom-node-developer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add nodetool-ai/nodetool --skill nodetool-custom-node-developer -a codex`. Or copy the skill folder (packages/system-skills/nodetool-custom-node-developer in nodetool-ai/nodetool) into .agents/skills/nodetool-custom-node-developer 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 nodetool-ai/nodetool --skill nodetool-custom-node-developer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/nodetool-custom-node-developer, .gemini/skills/nodetool-custom-node-developer, .github/skills/nodetool-custom-node-developer and .opencode/skills/nodetool-custom-node-developer in your project.
Going by SKILL.md and its folder, Nodetool Custom Node Developer needs the command-line tools its instructions call (npm). Our summary lists: Node.js; A credential in MY_API_KEY.
SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. 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.
Nodetool Custom Node Developer is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2k tokens (SKILL.md is roughly 7.9k 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 Nodetool Custom Node Developer: Add New Package (remotion-dev/remotion, 62k stars), MCP Server Builder (shareAI-lab/learn-claude-code, 78k stars), Install Anti-Slop Oxlint Rules (dmmulroy/anti-slop, 5.3k stars) and Link Workspace Packages (nomcopter/react-mosaic, 4.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
nodetool-ai (a GitHub organization) maintains it in nodetool-ai/nodetool, which has 556 GitHub stars. The repository holds 127 skills in this directory. The repository was last updated on October 8, 2026.
Source: nodetool-ai/nodetool on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.