How the CLI, agent, metastructure, and plugins fit together.
Two design choices set formae apart from traditional infrastructure tooling:
Active components automate work that usually needs manual intervention,
reducing the operational burden on you.
Automatic state management tracks every infrastructure change regardless of
where it came from, and keeps state current so an up-to-date
infrastructure-as-code representation is available on request at any time.
Together they improve maintainability, change tracking, and operational
efficiency across the whole infrastructure lifecycle.
The CLI and API are the front end of the system: a consistent interface for
people and applications to drive the platform. The API currently lives inside the
agent and will be extracted into its own component later. The CLI runs wherever
you need it, on your local machine or on a node in your CI/CD system.
The metastructure is formae’s internal representation that combines your
infrastructure configuration with the operational logic to manage it. It enables:
Active monitoring of infrastructure changes in real time.
Asynchronous application of changes that converge to your desired state.
Complete version history, so you can take any infrastructure state (past or
present), modify it, and apply it to any environment.
Automatic tracking of changes made both inside and outside formae.
Traditional IaC tools store only static configuration. The metastructure holds
both the what (your infrastructure) and the how (the operations to manage it),
which is what lets formae continuously reconcile your actual infrastructure with
your code. This design moves complexity into the agent and keeps the plugins
simple.
The agent is the actively running backend of the platform, responsible for
executing core operations. formae currently supports single-agent operation, with
multi-agent distribution planned for the future.The agent:
Is the central execution engine for platform operations.
Maintains state and handles resource management.
Processes requests from the CLI through the API.
Manages the metastructure implementation.
You can deploy the agent in several ways:
Cloud deployment runs the agent in a cloud account as a service. This is the
standard approach for production.
Local operation runs the agent entirely on a local computer, whether a
developer’s machine or a CI/CD node.
Container or Kubernetes runs the agent in a container, or in a Kubernetes
pod with a few extra prerequisites such as storage.
The agent manages the lifecycle of the technology plugins shipped with formae and
any you implement yourself. Plugins always run as separate processes and are never
embedded.
A single target must be managed by exactly one agent. Two agents managing
overlapping targets conflict: each has its own datastore, which leads to
conflicting discovery, duplicate resource tracking, and unpredictable behaviour.The correct pattern is one agent per target, with multiple team members pointing
their CLIs at the same agent so there is a single source of truth. When you design
targets across agents, make sure no piece of infrastructure is managed by more
than one agent.
The agent uses a datastore for persistence. The implementation varies with your
deployment:
SQLite (default): an embedded database on the agent’s local disk, no setup
required.
Postgres: an external PostgreSQL server, typically managed or highly
available.
Aurora Data API: reaches Aurora through the AWS RDS Data API instead of a
direct connection, so no VPC access is needed.
Microsoft SQL Server: an external SQL Server instance, with SQL or workload
identity authentication.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"formae","colors":{"primary":"#ff8201","light":"#ff8201","dark":"#9c4f00"},"logo":{"light":"https://mintcdn.com/platform-engineering-labs/mNa46DBzXSjV0agT/logo/formae-logo-light.png?fit=max\u0026auto=format\u0026n=mNa46DBzXSjV0agT\u0026q=85\u0026s=8563b5284bd2cf259539ff5e7b9d457f","dark":"https://mintcdn.com/platform-engineering-labs/mNa46DBzXSjV0agT/logo/formae-logo-dark.png?fit=max\u0026auto=format\u0026n=mNa46DBzXSjV0agT\u0026q=85\u0026s=12888995934ece68e08ef7c2c8da99b7"},"favicon":"https://mintcdn.com/platform-engineering-labs/CG7M-6iCStm7YFly/logo/favicon.ico?fit=max\u0026auto=format\u0026n=CG7M-6iCStm7YFly\u0026q=85\u0026s=dbfd5946ac35d39a009c90d67740874a","appearance":{"default":"dark"},"background":{"decoration":"grid","color":{"light":"#f4f5fb","dark":"#05051f"}},"fonts":{"heading":{"family":"Saans","weight":700,"source":"fonts/Saans-Bold.woff2","format":"woff2"},"body":{"family":"Saans","weight":400,"source":"fonts/Saans-Regular.woff2","format":"woff2"}},"styling":{"codeblocks":{"languages":{"custom":["/languages/pkl.json"]}},"latex":true},"banner":{"content":"The formae MCP plugin is now **formae**. Uninstall **formae-mcp** and install **formae**. [Migration steps](/documentation/guides/ai-coding-assistants#migrate-from-formae-mcp).","dismissible":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"platform-engineering-labs","hasAudioNarration":false,"actualSubdomain":"platform-engineering-labs","customDomains":["docs.formae.ai"],"gitSource":{"type":"github","owner":"platform-engineering-labs","repo":"formae-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"5e7fa02b-cbcc-4078-aba0-ba3b5a3518af","liveDeploymentHistoryId":"6ac68da1059039e5661c1ae1","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ac68da1059039e5661c1ae1"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ac68da1059039e5661c1ae1","clientVersion":"0.0.3965","searchFilterCounts":[{"language":"default","tag":"Documentation","count":103},{"language":"default","tag":"Reference","count":59},{"language":"default","tag":"Plugin development","count":34},{"language":"default","tag":"Cloud providers","count":33},{"language":"default","tag":"Guides","count":32},{"language":"default","tag":"Concepts","count":24},{"language":"default","tag":"Get started","count":22},{"language":"default","tag":"Common patterns","count":22},{"language":"default","tag":"CLI","count":16},{"language":"default","tag":"Tutorial","count":16}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":":root{--brand-navy:#02024b;--brand-orange:#ff8201;--brand-orange-deep:#e07301;--brand-sky:#29abe2;--brand-green:#00c153;--brand-radius:12px;--brand-mono:\"Saans Mono\", ui-monospace, SFMono-Regular, Menlo, monospace;--brand-mono-safe:ui-monospace, \"SF Mono\", SFMono-Regular, Menlo, Consolas, monospace;--brand-ink:#0a0a1f;--brand-ink-soft:#494c66;--brand-ink-faint:rgba(2, 2, 75, 0.62);--brand-rail:rgba(255, 255, 255, 0.55);--brand-card:rgba(255, 255, 255, 0.78);--brand-edge:rgba(2, 2, 75, 0.13);--brand-edge-strong:rgba(2, 2, 75, 0.26)}html.dark{--brand-ground:#05051f;--brand-ink:#ffffff;--brand-ink-soft:#cccccc;--brand-ink-faint:rgba(255, 255, 255, 0.55);--brand-rail:rgba(255, 255, 255, 0.03);--brand-card:rgba(255, 255, 255, 0.045);--brand-edge:rgba(255, 255, 255, 0.12);--brand-edge-strong:rgba(255, 255, 255, 0.22)}@font-face{font-family:\"Saans Mono\";src:url(/fonts/SaansMono-Medium.woff2) format(\"woff2\");font-weight:500;font-style:normal;font-display:swap}code,kbd,samp{font-family:var(--brand-mono)}pre,pre code,pre.shiki,pre.shiki code{font-family:var(--brand-mono-safe)}.nav-logo{height:2.625rem!important}.fa-convo{border:1px solid var(--brand-edge);border-radius:var(--brand-radius);background:var(--brand-card);overflow:hidden;margin:1.1rem 0}.fa-convo-head{display:flex;align-items:center;gap:8px;padding:8px 16px;font-family:var(--brand-mono);font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--brand-ink-faint);background:var(--brand-rail);border-bottom:1px solid var(--brand-edge)}.fa-convo-head::before{content:\"\";width:8px;height:8px;border-radius:999px;background:var(--brand-orange)}.fa-turn{display:grid;grid-template-columns:82px 1fr;gap:14px;padding:13px 16px;border-left:3px solid transparent}.fa-turn+.fa-turn{border-top:1px solid var(--brand-edge)}.fa-turn.fa-bot{border-left-color:var(--brand-orange)}.fa-tag{font-family:var(--brand-mono);font-size:11px;letter-spacing:.03em;text-transform:uppercase;font-weight:600;padding-top:2px}.fa-turn.fa-you .fa-tag{color:var(--brand-orange)}.fa-turn.fa-bot .fa-tag{color:var(--brand-ink-faint)}.fa-body{margin:0}@media (max-width:640px){.fa-turn{grid-template-columns:62px 1fr;gap:10px}}.fa-term{border-radius:16px;overflow:hidden;border:1px solid rgba(255,255,255,.1);margin:1.1rem 0;background:#0b0c0e}.fa-term-body{color:#ccc;padding:14px 16px;overflow-x:auto;white-space:nowrap;font-family:var(--brand-mono-safe);font-size:12.5px;line-height:1.1}.fa-term-banner{display:flex;align-items:flex-end;gap:12px;padding:16px 16px 2px}.fa-term-banner img{display:block;width:165px;max-width:55%;height:auto;margin:0!important}.fa-term-ver{font-family:var(--brand-mono-safe);font-size:12.5px;line-height:1;padding-bottom:3.5px;color:rgba(255,255,255,.45)}.fa-term-banner+.fa-term-body{padding-top:6px}.fa-plate img,.fa-plate>div{border-radius:var(--brand-radius)}.fa-plate img{border:1px solid var(--brand-edge)}html.dark .fa-plate img{background:#fff;padding:14px}html:not(.dark) span[style*=\"rgba(255, 130, 1, 0.1)\"]{background:0 0!important}.fa-arch{margin:1.5rem 0}.fa-arch img{width:100%;height:auto}.fa-arch .fa-arch-d,html.dark .fa-arch .fa-arch-l{display:none}.fa-arch img,html.dark .fa-arch .fa-arch-d{display:block}html:not(.dark) .prose a{border-bottom-color:#9c4f00;border-bottom-width:1.5px}html:not(.dark) .prose a:hover{border-bottom-width:2.5px}body,html{overflow-x:clip!important}"}],"page":{"pagePath":"documentation/concepts/architecture","slug":"/documentation/concepts/architecture","pageMetadata":{"title":"Architecture","description":"How the CLI, agent, metastructure, and plugins fit together.","href":"/documentation/concepts/architecture"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"How the CLI, agent, metastructure, and plugins fit together.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={em:`em`,li:`li`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Heading,OptimizedImage,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(`div`,{className:`fa-arch`,children:[_jsx(OptimizedImage,{className:`fa-arch-l`,src:`https://mintcdn.com/platform-engineering-labs/CG7M-6iCStm7YFly/images/concepts/architecture-light.svg?fit=max\u0026auto=format\u0026n=CG7M-6iCStm7YFly\u0026q=85\u0026s=b292c75b8a244a09c1957ab4530adae0`,alt:`The client holds the CLI and MCP side by side as siblings. Both read your infrastructure as code in Pkl, and both call the API inside your infrastructure. The agent contains the API and the metastructure, which holds the datastore. The agent drives three plugins, each of which manages resources such as S3 and IAM, VMs and databases, or routers.`,\"data-og-width\":`820`,width:`820`,\"data-og-height\":`530`,height:`530`,\"data-path\":`images/concepts/architecture-light.svg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/platform-engineering-labs/CG7M-6iCStm7YFly/images/concepts/architecture-light.svg?w=280\u0026fit=max\u0026auto=format\u0026n=CG7M-6iCStm7YFly\u0026q=85\u0026s=49ac231e44f56668879ebe2baa241f5a 280w, https://mintcdn.com/platform-engineering-labs/CG7M-6iCStm7YFly/images/concepts/architecture-light.svg?w=560\u0026fit=max\u0026auto=format\u0026n=CG7M-6iCStm7YFly\u0026q=85\u0026s=4e6e395707d2febabeed3e9e6a9263e3 560w, https://mintcdn.com/platform-engineering-labs/CG7M-6iCStm7YFly/images/concepts/architecture-light.svg?w=840\u0026fit=max\u0026auto=format\u0026n=CG7M-6iCStm7YFly\u0026q=85\u0026s=23dcd95615ae18f16bfc2774e641414e 840w, https://mintcdn.com/platform-engineering-labs/CG7M-6iCStm7YFly/images/concepts/architecture-light.svg?w=1100\u0026fit=max\u0026auto=format\u0026n=CG7M-6iCStm7YFly\u0026q=85\u0026s=55452a786b6301d04327ea852d431736 1100w, https://mintcdn.com/platform-engineering-labs/CG7M-6iCStm7YFly/images/concepts/architecture-light.svg?w=1650\u0026fit=max\u0026auto=format\u0026n=CG7M-6iCStm7YFly\u0026q=85\u0026s=625e3a9c7eb1cd60f602b3d8994ea0c1 1650w, https://mintcdn.com/platform-engineering-labs/CG7M-6iCStm7YFly/images/concepts/architecture-light.svg?w=2500\u0026fit=max\u0026auto=format\u0026n=CG7M-6iCStm7YFly\u0026q=85\u0026s=9f92fc25fea69e2b5136329d7ffb78b7 2500w`}),_jsx(OptimizedImage,{className:`fa-arch-d`,src:`https://mintcdn.com/platform-engineering-labs/CG7M-6iCStm7YFly/images/concepts/architecture-dark.svg?fit=max\u0026auto=format\u0026n=CG7M-6iCStm7YFly\u0026q=85\u0026s=7e21911e281d96cb37466a8b44324d3e`,alt:``,\"data-og-width\":`820`,width:`820`,\"data-og-height\":`530`,height:`530`,\"data-path\":`images/concepts/architecture-dark.svg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/platform-engineering-labs/CG7M-6iCStm7YFly/images/concepts/architecture-dark.svg?w=280\u0026fit=max\u0026auto=format\u0026n=CG7M-6iCStm7YFly\u0026q=85\u0026s=b15c567f9fe04d5dc614d4b04bad3dd6 280w, https://mintcdn.com/platform-engineering-labs/CG7M-6iCStm7YFly/images/concepts/architecture-dark.svg?w=560\u0026fit=max\u0026auto=format\u0026n=CG7M-6iCStm7YFly\u0026q=85\u0026s=c45ffd68e5187e12f5089dac5cdf3c7d 560w, https://mintcdn.com/platform-engineering-labs/CG7M-6iCStm7YFly/images/concepts/architecture-dark.svg?w=840\u0026fit=max\u0026auto=format\u0026n=CG7M-6iCStm7YFly\u0026q=85\u0026s=a8e0445332430db6f464be3f06eca694 840w, https://mintcdn.com/platform-engineering-labs/CG7M-6iCStm7YFly/images/concepts/architecture-dark.svg?w=1100\u0026fit=max\u0026auto=format\u0026n=CG7M-6iCStm7YFly\u0026q=85\u0026s=d87839435d7022be1dfce9fb7726b5a7 1100w, https://mintcdn.com/platform-engineering-labs/CG7M-6iCStm7YFly/images/concepts/architecture-dark.svg?w=1650\u0026fit=max\u0026auto=format\u0026n=CG7M-6iCStm7YFly\u0026q=85\u0026s=fb933fb719255a6ee740e886348f702a 1650w, https://mintcdn.com/platform-engineering-labs/CG7M-6iCStm7YFly/images/concepts/architecture-dark.svg?w=2500\u0026fit=max\u0026auto=format\u0026n=CG7M-6iCStm7YFly\u0026q=85\u0026s=2a786c84231ab6f05f2684f1206f1cc1 2500w`})]}),`\n`,_jsx(_components.p,{children:`Two design choices set formae apart from traditional infrastructure tooling:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Active components`}),` automate work that usually needs manual intervention,\nreducing the operational burden on you.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Automatic state management`}),` tracks every infrastructure change regardless of\nwhere it came from, and keeps state current so an up-to-date\ninfrastructure-as-code representation is available on request at any time.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Together they improve maintainability, change tracking, and operational\nefficiency across the whole infrastructure lifecycle.`}),`\n`,_jsx(Heading,{level:`2`,id:`cli-and-api`,children:`CLI and API`}),`\n`,_jsx(_components.p,{children:`The CLI and API are the front end of the system: a consistent interface for\npeople and applications to drive the platform. The API currently lives inside the\nagent and will be extracted into its own component later. The CLI runs wherever\nyou need it, on your local machine or on a node in your CI/CD system.`}),`\n`,_jsx(Heading,{level:`2`,id:`metastructure`,children:`Metastructure`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.strong,{children:`metastructure`}),` is formae’s internal representation that combines your\ninfrastructure configuration with the operational logic to manage it. It enables:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Active monitoring`}),` of infrastructure changes in real time.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Asynchronous application`}),` of changes that converge to your desired state.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Complete version history`}),`, so you can take any infrastructure state (past or\npresent), modify it, and apply it to any environment.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Automatic tracking`}),` of changes made both inside and outside formae.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Traditional IaC tools store only static configuration. The metastructure holds\nboth the `,_jsx(_components.em,{children:`what`}),` (your infrastructure) and the `,_jsx(_components.em,{children:`how`}),` (the operations to manage it),\nwhich is what lets formae continuously reconcile your actual infrastructure with\nyour code. This design moves complexity into the agent and keeps the plugins\nsimple.`]}),`\n`,_jsx(Heading,{level:`2`,id:`agent`,children:`Agent`}),`\n`,_jsx(_components.p,{children:`The agent is the actively running backend of the platform, responsible for\nexecuting core operations. formae currently supports single-agent operation, with\nmulti-agent distribution planned for the future.`}),`\n`,_jsx(_components.p,{children:`The agent:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Is the central execution engine for platform operations.`}),`\n`,_jsx(_components.li,{children:`Maintains state and handles resource management.`}),`\n`,_jsx(_components.li,{children:`Processes requests from the CLI through the API.`}),`\n`,_jsx(_components.li,{children:`Manages the metastructure implementation.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`You can deploy the agent in several ways:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Cloud deployment`}),` runs the agent in a cloud account as a service. This is the\nstandard approach for production.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Local operation`}),` runs the agent entirely on a local computer, whether a\ndeveloper’s machine or a CI/CD node.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Container or Kubernetes`}),` runs the agent in a container, or in a Kubernetes\npod with a few extra prerequisites such as storage.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`The agent manages the lifecycle of the technology plugins shipped with formae and\nany you implement yourself. Plugins always run as separate processes and are never\nembedded.`}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`A single target must be managed by exactly one agent.`}),` Two agents managing\noverlapping targets conflict: each has its own datastore, which leads to\nconflicting discovery, duplicate resource tracking, and unpredictable behaviour.`]}),_jsx(_components.p,{children:`The correct pattern is one agent per target, with multiple team members pointing\ntheir CLIs at the same agent so there is a single source of truth. When you design\ntargets across agents, make sure no piece of infrastructure is managed by more\nthan one agent.`})]}),`\n`,_jsx(Heading,{level:`2`,id:`datastore`,children:`Datastore`}),`\n`,_jsx(_components.p,{children:`The agent uses a datastore for persistence. The implementation varies with your\ndeployment:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`SQLite`}),` (default): an embedded database on the agent’s local disk, no setup\nrequired.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Postgres`}),`: an external PostgreSQL server, typically managed or highly\navailable.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Aurora Data API`}),`: reaches Aurora through the AWS RDS Data API instead of a\ndirect connection, so no VPC access is needed.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Microsoft SQL Server`}),`: an external SQL Server instance, with SQL or workload\nidentity authentication.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":{"languages":{"custom":["/languages/pkl.json"]}},"config":{},"pageMetadata":{"title":"Architecture","description":"How the CLI, agent, metastructure, and plugins fit together.","href":"/documentation/concepts/architecture"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"CLI and API","slug":"cli-and-api","depth":2,"children":[]},{"title":"Metastructure","slug":"metastructure","depth":2,"children":[]},{"title":"Agent","slug":"agent","depth":2,"children":[]},{"title":"Datastore","slug":"datastore","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/platform-engineering-labs/4ffdbad5874a08d3/posthog.js"],"subdomain":"platform-engineering-labs","siteName":"formae","title":"Architecture - formae","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-08-28T07:02:32.465Z","originalFileLocation":"documentation/concepts/architecture.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"How the CLI, agent, metastructure, and plugins fit together.\">\u003cmeta data-mint-head name=\"application-name\" content=\"formae\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/platform-engineering-labs/ih3MxqvV1WG3EvUf/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/platform-engineering-labs/ih3MxqvV1WG3EvUf/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/platform-engineering-labs/ih3MxqvV1WG3EvUf/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/platform-engineering-labs/ih3MxqvV1WG3EvUf/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/platform-engineering-labs/ih3MxqvV1WG3EvUf/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/platform-engineering-labs/ih3MxqvV1WG3EvUf/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/platform-engineering-labs/ih3MxqvV1WG3EvUf/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/platform-engineering-labs/ih3MxqvV1WG3EvUf/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/platform-engineering-labs/ih3MxqvV1WG3EvUf/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Architecture - formae\">\u003cmeta data-mint-head property=\"og:description\" content=\"How the CLI, agent, metastructure, and plugins fit together.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"formae\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.formae.ai/documentation/concepts/architecture\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://platform-engineering-labs.mintlify.app/_mintlify/api/og/v2?division=How+formae+works\u0026amp;title=Architecture\u0026amp;description=How+the+CLI%2C+agent%2C+metastructure%2C+and+plugins+fit+together.\u0026amp;theme=07768c424fb26f39d157f55a\u0026amp;signature=a6e6064defbf68cb2fc33be9467c7e14a4cf074eec891027e9e31a3d159602ae\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Architecture - formae\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How the CLI, agent, metastructure, and plugins fit together.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://platform-engineering-labs.mintlify.app/_mintlify/api/og/v2?division=How+formae+works\u0026amp;title=Architecture\u0026amp;description=How+the+CLI%2C+agent%2C+metastructure%2C+and+plugins+fit+together.\u0026amp;theme=07768c424fb26f39d157f55a\u0026amp;signature=a6e6064defbf68cb2fc33be9467c7e14a4cf074eec891027e9e31a3d159602ae\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/platform-engineering-labs/ih3MxqvV1WG3EvUf/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"formae\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#ff8201\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.formae.ai/documentation/concepts/architecture\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/documentation/concepts/architecture.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.formae.ai/#organization\",\"name\":\"formae\",\"url\":\"https://docs.formae.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/platform-engineering-labs/mNa46DBzXSjV0agT/logo/formae-logo-light.png?fit=max\u0026auto=format\u0026n=mNa46DBzXSjV0agT\u0026q=85\u0026s=8563b5284bd2cf259539ff5e7b9d457f\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.formae.ai#website\",\"name\":\"formae\",\"url\":\"https://docs.formae.ai\",\"publisher\":{\"@id\":\"https://docs.formae.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.formae.ai/documentation/concepts/architecture#webpage\",\"url\":\"https://docs.formae.ai/documentation/concepts/architecture\",\"name\":\"Architecture\",\"description\":\"How the CLI, agent, metastructure, and plugins fit together.\",\"dateModified\":\"2026-08-28T07:02:32.465Z\",\"isPartOf\":{\"@id\":\"https://docs.formae.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.formae.ai/documentation/concepts/architecture#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.formae.ai/documentation/concepts/architecture#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Concepts\",\"item\":\"https://docs.formae.ai/documentation/concepts/forma\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Architecture\",\"item\":\"https://docs.formae.ai/documentation/concepts/architecture\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.formae.ai/documentation/concepts/architecture#article\",\"headline\":\"Architecture\",\"name\":\"Architecture\",\"description\":\"How the CLI, agent, metastructure, and plugins fit together.\",\"url\":\"https://docs.formae.ai/documentation/concepts/architecture\",\"mainEntityOfPage\":{\"@id\":\"https://docs.formae.ai/documentation/concepts/architecture#webpage\"},\"dateModified\":\"2026-08-28T07:02:32.465Z\",\"publisher\":{\"@id\":\"https://docs.formae.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.formae.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"formae\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"formae","nav":{"global":null,"tabs":[{"tab":"Documentation","groups":[{"group":"Get started","pages":[{"title":"formae documentation","href":"/documentation"},{"title":"Quick start","href":"/documentation/get-started/quickstart"},{"title":"Quick start with formae Cloud","href":"/documentation/get-started/quickstart-cloud"},{"title":"Quick start with an AI assistant","href":"/documentation/get-started/quickstart-ai-assistant"},{"title":"Write your first forma","href":"/documentation/get-started/write-your-first-forma"}]},{"group":"Guides","pages":[{"group":"Set up your tools","pages":[{"title":"Set up Pkl in your editor","href":"/documentation/guides/pkl-ide-support"},{"title":"AI assistants","href":"/documentation/guides/ai-coding-assistants"},{"title":"Read tfvars in a forma","href":"/documentation/guides/tfvars"}]},{"group":"Install and run the agent","pages":[{"title":"Install and run the agent","href":"/documentation/guides/install-agent"},{"title":"Install and run the agent on Azure","href":"/documentation/guides/install-agent-azure"},{"title":"Install and run the agent on GCP","href":"/documentation/guides/install-agent-gcp"},{"title":"Install the agent with Docker","href":"/documentation/guides/install-agent-docker"},{"title":"Install the agent with Helm","href":"/documentation/guides/install-agent-helm"},{"title":"Extend the agent image","href":"/documentation/guides/extend-the-agent-image"},{"title":"Observe the agent","href":"/documentation/guides/observe-the-agent"},{"title":"Manage profiles","href":"/documentation/guides/manage-profiles"}]},{"group":"Manage infrastructure","pages":[{"title":"Create a target","href":"/documentation/guides/create-a-target"},{"title":"Explore your infrastructure","href":"/documentation/guides/explore-your-infrastructure"},{"title":"Bring existing resources under management","href":"/documentation/guides/bring-resources-under-management"},{"title":"Everyday changes","href":"/documentation/guides/everyday-changes"},{"title":"Manage stack policies","href":"/documentation/guides/policies"},{"title":"Rename a resource","href":"/documentation/guides/rename-a-resource"},{"title":"Incidents and recovery","href":"/documentation/guides/incidents-and-recovery"},{"title":"Troubleshoot a failed command","href":"/documentation/guides/troubleshoot-a-failed-command"},{"title":"Repair duplicated map keys","href":"/documentation/guides/repair-duplicated-map-keys"},{"title":"Cancel a running command","href":"/documentation/guides/cancel-a-running-command"},{"title":"Deal with out-of-band changes","href":"/documentation/guides/deal-with-out-of-band-changes"},{"title":"Build self-service infrastructure","href":"/documentation/guides/build-self-service-infrastructure"},{"title":"Reuse infrastructure with modules","href":"/documentation/guides/reuse-with-modules"},{"title":"Run formae in CI/CD","href":"/documentation/guides/cicd"}]}]},{"group":"Concepts","pages":[{"group":"Building blocks","pages":[{"title":"Forma","href":"/documentation/concepts/forma"},{"title":"Stack","href":"/documentation/concepts/stack"},{"title":"Target","href":"/documentation/concepts/target"},{"title":"Resources","href":"/documentation/concepts/resources"},{"title":"Label","href":"/documentation/concepts/label"},{"title":"Properties","href":"/documentation/concepts/properties"},{"title":"Resolvable","href":"/documentation/concepts/resolvable"},{"title":"Values","href":"/documentation/concepts/values"},{"title":"Secrets and generated credentials","href":"/documentation/concepts/secrets"},{"group":"Policies","pages":[{"title":"Policy","sidebarTitle":"Overview","href":"/documentation/concepts/policy"},{"title":"TTL policy","sidebarTitle":"TTL","href":"/documentation/concepts/policies/ttl"},{"title":"Auto-reconcile policy","sidebarTitle":"Auto-reconcile","description":"Automatically re-apply a stack's declared state at a fixed interval, undoing drift.","href":"/documentation/concepts/policies/auto-reconcile"}]}]},{"group":"How formae works","pages":[{"title":"Architecture","href":"/documentation/concepts/architecture"},{"title":"Plugins","description":"How formae extends itself to new infrastructure through separate, independently versioned plugin processes.","href":"/documentation/concepts/plugin"},{"title":"Ways to work with formae","href":"/documentation/concepts/ways-to-work"},{"title":"Apply modes","href":"/documentation/concepts/apply-modes"},{"title":"Synchronization","href":"/documentation/concepts/synchronization"},{"title":"Discovery","href":"/documentation/concepts/discovery"}]}]},{"group":"Reference","pages":[{"group":"CLI","pages":[{"title":"CLI reference","href":"/documentation/reference/cli"},{"title":"formae apply","href":"/documentation/reference/cli/apply"},{"title":"formae destroy","href":"/documentation/reference/cli/destroy"},{"title":"formae status","href":"/documentation/reference/cli/status"},{"title":"formae command","href":"/documentation/reference/cli/command"},{"title":"formae cancel","href":"/documentation/reference/cli/cancel"},{"title":"formae connect","href":"/documentation/reference/cli/connect"},{"title":"formae inventory","href":"/documentation/reference/cli/inventory"},{"title":"formae extract","href":"/documentation/reference/cli/extract"},{"title":"formae eval","href":"/documentation/reference/cli/eval"},{"title":"formae project","href":"/documentation/reference/cli/project"},{"title":"formae plugin","href":"/documentation/reference/cli/plugin"},{"title":"formae profile","href":"/documentation/reference/cli/profile"},{"title":"formae agent","href":"/documentation/reference/cli/agent"},{"title":"formae update","href":"/documentation/reference/cli/update"},{"title":"formae clean","href":"/documentation/reference/cli/clean"}]},{"title":"Configuration","href":"/documentation/reference/configuration"},{"title":"CLI themes","href":"/documentation/reference/themes"},{"title":"Security and networking","href":"/documentation/reference/security-and-networking"},{"title":"Pkl cheatsheet","href":"/documentation/reference/pkl-cheatsheet"},{"group":"Cloud providers","pages":[{"group":"AWS","pages":[{"title":"AWS configuration","href":"/documentation/reference/providers/aws/configuration"},{"group":"Common patterns","pages":[{"title":"Static website (S3 + CloudFront)","href":"/documentation/reference/providers/aws/patterns/static-website-s3-cloudfront"},{"title":"Base VPC networking","href":"/documentation/reference/providers/aws/patterns/base-vpc-networking"},{"title":"CloudFront edge","href":"/documentation/reference/providers/aws/patterns/cloudfront-edge"},{"title":"A self-service database","href":"/documentation/reference/providers/aws/patterns/a-self-service-database"},{"title":"ML platform","href":"/documentation/reference/providers/aws/patterns/ml-platform"},{"title":"Deploy a Lambda","href":"/documentation/reference/providers/aws/patterns/deploy-a-lambda"},{"title":"Deploy an ECS service","href":"/documentation/reference/providers/aws/patterns/deploy-an-ecs-service"},{"title":"Bookstore on EKS","href":"/documentation/reference/providers/aws/patterns/bookstore-on-eks"}]},{"title":"AWS supported resources","href":"/documentation/reference/providers/aws/supported-resources"}]},{"group":"Azure","pages":[{"title":"Azure configuration","href":"/documentation/reference/providers/azure/configuration"},{"group":"Common patterns","pages":[{"title":"Lay down base networking","href":"/documentation/reference/providers/azure/patterns/lay-down-base-networking"},{"title":"Run a PostgreSQL database","href":"/documentation/reference/providers/azure/patterns/run-a-postgresql-database"},{"title":"Provision an AKS cluster","href":"/documentation/reference/providers/azure/patterns/provision-an-aks-cluster"},{"title":"Deploy a virtual machine","href":"/documentation/reference/providers/azure/patterns/deploy-a-virtual-machine"},{"title":"Deploy the bookstore on AKS","href":"/documentation/reference/providers/azure/patterns/deploy-the-bookstore-on-aks"}]},{"title":"Azure supported resources","href":"/documentation/reference/providers/azure/supported-resources"}]},{"group":"GCP","pages":[{"title":"GCP configuration","href":"/documentation/reference/providers/gcp/configuration"},{"group":"Common patterns","pages":[{"title":"Deploy base VPC networking","href":"/documentation/reference/providers/gcp/patterns/deploy-base-vpc-networking"},{"title":"Deploy an HTTP(S) load balancer","href":"/documentation/reference/providers/gcp/patterns/deploy-an-https-load-balancer"},{"title":"Deploy the bookstore on GKE","href":"/documentation/reference/providers/gcp/patterns/deploy-the-bookstore-on-gke"}]},{"title":"GCP supported resources","href":"/documentation/reference/providers/gcp/supported-resources"}]},{"group":"OCI","pages":[{"title":"OCI configuration","href":"/documentation/reference/providers/oci/configuration"},{"group":"Common patterns","pages":[{"title":"Deploy base VCN networking","href":"/documentation/reference/providers/oci/patterns/deploy-base-vcn-networking"},{"title":"Deploy an OKE Kubernetes cluster","href":"/documentation/reference/providers/oci/patterns/deploy-an-oke-kubernetes-cluster"}]},{"title":"OCI supported resources","href":"/documentation/reference/providers/oci/supported-resources"}]},{"group":"Kubernetes","pages":[{"title":"Kubernetes configuration","href":"/documentation/reference/providers/kubernetes/configuration"},{"title":"Kubernetes with installation OIDC","href":"/documentation/reference/providers/kubernetes/oidc"},{"group":"Common patterns","pages":[{"title":"Deploy a Helm chart","href":"/documentation/reference/providers/kubernetes/patterns/deploy-a-helm-chart"},{"title":"Deploy the bookstore webapp","href":"/documentation/reference/providers/kubernetes/patterns/deploy-the-bookstore-webapp"},{"title":"Deploy a Crossplane control plane","href":"/documentation/reference/providers/kubernetes/patterns/deploy-a-crossplane-control-plane"},{"title":"Deploy the LGTM observability stack","href":"/documentation/reference/providers/kubernetes/patterns/deploy-the-lgtm-observability-stack"}]},{"title":"Kubernetes supported resources","href":"/documentation/reference/providers/kubernetes/supported-resources"}]}]},{"title":"Plugin catalog","href":"/documentation/reference/plugin-catalog"},{"title":"Release notes","href":"/documentation/reference/release-notes"}]}]},{"tab":"Plugin development","pages":[{"title":"Plugin development","href":"/plugin-development"}]}]},"title":"Architecture - formae","buildId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","deploymentId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","dynamics":["10e4515597","a74be98ba7"],"chunks":["BannerMarkdown-cfwQA_n9.js","dist-2LoAhjKH.js","lib--scc4DXi.js","lib-B8HbPgcC.js","clsx-DZLdJUrt.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","zoom-image-lightbox-CaUwvYH3.js","lightbox-handle-r17bVUz3.js"]}