From 4ffcfc6a1f3dd034b3a0e36279a4777dbb452e2b Mon Sep 17 00:00:00 2001 From: Andrey Cheptsov Date: Fri, 7 Aug 2026 15:21:32 +0200 Subject: [PATCH] Minor updates to docs and README - Refresh the README news list through 0.21.0 - Promote Presets to a top-level Concepts nav item and add it to the configuration lists (README + docs index, now consistent) - Point the landing and docs banners at the Presets concept page - Replace the docs/README architecture diagram with the prebuilt light/dark SVG pair served from dstackai/static-assets; the landing keeps the HTML/CSS component as the source for regeneration - Drop the now-unused legacy diagram CSS and arch-logos copies Co-Authored-By: Claude Fable 5 --- README.md | 29 +-- mkdocs.yml | 4 +- mkdocs/assets/images/arch-logos/amd.webp | Bin 49704 -> 0 bytes mkdocs/assets/images/arch-logos/aws.svg | 38 ---- mkdocs/assets/images/arch-logos/deepseek.svg | 1 - mkdocs/assets/images/arch-logos/docker.svg | 1 - mkdocs/assets/images/arch-logos/gcp.svg | 9 - mkdocs/assets/images/arch-logos/glm.svg | 5 - .../assets/images/arch-logos/huggingface.svg | 7 - mkdocs/assets/images/arch-logos/kimi.svg | 1 - .../assets/images/arch-logos/kubernetes.svg | 16 -- mkdocs/assets/images/arch-logos/lambda.svg | 1 - mkdocs/assets/images/arch-logos/meta.svg | 19 -- mkdocs/assets/images/arch-logos/nebius.svg | 14 -- mkdocs/assets/images/arch-logos/nvidia.svg | 1 - mkdocs/assets/images/arch-logos/pytorch.svg | 12 -- mkdocs/assets/images/arch-logos/qwen.svg | 4 - mkdocs/assets/images/arch-logos/runpod.svg | 3 - mkdocs/assets/images/arch-logos/sglang.svg | 1 - .../assets/images/arch-logos/tenstorrent.svg | 23 --- mkdocs/assets/images/arch-logos/vllm.svg | 1 - mkdocs/assets/stylesheets/cloudscape-docs.css | 166 ++---------------- mkdocs/docs/index.md | 22 ++- mkdocs/overrides/main.html | 2 +- .../src/components/ArchitectureDiagram.tsx | 9 +- website/src/components/SiteBanner.tsx | 6 +- 26 files changed, 53 insertions(+), 342 deletions(-) delete mode 100644 mkdocs/assets/images/arch-logos/amd.webp delete mode 100644 mkdocs/assets/images/arch-logos/aws.svg delete mode 100644 mkdocs/assets/images/arch-logos/deepseek.svg delete mode 100644 mkdocs/assets/images/arch-logos/docker.svg delete mode 100644 mkdocs/assets/images/arch-logos/gcp.svg delete mode 100644 mkdocs/assets/images/arch-logos/glm.svg delete mode 100644 mkdocs/assets/images/arch-logos/huggingface.svg delete mode 100644 mkdocs/assets/images/arch-logos/kimi.svg delete mode 100644 mkdocs/assets/images/arch-logos/kubernetes.svg delete mode 100644 mkdocs/assets/images/arch-logos/lambda.svg delete mode 100644 mkdocs/assets/images/arch-logos/meta.svg delete mode 100644 mkdocs/assets/images/arch-logos/nebius.svg delete mode 100644 mkdocs/assets/images/arch-logos/nvidia.svg delete mode 100644 mkdocs/assets/images/arch-logos/pytorch.svg delete mode 100644 mkdocs/assets/images/arch-logos/qwen.svg delete mode 100644 mkdocs/assets/images/arch-logos/runpod.svg delete mode 100644 mkdocs/assets/images/arch-logos/sglang.svg delete mode 100644 mkdocs/assets/images/arch-logos/tenstorrent.svg delete mode 100644 mkdocs/assets/images/arch-logos/vllm.svg diff --git a/README.md b/README.md index b1e616f1b9..3a9f91bae6 100644 --- a/README.md +++ b/README.md @@ -23,18 +23,20 @@ It streamlines development, training, and inference, and is compatible with any `dstack` supports `NVIDIA`, `AMD`, `Google TPU`, and `Tenstorrent` accelerators out of the box. ## Latest news ✨ -- [2026/04] [dstack 0.20.17: PD disaggregation, Kubernetes volumes](https://github.com/dstackai/dstack/releases/tag/0.20.17) -- [2026/04] [dstack 0.20.16: Performance, SSH proxy](https://github.com/dstackai/dstack/releases/tag/0.20.16) -- [2026/03] [dstack 0.20.13: Exports, Templates](https://github.com/dstackai/dstack/releases/tag/0.20.13) -- [2026/02] [dstack 0.20.12: Crusoe](https://github.com/dstackai/dstack/releases/tag/0.20.12) -- [2026/02] [dstack 0.20.8: Skills](https://github.com/dstackai/dstack/releases/tag/0.20.8) -- [2025/12] [dstack 0.20.0: Fleet-first UX, Events, and more](https://github.com/dstackai/dstack/releases/tag/0.20.0) +- [2026/08] [dstack 0.21.0: Pydantic v2, Gateway replicas](https://github.com/dstackai/dstack/releases/tag/0.21.0) +- [2026/07] [dstack 0.20.29: Presets — agent-driven inference optimization (experimental)](https://dstack.ai/docs/concepts/presets/) +- [2026/07] [dstack 0.20.27: Slurm backend](https://github.com/dstackai/dstack/releases/tag/0.20.27) +- [2026/05] [dstack 0.20.21: Kubernetes multiple clusters](https://github.com/dstackai/dstack/releases/tag/0.20.21) +- [2026/05] [dstack 0.20.20: NVIDIA Dynamo integration](https://github.com/dstackai/dstack/releases/tag/0.20.20) +- [2026/04] [dstack 0.20.17: Kubernetes volumes](https://github.com/dstackai/dstack/releases/tag/0.20.17) +- [2026/02] [dstack 0.20.10: PD disaggregation support](https://github.com/dstackai/dstack/releases/tag/0.20.10) +- [2026/01] [dstack 0.20.7: Replica groups](https://github.com/dstackai/dstack/releases/tag/0.20.7) ## How does it work? - - + + ### Launch the server @@ -101,11 +103,12 @@ AI agents like Claude, Codex, and Cursor can now create and manage fleets and su `dstack` supports the following configurations: -* [Fleets](https://dstack.ai/docs/concepts/fleets) — for managing cloud and on-prem clusters -* [Dev environments](https://dstack.ai/docs/concepts/dev-environments) — for interactive development using a desktop IDE -* [Tasks](https://dstack.ai/docs/concepts/tasks) — for scheduling jobs (incl. distributed jobs) or running web apps -* [Services](https://dstack.ai/docs/concepts/services) — for deployment of models and web apps (with auto-scaling and authorization) -* [Volumes](https://dstack.ai/docs/concepts/volumes) — for managing persisted volumes +* [Fleets](https://dstack.ai/docs/concepts/fleets) — Provision and manage clusters across clouds, Kubernetes, and on-prem +* [Dev environments](https://dstack.ai/docs/concepts/dev-environments) — Launch dev environments to be accessed by agents or from your IDE +* [Tasks](https://dstack.ai/docs/concepts/tasks) — Run training, batch or other jobs across a single node or clusters +* [Services](https://dstack.ai/docs/concepts/services) — Deploy model inference as secure and scalable endpoints +* [Presets](https://dstack.ai/docs/concepts/presets) — Agent-driven inference optimization (experimental) +* [Volumes](https://dstack.ai/docs/concepts/volumes) — Managing instance and network volumes for persisting data Configuration can be defined as YAML files within your repo. diff --git a/mkdocs.yml b/mkdocs.yml index efde929f51..89cd591efc 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -297,9 +297,9 @@ nav: - Dev environments: docs/concepts/dev-environments.md - Tasks: docs/concepts/tasks.md - Services: docs/concepts/services.md - - Volumes: docs/concepts/volumes.md + - Presets: docs/concepts/presets.md - More: - - Presets: docs/concepts/presets.md + - Volumes: docs/concepts/volumes.md - Gateways: docs/concepts/gateways.md - Secrets: docs/concepts/secrets.md - Projects: docs/concepts/projects.md diff --git a/mkdocs/assets/images/arch-logos/amd.webp b/mkdocs/assets/images/arch-logos/amd.webp deleted file mode 100644 index a53f88bfc5f8343497f0706180ee448e3add4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49704 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%0A*{L1T;V0c?`B|6JM1XZD-U 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 RMuC4@LH>*V!2UxH^gkPkNZ$Ye diff --git a/mkdocs/assets/images/arch-logos/aws.svg b/mkdocs/assets/images/arch-logos/aws.svg deleted file mode 100644 index 80192a12d8..0000000000 --- a/mkdocs/assets/images/arch-logos/aws.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - diff --git a/mkdocs/assets/images/arch-logos/deepseek.svg b/mkdocs/assets/images/arch-logos/deepseek.svg deleted file mode 100644 index 3c9d00e9b0..0000000000 --- a/mkdocs/assets/images/arch-logos/deepseek.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/mkdocs/assets/images/arch-logos/docker.svg b/mkdocs/assets/images/arch-logos/docker.svg deleted file mode 100644 index dfbafd12bb..0000000000 --- a/mkdocs/assets/images/arch-logos/docker.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/mkdocs/assets/images/arch-logos/gcp.svg b/mkdocs/assets/images/arch-logos/gcp.svg deleted file mode 100644 index b8478f1f93..0000000000 --- a/mkdocs/assets/images/arch-logos/gcp.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/mkdocs/assets/images/arch-logos/glm.svg b/mkdocs/assets/images/arch-logos/glm.svg deleted file mode 100644 index 0638057dbb..0000000000 --- a/mkdocs/assets/images/arch-logos/glm.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/mkdocs/assets/images/arch-logos/huggingface.svg b/mkdocs/assets/images/arch-logos/huggingface.svg deleted file mode 100644 index cab717b750..0000000000 --- a/mkdocs/assets/images/arch-logos/huggingface.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - Huggingface Streamline Icon: https://streamlinehq.com - - Hugging Face - - diff --git a/mkdocs/assets/images/arch-logos/kimi.svg b/mkdocs/assets/images/arch-logos/kimi.svg deleted file mode 100644 index 8f95bd7fc8..0000000000 --- a/mkdocs/assets/images/arch-logos/kimi.svg +++ /dev/null @@ -1 +0,0 @@ -Kimi diff --git a/mkdocs/assets/images/arch-logos/kubernetes.svg b/mkdocs/assets/images/arch-logos/kubernetes.svg deleted file mode 100644 index 140c74aab4..0000000000 --- a/mkdocs/assets/images/arch-logos/kubernetes.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - Logo Kubernetes Streamline Icon: https://streamlinehq.com - - - - - - - - - - - - - diff --git a/mkdocs/assets/images/arch-logos/lambda.svg b/mkdocs/assets/images/arch-logos/lambda.svg deleted file mode 100644 index 6143f02db0..0000000000 --- a/mkdocs/assets/images/arch-logos/lambda.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/mkdocs/assets/images/arch-logos/meta.svg b/mkdocs/assets/images/arch-logos/meta.svg deleted file mode 100644 index ac4cdd3f5a..0000000000 --- a/mkdocs/assets/images/arch-logos/meta.svg +++ /dev/null @@ -1,19 +0,0 @@ - - -Logo of Meta Platforms -- Graphic created by Detmar Owen - - - - - - - - - - - - - - - - diff --git a/mkdocs/assets/images/arch-logos/nebius.svg b/mkdocs/assets/images/arch-logos/nebius.svg deleted file mode 100644 index 55a25a6b2c..0000000000 --- a/mkdocs/assets/images/arch-logos/nebius.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/mkdocs/assets/images/arch-logos/nvidia.svg b/mkdocs/assets/images/arch-logos/nvidia.svg deleted file mode 100644 index 7514d0ed39..0000000000 --- a/mkdocs/assets/images/arch-logos/nvidia.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/mkdocs/assets/images/arch-logos/pytorch.svg b/mkdocs/assets/images/arch-logos/pytorch.svg deleted file mode 100644 index 9dcafc39af..0000000000 --- a/mkdocs/assets/images/arch-logos/pytorch.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - diff --git a/mkdocs/assets/images/arch-logos/qwen.svg b/mkdocs/assets/images/arch-logos/qwen.svg deleted file mode 100644 index 3b4f0ee9d9..0000000000 --- a/mkdocs/assets/images/arch-logos/qwen.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/mkdocs/assets/images/arch-logos/runpod.svg b/mkdocs/assets/images/arch-logos/runpod.svg deleted file mode 100644 index f6fab58239..0000000000 --- a/mkdocs/assets/images/arch-logos/runpod.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/mkdocs/assets/images/arch-logos/sglang.svg b/mkdocs/assets/images/arch-logos/sglang.svg deleted file mode 100644 index a82fa0aeb1..0000000000 --- a/mkdocs/assets/images/arch-logos/sglang.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/mkdocs/assets/images/arch-logos/tenstorrent.svg b/mkdocs/assets/images/arch-logos/tenstorrent.svg deleted file mode 100644 index 570923ae35..0000000000 --- a/mkdocs/assets/images/arch-logos/tenstorrent.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - diff --git a/mkdocs/assets/images/arch-logos/vllm.svg b/mkdocs/assets/images/arch-logos/vllm.svg deleted file mode 100644 index 07eaef09ca..0000000000 --- a/mkdocs/assets/images/arch-logos/vllm.svg +++ /dev/null @@ -1 +0,0 @@ -vLLM diff --git a/mkdocs/assets/stylesheets/cloudscape-docs.css b/mkdocs/assets/stylesheets/cloudscape-docs.css index d7b0fb39f5..298a0f0ee7 100644 --- a/mkdocs/assets/stylesheets/cloudscape-docs.css +++ b/mkdocs/assets/stylesheets/cloudscape-docs.css @@ -2058,163 +2058,23 @@ } /* ===== Architecture diagram (docs index) ===================================== - Ported 1:1 from the new landing's (website/src/components/ - ArchitectureDiagram.tsx + .arch-* in website/src/styles.css). Keep the two in sync — if the - landing diagram changes, update this block AND the HTML in mkdocs/docs/index.md. - Everything is in cqw (resolved against .arch-diagram-wrap) so it scales like the old SVG. - Logos are source SVG/webp used as a currentColor mask → monochrome + theme-adaptive. */ -.arch-diagram-wrap { - container-type: inline-size; + Prebuilt light/dark SVG pair served from the dstackai/static-assets repo + (static-assets/images/dstack-architecture-diagram*.svg), shared with the landing + and the README. The pair swaps with the docs theme. */ +/* `.md-typeset img` (0,1,1) beats a bare `.arch-svg` (0,1,0), so qualify the selectors + to out-specify Material's `img { height: auto; max-width: 100% }`. */ +.md-typeset img.arch-svg { + display: block; width: 100%; max-width: 700px; margin: 1em 0; } -/* The cells' dotted outline is an ; Material's `.md-typeset svg { height:auto; max-width:100% }` - would collapse it, so force it to fill the cell (it's position:absolute inset:0). */ -.md-typeset .arch-dash { - width: 100% !important; - height: 100% !important; - max-width: none !important; -} -.arch-diagram { - display: flex; - flex-direction: column; - gap: 2.66cqw; - width: 100%; - color: var(--cs-text); - --arch-border-width: max(1px, 0.22cqw); - --arch-gradient: var(--cs-text); -} -.arch-dash { - position: absolute; - inset: 0; - width: 100%; - height: 100%; - overflow: visible; - pointer-events: none; -} -.arch-dash rect { - x: 0.25px; - y: 0.25px; - width: calc(100% - 0.5px); - height: calc(100% - 0.5px); - rx: 12px; - fill: none; - stroke: var(--arch-dash-stroke, var(--cs-text)); - stroke-width: 0.5px; - stroke-dasharray: 1 0; - stroke-linecap: butt; -} -.arch-row { - display: grid; - grid-template-columns: 2.54fr 1fr 1fr; - gap: 1.72cqw; -} -.arch-cell { - position: relative; - display: flex; - align-items: center; - gap: 1.55cqw; - min-height: 9.83cqw; - padding: 0 2cqw; - border-radius: 12px; -} -.arch-cell--center { justify-content: center; } -.arch-cell--center .arch-cell__label { white-space: normal; text-align: center; } -.arch-cell--full { min-height: 9.83cqw; } -.arch-cell--gpu { justify-content: space-between; } -.arch-cell--model { grid-column: span 2; justify-content: space-between; } -.arch-cell--hw { justify-content: center; } -.arch-cell--hw > .arch-cell__label { position: absolute; left: 2cqw; } -.arch-cell__label { - font-size: 16px; /* fixed (not cqw-scaled) to match the body text */ - font-weight: 500; - line-height: 1.2; - white-space: nowrap; -} -.arch-orchestration { - display: flex; - flex-direction: column; - align-items: center; - gap: 3cqw; - padding: 3.2cqw 3.2cqw 3.48cqw; - border-radius: 1.6cqw; - background: var(--arch-gradient); - color: var(--cs-bg); -} -.arch-orchestration__title { display: flex; align-items: center; justify-content: space-between; gap: 2cqw; width: 100%; font-size: 16px; font-weight: 500; } -.arch-orchestration__cells { - display: grid; - grid-template-columns: 1fr 1.34fr 1fr 1fr 1fr; - gap: 1.26cqw; - width: 100%; -} -.arch-subcell { - position: relative; - display: flex; - align-items: center; - justify-content: center; - min-height: 5.54cqw; - padding: 0 0.8cqw; - border-radius: 12px; - text-align: center; - font-size: 2.25cqw; - font-weight: 500; - line-height: 1.2; - --arch-dash-stroke: var(--cs-bg); +.md-typeset img.arch-svg--dark { + display: none; } -.arch-logos { - display: inline-flex; - align-items: center; - gap: 1.15cqw; - flex-wrap: nowrap; +[data-md-color-scheme="slate"] .md-typeset img.arch-svg--light { + display: none; } -.arch-logo { - display: inline-block; - background-color: currentColor; - -webkit-mask-repeat: no-repeat; - mask-repeat: no-repeat; - -webkit-mask-position: center; - mask-position: center; - -webkit-mask-size: contain; - mask-size: contain; -} -/* Per-logo height + aspect (from each source's viewBox) + the mask image (relative to this - stylesheet → /assets/images/arch-logos/). */ -.arch-logo--aws { height: 4.05cqw; aspect-ratio: 304 / 182; -webkit-mask-image: url(../images/arch-logos/aws.svg); mask-image: url(../images/arch-logos/aws.svg); } -.arch-logo--gcp { height: 4.55cqw; aspect-ratio: 256 / 206; -webkit-mask-image: url(../images/arch-logos/gcp.svg); mask-image: url(../images/arch-logos/gcp.svg); } -.arch-logo--lambda { height: 4.9cqw; aspect-ratio: 1; -webkit-mask-image: url(../images/arch-logos/lambda.svg); mask-image: url(../images/arch-logos/lambda.svg); } -.arch-logo--nebius { height: 4.6cqw; aspect-ratio: 1; -webkit-mask-image: url(../images/arch-logos/nebius.svg); mask-image: url(../images/arch-logos/nebius.svg); } -.arch-logo--runpod { height: 5.04cqw; aspect-ratio: 120 / 130; -webkit-mask-image: url(../images/arch-logos/runpod.svg); mask-image: url(../images/arch-logos/runpod.svg); } -.arch-logo--kubernetes { height: 4.98cqw; aspect-ratio: 1; -webkit-mask-image: url(../images/arch-logos/kubernetes.svg); mask-image: url(../images/arch-logos/kubernetes.svg); } -.arch-logo--pytorch { height: 5.2cqw; aspect-ratio: 90.3 / 109.1; -webkit-mask-image: url(../images/arch-logos/pytorch.svg); mask-image: url(../images/arch-logos/pytorch.svg); } -.arch-logo--vllm { height: 4.8cqw; aspect-ratio: 1; -webkit-mask-image: url(../images/arch-logos/vllm.svg); mask-image: url(../images/arch-logos/vllm.svg); } -.arch-logo--sglang { height: 4.8cqw; aspect-ratio: 596 / 683; -webkit-mask-image: url(../images/arch-logos/sglang.svg); mask-image: url(../images/arch-logos/sglang.svg); } -.arch-logo--meta { height: 3.7cqw; aspect-ratio: 287.56 / 191; -webkit-mask-image: url(../images/arch-logos/meta.svg); mask-image: url(../images/arch-logos/meta.svg); } -.arch-logo--huggingface { height: 5.1cqw; aspect-ratio: 1; -webkit-mask-image: url(../images/arch-logos/huggingface.svg); mask-image: url(../images/arch-logos/huggingface.svg); } -.arch-logo--nvidia { height: 3.7cqw; aspect-ratio: 271.7 / 179.7; -webkit-mask-image: url(../images/arch-logos/nvidia.svg); mask-image: url(../images/arch-logos/nvidia.svg); } -.arch-logo--amd { height: 4.6cqw; aspect-ratio: 1600 / 1408; -webkit-mask-image: url(../images/arch-logos/amd.webp); mask-image: url(../images/arch-logos/amd.webp); } -.arch-logo--tenstorrent { height: 4.8cqw; aspect-ratio: 170 / 169; -webkit-mask-image: url(../images/arch-logos/tenstorrent.svg); mask-image: url(../images/arch-logos/tenstorrent.svg); } -.arch-logo--tpu { height: 4.2cqw; aspect-ratio: 256 / 206; -webkit-mask-image: url(../images/arch-logos/gcp.svg); mask-image: url(../images/arch-logos/gcp.svg); } -.arch-logo--glm { height: 3.4cqw; aspect-ratio: 19 / 16; -webkit-mask-image: url(../images/arch-logos/glm.svg); mask-image: url(../images/arch-logos/glm.svg); } -.arch-logo--deepseek { height: 4.8cqw; aspect-ratio: 1; transform: translateY(-1px); -webkit-mask-image: url(../images/arch-logos/deepseek.svg); mask-image: url(../images/arch-logos/deepseek.svg); } -.arch-logo--qwen { height: 4.9cqw; aspect-ratio: 1; transform: translateY(1px); -webkit-mask-image: url(../images/arch-logos/qwen.svg); mask-image: url(../images/arch-logos/qwen.svg); } -.arch-logo--kimi { height: 4.3cqw; aspect-ratio: 1; -webkit-mask-image: url(../images/arch-logos/kimi.svg); mask-image: url(../images/arch-logos/kimi.svg); } -.arch-logo--docker { height: 2.8cqw; aspect-ratio: 122.88 / 88.17; -webkit-mask-image: url(../images/arch-logos/docker.svg); mask-image: url(../images/arch-logos/docker.svg); } -/* Reflow to 2-up below ~480px (was 360px): the cell labels are a fixed 16px, so on a narrow - phone the 3-up grid can't shrink them and they overflow — switch to 2-up sooner. */ -@container (max-width: 480px) { - .arch-diagram { gap: 12px; } - .arch-row { grid-template-columns: 1fr 1fr; gap: 8px; } - .arch-row > :first-child { grid-column: 1 / -1; } - .arch-cell { min-height: 52px; padding: 10px 14px; gap: 12px; border-radius: 8px; } - .arch-cell__label { font-size: 16px; white-space: normal; } - .arch-cell--hw { justify-content: space-between; } - .arch-cell--hw > .arch-cell__label { position: static; } - .arch-orchestration { gap: 12px; padding: 16px; border-radius: 12px; } - .arch-orchestration__title { font-size: 15px; } - .arch-orchestration__cells { grid-template-columns: repeat(2, 1fr); gap: 8px; } - .arch-subcell { min-height: 44px; font-size: 13px; border-radius: 7px; } - .arch-logos { gap: 12px; } - .arch-logo { height: 22px !important; } +[data-md-color-scheme="slate"] .md-typeset img.arch-svg--dark { + display: block; } diff --git a/mkdocs/docs/index.md b/mkdocs/docs/index.md index e64a0f264c..a5df3e1fed 100644 --- a/mkdocs/docs/index.md +++ b/mkdocs/docs/index.md @@ -14,10 +14,13 @@ It streamlines development, training, and inference, and is compatible with any ## How does it work? - -
+ +dstack architecture: an orchestration layer between AI frameworks and models on top, and GPU clouds, Kubernetes, on-prem clusters, and hardware below. +dstack architecture: an orchestration layer between AI frameworks and models on top, and GPU clouds, Kubernetes, on-prem clusters, and hardware below. ### Set up the server @@ -27,11 +30,12 @@ It streamlines development, training, and inference, and is compatible with any `dstack` supports the following configurations: -* [Fleets](concepts/fleets.md) — for managing cloud and on-prem clusters -* [Dev environments](concepts/dev-environments.md) — for interactive development using a desktop IDE -* [Tasks](concepts/tasks.md) — for scheduling jobs, incl. distributed ones (or running web apps) -* [Services](concepts/services.md) — for deploying models (or web apps) -* [Volumes](concepts/volumes.md) — for managing network volumes (to persist data) +* [Fleets](concepts/fleets.md) — Provision and manage clusters across clouds, Kubernetes, and on-prem +* [Dev environments](concepts/dev-environments.md) — Launch dev environments to be accessed by agents or from your IDE +* [Tasks](concepts/tasks.md) — Run training, batch or other jobs across a single node or clusters +* [Services](concepts/services.md) — Deploy model inference as secure and scalable endpoints +* [Presets](concepts/presets.md) — Agent-driven inference optimization (experimental) +* [Volumes](concepts/volumes.md) — Managing instance and network volumes for persisting data Configuration can be defined as YAML files within your repo. diff --git a/mkdocs/overrides/main.html b/mkdocs/overrides/main.html index 123b760be8..c5f2b6b225 100644 --- a/mkdocs/overrides/main.html +++ b/mkdocs/overrides/main.html @@ -228,7 +228,7 @@ {% endblock %} {% block announce %} -Infrastructure orchestration is an agent skill +Presets: agent-driven inference optimization {% endblock %} {# Footer is rendered INSIDE .md-content (above, after the article) — NOT as a full-width sibling — diff --git a/website/src/components/ArchitectureDiagram.tsx b/website/src/components/ArchitectureDiagram.tsx index a0abca02c9..f8e60fe1ae 100644 --- a/website/src/components/ArchitectureDiagram.tsx +++ b/website/src/components/ArchitectureDiagram.tsx @@ -7,10 +7,11 @@ import { DashedBorder } from './DashedBorder'; // lives in CSS (.arch-logo--); only the mask image URL is set inline, since it must carry // the runtime base path (asset()). // -// NOTE: This diagram is mirrored in the docs: mkdocs/docs/index.md ("How does it work?") embeds the -// same markup, with the styles ported to mkdocs/assets/stylesheets/cloudscape-docs.css (.arch-*) -// and the logos copied to mkdocs/assets/images/arch-logos/. If you change this component (markup, -// logos, or sizing), update the docs copy too so the two stay in sync. +// NOTE: This component is the SOURCE for the static SVG pair published in +// https://github.com/dstackai/static-assets (static-assets/images/dstack-architecture-diagram*.svg, +// served via https://dstack.ai/static-assets/static-assets/images/) and embedded by the docs +// index ("How does it work?") and the README. If you change this component (markup, logos, or +// sizing), regenerate the SVGs from it and overwrite them in place — the URLs stay stable. type Logo = { key: string; label: string; src?: string; initials?: string }; diff --git a/website/src/components/SiteBanner.tsx b/website/src/components/SiteBanner.tsx index d092e8a4eb..4264ddc216 100644 --- a/website/src/components/SiteBanner.tsx +++ b/website/src/components/SiteBanner.tsx @@ -1,10 +1,10 @@ -import { BLOG_URL } from '../routes'; +import { DOCS_URL } from '../routes'; // Top announcement banner, mirroring the one on the MkDocs docs site. It sits above the top // nav; the two stick to the top together (see .site-header). Update the copy/href here when // the announcement changes. -const BANNER_TEXT = 'Infrastructure orchestration is an agent skill'; -const BANNER_HREF = `${BLOG_URL}/agentic-orchestration/`; +const BANNER_TEXT = 'Presets: agent-driven inference optimization'; +const BANNER_HREF = `${DOCS_URL}/concepts/presets/`; export function SiteBanner() { return (