Create elements with proper naming (PascalCase kinds, camelCase vars), required metadata (technology, description), and correct hierarchy.
Answer with a usable, repo-aligned declaration first.
Default flow:
If the user asks “what should I model?”, do not respond with routing alone when you can already give the declaration.
technology, description, tags, links, icons, or metadataDo not use for relationship arrows or view design — use create-relationship and design-view.
If the system boundary itself is still unclear, hand off to c4-modeling-process after giving the minimal element recommendation.
Check these in this order:
read-project-summary) or the project config/model filesprojects/shared/SPEC_CHEATSHEET.mdprojects/shared/spec-context.c4, spec-containers.c4, spec-components.c4, spec-deployment.c4Example projects help with inspiration, but they are not the semantic source of truth for kinds or tags.
When the prompt is concrete, answer in this order:
tag, link, icon, metadata)| Layer | Typical kinds used here |
|---|---|
| Context | Actor_Person, Actor_Staff, Actor_Admin, System_New, System_Existing, System_Legacy, System_External |
| Containers | Container_Api, Container_Webapp, Container_Queue, Container_Database, Container_ObjectStorage, Container_Directory, Container_Loadbalancer, Container_FileServer |
| Components | Component |
| Deployment | Node_Environment, Zone, Node_Vm, Node_App, Infra_Fw |
Use the exact shared spelling/case. For example: Container_Api, not Container_API.
model {
ingestionApi = Container_Api 'Ingestion API' {
technology 'Node.js, Fastify'
description 'Receives uploaded files and starts the ingestion workflow.'
}
}
model {
virusScanProvider = System_External 'Virus Scan Provider' {
technology 'HTTPS API'
description 'Third-party malware scanning service used before file acceptance.'
}
}
If the prompt also asks for arrows or views, still lead with the element declarations, then route:
create-relationshipdesign-viewwrite-rich-descriptionsmodel-deployment-infrastructure| Topic | Rule |
|---|---|
| Kind naming | Exact declared Category_Subtype PascalCase (Container_Api, Node_Vm) |
| Variable naming | camelCase (ingestionApi, prodUploadVm) |
| Description | Required for all elements; explain purpose and responsibilities |
| Technology | Expected for systems/containers/components/nodes when it is known; always include it for containers, components, and deployment nodes |
| Tags | Reuse declared tags with exact spelling/case only when they add operational meaning beyond the kind |
| Metadata | Optional; add only if someone will filter/query it |
| Hierarchy | System → Container → Component and Environment → Zone → VM → App |
| New kinds | Last resort only; check shared specs first and ask before introducing one |
Prefer an existing shared kind over a one-off local kind.
Container_Api for a new internal APISystem_External for a vendor platformContainer_UploadOrchestrator for a single service when Container_Api or another declared kind already fitsContainer_MockApi just to distinguish a test double from productionmodel {
ingestionApi = Container_Api 'Ingestion API' {
technology 'Node.js, Fastify'
description """
Receives upload requests and starts the ingestion workflow.
**Responsibilities:**
- validate upload metadata
- persist accepted jobs for downstream processing
"""
}
}
model {
primaryDatabase = Container_Database 'Primary Database' {
technology 'PostgreSQL 15'
description 'Stores canonical application data.'
icon tech:postgresql
link https://www.postgresql.org/docs/ 'PostgreSQL documentation'
}
}
Use icon namespaces such as tech:, aws:, gcp:, azure: only when they help the view.
Stay useful anyway:
projects/shared/SPEC_CHEATSHEET.md and projects/shared/spec-*.c4likec4.config.json and nearby model filesread-project-summary, search-element, read-element)Do not become generic just because MCP is unavailable; use the repository taxonomy you can already see.
Use Context7 /likec4/likec4 only when syntax remains unclear after reading local files, especially for:
technology, description, link, icon)❌ guessed kinds such as Container_API, Component_Service, Node_VM
❌ answering only with “use another skill” when a minimal declaration is already possible
❌ creating a new kind instead of reusing an existing shared kind
❌ using tags to repeat what the kind already says
❌ placing containers outside their system or apps outside their VM hierarchy
Return a concrete declaration that is ready to paste, with minimal but sufficient documentation and the correct parent placement.