Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
full-statck-skills avatar

Ddd Architecture Awesome

  • 13 installs
  • 1 repo stars
  • Updated July 29, 2026
  • full-statck-skills/ddd-skills

Entry-point guide to Domain-Driven Design concepts, applicability assessment, complexity ladder, core patterns, and anti-patterns.

About

Serves as the entry point to DDD, explaining concepts, when DDD fits, the complexity ladder, and core Entity/ValueObject/Aggregate patterns. A developer uses it to understand DDD basics and decide whether to adopt it.

  • DDD applicability assessment and complexity ladder
  • Core concepts and anti-patterns with fixes

Ddd Architecture Awesome by the numbers

  • 13 all-time installs (skills.sh)
  • Ranked #3,516 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
  • Data as of Jul 30, 2026 (Skillselion catalog sync)
npx skills add https://github.com/full-statck-skills/ddd-skills --skill ddd-architecture-awesome

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs13
repo stars1
Last updatedJuly 29, 2026
Repositoryfull-statck-skills/ddd-skills

What it does

Entry-point guide to Domain-Driven Design concepts, applicability assessment, complexity ladder, core patterns, and anti-patterns.

Files

SKILL.mdMarkdownGitHub ↗

DDD Architecture Awesome

The entry point to the DDD Skills ecosystem. This skill provides everything needed to understand DDD, decide if it's right for your project, and chart your learning path — all in one place.

When to Use (and When NOT to)

✅ Use When❌ Skip When
Complex business domain with many rulesSimple CRUD, few business rules
Long-lived system (years of maintenance)Prototype, MVP, throwaway code
Team of 5+ developersSolo developer or small team (1-2)
Multiple entry points (API, CLI, events)Single entry point, simple API
Need to swap infrastructure (DB, broker)Fixed infrastructure, unlikely to change
High test coverage requiredQuick scripts, internal tools
Chinese enterprise Spring Boot + MyBatis stackAlready using established architecture that works

Start simple. Evolve complexity only when needed. Most systems don't need full CQRS or Event Sourcing.

When to trigger this skill

ALWAYS use this skill when the user mentions:

  • "What is DDD", "Explain DDD", "DDD 是什么", "介绍一下 DDD"
  • "Domain-Driven Design", "领域驱动设计"
  • "DDD basics", "DDD fundamentals", "DDD 基础", "DDD 入门"
  • "Should I use DDD", "DDD 适用场景", "DDD 是否适合"
  • "DDD vs CRUD", "DDD vs traditional", "DDD 对比"
  • "DDD concepts", "DDD 概念"
  • "Strategic design DDD", "Tactical design DDD", "DDD 战略设计", "DDD 战术设计"
  • "When to apply DDD", "When DDD is appropriate"
  • Questions about DDD architecture types and their differences
  • New to DDD and seeking guidance on where to start

---

1. DDD Definition

Domain-Driven Design is a development methodology that brings complex business rules into domain models: first define business boundaries (Strategic Design), then encode rules into models (Tactical Design).

Key insight: DDD is not about technology — it's about aligning your code with how the business thinks.

---

2. DDD Applicability Decision Tree

Evaluate along these dimensions and provide a "Suitable / Cautious / Not Recommended" conclusion:

DimensionSuitable (✓)Cautious (~)Not Recommended (✗)
Business ComplexityComplex rules, state machines, cross-team coordinationSome business rules, mostly simplePure CRUD, data entry
LifecycleLong-lived, continuous evolutionMedium-term, some iterationShort-term, disposable
Team MaturityDedicated domain expert, stable PMGeneral business knowledgeNo domain knowledge
Engineering CapabilityStrong test/observability, event-driven readyBasic CI/CD, some testingNo testing infrastructure

Decision Flowchart

Is business logic complex (rules, state machines, constraints)?
├── NO → Is system long-lived (> 2 years)?
│         ├── NO → ✗ DDD NOT RECOMMENDED (Use simple CRUD + Service)
│         └── YES → ~ Cautious: adopt tactical patterns selectively
│
└── YES → Is there a domain expert or stable product owner?
          ├── NO → ~ Cautious: DDD without domain expert = complex code for nothing
          └── YES → Is the team familiar with DDD or willing to learn?
                    ├── NO → ~ Cautious: start with Layered, evolve later
                    └── YES → Do you need to swap infrastructure (DB, MQ)?
                              ├── NO → ✓ DDD RECOMMENDED (COLA or Layered)
                              └── YES → ✓ DDD STRONGLY RECOMMENDED (Hexagonal/Clean)

