Firecrawl Page Scrape Integration
firecrawl/firecrawl
Adds Firecrawl's /scrape endpoint to application code to pull markdown, HTML, links, screenshots or structured data from a single known URL.
Doctrine for designing and evolving any SDK Grida ships — TypeScript, Rust, or otherwise.
$ npx skills add gridaco/grida --skill sdk-design -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install gridaco/grida sdk-design --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/gridaco/grida.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/sdk-design .claude/skills/sdk-design && 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 "sdk-design" agent skill from https://github.com/gridaco/grida/tree/main/.agents/skills/sdk-design into .claude/skills/sdk-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sdk-design", 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/gridaco/grida/tree/main/.agents/skills/sdk-designType 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 gridaco/grida --skill sdk-design -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install gridaco/grida sdk-design --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gridaco/grida.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/sdk-design .agents/skills/sdk-design && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "sdk-design" agent skill from https://github.com/gridaco/grida/tree/main/.agents/skills/sdk-design into .agents/skills/sdk-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sdk-design", 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 gridaco/grida --skill sdk-design -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install gridaco/grida sdk-design --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gridaco/grida.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/sdk-design .cursor/skills/sdk-design && 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 "sdk-design" agent skill from https://github.com/gridaco/grida/tree/main/.agents/skills/sdk-design into .cursor/skills/sdk-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sdk-design", 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/gridaco/grida.git --path .agents/skills/sdk-design--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 gridaco/grida --skill sdk-design -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install gridaco/grida sdk-design --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gridaco/grida.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/sdk-design .gemini/skills/sdk-design && 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 "sdk-design" agent skill from https://github.com/gridaco/grida/tree/main/.agents/skills/sdk-design into .gemini/skills/sdk-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sdk-design", 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 gridaco/grida sdk-designInstalls 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 gridaco/grida --skill sdk-design -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/gridaco/grida.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/sdk-design .github/skills/sdk-design && 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 "sdk-design" agent skill from https://github.com/gridaco/grida/tree/main/.agents/skills/sdk-design into .github/skills/sdk-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sdk-design", 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 gridaco/grida --skill sdk-design -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install gridaco/grida sdk-design --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gridaco/grida.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/sdk-design .opencode/skills/sdk-design && 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 "sdk-design" agent skill from https://github.com/gridaco/grida/tree/main/.agents/skills/sdk-design into .opencode/skills/sdk-design/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sdk-design", 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.
sdk-designDoctrine for designing and evolving any SDK Grida ships — TypeScript, Rust, or otherwise.
SDK Design is an agent skill from gridaco/grida. Doctrine for designing and evolving any SDK Grida ships — TypeScript, Rust, or otherwise. "SDK" here means a surface that crosses a foreign-or-foreign-treated boundary: published packages, separately-versioned consumers, FFI bindings, public-by-design modules. An SDK's job is to refuse; a strict, honest surface rejects the wrong contents and keeps the package testable in isolation. Default is "core, not customizable"; customization is the exception, defended by a deciding table. Use when authoring or evolving any…
Its SKILL.md is about 3.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It works with Rust and TypeScript. 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 165496f. 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:
gitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, 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.
SDK Design loads about 3.9k tokens when it runs. Until then it costs about 227 tokens; SKILL.md has 2,146 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 gridaco/grida at commit 165496f, republished under its Apache-2.0 licence (© gridaco). 2,146 words, ~3,926 tokens.
.claude/skills/sdk-design/SKILL.md (or your agent's skills folder).This is not a style guide. Style and language-specific code shape are downstream (see $code-ts, $code-react for the TS sides). This is about what an SDK refuses to do — the discipline that keeps a package small, legible, and replaceable, regardless of language.
An SDK lives or dies by what it refuses to expose. Default is core; customization is the exception. Every public knob is a contract you cannot retract without a semver break and a coordinated migration across every downstream call site.
A library with too few knobs is easy to grow. A library with too many is impossible to retire. The asymmetry is brutal — design from it.
This doctrine applies whether the package ships as an npm scope, a crate, a header-only library, a WASM module, a Python wheel, a hosted service with an SDK, or a pair of microservices defining a shared message vocabulary. The mechanics of "publish" differ; the discipline of "refuse the wrong contents" does not.
This is the gate. The skill says "SDK," not "package," because the two are different. An SDK is:
npm, crates.io, PyPI); linked by a separately-versioned consumer (a desktop binary against a crate, a generated WASM/FFI binding); or authored as if a foreign consumer existed even if one doesn't yet (any package whose README documents it as a public surface, anything tagged for publication, anything in a *-hosted suffix family).What this excludes — where the doctrine is welcome but not load-bearing:
packages/. Adopt the parts of this skill that pay; skip the rest without apology.crates/. Same logic.Don't extend the doctrine to internal-only utilities just because the file structure looks like an SDK. The discipline costs something — designed views over raw streams, anti-goals as perimeters, promotion-on-dogfooding — and that cost is paid by the foreign-callers it protects. If there are no foreign callers (now or planned), the strictness doesn't pay back.
sdk-seam triggers on the same gate from the other angle: any
boundary that meets the SDK bar above, where the same author
writes both sides. Include FFI bindings to internal crates here —
binding regeneration cost makes the boundary foreign-treated even
when the crate is same-repo.
When a new decision lands — "should this be a provider hook? a built-in toggle? a sibling package? a public type or an internal seam?" — walk these in order. First match wins.
| Question | If yes → | Why |
|---|---|---|
| Would customization let a consumer break the invariant this package exists to protect? | Core, non-customizable | Sovereignty |
| Is this genuinely a host-owned concern (I/O, locale, surface, credentials, clock)? | Provider at construction | Host knows what you can't |
| Is this per-variant edit/parse/render semantics, complex but bounded by a spec or schema? | Internal seam, no public API | Code organization, not API |
| Does the candidate have ≥2 internal consumers AND can be tested without mounting the SDK? | Separate layer (own module/package) | Earned its separation |
| Have ≥2 internal consumers shaped the contract already? | Eligible for public | Public only after dogfooding |
| Otherwise | Core, internally modular | Default-in, not default-out |
The third rung — "complex but internal" — is where most "extension-point" mistakes get caught. A real spec or schema (SVG element table, MIDI event types, OpenType tables, USB device classes) is the registry; the SDK implements against it. Don't re-invite the spec to be re-implemented at runtime by consumers.
The public observation surface is designed, not raw. It exposes purpose-built views — selection, mode, dirty/version, computed property — each handling multi-target, capability variance, and bookkeeping internally. Consumers never receive raw input events, reducer actions, or internal state frames.
If a needed view doesn't exist, that's an API gap to close, not an internals hatch to open. Exposing the internal stream because "the consumer can compose it themselves" is how you wake up six months later unable to refactor the core.
The same rule applies to the other direction: emit named outcomes
(intents, commands, requests), not "the user moved their pointer."
If your outputs carry phase markers (preview / commit, begin /
progress / end), the consumer wraps history/transactions without
guessing internal state.
One-directional dependency, layered:
primitives / math ← logic core ← adapter shell ← hostThe math/logic core has no I/O, no DOM, no canvas, no UI runtime,
no global clock. Plain function over plain inputs returns plain
output. Runnable under the language's basic test runner with zero
mocks. A Rust crate's core compiles under no_std where feasible;
a TS package's core has no window / document import; a Python
package's core does not touch the filesystem.
The shell is a thin wire: lifecycle, draw loop, host wiring. Its own logic should be trivial enough to verify by inspection, because it's the part you can't test headlessly.
Why this matters: when a shell grows logic, that logic ships
unguarded. Common failure: the shell holds a switch (render,
dispatch, route) and a new core variant is added without
updating the switch — the core's tests pass; the shell silently
drops the variant; downstreams hit it in production. Push logic
into the core. Tests follow.
Don't conflate outputs that exist to satisfy different constraints. Every paired-but-asymmetric surface — render vs. hit-test, read vs. write, declared vs. computed, preview vs. commit, encode vs. decode — earns its asymmetry from a real disagreement in requirements. When you find yourself unifying them "for elegance," you're about to break one.
Concrete pattern: a UI surface that draws and hit-tests as two separate outputs. Drawing optimizes for legibility at any zoom; hit-testing optimizes for Fitts'-reach (fat targets, virtual regions that extend past the visible shape). Collapsing them — sizing the visual to match the hit AABB, or shrinking the hit region to match the visual — breaks one of the two; each side has to compromise to satisfy the other.
The generalization: tests assert each side separately, and — where they intentionally differ — assert the direction of difference (e.g., the hit region strictly contains the rendered bbox).
Every published SDK ships an explicit Anti-goals section in its README. It is not aspirational; it is the perimeter that lets the package stay small. Examples that have already prevented bloat across various Grida packages:
When a feature request arrives, the first question is which anti-goal it would violate. If it violates one, the right answer is "this is the wrong tool." If it threatens one without crossing it, write the anti-goal sharper.
Adding an anti-goal is the cheapest design work an SDK author does.
See $naming for the full treatment. The SDK-specific corollary:
git mv; published-name rename is a coordinated downstream migration. Invest heavily before a name escapes its file.Surface, Encoder, Intent, Paint in a package asserts "nothing else competes for this slot here." If a peer could be added later, qualify now.<consumer> for <feature>" is leaking the consumer's problem into the contract. The field name should justify itself in producer-only terms.Internal seams stay internal until ≥2 internal consumers have shaped the contract. This is not a bureaucratic gate — it's the only way to avoid public APIs designed against one use case.
Promoting too early produces:
Promoting too late costs little. Internal callers reach into internals; you tighten when the second consumer arrives. Default direction of pressure is inward, not outward.
When you do promote, the contract test is: "could a stranger build the next caller against this API alone, without reading the SDK's source?" If no, it's not promoted; it's exposed.
For very new packages without a second internal consumer yet, the honest move is to mark the surface as unstable in its README ("v0.x.y — no compatibility guarantees") and let the second consumer's needs shape the contract before locking it.
For any extensibility request, walk this ladder. Reach down only when the rung above doesn't fit.
What's absent from this ladder is a generic plugin / widget / middleware registry. That's the point. A registry is the path that turns small packages into god-classes — the lesson is repeated across the industry (jQuery plugins, Babel plugins of the early era, Webpack loaders) and locally (the Grida main editor's 6,800-line god-class grew partly from this).
For an SDK, tests carry double weight:
Discipline: every default behavior is locked by a test whose description names the behavior in plain language. The test name is the spec. The body proves the code obeys it. A comment above explains why — the design intent that the code itself can't carry.
Where applicable, embed scenario names verbatim in test text so "did we drop a rule?" is grep-able across implementations and ports. This matters most for SDKs that ship parallel implementations (TS + Rust + WASM bindings) of the same contract.
A PR that touches a public behavior without touching the matching test is a smell; a PR that flips a test's assertion without changing the test name is a near-certain regression.
$pedantic — before drafting a public API, run the design through pedantic. The probes for unfalsifiability, vague quantifiers, and assumed-bedrock catch the "this feels finished but isn't grounded" failure mode that produces APIs you can't retract.$etiology — before patching across an SDK boundary, walk the diagnostic ladder. Most "quick fixes" at a boundary are API-contract bugs (rung 3), not call-site bugs (rung 2). Treating one as the other is how contracts rot.Work that touches more than one SDK — your producer and its
consumer, two sibling packages, a published surface and its tests,
two crates on either side of an FFI boundary — has a specific
failure mode of its own: when you control both sides, you shotgun
changes across them in a single edit and the contract silently
degrades. The joint between the two sides is a seam; keeping
seams clean has its own discipline. See $sdk-seam.
$sdk-seam.© gridaco, 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 .agents/skills/sdk-design of gridaco/grida.
Open the folder on GitHubat commit 165496f
SDK Design 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 |
|---|---|---|---|---|---|---|
| SDK Design this skillgridaco/grida | 2.7k | — | ~3.9k | Automated safety check: Pass | Apache-2.0 | |
| Firecrawl Page Scrape Integrationfirecrawl/firecrawl | 190k | 1 repos | ~944 | Automated safety check: Pass | ISC | |
| Pnpm Engineteambit/bit | 18k | — | ~1.9k | Automated safety check: Pass | Custom licence | |
| Build Teaql Appteaql/teaql-agent-kit | 2.8k | — | ~4.6k | Automated safety check: Pass | MIT | |
| Testing Changespnpm/pnpm | 37k | — | ~1.1k | Automated safety check: Pass | MIT | |
| jscpd Code Migration Trackerkucherenko/jscpd | 6.4k | — | ~5k | Automated safety check: Pass | MIT |
firecrawl/firecrawl
Adds Firecrawl's /scrape endpoint to application code to pull markdown, HTML, links, screenshots or structured data from a single known URL.
teambit/bit
Work on the pnpm Rust engine (@pnpm/napi, the pacquet crates) that bit install runs through.
teaql/teaql-agent-kit
Build or change a TeaQL application in Java, Rust, Go, Swift, Python, C/.NET, or TypeScript, including Kotlin/JVM applications that consume Java-generated libraries.
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…
kucherenko/jscpd
Measures a code port between languages or frameworks with jscpd's function-level comparison, porting tests before code and tracking what is left unmatched.
mcthesw/game-save-manager
Prepare change-specific RGSM GUI acceptance environments and short manual scenarios when the user wants to try a change locally.
gridaco/grida
Grida Desktop Electron shell and release-impact work: BrowserWindow, preload, window.grida, menus, protocol/deep links, file associations, Forge, path-scoped bridge security, Electron-only UI bugs…
gridaco/grida
Guides work on the Figma I/O package (@grida/io-figma, packages/grida-canvas-io-figma/).
gridaco/grida
Set up, download, verify, and seed the optional Grida Library developer corpus into local Supabase.
gridaco/grida
Query images with a local Ollama vision model without loading the image into the main agent context.
gridaco/grida
Research, compare, and update shared AI model JSON for TypeScript, web, and Rust consumers.
gridaco/grida
Grida AI agent system work: @grida/daemon (DaemonServer, loopback HTTP perimeter, files/workspaces, secrets store, daemon discovery) and @grida/agent (the agent tenant: sessions, providers/BYOK…
Works with
Doctrine for designing and evolving any SDK Grida ships — TypeScript, Rust, or otherwise. SDK Design is an agent skill from gridaco/grida. Doctrine for designing and evolving any SDK Grida ships — TypeScript, Rust, or otherwise.
SDK Design fits situations like: evolving any such surface — @grida/ published packages; engine crates (gridaco/nothing crates/) published; intent/message vocabularies; any contract a second author will compile against.
Run `npx skills add gridaco/grida --skill sdk-design -a claude-code`. Or copy the skill folder (.agents/skills/sdk-design in gridaco/grida) into .claude/skills/sdk-design in your project. Claude Code loads it when a task matches its description.
Run `npx skills add gridaco/grida --skill sdk-design -a codex`. Or copy the skill folder (.agents/skills/sdk-design in gridaco/grida) into .agents/skills/sdk-design 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 gridaco/grida --skill sdk-design -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/sdk-design, .gemini/skills/sdk-design, .github/skills/sdk-design and .opencode/skills/sdk-design in your project.
Going by SKILL.md and its folder, SDK Design needs the command-line tools its instructions call (git). Our summary lists: Python 3.
SKILL.md contains no URLs. Its commands use git, 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.
SDK Design 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 3.9k tokens (SKILL.md is roughly 16k 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 SDK Design: Firecrawl Page Scrape Integration (firecrawl/firecrawl, 190k stars), Pnpm Engine (teambit/bit, 18k stars), Build Teaql App (teaql/teaql-agent-kit, 2.8k stars) and Testing Changes (pnpm/pnpm, 37k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
gridaco (a GitHub organization) maintains it in gridaco/grida, which has 2,659 GitHub stars. The repository holds 29 skills in this directory. The repository was last updated on October 7, 2026.
Source: gridaco/grida on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.