{"slug":"feature-sliced-design","title":"feature-sliced-design","summary":"Official Feature-Sliced Design (FSD) v2.1 skill for applying the methodology to frontend projects. Use when the task involves organizing project structure with FSD layers, deciding where code belongs, placing static assets (images, icons, fonts, PDFs), grouping closely related sl","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-05T10:18:53.549722Z","repo":{"url":"https://github.com/feature-sliced/skills","stars":105,"forks":9,"license":null,"updatedAt":"2026-09-16T15:28:03Z"},"bodyHtml":"<hr>\n<h2>name: feature-sliced-design\ndescription: &gt;\nOfficial Feature-Sliced Design (FSD) v2.1 skill for applying the methodology\nto frontend projects. Use when the task involves organizing project structure\nwith FSD layers, deciding where code belongs, placing static assets (images,\nicons, fonts, PDFs), grouping closely related slices, defining public APIs\nand import boundaries, resolving cross-imports or evaluating the @x pattern,\ndeciding whether to create or remove an entity, evaluating whether the\nentities layer is needed at all, deciding where page layouts belong or\nwhether to use the widgets layer (discouraged), deciding whether logic\nshould remain local or be extracted, migrating from FSD v2.0 or a non-FSD\ncodebase, integrating FSD with frameworks (Next.js App Router and Pages\nRouter, React Router, Nuxt, Vite, Astro), or implementing common patterns\nsuch as authentication, API handling, Redux, and TanStack Query\n(React Query) within FSD.</h2>\n<h1>Feature-Sliced Design (FSD) v2.1</h1>\n<blockquote>\n<p><strong>Source</strong>: <a href=\"https://fsd.how\">fsd.how</a> | Strictness can be adjusted based on\nproject scale and team context.</p>\n</blockquote>\n<p><strong>How to use this skill.</strong> For placement decisions, start with the decision\ntree in Section 2 and use the placement table in Section 3 as a quick\nreference. To check a structure for violations, use the rules in Section 4.\nTo resolve same-layer cross-imports, use Section 7. For task-specific\nguidance, load only the relevant reference files from Section 10; do not\npreload the rest.</p>\n<h2>1. Core philosophy &amp; layer overview</h2>\n<p>FSD v2.1 core principle: <strong>\"Start simple, extract when needed.\"</strong></p>\n<h3>The extraction rule</h3>\n<p>Place code in <code>pages/</code> first. Duplication across pages is acceptable and\ndoes not by itself require extraction to a lower layer. Extract only when\nall three conditions hold:</p>\n<ol>\n<li>The same code is used in multiple places right now, not hypothetically.</li>\n<li>It has a reason to change that is independent of any one consumer.</li>\n<li>The boundary has a focused responsibility.</li>\n</ol>\n<h3>The six layers</h3>\n<p><strong>Not all layers are required.</strong> Most projects can start with only <code>shared/</code>,\n<code>pages/</code>, and <code>app/</code>. Add <code>features/</code> and <code>entities/</code> only when they provide\nclear value. Do not create empty layer folders \"just in case.\" The <code>widgets/</code>\nlayer is <strong>discouraged</strong> (see the callout below).</p>\n<p>FSD uses 6 standardized layers, listed here from highest to lowest:</p>\n<pre><code>app/       → App initialization, providers, routing\npages/     → Route-level composition, owns its own logic\nwidgets/   → Reusable UI blocks (discouraged, see the callout below)\nfeatures/  → Reusable user interactions (see the extraction rule above)\nentities/  → Reusable business domain models (see the extraction rule above)\nshared/    → Infrastructure with no business logic (UI kit, utils, API client)\n</code></pre>\n<p><strong>The official layer reference discourages using the Widgets layer</strong>, and\nthis skill follows it. Widgets may seem useful for representing independent\nUI blocks. However, in real frontend code, UI blocks often include logic\nrequired for user flows, such as data fetching, state management, and event\nhandling. In this case, the responsibilities of Features, which handle user\nflows, and Widgets, which handle UI blocks, can overlap, making the boundary\nbetween the two layers unclear.</p>\n<p>Not creating a widget does not mean moving the block elsewhere untouched.\nA screen-specific composition stays in <code>pages</code>; a reused action and the UI\nto perform it go to <code>features</code>; context-free UI goes to <code>shared</code>; an\napp-wide layout goes to <code>app</code>.</p>\n<p>Discouraged is not deprecated: an existing widgets layer stays valid. See\n<code>references/layer-structure.md</code> for that case and for layout placement.</p>\n<h3>The import rule</h3>\n<p>A module may only import from layers strictly below it. Cross-imports\nbetween slices on the same layer are forbidden, with one narrow exception\nin Section 7.</p>\n<pre><code>// Allowed\nimport { Button } from \"@/shared/ui/Button\"; // features → shared\nimport { useUser } from \"@/entities/user\"; // pages → entities\n\n// Violation\nimport { loginUser } from \"@/features/auth\"; // entities → features\nimport { likePost } from \"@/features/like-post\"; // features → features\n</code></pre>\n<p><strong>Note</strong>: The <code>processes/</code> layer is <strong>deprecated</strong> in v2.1. For migration\ndetails, read <code>references/migration-guide.md</code>.</p>\n<h2>2. Decision framework</h2>\n<p>When writing new code, follow this tree:</p>\n<p><strong>Step 1: Where is this code used?</strong></p>\n<ul>\n<li>Used in only one page → keep it in that <code>pages/</code> slice.</li>\n<li>Used in 2+ pages but duplication is manageable → keeping separate copies\nin each page is also valid.</li>\n<li>An entity or feature with a single consumer → keep it there (Steiger\nflags this as <code>insignificant-slice</code>).</li>\n</ul>\n<p><strong>Step 2: Is it reusable infrastructure with no business logic?</strong></p>\n<p>The official layer reference draws the line for Shared like this: no\nbusiness logic, but business-themed is fine (a company logo, a page\nlayout), and so is UI logic (autocomplete, a search bar). Exchanging data\nwith the backend and CRUD boilerplate are not business logic either.\nBusiness logic is a rule the product enforces on its own data, such as\napplying a discount to an order. If the code fits none of the exclusions\nand still does not clearly enforce a product rule, the term does not\ndecide; go back to Step 1 and place it by where it is used.</p>\n<ul>\n<li>UI components → <code>shared/ui/</code></li>\n<li>Utility functions → <code>shared/lib/</code></li>\n<li>API client, route constants → <code>shared/api/</code> or <code>shared/config/</code></li>\n<li>Auth tokens, session management → <code>shared/auth/</code></li>\n<li>CRUD once several slices call it → <code>shared/api/</code> (a single caller keeps\nit, see Step 1)</li>\n</ul>\n<p><strong>Step 3: Is it a complete user action that several consumers share, with\na focused responsibility and a reason to change of its own?</strong></p>\n<ul>\n<li>Yes → <code>features/</code></li>\n<li>Uncertain, single use, or speculative reuse → keep in the page.</li>\n</ul>\n<p><strong>Step 4: Is it a business domain model that several consumers share, with\na focused responsibility and a reason to change of its own?</strong></p>\n<ul>\n<li>Yes → <code>entities/</code></li>\n<li>Uncertain, single use, or speculative reuse → keep in the page.</li>\n</ul>\n<p><strong>Step 5: Is it app-wide configuration?</strong></p>\n<ul>\n<li>Global providers, router, theme → <code>app/</code></li>\n</ul>\n<p><strong>Golden Rule: When in doubt, keep it in <code>pages/</code>. Extract only when the\nextraction rule holds.</strong></p>\n<h2>3. Quick placement table</h2>\n<table>\n<thead>\n<tr>\n<th>Scenario</th>\n<th>Single use</th>\n<th>Confirmed multi-use</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>User profile form</td>\n<td><code>pages/profile/ui/ProfileForm.tsx</code></td>\n<td><code>features/profile-form/</code></td>\n</tr>\n<tr>\n<td>Product card</td>\n<td><code>pages/products/ui/ProductCard.tsx</code></td>\n<td><code>entities/product/ui/</code> if the entity owns it</td>\n</tr>\n<tr>\n<td>API request (read or CRUD)</td>\n<td><code>pages/product-detail/api/fetch-product.ts</code></td>\n<td><code>shared/api/</code> (no domain rules)</td>\n</tr>\n<tr>\n<td>Auth token/session</td>\n<td><code>shared/auth/</code></td>\n<td><code>shared/auth/</code></td>\n</tr>\n<tr>\n<td>Auth login form</td>\n<td><code>pages/login/ui/LoginForm.tsx</code></td>\n<td><code>features/auth/</code></td>\n</tr>\n<tr>\n<td>Generic Card layout</td>\n<td></td>\n<td><code>shared/ui/Card/</code></td>\n</tr>\n<tr>\n<td>Modal manager</td>\n<td></td>\n<td><code>shared/ui/modal-manager/</code></td>\n</tr>\n<tr>\n<td>Modal content</td>\n<td><code>pages/[page]/ui/SomeModal.tsx</code></td>\n<td></td>\n</tr>\n<tr>\n<td>Date formatting util</td>\n<td></td>\n<td><code>shared/lib/format-date.ts</code></td>\n</tr>\n</tbody>\n</table>\n<p>\"Confirmed multi-use\" means the extraction rule holds, not that a second\nconsumer appeared: two similar copies that keep drifting apart stay in\ntheir pages (<code>references/growth-walkthrough.md</code>, Snapshot 1). Entity UI\ncarries the Section 6 caution even when the rule does hold.</p>\n<h2>4. Architectural rules (MUST)</h2>\n<p>These rules are the foundation of FSD. Violations weaken the architecture.\nIf you must break a rule, ensure it is an intentional design decision and\ndocument the reason in code (a comment or ADR).</p>\n<h3>4-1. Import only from lower layers</h3>\n<p><code>app → pages → widgets → features → entities → shared</code>.\nUpward imports are forbidden. So are cross-imports between slices on the\nsame layer, except through the other slice's public API as a last resort\n(Section 7, Strategy D).</p>\n<h3>4-2. Public API: every slice exports through index.ts</h3>\n<p>External consumers may only import from a slice's <code>index.ts</code>. Direct imports\nof internal files are forbidden.</p>\n<pre><code>// Correct\nimport { LoginForm } from \"@/features/auth\";\n\n// Violation: bypasses public API\nimport { LoginForm } from \"@/features/auth/ui/LoginForm\";\n</code></pre>\n<p><strong>Shared layer:</strong> Shared has no slices. Define a separate public API per\nsegment (<code>shared/ui/index.ts</code>, <code>shared/api/index.ts</code>, etc.) rather than\none top-level <code>shared/index.ts</code>. This keeps imports from Shared\norganized by intent.</p>\n<p>Where one index over a segment's unrelated modules hurts bundling, give\neach component, library, or controller folder its own index instead\n(<code>shared/ui/Button/index.ts</code> as <code>@/shared/ui/Button</code>, <code>shared/api/post/</code>\nas <code>@/shared/api/post</code>). That folder is then the boundary; reaching past\nit (<code>@/shared/ui/Button/Button.tsx</code>) is still a violation. See\n<code>references/layer-structure.md</code> for the shape.</p>\n<p><strong>Environment-specific entry points:</strong> a slice normally exposes one\n<code>index.ts</code>, and ad-hoc variations are not recommended. If a single index\ncannot preserve a runtime boundary, add an entry point such as\n<code>index.server.ts</code>. See <code>references/framework-integration.md</code>.</p>\n<h3>4-3. No cross-imports between slices on the same layer</h3>\n<p>If two slices on the same layer need to share logic, follow the resolution\norder in Section 7. Never reach into another slice's internals.</p>\n<h3>4-4. Domain-based file naming (no desegmentation)</h3>\n<p>Name files after what they are for, the domain or concern they serve, not\nafter their technical role. Technical-role names like <code>types.ts</code>,\n<code>utils.ts</code>, <code>helpers.ts</code> mix unrelated concerns in a single file and\nreduce cohesion.</p>\n<pre><code>// BAD: technical-role naming\nmodel/types.ts          ← Which types? User? Order? Mixed?\nmodel/utils.ts\n\n// GOOD: domain-based naming\nmodel/user.ts           ← User types + related logic\nmodel/order.ts          ← Order types + related logic\napi/fetch-profile.ts    ← Clear purpose\n</code></pre>\n<h3>4-5. No business logic in shared/</h3>\n<p>Shared contains only infrastructure: UI kit, utilities, API client setup,\nroute constants, assets. Business calculations, domain rules, and workflows\nbelong in <code>entities/</code> or higher layers. Section 2, Step 2 says what counts.</p>\n<pre><code>// BAD: business logic in shared\n// shared/lib/userHelpers.ts\nexport const calculateUserReputation = (user) =&gt; { ... };\n\n// GOOD: move it to whoever owns the rule\n// pages/profile/model/reputation.ts       ← while the profile page owns it\n// entities/user/model/reputation.ts       ← once a user boundary is earned\nexport const calculateUserReputation = (user) =&gt; { ... };\n</code></pre>\n<h2>5. Recommendations (SHOULD)</h2>\n<h3>5-1. Pages first: place code where it is used</h3>\n<p>Place code in <code>pages/</code> first. Extract to lower layers only when truly needed.\nExtraction is a design decision that affects the whole project, so the\nthreshold should be high.</p>\n<p><strong>What stays in pages:</strong></p>\n<ul>\n<li>Large UI blocks used only in one page</li>\n<li>Page-specific forms, validation, data fetching, state management</li>\n<li>Page-specific business logic and API integrations</li>\n<li>Code that looks reusable but is simpler to keep local</li>\n</ul>\n<p><strong>Evolution pattern:</strong> Start with everything in <code>pages/profile/</code>. Extract\nthe shared model to <code>entities/user/</code> when a second page consumes it <em>and</em>\nthe extraction rule holds. A response type that several pages read is not\none of those cases: it stays in <code>shared/api</code>. Keep page-specific API calls\nand UI in the page.</p>\n<h3>5-2. Be conservative with entities</h3>\n<p>The entities layer is highly accessible (almost every other layer can import\nfrom it), so changes propagate widely.</p>\n<ol>\n<li><strong>Start without entities.</strong> <code>shared/</code> + <code>pages/</code> + <code>app/</code> is valid FSD.\nThin-client apps rarely need entities.</li>\n<li><strong>Do not split slices prematurely.</strong> Keep code in pages. Extract to\nentities only when the extraction rule holds.</li>\n<li><strong>Business logic does not automatically require an entity.</strong> Keeping types\nin <code>shared/api</code> and logic in the current slice's <code>model/</code> segment may\nbe sufficient.</li>\n<li><strong>CRUD is infrastructure, not entities.</strong> Place it by the request\nplacement rule: with its consumer while there is one, in <code>shared/api/</code>\nonce several slices call it.</li>\n<li><strong>Place auth data in <code>shared/auth/</code> or <code>shared/api/</code>.</strong> Tokens and login\nDTOs are auth-context-dependent and rarely reused outside authentication.</li>\n</ol>\n<p>For detailed guidance on keeping the entities layer clean (when to skip\nit entirely, how to isolate business contexts, why CRUD belongs in\n<code>shared/api</code>), see <code>references/excessive-entities.md</code>.</p>\n<h3>5-3. Start with minimal layers</h3>\n<pre><code>// Valid minimal FSD project\nsrc/\n  app/         ← Providers, routing\n  pages/       ← All page-level code\n  shared/      ← UI kit, utils, API client\n\n// Add layers only when an actual use case requires them:\n// + features/  ← User-action boundaries that need one shared home\n// + entities/  ← Domain boundaries that need one shared home\n// (widgets/ is discouraged; see Section 1 for where that code goes instead)\n</code></pre>\n<h3>5-4. Validate with the Steiger linter</h3>\n<p><a href=\"https://github.com/feature-sliced/steiger\">Steiger</a> is the official FSD\nlinter. Key rules:</p>\n<ul>\n<li><strong><code>insignificant-slice</code></strong>: Flags a slice with no references, or with one,\nand suggests merging it into the layer above. Pages may hold a single\nreference, and so may slices used only from <code>app/</code>.</li>\n<li><strong><code>excessive-slicing</code></strong>: Suggests merging or grouping when a layer has too\nmany slices.</li>\n</ul>\n<pre><code>npm install -D @feature-sliced/steiger\nnpx steiger src\n</code></pre>\n<h2>6. Anti-patterns (AVOID)</h2>\n<ul>\n<li><strong>Do not create entities prematurely.</strong> Data structures used in only one\nplace belong in that place.</li>\n<li><strong>Do not put CRUD in entities.</strong> Plain CRUD is <code>shared/api/</code>. An\noperation that carries business rules is placed by who owns the rule,\nwhich may be an entity, a feature, or the page running the workflow.</li>\n<li><strong>Do not create a <code>user</code> entity just for auth data.</strong> Tokens and login DTOs\nbelong in <code>shared/auth/</code> or <code>shared/api/</code>.</li>\n<li><strong>Do not abuse <code>@x</code>.</strong> It is a necessary compromise, not a recommended\npattern. The notation is for the entities layer only, and only when\nboundary merge is genuinely impossible. Features and widgets handle\ncross-imports through strategies A through D (see Section 7).</li>\n<li><strong>Do not extract single-use code.</strong> A feature or entity used by only one\npage should stay in that page.</li>\n<li><strong>Do not use technical-role file names.</strong> Use domain-based names\n(see Rule 4-4).</li>\n<li><strong>Be cautious adding UI to entities.</strong> Entity UI tempts cross-imports from\nother entities. If you add UI segments to entities, only import them from\nhigher layers (features, pages, app), never from other entities.</li>\n<li><strong>Do not create god slices.</strong> Slices with excessively broad responsibilities\nshould be split into focused slices (e.g., split <code>user-management/</code> into\n<code>auth/</code>, <code>profile-edit/</code>, <code>password-reset/</code>).</li>\n<li><strong>Do not create a top-level <code>assets/</code> segment.</strong> Place static assets next\nto the code that uses them; global stylesheets and fonts go to <code>app/</code>.\nSee <code>references/asset-handling.md</code>.</li>\n</ul>\n<h2>7. Cross-import resolution</h2>\n<p>Cross-imports are a code smell, not an absolute prohibition. The right\nstrategy depends on the layer and the situation.</p>\n<h3>Entities layer: prefer boundary merge, @x is last resort</h3>\n<p>Cross-imports in <code>entities</code> are usually caused by splitting entities too\ngranularly. Before reaching for <code>@x</code>, consider whether the boundaries\nshould be merged.</p>\n<p><code>@x</code> is a <strong>necessary compromise, not a recommended approach</strong>. Use it only\nwhen boundaries genuinely cannot be merged, and document why. Overuse locks\nentity boundaries together and increases refactoring cost.</p>\n<h3>Features and widgets: four strategies (A, B, C, D)</h3>\n<p>In <code>features</code> and <code>widgets</code>, choose based on context:</p>\n<ul>\n<li><strong>Strategy A: slice merge.</strong> Two slices always change together → merge.</li>\n<li><strong>Strategy B: push to entities.</strong> A shared domain responsibility → move\nit to the entity that owns it, keep UI in the feature.</li>\n<li><strong>Strategy C: compose from upper layer (IoC).</strong> The parent (pages or app)\nimports both slices and connects them via render props, slots, or DI.</li>\n<li><strong>Strategy D: Public API access.</strong> When reuse is genuinely unavoidable,\nallow it only through the slice's <code>index.ts</code>. Never reach into <code>model/</code>,\n<code>store/</code>, or internal files.</li>\n</ul>\n<p>The <code>@x</code> notation is for the entities layer only. Features and widgets use\nstrategies A through D above.</p>\n<h3>Strictness depends on project context</h3>\n<p>Cross-imports are dependencies that are generally best avoided, but\nsometimes used intentionally. Strictness varies by project context:</p>\n<ul>\n<li><strong>Early-stage products</strong> with heavy experimentation: allowing some\ncross-imports may be a pragmatic speed trade-off.</li>\n<li><strong>Long-lived or regulated systems</strong> (fintech, large-scale services):\nstricter boundaries pay off in maintainability and stability.</li>\n</ul>\n<p>If a cross-import is introduced, treat it as a deliberate choice and\ndocument the reasoning in code (a comment explaining why other strategies\ndo not apply).</p>\n<p>For detailed code examples of each strategy, read\n<code>references/cross-import-patterns.md</code>.</p>\n<h2>8. Segments &amp; structure rules</h2>\n<h3>Standard segments</h3>\n<p>Segments group code within a slice by technical purpose:</p>\n<ul>\n<li><strong><code>ui/</code></strong>: UI components, styles, display-related code</li>\n<li><strong><code>model/</code></strong>: Data models, state stores, business logic, validation</li>\n<li><strong><code>api/</code></strong>: Backend integration, request functions, API-specific types</li>\n<li><strong><code>lib/</code></strong>: Internal utility functions for this slice</li>\n<li><strong><code>config/</code></strong>: Configuration, feature flags</li>\n</ul>\n<h3>Layer structure rules</h3>\n<ul>\n<li><strong>App and Shared</strong>: No slices, organized directly by segments. Segments\nwithin these layers may import from each other.</li>\n<li><strong>Pages, Widgets, Features, Entities</strong>: Slices first, then segments inside\neach slice.</li>\n<li><strong>Slice groups (optional)</strong>: A group folder may contain related slices on\nthe same layer for navigation purposes only. The group has no segments and\nno public API. See <code>references/layer-structure.md</code> for details.</li>\n</ul>\n<h3>File naming within segments</h3>\n<p>Always use domain-based names that describe what the code is about:</p>\n<pre><code>model/user.ts            ← User types + logic + store\nmodel/order.ts           ← Order types + logic + store\napi/fetch-profile.ts     ← Profile fetching\napi/update-settings.ts   ← Settings update\n</code></pre>\n<p>If a segment has only one domain concern, the filename may match the slice\nname (e.g., <code>features/auth/model/auth.ts</code>).</p>\n<h2>9. Shared layer guide</h2>\n<p>Shared contains infrastructure with <strong>no business logic</strong>. It is organized by\nsegments only (no slices). Segments within shared may import from each other.</p>\n<p><strong>Allowed in shared:</strong></p>\n<ul>\n<li><code>ui/</code>: UI kit (Button, Input, Modal, Card)</li>\n<li><code>lib/</code>: Utilities (formatDate, debounce, classnames)</li>\n<li><code>api/</code>: API client, route constants, CRUD helpers, base types</li>\n<li><code>auth/</code>: Auth tokens, login utilities, session management</li>\n<li><code>config/</code>: Environment variables, app settings</li>\n<li>Assets live with the code that uses them, not in an <code>assets/</code> segment.\nSee <code>references/asset-handling.md</code>.</li>\n</ul>\n<p>Shared <strong>may</strong> contain application-aware code: route constants, API\nendpoints, branding assets, and transport types such as <code>ProductDTO</code>.\nIt must <strong>never</strong> hold the business rules an entity or feature owns, nor\nimport from those layers.</p>\n<h2>10. Conditional references</h2>\n<p>Read the following reference files <strong>only</strong> when the specific situation applies.\nDo <strong>not</strong> preload all references.</p>\n<ul>\n<li><p><strong>When reviewing or reorganizing folder and file structure</strong> that already\nexists, deciding what goes inside a layer or slice, deciding where a page\nlayout belongs, routing widget-like code to another layer, or grouping\nclosely related slices into a parent folder for navigation (e.g., \"where\ndoes this folder go\", \"how do I group these payment entities\"):\n→ Read <code>references/layer-structure.md</code></p>\n</li>\n<li><p><strong>When setting up a new project from scratch</strong> (e.g., \"set up an FSD\nproject\", \"start a new app with FSD\"), or when asked whether to add\nentities or features yet, or to show how a structure earns each layer\nover time rather than its finished shape:\n→ Read <code>references/growth-walkthrough.md</code></p>\n</li>\n<li><p><strong>When resolving cross-import issues</strong> between slices on the same layer,\nevaluating the <code>@x</code> pattern, choosing between Strategy A/B/C/D for\nfeatures and widgets, or deciding whether boundaries should be merged:\n→ Read <code>references/cross-import-patterns.md</code></p>\n</li>\n<li><p><strong>When deciding whether to create or remove an entity</strong>, dealing with too\nmany entities, evaluating whether to skip the entities layer entirely,\nplacing CRUD operations, or isolating business contexts to avoid <code>@x</code>\nchains:\n→ Read <code>references/excessive-entities.md</code></p>\n</li>\n<li><p><strong>When deciding where to place static assets</strong> (images, icons, fonts,\nPDFs, stylesheets) for a single slice, for sharing across slices, or\nglobally:\n→ Read <code>references/asset-handling.md</code></p>\n</li>\n<li><p><strong>When migrating</strong> from FSD v2.0 to v2.1, converting a non-FSD codebase to\nFSD, phasing out an existing widgets layer, or deprecating the processes\nlayer:\n→ Read <code>references/migration-guide.md</code></p>\n</li>\n<li><p><strong>When integrating FSD with a specific framework</strong> (Next.js with App Router\nor Pages Router, React Router, Nuxt, Vite, Astro) for wiring routes to\nFSD pages, placing proxy/middleware and instrumentation files,\nstructuring API\nroute handlers, or configuring path aliases:\n→ Read <code>references/framework-integration.md</code></p>\n</li>\n<li><p><strong>When implementing authentication, type definitions, or API request\nhandling</strong> as concrete code within FSD structure (token storage, login\nflow, DTO placement, where a request function lives):\n→ Read <code>references/auth-and-api.md</code></p>\n</li>\n<li><p><strong>When wiring state management</strong> (Redux slices, TanStack Query / React\nQuery, including query factories, infinite scroll, Suspense mode, and\n<code>useMutationState</code>) into FSD structure:\n→ Read <code>references/state-management.md</code></p>\n</li>\n</ul>\n","files":[{"path":"evals/evals.json","sizeBytes":20021,"isText":true},{"path":"evals/README.md","sizeBytes":5387,"isText":true},{"path":"references/asset-handling.md","sizeBytes":6573,"isText":true},{"path":"references/auth-and-api.md","sizeBytes":15793,"isText":true},{"path":"references/cross-import-patterns.md","sizeBytes":14624,"isText":true},{"path":"references/excessive-entities.md","sizeBytes":9042,"isText":true},{"path":"references/framework-integration.md","sizeBytes":16047,"isText":true},{"path":"references/growth-walkthrough.md","sizeBytes":8098,"isText":true},{"path":"references/layer-structure.md","sizeBytes":19776,"isText":true},{"path":"references/migration-guide.md","sizeBytes":13642,"isText":true},{"path":"references/state-management.md","sizeBytes":13980,"isText":true},{"path":"SKILL.md","sizeBytes":22284,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-20T13:52:01.564238Z","sha256":"2C77FF0583F4E0DC17BE3043224BB927B3F11F9172208B9C2F4F4839CDE579FF","sizeBytes":62582},"review":null,"source":{"repositoryUrl":"https://github.com/feature-sliced/skills","path":"feature-sliced-design","license":null,"commit":"fd71da42a89e916f2ced63e5349fd865c87070a6","subtreeSha":"1426878ECF5B063002A68BB6357C6AE9FD690B6B3ACC4D7A5037352F7FB92532","lastSyncedAt":"2026-09-27T20:57:00.394522Z"},"reviewedAt":"2026-09-20T14:00:50.310424Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/feature-sliced/skills/tree/master/feature-sliced-design"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install feature-sliced-skills@llmmart"},{"target":"git","command":"git clone https://github.com/feature-sliced/skills.git"}]}