---

3. Complexity Ladder — Don't Skip Levels

Each level adds real complexity. Move up only when you've proven the current level insufficient.

Level 1: Simple Layered (Controller → Service → Repository)
   ↓ When business rules grow complex and need explicit modeling
Level 2: DDD 4-Layer with Rich Domain Model (Layered)
   ↓ When need multiple entry points (REST + CLI + MQ + gRPC)
Level 3: Ports & Adapters (Hexagonal Architecture)
   ↓ When read/write patterns diverge significantly
Level 4: CQRS — Separate Read/Write Models
   ↓ When need complete audit trail / temporal queries
Level 5: Event Sourcing — Store events, derive state

Your project Level: ___ (Recommend with reasoning)

---

4. Pattern Boundaries — What Each Pattern IS and IS NOT

This table solves the most common DDD confusion: "What's the difference between these patterns, and when should I use each one?"

PatternPrimary QuestionUse It ForDo NOT Treat As
DDDHow do we model a complex business domain?Ubiquitous language, bounded contexts, aggregates, value objectsA folder structure by itself
Hexagonal ArchitectureHow does the application interact with the outside world?Ports, driver adapters, driven adapters, testable application coreA mandate for six sides or one exact package layout
Clean ArchitectureWhich direction should dependencies point?Inward dependency rule, use case boundaries, framework independenceA universal four-folder template
Onion ArchitectureHow do we keep the domain model central?Domain-centered layers and dependency inversionA separate requirement when Clean/Hexagonal already solve the problem
COLA v5How do we standardize DDD in enterprise Java teams?Diamond architecture, scaffolding, automated architecture validationA silver bullet for all projects
Layered ArchitectureHow do we introduce DDD incrementally?4-layer separation, minimal disruption to existing 3-layer projectsA permanent destination (evolve when ready)
CQRSDo reads and writes need different models?Bounded contexts with divergent read/write workloadsA default application architecture
Event SourcingDo we need state from a complete event history?Audit trails, temporal queries, replayable workflowsA persistence default for CRUD systems

---

5. DDD Architecture Landscape Overview

DDD Architecture Family:

  Foundational (Learning cost: Low → Medium):
  ├── Layered Architecture (分层架构)
  │   └── Classic 4-layer: Interface → Application → Domain ← Infrastructure
  │       1-5 people | CRUD-friendly | Spring Boot native
  │
  ├── Onion Architecture (洋葱架构)
  │   └── Domain core, concentric dependency rings, inner defines interface
  │       5-15 people | High testability | Frequent infra changes
  │
  ├── Hexagonal Architecture (六边形架构 / Ports & Adapters)
  │   └── Domain at center, ports define contracts, adapters implement
  │       5-15 people | Multi-entry systems | Best testability
  │
  Advanced (Learning cost: Medium → High):
  ├── Clean Architecture (整洁架构)
  │   └── Entities → Use Cases → Interface Adapters → Frameworks
  │       15-50 people | Enterprise systems | Strict module isolation
  │
  └── COLA Architecture (COLA v5 架构)
      └── Diamond pattern: Adapter → App → Domain ← Infrastructure
          5-50 people | Chinese enterprise | Best tooling & community

  Complementary Patterns:
  ├── CQRS — Separate read/write models (L1: Model only / L2: DB separation / L3: Event Sourcing)
  ├── Domain Events — Cross-aggregate eventual consistency
  └── Event Sourcing — Store events as source of truth

Architecture Visual Comparison

