with one click
designing-architecture
// Guides software architecture decisions, design patterns, and system design principles. Use when designing systems, choosing patterns, or making architectural decisions.
// Guides software architecture decisions, design patterns, and system design principles. Use when designing systems, choosing patterns, or making architectural decisions.
Guides systematic project analysis, codebase exploration, and architecture pattern recognition. Use when understanding new codebases, onboarding to projects, or investigating system structure.
Guides REST and GraphQL API design, endpoint patterns, request/response schemas, versioning, and API best practices. Use when building APIs, designing endpoints, or reviewing API contracts.
Guides test strategy, TDD/BDD approaches, test coverage planning, and testing best practices. Use when designing test suites, improving coverage, or choosing testing approaches.
Guides git workflows, branching strategies, commit conventions, and version control best practices. Use when managing repositories, creating branches, or handling merges.
Guides performance optimization, profiling techniques, and bottleneck identification. Use when improving application speed, reducing resource usage, or diagnosing performance issues.
CRITICAL skill for executing multiple Task tool calls in a SINGLE message for true parallelism. Essential for efficient multi-task workflows, subagent coordination, and maximizing throughput.
| name | designing-architecture |
| description | Guides software architecture decisions, design patterns, and system design principles. Use when designing systems, choosing patterns, or making architectural decisions. |
| license | MIT |
| compatibility | opencode |
| metadata | {"category":"design","audience":"developers"} |
Principles and patterns for designing maintainable, scalable, and robust software systems.
| Principle | Summary | Violation Sign |
|---|---|---|
| Single Responsibility | One reason to change | Class does too many things |
| Open/Closed | Open for extension, closed for modification | Modifying existing code for new features |
| Liskov Substitution | Subtypes replaceable for base types | Overrides break parent behavior |
| Interface Segregation | Small, focused interfaces | Classes implement unused methods |
| Dependency Inversion | Depend on abstractions | High-level modules depend on low-level |
Outer layers depend on inner layers, NEVER the reverse.
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Frameworks & Drivers ā ā Database, Web, UI
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā Interface Adapters ā ā Controllers, Presenters, Gateways
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā Application Business Rules ā ā Use Cases
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā Enterprise Business Rules ā ā Entities
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Dependencies point INWARD only.
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Presentation Layer ā ā UI, API Controllers
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā Application Layer ā ā Use Cases, Services
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā Domain Layer ā ā Business Logic, Entities
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā Infrastructure Layer ā ā Database, External APIs
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Use when: Traditional applications, clear separation needed Avoid when: High-performance needs, event-driven systems
āāāāāāāāāāāāāāāāā
ā Primary ā
ā Adapters ā ā REST API, CLI, GraphQL
āāāāāāāāā¬āāāāāāāā
ā
āāāāāāāāāāāā¼āāāāāāāāāāā
ā ā
ā āāāāāāāāāāāāā ā
ā ā Core ā ā
Primary ā ā Domain ā ā Secondary
Ports ā ā Logic ā ā Ports
ā āāāāāāāāāāāāā ā
ā ā
āāāāāāāāāāāā¬āāāāāāāāāāā
ā
āāāāāāāāā¼āāāāāāāā
ā Secondary ā
ā Adapters ā ā Database, Message Queue, External API
āāāāāāāāāāāāāāāāā
Use when: Testability is critical, multiple interfaces needed Avoid when: Simple CRUD applications
āāāāāāāāāāā āāāāāāāāāāā āāāāāāāāāāā
ā Service ā ā Service ā ā Service ā
ā A ā ā B ā ā C ā
āāāāāā¬āāāāā āāāāāā¬āāāāā āāāāāā¬āāāāā
ā ā ā
āāāāāāāāāāāāāā“āāāāāāāāāāāāā
ā
āāāāāāāā¼āāāāāāā
ā Message ā
ā Bus ā
āāāāāāāāāāāāāāā
Use when: Independent scaling, team autonomy, polyglot needs Avoid when: Small teams, simple domains, tight coupling required
Event Source ā Event Bus ā Event Handlers
ā ā ā
ā¼ ā¼ ā¼
Produces Routes Events Consumes
Events (Kafka, RabbitMQ) Events
Use when: Async processing, decoupling, audit trails Avoid when: Immediate consistency required, simple workflows
| Pattern | Purpose | When to Use |
|---|---|---|
| Factory | Create objects without specifying class | Object creation logic is complex |
| Builder | Construct complex objects step-by-step | Many optional parameters |
| Singleton | Single instance globally | Shared resource (use sparingly) |
| Dependency Injection | Inject dependencies externally | Testability, loose coupling |
| Pattern | Purpose | When to Use |
|---|---|---|
| Adapter | Convert interface to another | Integrating incompatible systems |
| Decorator | Add behavior dynamically | Extending functionality without inheritance |
| Facade | Simplified interface to complex system | Hiding complexity |
| Repository | Abstract data access | Separating domain from persistence |
| Pattern | Purpose | When to Use |
|---|---|---|
| Strategy | Interchangeable algorithms | Multiple ways to do something |
| Observer | Notify dependents of changes | Event systems, reactive updates |
| Command | Encapsulate actions as objects | Undo/redo, queuing, logging |
| Chain of Responsibility | Pass request along handlers | Middleware, validation chains |
| Concept | Definition | Example |
|---|---|---|
| Bounded Context | Explicit boundary for a domain model | Order context, Shipping context |
| Ubiquitous Language | Shared vocabulary between devs and domain experts | "Order", "Line Item", "Fulfillment" |
| Context Map | How bounded contexts relate | Customer shared between Sales and Support |
| Pattern | Purpose | Example |
|---|---|---|
| Entity | Object with identity | User, Order |
| Value Object | Object without identity | Money, Address |
| Aggregate | Cluster of entities with root | Order + LineItems |
| Domain Event | Something that happened | OrderPlaced, PaymentReceived |
| Repository | Collection-like access to aggregates | OrderRepository |
| Domain Service | Logic that doesn't fit entities | PricingService |
| Pattern | Description | Trade-off |
|---|---|---|
| Horizontal Scaling | Add more instances | Statelessness required |
| Vertical Scaling | Bigger machines | Hardware limits |
| Caching | Store computed results | Cache invalidation |
| Database Sharding | Split data across DBs | Query complexity |
| Read Replicas | Separate read/write | Eventual consistency |
| CDN | Edge content delivery | Static content only |
| Pattern | Purpose | Implementation |
|---|---|---|
| Circuit Breaker | Prevent cascade failures | Fail fast when downstream is down |
| Retry with Backoff | Handle transient failures | Exponential delay between retries |
| Bulkhead | Isolate failures | Separate thread pools per dependency |
| Timeout | Bound waiting time | Max wait for responses |
| Fallback | Graceful degradation | Default behavior when service unavailable |
| Pattern | Consistency | Use When |
|---|---|---|
| ACID Transactions | Strong | Financial data, critical operations |
| Saga | Eventual | Distributed transactions |
| Event Sourcing | Eventual | Audit trails, complex state |
| CQRS | Eventual | Different read/write models |
| Need | Recommended | Avoid |
|---|---|---|
| Relational data, ACID | PostgreSQL, MySQL | MongoDB |
| Document storage, flexible schema | MongoDB, DynamoDB | Relational |
| Key-value, high speed | Redis, Memcached | Relational |
| Time series | InfluxDB, TimescaleDB | Generic SQL |
| Graph relationships | Neo4j, Neptune | Relational (for complex) |
| Search | Elasticsearch, Meilisearch | Full table scans |
| Need | Pattern |
|---|---|
| Async processing | Queue (SQS, RabbitMQ) |
| Event broadcasting | Pub/Sub (SNS, Kafka) |
| Task scheduling | Delayed queues |
| Load leveling | Queue with workers |
| Event sourcing | Log-based (Kafka) |
# ADR-001: [Title]
## Status
[Proposed | Accepted | Deprecated | Superseded by ADR-XXX]
## Context
[Why is this decision needed?]
## Decision
[What is the decision?]
## Consequences
### Positive
- [Benefit 1]
- [Benefit 2]
### Negative
- [Trade-off 1]
- [Trade-off 2]
## Alternatives Considered
1. [Alternative 1] - [Why rejected]
2. [Alternative 2] - [Why rejected]
Before finalizing an architecture decision, verify:
SOLID:
S - Single Responsibility
O - Open/Closed
L - Liskov Substitution
I - Interface Segregation
D - Dependency Inversion
PATTERNS:
Layered ā Simple, clear separation
Hexagonal ā Testable, adaptable
Microservices ā Scalable, independent
Event-Driven ā Decoupled, async
DDD BUILDING BLOCKS:
Entity, Value Object, Aggregate
Repository, Domain Event, Domain Service
SCALABILITY:
Horizontal scaling, Caching, Sharding, CDN
RESILIENCE:
Circuit Breaker, Retry, Bulkhead, Timeout