diff --git a/.github/banner.png b/.github/banner.png
new file mode 100644
index 0000000..8b56b05
Binary files /dev/null and b/.github/banner.png differ
diff --git a/.github/banner.svg b/.github/banner.svg
new file mode 100644
index 0000000..a06e3ae
--- /dev/null
+++ b/.github/banner.svg
@@ -0,0 +1,28 @@
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 76802c0..a0101d3 100644
--- a/README.md
+++ b/README.md
@@ -1,26 +1,21 @@
-
+
-@smooai/deploy
-
- Deploy a smooth-operator agent two ways from one package — SST v4 constructs for AWS serverless, and a Helm chart + ArgoCD for Kubernetes.
+
+
+
-
-
-
+
- Features ·
- Install ·
- Usage ·
- Platform
+ Features · Install · Usage · Platform
---
@@ -118,37 +113,34 @@ Defaults are sensible: the WebSocket route table covers `$connect`, `$disconnect
## 📖 Architecture — one agent, two deploy paths
```mermaid
-flowchart TB
- SRC["smooth-operator (Rust agent)"]
-
- subgraph aws["AWS serverless · SmoothAgentApi (SST v4)"]
- WSAPI[API Gateway WebSocket]
- LAM["Rust Lambda
provided.al2023 / arm64"]
- DDB[(DynamoDB single table)]
- S3[(S3 blob bucket)]
- VEC[(S3 Vectors index)]
- SEC[gateway-key Secret]
- WSAPI --> LAM
- LAM --> DDB
- LAM --> S3
- LAM --> VEC
- LAM --> SEC
- end
-
- subgraph k8s["Kubernetes / self-host · smooth-operator Helm chart"]
- ING[WebSocket Ingress]
- DEP[axum /ws Deployment]
- PG[("pgvector Postgres
external")]
- ARGO[ArgoCD Application]
- ING --> DEP
- DEP --> PG
- ARGO -.->|syncs| DEP
- end
-
- SRC -->|cargo lambda artifact| LAM
- SRC -->|container image| DEP
- LAM -.->|OpenAI-compatible| GW[(LLM gateway)]
- DEP -.->|OpenAI-compatible| GW
+%%{init: {'theme':'base','themeVariables':{
+ 'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52',
+ 'lineColor':'#7c8aa0','secondaryColor':'#0b1426','tertiaryColor':'#0b1426','fontFamily':'ui-sans-serif, system-ui, sans-serif',
+ 'clusterBkg':'#0b1426','clusterBorder':'#22304a'}}}%%
+flowchart LR
+ SRC["smooth-operator
Rust agent"]
+
+ subgraph aws["AWS serverless · SmoothAgentApi"]
+ LAM["Rust Lambda"]
+ STORE[("Dynamo · S3 · Vectors")]
+ LAM --> STORE
+ end
+
+ subgraph k8s["Kubernetes · Helm + ArgoCD"]
+ DEP["axum /ws"]
+ PG[("pgvector Postgres")]
+ DEP --> PG
+ end
+
+ SRC -->|lambda artifact| LAM
+ SRC -->|container image| DEP
+ LAM -.->|OpenAI-compatible| GW[("LLM gateway")]
+ DEP -.->|OpenAI-compatible| GW
+
+ classDef warm fill:#f49f0a,stroke:#ff6b6c,color:#1a0f00;
+ classDef teal fill:#00a6a6,stroke:#00c2c2,color:#011;
+ class SRC warm
+ class STORE,PG,GW teal
```
The same agent ships as a Lambda artifact (serverless) or a container image (k8s). Both speak the same WebSocket protocol and call the same OpenAI-compatible LLM gateway — you pick the runtime, not the agent.
@@ -163,18 +155,19 @@ Infra you can't `cargo test` still has to be verified. This package proves corre
- **Deployed via CI, never locally** — local deploys can ship unintended changes; the pipeline owns `sst deploy` / `argocd sync`.
```mermaid
+%%{init: {'theme':'base','themeVariables':{
+ 'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52',
+ 'lineColor':'#7c8aa0','secondaryColor':'#0b1426','tertiaryColor':'#0b1426','fontFamily':'ui-sans-serif, system-ui, sans-serif',
+ 'clusterBkg':'#0b1426','clusterBorder':'#22304a'}}}%%
flowchart TD
- J["LLM-as-judge evals (engine)
multi-turn quality, scored 0–5"]
- E["kind-cluster smoke (CI)
render → apply → schedules"]
- C["Conformance
helm lint + helm template + ArgoCD app"]
- U["Construct typecheck
sst install → tsc --noEmit"]
-
- J --> E --> C --> U
-
- style U fill:#1f7a3d,stroke:#0d3,color:#fff
- style C fill:#2563eb,stroke:#08f,color:#fff
- style E fill:#7c3aed,stroke:#a0f,color:#fff
- style J fill:#b45309,stroke:#f90,color:#fff
+ U["Construct typecheck
sst install → tsc"] --> C["Conformance
helm lint + template"]
+ C --> E["kind-cluster smoke
render → apply"]
+ E --> J["LLM-as-judge evals
multi-turn, scored 0–5"]
+
+ classDef warm fill:#f49f0a,stroke:#ff6b6c,color:#1a0f00;
+ classDef teal fill:#00a6a6,stroke:#00c2c2,color:#011;
+ class U teal
+ class J warm
```
Verify locally (no AWS creds, no deploy):
@@ -233,13 +226,12 @@ See [`helm/smooth-operator/README.md`](helm/smooth-operator/README.md) for the p
## 🧩 Part of Smoo AI {#part-of-smoo-ai}
-`@smooai/deploy` is part of the [Smoo AI](https://smoo.ai) platform — an AI-powered business platform with AI built into every product. It packages the deploy primitives behind the rest of the stack:
+`@smooai/deploy` is built and open-sourced by **[Smoo AI](https://smoo.ai)** — the AI-powered business platform with AI built into every product: CRM, customer support, campaigns, field service, observability, and developer tools.
-- [smooth-operator](https://github.com/SmooAI/smooth-operator) — the agent service this deploys
-- [smooth-operator-core](https://github.com/SmooAI/smooth-operator-core) — the Rust engine
-- [smooth](https://github.com/SmooAI/smooth) — the Smoo AI CLI (`th`) and orchestration platform
-- [chat-widget](https://github.com/SmooAI/chat-widget) — the embeddable widget
-- [**lom.smoo.ai**](https://lom.smoo.ai) — hosted agent service
+- 🧰 **More open source from Smoo AI** — [smoo.ai/open-source](https://smoo.ai/open-source)
+- 🤖 **The agent this deploys** — [smooth-operator](https://github.com/SmooAI/smooth-operator) · [smooth-operator-core](https://github.com/SmooAI/smooth-operator-core) (Rust engine)
+- 🧩 **Sibling packages** — [smooth](https://github.com/SmooAI/smooth) (the `th` CLI), [chat-widget](https://github.com/SmooAI/chat-widget)
+- ☁️ **Hosted** — [lom.smoo.ai](https://lom.smoo.ai) runs the smooth-operator service for you
## 🤝 Contributing