Layered        Onion        Hexagonal      Clean          COLA v5
┌────────┐   ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐
│Interf. │   │ Infra    │  │ Adapter  │  │ Frame.   │  │ Adapter  │
├────────┤   │ ┌──────┐ │  ├──────────┤  ├──────────┤  ├──────────┤
│  App   │   │ │ App  │ │  │  Ports   │  │ Adapter  │  │   App    │
├────────┤   │ │┌────┐│ │  ├──────────┤  ├──────────┤  ├──────────┤
│ Domain │   │ ││Dom.││ │  │ Domain ★ │  │ Domain ★ │  │ Domain ★ │
├────────┤   │ ││ ★  ││ │  └──────────┘  └──────────┘  ├──────────┤
│ Infra  │   │ │└────┘│ │                              │ Infra    │
└────────┘   │ └──────┘ │                              └──────────┘
             └──────────┘

---

6. Core DDD Concepts Quick Reference

6.1 Strategic Design (战略设计)

ConceptDefinitionKey Point
Bounded ContextA boundary within which a domain model is consistentEach context has its own ubiquitous language
Ubiquitous LanguageA shared language between developers and domain expertsUsed in code, conversations, and documentation
Context MappingRelationships between bounded contextsPartnership, Shared Kernel, Customer-Supplier, ACL, OHS
Core DomainThe most important part of the businessInvest the most effort here
SubdomainSupporting or generic business capabilitiesCore / Supporting / Generic

6.2 Tactical Design (战术设计)

PatternPurposeKey Rule
EntityObject with identity that persistsEquality by ID, not attributes
Value ObjectImmutable data defined by attributesEquality by value, no setters
AggregateConsistency boundaryOne aggregate = one transaction
Aggregate RootSingle entry point to aggregateOnly root referenced externally
RepositoryPersistence abstractionOne repository per aggregate
Domain ServiceStateless cross-entity logicWhen logic doesn't fit any entity
Domain EventRecord of meaningful changePast tense naming (OrderPaid)
FactoryComplex object creationWhen constructor isn't enough
SpecificationComposable business ruleAND/OR/NOT combinable

6.3 Quick Decision Trees

"Where does this code go?"
Where does this code go?
├─ Pure business logic, no I/O           → domain/
├─ Orchestrates domain + has side effects → application/
├─ Talks to external systems              → infrastructure/
├─ Defines HOW to interact (interface)    → port (domain or application)
└─ Implements a port                      → adapter (infrastructure)
"Entity or Value Object?"
Entity or Value Object?
├─ Has unique identity that persists → Entity
├─ Defined only by its attributes    → Value Object
├─ "Is this THE same thing?"         → Entity (identity comparison)
└─ "Does this have the same value?"  → Value Object (structural equality)
"Should this be its own Aggregate?"
Aggregate boundaries?
├─ Must be consistent together in a transaction → Same aggregate
├─ Can be eventually consistent                 → Separate aggregates
├─ Referenced by ID only                        → Separate aggregates
└─ >10 entities in aggregate                    → Split it

Rule: One aggregate per transaction. Cross-aggregate consistency via domain events (eventual consistency).

---

7. Rich Domain Model vs Anemic CRUD (Critical Distinction)

// ❌ Anemic Model (Anti-Pattern) — Data bag + Service
@Entity
public class Order {
    private Long id;
    private String status;       // String instead of Value Object
    // Only getters/setters, NO behavior
}

@Service
public class OrderService {       // God Service with all logic
    @Transactional
    public void pay(Long orderId) {
        Order order = orderRepo.findById(orderId);
        if ("DRAFT".equals(order.getStatus())) {  // Raw string comparison
            order.setStatus("PAID");
            orderRepo.save(order);
        }
    }
}

// ✅ Rich Domain Model (DDD) — Behavior WITH data
public class Order extends AggregateRoot<OrderId> {
    private OrderStatus status;      // Value Object
    private Money totalAmount;
    private List<OrderItem> items;

    public void pay() {              // Behavior in entity
        if (!status.canPay()) {
            throw new OrderException("Cannot pay in current status");
        }
        this.status = OrderStatus.PAID;
        addDomainEvent(new OrderPaidEvent(this.id));
    }
}

Aggregate Sizing Heuristics

MetricHealthyWarningAction
Entities per aggregate1-56-10>10: Split
Lines of code (root)<500500-1000>1000: Split
Transaction lock time<100ms100-500ms>500ms: Split
Concurrent modification conflictsRareOccasionalFrequent: Split

---

8. Anti-Patterns (CRITICAL — with Fixes)

