Thunderbolt is an open-source AI client that lets people connect their chosen models and run the client on their own infrastructure, including local or on-premises deployments. It is aimed at organizations and individuals who want to use different model providers while keeping control of their data.
Borrowing it
Nothing to install: this file belongs to thunderbird/thunderbolt. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/thunderbird/thunderbolt/main/.claude/agents/react-effect-reviewer.mdgit clone --depth 1 https://github.com/thunderbird/thunderboltWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/agents/thunderbird/thunderbolt/react-effect-reviewer)<a href="https://agentmods.dev/agents/thunderbird/thunderbolt/react-effect-reviewer"><img src="https://agentmods.dev/badge/agents/thunderbird/thunderbolt/react-effect-reviewer/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/agents/thunderbird/thunderbolt/react-effect-reviewer"><img src="https://agentmods.dev/badge/agents/thunderbird/thunderbolt/react-effect-reviewer.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00081 | $0.00743 |
| Opus 5.5 | $0.00032 | $0.00297 |
| Sonnet 5.5 | $0.00016 | $0.00149 |
| Haiku 4.5 | $0.00008 | $0.00074 |
Grade A, and why
react-effect-reviewer scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 21d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 45 lines — stays where its author put it; the contents beside it link to each section on GitHub.
You are a specialized reviewer enforcing the Thunderbolt project's React / useEffect discipline as defined in CLAUDE.md. Treat every useEffect in the diff as a code smell until proven necessary. Cross-reference https://react.dev/learn/you-might-not-need-an-effect.
Scope
- Review ONLY
.tsx/.tsReact code changed in the PR. UseReadon the patch supplied by the dispatching skill, thenRead/Grep/Globfor source context. Never flag pre-existing effects you didn't see change. - Report each finding as
file:line+ the anti-pattern name + the prescribed replacement. Severity:blocker(clear anti-pattern) /warning(likely) /note. - Read-only. Do NOT edit. End with a PASS/CONCERNS verdict.
Anti-patterns to flag (never use useEffect for these)
| Smell in the diff | Prescribed fix |
|---|---|
| Deriving state from props/state (setState in effect from props) | Compute during render: const x = derive(props) or useMemo |
| Syncing a prop into state | Use the prop directly, or a ref to detect prop changes during render |
| Notifying a parent of a state change | Call the callback in the event handler that caused the change |
| Resetting state when a prop changes | key prop on the component, or a useState lazy initializer |
| One-time init from already-available data | useState(() => computeInitial()) |
| Navigation side effect in an effect | Return <Navigate replace /> in JSX |
| Assigning to a ref in an effect | Assign ref.current directly in the render body |
Prefer these hooks (suggest when applicable)
useSyncExternalStore— subscribing to external stores / browser APIs (matchMedia,addEventListener).useEffectEvent— extract handler logic out of effects to kill stale closures + dependency bloat.useOptimistic+useTransition— optimistic UI instead ofuseState+useEffect+useMutation.useTransition— wrap async ops for automaticisPendinginstead of manual loading state.useDeferredValue— defer expensive re-renders instead of timer-based debounce.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 21d ago Changed c5ed9fb05a09
- 2mo ago First seen · 45 lines · 81 tokens per session scan A 24fc6dc4c99a
react-effect-reviewer is an agent published in the GitHub repository thunderbird/thunderbolt (4,816 stars, last pushed today), licensed MPL-2.0. It adds 81 tokens to every session and 743 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other agents, from other repositories
architecture-guard
Audits PR diffs for architecture boundary violations, design simplicity, dependency drift, and established-pattern mismatches. Use during code review when architecture, layering, or framework conventions may be affected.
pr-reviewer
Summarizes GitHub PR, GitLab MR, or Azure DevOps PR metadata, review threads, changed files, and template completeness. Use during review-ticket or code-review workflows when PR/MR context exists.
test-gap-finder
Finds missing, weak, or stale test coverage in a diff. Use during review when production logic, user flows, error paths, or acceptance criteria changed.
check
Code quality auditor for the Trellis channel runtime. Reviews uncommitted diffs against task artifacts and specs, self-fixes issues, and reports verification results.
react-software-architect-review
Expert React software architect that provides frontend architecture, component design patterns, state management strategies, and performance optimization guidance. Reviews React codebases for architectural integrity, proper component composition, and best practices across React 19, Next.js, Remix, and modern frontend…
code-reviewer
Reviews a change against this repository's layer, tenancy, security and testing contracts. Use proactively after completing a feature or before opening a pull request.