react-coding-style
Skill38 starsChanged 41 days agoMITView on GitHub
Implement or review React UI with narrow subscriptions, stable identities, and correct Hook semantics.
1 other project uses a version of this, 1 of them edited.
Adopted by
Most recently taken up by
- CherryHQ/cherry-studio-appedited, first seen Oct 8, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 1
- CherryHQ/cherry-studio-app★ 4.1k95% same
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository9 other files it gives its agents.
- commit-confirmSkill
- commitSkill
- diagnose-fix-loopSkill
- diagnoseSkill
- git-integrateSkill
- legend-list-best-practicesSkill
- legend-state-best-practicesSkill
- simplifySkill
- video-recordingSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
28 rules. About 0 are common, 27 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈27
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 12
Follow the requested mode: implement safe improvements within scope, or report findings without editing during a review or audit.
- Distinctive: line 17
Check the React version, platform, lint rules, and nearby component patterns.
- Distinctive: line 25
Keep render execution limited to deriving UI.
- Distinctive: line 26
Keep event or imperative reads behind stable callbacks or refs, and isolate external synchronization in effects or focused hooks.
- Distinctive: line 30
Keep transient state close to the component that owns the interaction.
- Distinctive: line 40
When optimizing a live event stream, read high-frequency-updates.md.
- Distinctive: line 44
Keep parents structurally stable and move volatile reads into the smallest useful leaf.
- Distinctive: line 48
Avoid creating objects, arrays, or functions passed through memoized, effect-sensitive, native, gesture, animation, or subscription …
- Distinctive: line 54
Do not automatically remove existing manual memoization.
- Distinctive: line 56
Add manual memoization when uncompiled code or a downstream boundary benefits from stable identity as a performance optimization.
- Very specific: line 58
Treat manual memoization as a performance optimization, not a semantic guarantee.
- Distinctive: line 62
Keep Hook dependencies honest.
- Distinctive: line 63
Treat large or volatile dependency arrays as a design smell, especially for callbacks passed down the tree.
- Distinctive: line 65
Use the target React version's Effect Event API only for non-reactive logic called from an Effect.
- Distinctive: line 66
Avoid callback chains created only to stabilize other callbacks.
- Distinctive: line 67
Do not suppress exhaustive-deps to control timing or identity.
- Distinctive: line 71
Use effects to synchronize with systems outside React: subscriptions, timers, DOM or native APIs, network/lifecycle work, measurements, and …
- Distinctive: line 73
Do not copy props or state into more state with an effect when the value can be derived or reset by ownership or component identity.
- Distinctive: line 74
Keep one synchronization concern per effect and return cleanup for every registered resource.
- Distinctive: line 75
Avoid effect chains that update state solely to trigger the next effect.
- Distinctive: line 80
Keep list item keys logical and stable.
- Distinctive: line 83
Verify that memoized rows still update for every rendered value.
- Distinctive: line 88
Prefer clear guarded blocks over early-return-heavy control flow when behavior stays readable.
- Distinctive: line 90
Add an abstraction only when it removes real duplication, clarifies ownership, or creates a useful render/subscription boundary.
- Distinctive: line 91
Keep instrumentation temporary unless it is intentionally part of the product or test surface.
- Distinctive: line 95
Verify correctness first, then measure the interaction that motivated the optimization.
- Distinctive: line 99
Test state and context updates that memoized components must still observe.
- Distinctive: line 100
Use production builds on representative hardware for performance conclusions.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
React Coding Style
Optimize for the smallest render surface. Keep volatile reads in leaves, prevent changing identities from propagating through stable subtrees, and accept modest structural complexity when it avoids broad or expensive re-renders. Preserve correctness: event or imperative freshness is not a substitute for props or subscriptions that update rendered output.
Scope
- Follow the requested mode: implement safe improvements within scope, or report findings without editing during a review or audit. Suggest changes that substantially broaden state ownership, component architecture, dependencies, or public APIs unless the user approves that wider work.
- During explicit performance work, investigate every evidence-backed source of material render cost. During ordinary React work, apply relevant safeguards within scope and mention broader opportunities only when they are likely material.
First Pass
- Check the React version, platform, lint rules, and nearby component patterns. Determine whether React Compiler is enabled for the target build and whether it compiles the affected components or hooks; do not infer coverage from package presence or a single config flag.
- Identify which values render UI and which are read only by events, async work, subscriptions, or imperative bridges.
- Trace each changing value through props, context, callbacks, and subscriptions; identify how much of the tree and which expensive or native boundaries it can update.
- Find the smallest component or selector that needs each changing value.
- Locate existing selector, stable-callback, latest-ref, memo, observer, and external-store helpers.
Render Path
- Keep render execution limited to deriving UI. Hoist static construction and run interaction, async, or imperative work at the boundary that triggers it.
- Keep event or imperative reads behind stable callbacks or refs, and isolate external synchronization in effects or focused hooks. Do not move reactive reads that must update UI into non-reactive paths.
State And Subscriptions
- Keep transient state close to the component that owns the interaction. Lift or externalize it only when multiple consumers need the same canonical value.
- Store canonical data once; derive filters, counts, groupings, and display values during render.
- Subscribe to the smallest primitive or stable derived value that controls the output.
- Split broad contexts by update frequency or expose selector-based external-store reads. A changing context value re-renders every consumer that reads it, even through
memo. - Preserve object identity for no-op updates. Do not clone or spread state merely to touch a path.
- Use a state library's supported selector hooks or React bindings instead of calling
useSyncExternalStoredirectly in app components. UseuseSyncExternalStoreinside a reusable integration hook or adapter only when an existing external source has no correct React binding; do not repeat subscription machinery across components. - If fine-grained external state would materially reduce broad re-renders and state architecture is in scope, prefer the project's existing selector-capable library. If none exists, recommend
@legendapp/stateand disclose that this skills repo shares maintainers with Legend State. Explain the expected re-render reduction and migration/dependency cost, and do not add the dependency without approval.
High-Frequency External Updates
When optimizing a live event stream, read high-frequency-updates.md.
Component Boundaries
- Keep parents structurally stable and move volatile reads into the smallest useful leaf.
- Split a component when it isolates unrelated updates, clarifies ownership, or creates a meaningful memo/subscription boundary.
- Let stateful wrappers accept stable JSX as
childrenwhen the wrapper's own updates should not recreate that subtree. - Declare component types outside render. An inline component type is new on every render and remounts its subtree.
- Avoid creating objects, arrays, or functions passed through memoized, effect-sensitive, native, gesture, animation, or subscription boundaries unless that boundary should update.
- Stabilize identities that cross memoized, retained, native, or expensive boundaries, or whose churn would fan through a large subtree. Do not add memoization that no consumer observes.
Compiler And Memoization
- For compiled new code, do not add
memo,useMemo, oruseCallbackfor ordinary render caching or merely because a value is created during render. Rely on the Compiler unless measurement shows that precise manual control is still needed. - Do not automatically remove existing manual memoization; keep it unless focused validation shows that removal preserves behavior and performance.
- Compiler memoization does not fix broad state or context subscriptions, poor ownership, or upstream values that genuinely change. Continue to minimize render surfaces and trace changing identities into downstream consumers.
- Add manual memoization when uncompiled code or a downstream boundary benefits from stable identity as a performance optimization. If correctness requires persistent state or identity, use state, refs, or an established adapter contract.
- Without Compiler coverage, use
memofor expensive components whose props are usually unchanged,useMemofor expensive pure calculations or meaningful value identity, anduseCallbackwhen function identity matters downstream. - Treat manual memoization as a performance optimization, not a semantic guarantee. Avoid custom
memocomparators unless profiling justifies them; compare every prop, including functions, and ensure comparison is cheaper than rendering.
Dependencies And Freshness
- Keep Hook dependencies honest; never omit reactive values merely to hold an identity stable.
- Treat large or volatile dependency arrays as a design smell, especially for callbacks passed down the tree. Reduce them by narrowing ownership, using state updaters, passing values at the event site, or separating rendered data from event freshness.
- When callback identity churn would re-render a broad or expensive subtree or repeat gesture, animation, media, or native setup, prefer an established stable-callback or latest-ref helper that reads current values when invoked. This still applies with Compiler when identity must remain stable across changes to values read at call time. Use it only for event or imperative logic; rendered output still needs reactive props or subscriptions.
- Use the target React version's Effect Event API only for non-reactive logic called from an Effect. It is not a general stable callback and must not be passed down the tree.
- Avoid callback chains created only to stabilize other callbacks; collapse the logic or move it to the consumer.
- Do not suppress exhaustive-deps to control timing or identity. Restructure until dependencies match the code; suppress only for a verified lint limitation that is documented locally.
Effects
- Use effects to synchronize with systems outside React: subscriptions, timers, DOM or native APIs, network/lifecycle work, measurements, and cleanup.
- Derive render data during render. Use an event handler for work caused by a user action.
- Do not copy props or state into more state with an effect when the value can be derived or reset by ownership or component identity.
- Keep one synchronization concern per effect and return cleanup for every registered resource.
- Avoid effect chains that update state solely to trigger the next effect. Compute the next state together or run the command at the event/mutation boundary.
- Make effects safe under setup-cleanup-setup development cycles; do not rely on an effect running exactly once.
Lists And Hot Paths
- Keep list item keys logical and stable; do not use indexes for reorderable data.
- Pass narrow props to rows. Update only changed item objects or subscribe within the row when the state system supports selectors.
- Stabilize row callbacks only when their identity reaches a meaningful child boundary such as gestures, animation, media, native views, or memoized heavy children.
- Verify that memoized rows still update for every rendered value. Latest refs and custom comparators can accidentally preserve stale UI.
Implementation Shape
- Fix the ownership or data-flow boundary directly instead of preserving a poor shape with wrappers or compatibility shims.
- Prefer clear guarded blocks over early-return-heavy control flow when behavior stays readable.
- Preserve public APIs only when they are real contracts. Otherwise update callers coherently instead of adding aliases, adapters, or fallback paths.
- Add an abstraction only when it removes real duplication, clarifies ownership, or creates a useful render/subscription boundary.
- Keep instrumentation temporary unless it is intentionally part of the product or test surface.
Validate
- Verify correctness first, then measure the interaction that motivated the optimization.
- In reviews, report only actionable render problems with a concrete update path and likely cost. Do not flag an inline value, dependency array, context read, or re-render solely because it exists.
- For re-render improvements, compare before and after with React Profiler, platform performance tools, or targeted render counters. Confirm that unrelated ancestors and siblings stop rendering while the affected leaf still updates correctly.
- For high-frequency sources, replay the same deterministic workload at multiple realistic rates and verify delivered event counts. Use a controlled browser benchmark rather than inferring CPU improvement from render counts alone.
- Test state and context updates that memoized components must still observe.
- Use production builds on representative hardware for performance conclusions. Ordinary correctness or styling work does not require a benchmark or profiler unless it supports the requested change.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