Anti-PatternProblemFix
Anemic Domain ModelEntities are data bags, logic in servicesMove behavior INTO entities
Repository per TableBreaks aggregate boundariesOne repository per AGGREGATE
Leaking InfrastructureDomain imports DB/HTTP librariesDomain has ZERO external dependencies
God AggregateToo many entities, slow transactionsSplit into smaller aggregates
Skipping Use CasesControllers call repositories directlyRoute through application use cases
CRUD ThinkingModeling data, not behaviorModel business operations
Premature CQRSAdding complexity before neededStart simple, evolve
Cross-Aggregate TXMultiple aggregates in one transactionUse domain events for consistency
DDD without Domain ExpertArchitecture without business insightDDD without experts = complex code
Framework-First ThinkingChoosing tech before understanding domainDomain first, technology second

---

9. Implementation Order (Universal)

1. Discover the Domain — Event Storming, conversations with domain experts
2. Model the Domain — Entities, value objects, aggregates (NO infrastructure)
3. Define Ports — Repository interfaces, external service interfaces
4. Implement Use Cases — Application services coordinating domain
5. Add Adapters LAST — HTTP, database, messaging implementations

DDD is collaborative. Modeling sessions with domain experts are as important as code patterns.

---

10. How to Use This Skill

Step 1: Understand user context

Ask about: project nature, business complexity, team structure, current state.

Step 2: Assess DDD applicability

Run through the decision tree (Section 2) and output:

  • Suitable: Proceed to architecture selection
  • Cautious: Recommend selective adoption
  • Not Recommended: Explain why, prevent over-engineering

Step 3: Recommend learning path

User TypeRecommended Path
DDD Noviceawesome → selector → (architecture Skill) → code-reviewer
Architect/Tech Leadselector → (architecture Skill) → domain-designer → doc
Migrating to DDDawesome → selector → (architecture Skill) → reviewer → evaluator
Layeredselector → architecture-layered → domain-designer
Onionselector → architecture-onion → domain-designer
Hexagonalselector → architecture-hexagonal → domain-designer + api-designer
Cleanselector → architecture-clean → domain-designer
COLAselector → architecture-cola → domain-designer → api-designer
Needs CQRSselector → cqrs-architecture (standalone or embedded in architecture)
Microservices + Eventsselector → (architecture Skill) → cqrs-architecture → api-designer
Code Reviewcode-reviewer (standalone)
Architecture Evalevaluator (periodic)
Architecture Docdoc (standalone, read existing code)
Event Storming Workshopevent-storming (standalone or paired with domain-designer)
Testing Strategytesting-strategist (standalone or paired with architecture Skill)
DevOps Integrationdevops-integration (paired with CI/CD pipeline)

Step 4: Output format

Always structure response with: 1. 适用性评估 (Applicability Assessment) — clear conclusion + reasoning per dimension 2. DDD 核心概念速览 (Core Concepts Quick Reference) — tailored to context 3. 推荐学习路径 (Recommended Learning Path) — which skills, what order

---

11. Sources

Primary Sources — Original Papers & Books

Primary Pattern References

Implementation Guides

Supplemental Syntheses

Chinese Resources (中文资源)

Reference Implementations by Language

LanguageRepositoryArchitecture
Javathombergs/buckpalClean Architecture
Javaalibaba/COLACOLA v5
Gobxcodec/go-clean-archClean Architecture
Rustflosse/clean-architecture-with-rustClean Architecture
Pythoncdddg/py-clean-archClean Architecture
TypeScriptjbuget/nodejs-clean-architecture-appClean Architecture
.NETjasontaylordev/CleanArchitectureClean Architecture

---

Reference Library(按需加载)

This skill bundles a structured reference library organized by learning path. Each file is loaded only on demand — when the agent identifies the need.

How to use these references

When a user asks a question, find the matching category below and read the relevant file(s). Do NOT load all references at once.

