Installs into .claude/skills of the current project.
Are you the author of Preact Stinger?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/legioncodeinc-preact-stinger)
---
name: "preact-stinger"
license: AGPL-3.0-or-later
description: "Build Preact 11 apps and widgets. Use for signals, React compat migration, embeds, Astro islands, or Fresh. Read README.md for the guide map."
---
# preact-stinger
Procedural arsenal for `preact-wasp-drone`, the Wasp Nest's Preact 11 specialist. This stinger encodes the opinionated decision framework, the signals API (v2), the `preact/compat` compatibility surface, the third-party embed pattern, and the Astro/Fresh integration playbooks.
**First-read priority:** Start with `guides/00-when-to-choose-preact.md`. If you have already classified the scenario, jump to the relevant guide. The research summary is at `research/research-summary.md`.
---
## When this stinger applies
Load this stinger when any of the following is true:
- The user is evaluating Preact vs React for a new project.
- The user is migrating an existing React codebase to Preact via `preact/compat`.
- The user is building a third-party embed widget and bundle size is a constraint.
- The user is working in an Astro project and wants to use Preact islands.
- The user is working in a Fresh 2.x project.
- The user has Preact code to review, debug, or refactor.
- The user asks about signals (`signal`, `computed`, `effect`, `createModel`).
Do NOT load for:
- Pure React architecture questions → `react-wasp-drone`.
- Next.js App Router configuration → `react-wasp-drone` (and warn: `preact/compat` + App Router is a footgun).
- Deno DevOps beyond Fresh (deploy configs, Docker, etc.) → `devops-wasp-drone`.
- Design system or token decisions → `ux-ui-svelte-wasp-drone`.
---
## Scenario classification (read first)
Before applying any guide, classify the incoming request:
| Scenario | Key signal | Primary guide |
|---|---|---|
| New project, evaluating Preact | "should I use Preact?", bundle size target, no existing React code | `guides/00-when-to-choose-preact.md` |
| Signals authoring | "signals", "signal()", "computed()", "createModel" | `guides/01-signals-api.md` |
| React-to-Preact migration | existing React codebase, `preact/compat`, alias setup | `guides/02-compat-migration.md` |
| Third-party embed widget | "embed", "third-party script", "widget", shadow DOM, bundle budget | `guides/03-embed-widget.md` |
| Astro integration | `@astrojs/preact`, `client:*` directives, Astro project | `guides/04-astro-integration.md` |
| Fresh framework | Fresh, Deno, `islands/`, `deno.json` | `guides/05-fresh-framework.md` |
If the scenario is ambiguous, ask one targeted clarifying question before diving into code.
---
## Critical directives
These are non-negotiables for `preact-wasp-drone`. Each has a one-line "why".
- **Never recommend Preact without naming the concrete benefit.** Why: "smaller bundle" is not a reason; the specific size delta, embed constraint, or signals preference must be stated.
- **Always check `preact/compat` compatibility before migrating.** Why: React 19 `use()`, `useTransition`, RSC, and `@types/react` each break compat silently or noisily.
- **`@types/react` must NEVER be installed alongside `preact/compat`.** Why: type conflicts are pervasive and hard to debug; use `preact`'s built-in types only.
- **Next.js App Router + `preact/compat` = footgun. Stop and warn.** Why: RSC requires React's fiber; compat wraps but does not replace it, producing silent failures.
- **Scope signals to the specific use case.** Why: mixing naive `useState` patterns with signals produces tracking bugs; the mental model shift must be explicit.
- **Defer to `react-wasp-drone` for React architecture.** Why: the two wasp-drones share JSX surface but own different mental models; crossing produces contradictory advice.
---
## Version anchors (May 2026)
| Package | Stable version | Notes |
|---|---|---|
| preact | 10.x (v11 beta) | v11 beta as of Aug 2025; check for stable |
| @preact/signals | 2.9.0 | v2 API is current |
| preact-custom-element | 4.6.0 | embed/web component wrapper |
| @astrojs/preact | 5.1.2 | **require >= 5.0.1** (useId bug fixed) |
| Fresh | 2.2.2 | Vite-based; Fresh 1.x is esbuild |
> Source: `research/internal/2026-05-20-stinger-folder-context.md`
---
## Folder layout
```
preact-stinger/
├── SKILL.md (this file — master index)
├── README.md (one-page human overview)
├── guides/
│ ├── 00-when-to-choose-preact.md (tradeoff matrix + honest "when React wins")
│ ├── 01-signals-api.md (v1 primitives + v2 model pattern)
│ ├── 02-compat-migration.md (alias setup, known gaps, migration checklist)
│ ├── 03-embed-widget.md (shadow DOM, IIFE bundle, size checklist)
│ ├── 04-astro-integration.md (client: directives, useId fix, compat in Astro)
│ └── 05-fresh-framework.md (islands, serializable props, signals state)
├── examples/
│ ├── happy-path-signals-component.md
│ └── compat-migration-vite.md
├── templates/
│ └── migration-checklist.md
├── reports/
│ └── README.md
└── research/ (authored by scripture-historian — do not modify)
├── research-plan.md
├── research-summary.md
├── index.md
├── external/
└── internal/
```
---
*Forged by `stinger-forge` from `preact-wasp-drone-command-brief.md` and `research/`. Part of The Wasp Nest by [Mario Aldayuz a.k.a @thenotoriousllama](https://github.com/thenotoriousllama).*