Frontend architecture
Skill nimadorostkar/Claude-Skills-collection/skills/frontend/frontend-architecture
Use when structuring a frontend codebase. Covers module and folder organization, state boundaries, data-fetching layers, build configuration, and keeping a large application navigable.From its SKILL.md
npx -y skills add nimadorostkar/Claude-Skills-collection --skill frontend-architectureAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 26 days oldThe repository was created 26 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 23 stars23 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
4.8 KB, ~1.0k tokens by cl100k_base, as published. Nobody here has run it
Frontend Architecture
Purpose
Structure a frontend so that a new engineer can find the code for a feature in under a minute, and so that changing one feature does not require touching five others.
When to Use
- Starting a new frontend application.
- A codebase where features are scattered across
components/,utils/,hooks/, andtypes/. - Deciding where state belongs and what owns data fetching.
- Setting up a monorepo or splitting a large application.
Capabilities
- Feature-based organization and module boundaries.
- State layering: server cache, global client state, feature state, component state.
- Data-access layer design and API client structure.
- Build configuration, code splitting, and bundle budgets.
- Monorepo structure and shared package design.
Inputs
- The application's feature set and team structure.
- Current pain: where changes ripple, what is hard to find.
- Build tooling and deployment target.
Outputs
- A folder structure organized by feature, not by file type.
- Explicit rules for what may import what.
- Bundle budgets enforced in CI.
Workflow
- Organize by feature, not by kind —
features/checkout/containing its components, hooks, api, and types beatscomponents/,hooks/,api/each containing a slice of every feature. - Draw the import rules — Features may import from
shared/. Features may not import from each other; if two need the same thing, it moves toshared/. Enforce this with a lint rule, not a convention document. - Layer the state deliberately — Server data in a query cache. Genuinely global client state (theme, session) in one store. Everything else stays local. Most "global state" is server state in disguise.
- Centralize the API client — One place that knows about base URLs, auth headers, error mapping, and retries. Feature code calls typed functions, not
fetch. - Budget the bundle — Set a size limit per route and fail the build when it is exceeded. Bundle size regresses one dependency at a time.
Best Practices
- A
utils/folder is where code goes to be forgotten. If a function belongs to a feature, keep it in the feature. - Barrel files (
index.tsre-exporting everything) defeat tree-shaking and create import cycles. Import from the source module. - Route-level code splitting is nearly free and pays for itself immediately. Component-level splitting rarely does.
- Do not put server data in a global store. It has staleness, refetch, and error semantics that a store does not model — you will rebuild a query library, badly.
- A shared component library inside the app is fine. Extracting it into a package before a second consumer exists is premature.
- Keep the dependency count low. Every dependency is bundle weight, a supply-chain risk, and a future migration.
Examples
Feature-based structure with enforced boundaries:
src/
app/ # routing, providers, global layout
features/
checkout/
components/ # only used by checkout
api/ # checkout endpoints, typed
model/ # checkout state and domain types
index.ts # the feature's public surface
orders/
account/
shared/
ui/ # design-system primitives
api/ # http client, auth, error mapping
lib/ # genuinely cross-cutting helpers
// eslint.config.js — the boundary is enforced, not merely documented.
{
rules: {
"import/no-restricted-paths": ["error", {
zones: [{
target: "./src/features/*",
from: "./src/features/*",
message: "Features must not import each other. Move shared code to src/shared.",
}],
}],
},
}
A bundle budget that fails the build:
{
"bundlesize": [
{ "path": "dist/assets/index-*.js", "maxSize": "180 kB", "compression": "brotli" },
{ "path": "dist/assets/checkout-*.js", "maxSize": "90 kB", "compression": "brotli" }
]
}
Notes
- The single most effective architectural rule in a frontend codebase is "features may not import each other". It is trivially enforceable and prevents the coupling that makes large frontends unchangeable.
- Analyze the bundle before optimizing it.
vite-bundle-visualizerorsource-map-explorerwill usually show one date library or one icon set accounting for a third of the payload. - Monorepos solve a versioning problem between packages. If you have one application, a monorepo is overhead with no corresponding benefit.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.