User asks about...Load this file
"Why DDD?", "Should I use DDD?", "DDD vs CRUD"references/01-strategic/01-why-ddd.md
"What is a domain / subdomain?", "Core vs Generic vs Supporting"references/01-strategic/02-domain-and-subdomain.md
"What is bounded context?", "How to split bounded contexts?", "Context mapping"references/01-strategic/03-bounded-context.md
"Entity vs Value Object", "When to use Entity / VO?", "Equality patterns"references/02-tactical/01-entity-and-value-object.md
"How to design aggregates?", "Aggregate design principles", "Aggregate boundaries"references/02-tactical/02-aggregate-design.md
"Deep dive: aggregate design process", "5 steps from event storming to aggregate"references/02-tactical/03-aggregate-deep-dive.md
"Domain events explained", "How to use events for decoupling", "Event bus, Event Sourcing"references/02-tactical/04-domain-events.md
"DDD building blocks", "Naming conventions", "Aggregate size metrics"references/02-tactical/05-building-blocks.md
"All DDD tactical patterns explained", "Repository, Factory, Specification patterns"references/02-tactical/06-tactical-concepts.md
"Clean Architecture tactical reference (original source)"references/02-tactical/07-clean-tactical-reference.md
"Compare DDD architectures", "Which architecture to choose?", "Layered vs Hexagonal vs Clean"references/03-architecture/01-comparison.md
"Is DDD right for my project?", "DDD applicability decision matrix", "Real-world scenarios"references/03-architecture/02-decision-matrix.md
"DDD layered architecture in detail", "4-layer responsibilities, strict vs loose layering", "Three-tier to DDD migration"references/03-architecture/03-layered-architecture-detail.md
"Architecture deep dive", "DDD + Hexagonal + Clean + COLA explained in depth"references/03-architecture/04-architecture-deep-dive.md
"Four-layer architecture reference", "Domain/Application/Infrastructure/Presentation code templates"references/03-architecture/05-clean-layers-reference.md
"Hexagonal architecture reference", "Ports & Adapters code examples"references/03-architecture/06-clean-hexagonal-reference.md
"Strategic DDD reference (original source)", "Bounded contexts, context mapping"references/03-architecture/07-clean-strategic-reference.md
"Quick cheatsheet", "Pattern boundaries, layer summary, decision trees"references/04-quick-ref/01-cheatsheet.md
"DDD mindmap — complete knowledge system panorama", "Strategy, tactics, architecture, process, principles, implementation"references/04-quick-ref/02-ddd-mindmap.md
"Event Storming workshop methodology", "6-step workshop process, facilitator guide", "How to run DDD discovery"references/05-implementation/01-event-storming-workshop.md
"Domain-to-code object mapping", "How to map domain objects to code objects", "Mapping table template"references/05-implementation/02-domain-to-code-mapping.md
"Microservice code model structure", "Directory layout, package conventions, layered code"references/05-implementation/03-code-model-structure.md
"Service and data collaboration in layers", "DO/DTO/VO/PO transformation chain", "Strict layering service calls"references/05-implementation/04-service-data-collaboration.md
"Microservice boundaries and evolution", "Logical/physical/code boundaries", "How to evolve architecture safely"references/05-implementation/05-boundaries-and-evolution.md
"Middle platform (中台) design with DDD", "Platform vs Middle Platform, 5-step modeling", "Top-down vs bottom-up strategy"references/06-enterprise/01-middle-platform-design.md
"Microservice design principles and strategies", "Strangler vs Repairer pattern", "4 design principles"references/06-enterprise/02-microservice-design-principles.md
"Distributed architecture FAQ", "10 key questions: sharding, CDC, caching, BFF, multi-DC"references/06-enterprise/03-distributed-architecture-faq.md

End-to-End Examples

Examples differ from references: references teach concepts and principles; examples demonstrate application in concrete business contexts with real code. Load these when the user wants to see DDD applied to a realistic scenario.

Business ScenarioWhat it demonstratesWhen to load
Attendance SystemFull workflow: event storming → aggregate design → service identification → code structure. Includes non-typical aggregate handling."Show me a complete DDD example", "Walk through DDD end-to-end", "考勤 DDD 案例"
E-Commerce OrderCore order domain: aggregate design with Order/OrderItem, value objects (Money, OrderStatus), domain events, complete layered code."E-commerce DDD example", "Order aggregate design", "电商 DDD 案例"
Insurance PolicyComplex aggregate design: entity vs VO decisions, invariants enforcement, domain service for cross-entity logic."Insurance DDD example", "Complex aggregate design", "保险 DDD 案例"
Principle: "Don't apply DDD everywhere. Apply it where it matters."

