Enforce Vertical Slice Architecture (VSA) when building applications in any language (Go, .NET/C#, Java, Kotlin, TypeScript, Python, etc.) and any type (web API, mobile backend, CLI, event-driven). Organize code by feature/use-case instead of technical layers. Each feature is a self-contained vertical slice with a single entry point that receives the router/framework handle and its dependencies. Use when the user says "vertical slice architecture", "VSA", "organize by feature", "feature-based a…
Enforce Vertical Slice Architecture (VSA) when building applications in any language (Go, .NET/C#, Java, Kotlin, TypeScript, Python, etc.) and any type (web API, mobile backend, CLI, event-driven).
Organize code by feature/use-case instead of technical layers.
Each feature is a self-contained vertical slice with a single entry point that receives the router/framework handle and its dependencies.
Use when the user says "vertical slice architecture", "VSA", "organize by feature", "feature-based architecture", "slice architecture", or when building a new app or feature and the project already follows VSA conventions.
Also use when reviewing or refactoring code to align with VSA principles.
Similar popular skills
Related neighbors and high-traction skills in the same topics — useful to compare before installing.
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
Claude CodeNot declared
CursorNot declared
CodexNot declared
GitHub CopilotNot declared
WindsurfNot declared
Gemini CLINot declared
ClineNot declared
OpenCodeNot declared
Repository health
Stars3
LicenseLICENSE
Default branchmain
Open issues0
Status
Active
Skill metadata
Parsed from SKILL.md frontmatter.
Version1.0.3
Package contents
Files included with this skill beyond the listing page.
skill mdSKILL.md5,380 B
docsSUMMARY.md730 B
History
First seen on skills.sh
First recorded snapshot · 300 installs
SKILL.md
Vertical Slice Architecture
Quick Reference: The 5 Rules
One feature = one directory containing handler, request/response types, validation, and tests
One entry point per feature — a setup/registration function that receives the router and dependencies. Name varies by convention (Setup, RegisterRoute, Map); the role is the invariant, not the name.
Minimize coupling between slices, maximize coupling within a slice
No premature abstractions — no shared repository/service layers until genuine duplication emerges across multiple slices
Test each feature primarily through its entry point, verifying outcomes (DB state, API calls, response). Platform/adapter tests are also encouraged.
Only extract when genuine duplication emerges across multiple slices (use judgment — the "3+ slices" heuristic is guidance, not a hard rule):
Duplicate business rule: extract to a domain entity/value object
Duplicate data access pattern: extract to a shared repository (only for that specific pattern)
Duplicate HTTP helper: extract to platform/httpx/
Key Decisions by Language
Detect the project's language/framework and consult the appropriate reference:
Patterns per language: See [references/patterns-by-language.md](references/patterns-by-language.md) for Go, .NET, Java, TypeScript, Python
Testing per language: See [references/testing.md](references/testing.md) for testcontainers, mock verification, integration test patterns
Core principles: See [references/principles.md](references/principles.md) for detailed rules, anti-patterns, and shared domain model guidance
Single Entry Point Contract
Every feature exposes one primary setup/registration function. Internal types stay private. The entry point name is conventional — the invariant is: one public function per feature that wires the slice to the framework.
Go — convention Setup or RegisterRoute; signature func Setup(r gin.IRoutes, repo Repository); DI via explicit params.
.NET — convention Map (static); signature static void Map(IEndpointRouteBuilder app); DI container resolves deps in handler.
Java/Kotlin — @RestController class discovered by component scan; Spring DI (constructor injection).
TypeScript — convention setup; signature function setup(router: Router, db: Database): void; DI via explicit params.
Python — convention setup; signature def setup(router: APIRouter, db: Database) -> None; DI via explicit params or Depends().
Exceptions: Versioned APIs may have SetupV1/SetupV2 wrappers sharing internal handler wiring. Frameworks with auto-discovery (Spring, NestJS) use the controller/module class itself as the entry point.
Testing
See [references/testing.md](references/testing.md) for full testing strategy per language, including feature integration tests, platform/adapter tests, mock verification patterns, and test naming conventions.