>

After this, use ddd-architecture-selector to choose the right architecture pattern, then dive into domain modeling with ddd-domain-designer and implementation with the specific architecture skill.

---

Gotchas — Common Pitfalls

  • "DDD = COLA" 误解: DDD 不是等于 COLA 框架。COLA 只是阿里体系中一种落地方案。还有 Layered、Onion、Hexagonal、Clean 等多种架构可选。根据项目实际需求选择。
  • 一上来就搞 CQRS + Event Sourcing: 绝大多数项目不需要 Event Sourcing。先评估是否真的需要完整审计追踪和时间旅行查询。从最简单的分层架构开始。
  • 把 DDD 当银弹: DDD 适合复杂业务领域,对于简单 CRUD 项目反而是过度设计。判断标准:业务规则 > CRUD 操作,有领域专家参与,需要长期维护。
  • 战术设计先于战略设计: 直接写 Entity/ValueObject 而不先做 Bounded Context 划分。没有战略边界的战术设计会导致上下文混乱和模型冲突。
  • 领域专家参与不足: DDD 需要领域专家持续参与。开发人员凭自己对业务的理解建模,产出的模型很可能偏离真实业务。

When NOT to Use This Skill

❌ Skip✅ Use Instead
Already know DDD wellJump to architecture-selector
Just need architecture comparisonarchitecture-selector (faster)
Want code immediately, not conceptsPick an Architecture Skill directly
Building a simple prototypeSkip DDD, use simple Spring Boot MVC
Existing project with working architecturearchitecture-evaluator (assess if DDD needed)

Security & Stability

  • All code examples and concept illustrations are for educational purposes. They contain no real credentials or sensitive data.
  • This skill teaches DDD methodology and patterns. It does not execute code, access external systems, or modify any project files.
  • DDD's bounded context isolation naturally promotes security boundaries between different parts of the system.
  • No executable scripts bundled. This skill is a pure learning and reference resource.

🧭 DDD Skills Journey

📍 You are here: `ddd-architecture-awesome` — Step 1: DDD 入门与全景
flowchart LR
    S1["⭐ Step 1<br/>awesome<br/>入门与全景"] --> S2["Step 2<br/>selector<br/>架构选型"]
    S2 --> S3A["Step 3<br/>layered<br/>分层架构"]
    S2 --> S3B["Step 3<br/>onion<br/>洋葱架构"]
    S2 --> S3C["Step 3<br/>hexagonal<br/>六边形架构"]
    S2 --> S3D["Step 3<br/>clean<br/>整洁架构"]
    S2 --> S3E["Step 3<br/>cola<br/>COLA v5"]
    S3A & S3B & S3C & S3D & S3E --> S4A["Step 4<br/>domain-designer<br/>领域建模"]
    S3A & S3B & S3C & S3D & S3E --> S4B["Step 4<br/>cqrs-architecture<br/>CQRS"]
    S3A & S3B & S3C & S3D & S3E --> S4C["Step 4<br/>api-designer<br/>API设计"]
    S4A & S4B & S4C --> S5["Step 5<br/>code-reviewer<br/>代码审查"]
    S5 --> S6A["Step 6<br/>event-storming<br/>事件风暴"]
    S5 --> S6B["Step 6<br/>testing-strategist<br/>测试策略"]
    S5 --> S6C["Step 6<br/>devops-integration<br/>DevOps"]
    S5 --> S6D["Step 6<br/>evaluator<br/>架构评估"]
    S6A & S6B & S6C & S6D --> S7["🏁 Step 7<br/>architecture-doc<br/>架构文档"]

    style S1 fill:#10b981,stroke:#059669,color:white,stroke-width:3px

← Previous: 你已经在 DDD 旅程的起点 🚀 → Next: selector — 选择适合你项目的架构模式 🔗 Related: domain-designer — 直接开始领域建模 | event-storming — 先做事件风暴工作坊 🏠 Home: 你在起点

💡 你是第一次接触 DDD?读完 Section 4 的 Pattern Boundaries 表和 Section 6 的核心概念速查,然后去 selector 选架构。

📋 See DESIGN.md for the complete 16-skill ecosystem map.

Related skills

Backend & APIsbackenddocs

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.