17 changed ยท 8 files unchanged (carried over intact from the previous snapshot)
changedgetting-started/installation.md
@@ -5,29 +5,32 @@ # Installing Nimbus -+ -Nimbus 1.5 adds official packages for every major platform and a container-image.+Nimbus 2.0 runs your sync, your deploys, and now your **edge functions** from one+CLI. Install it however you like: ```bash brew install nimbus # macOS / Linux npm install -g @nimbus/cli # Node 18+-docker pull ghcr.io/nimbus/cli:1.5 # container+docker pull ghcr.io/nimbus/cli:2 # container+winget install Nimbus.CLI # Windows ``` -Language SDKs are published for TypeScript, Python, and Go:+SDKs track the CLI version: ```bash-npm install @nimbus/sdk-pip install nimbus-sdk-go get go.nimbus.dev/sdk+npm install @nimbus/sdk # TypeScript+pip install nimbus-sdk # Python+go get go.nimbus.dev/sdk # Go ``` Verify: ```bash nimbus --version-# nimbus 1.5.0+# nimbus 2.0.0 ``` +<div class="callout callout-note"><div class="callout-title">Upgrading from 1.x?</div>2.0 changes a few config keys and the token model. Follow the <a href="../../guides/troubleshooting/">migration notes</a> before you deploy.</div>+
changedgetting-started/quickstart.md
@@ -5,38 +5,41 @@ # Quickstart -Watch the overview, then set up a project with zero-downtime deploys.+Watch the 2.0 launch tour, then ship your first edge function. -<div class="embed embed-video"><iframe src="https://www.youtube.com/embed/jNQXAC9IVRw" title="Nimbus 1.5 overview" allowfullscreen loading="lazy"></iframe></div>+<div class="embed embed-video"><iframe src="https://www.youtube.com/embed/jNQXAC9IVRw" title="Nimbus 2.0 launch" allowfullscreen loading="lazy"></iframe></div> <p class="embed-caption">Placeholder video. Swap in your product walkthrough.</p>++Scaffold a project and run it live: ```bash nimbus init nimbus run --watch ``` -The same flow from each SDK:+Add an edge function, a small handler that runs at every region: ```ts-// TypeScript-import { Nimbus } from '@nimbus/sdk'-const nimbus = new Nimbus({ key: process.env.NIMBUS_KEY })-await nimbus.deploy({ source: 'docs', strategy: 'drain' })+// functions/hello.ts+import type { EdgeRequest } from '@nimbus/sdk'++export default function (req: EdgeRequest) {+ return new Response(`hello from ${req.region}`)+} ``` -```python-# Python-from nimbus import Nimbus-nimbus = Nimbus(key=os.environ["NIMBUS_KEY"])-nimbus.deploy(source="docs", strategy="drain")+Deploy it everywhere with one command:++```bash+nimbus deploy --remote edge ``` -```go-// Go-n := nimbus.New(os.Getenv("NIMBUS_KEY"))-n.Deploy(ctx, nimbus.Deploy{Source: "docs", Strategy: "drain"})+Or from your own code:++```python+from nimbus import Nimbus++nimbus = Nimbus(key=os.environ["NIMBUS_KEY"])+nimbus.deploy(source="docs", functions="./functions", strategy="drain") ``` -`strategy: "drain"` is the 1.5 default: old instances finish in-flight requests-before they are retired.-
changedguides/configuration.md
@@ -5,37 +5,48 @@ # Configuration -+ -1.5 introduces **plugins**. Add a plugin block to `nimbus.toml` and Nimbus loads-it during sync:+`nimbus.toml` in 2.0 adds a `[functions]` block and per-team defaults: ```toml [project] name = "docs"-concurrency = 12+team = "platform"+concurrency = 16++[[source]]+type = "local"+path = "./data"++[functions]+dir = "./functions"+runtime = "edge-js@2" [[plugin]] name = "image-optimize" version = "^2.0" -[[plugin]]-name = "html-minify"- [remote.edge] url = "https://edge.nimbus.dev"-regions = ["iad", "fra", "sin", "gru"]+regions = ["iad", "fra", "sin", "gru", "syd"] strategy = "drain" ``` -Plugins run in order and can transform files before they are deployed. List what-is available:+## Resolution order++Values are merged from several places. Later sources win:++| Source | Example |+| ----------------------------- | ------------------------------------ |+| `nimbus.toml` | `concurrency = 16` |+| team defaults | set in the dashboard |+| environment variables | `NIMBUS_PROJECT__CONCURRENCY=32` |+| command-line flags | `--concurrency 32` |++Print the fully resolved config before shipping: ```bash-nimbus plugin search-nimbus plugin add image-optimize+nimbus config show --resolved --format json ``` -The full architecture is in the spec sheet on the-[References](../references/) page.-
changedguides/deployment.md
@@ -5,31 +5,40 @@ # Deployment -## Zero downtime+## Functions and assets, together -1.5 deploys drain by default. Two instances run behind the region's load-balancer and are replaced one at a time:+2.0 deploys your static output and your edge functions in one atomic release: ```bash-nimbus deploy --remote edge --strategy drain+nimbus deploy --remote edge --follow ```++```text+โ building functions (edge-js@2) โฆ 2 functions, 41ms+โ iad drain โโโโโโโโโโ served rel_9f2a+โ fra drain โโโโโโโโโโ served rel_9f2a+โ sin drain โโโโโโโโโโ served rel_9f2a+โ release rel_9f2a live in 5 regions (4.1s)+```++## Rollback++Every release is immutable and addressable. Roll back instantly:++```bash+nimbus releases list --remote edge+nimbus rollback --remote edge rel_9e11+```++<div class="callout callout-tip"><div class="callout-title">Tip</div>A rollback is just a deploy of an older release, so it drains the same way, with no downtime and no rebuild.</div> ## Observability -Every deploy now emits OpenTelemetry traces and Prometheus metrics. Point them-at your collector:--```toml-[telemetry]-otlp_endpoint = "http://otel-collector:4317"-metrics = true-```--Scrape the node directly if you prefer:+Traces and metrics are on by default in 2.0: ```bash curl https://edge.nimbus.dev/metrics-# nimbus_deploy_duration_seconds{region="iad"} 3.2-# nimbus_active_instances{region="iad"} 2+# nimbus_function_invocations_total{region="iad",fn="hello"} 1832+# nimbus_deploy_duration_seconds{region="iad"} 4.1 ```
changedguides/security.md
@@ -5,25 +5,30 @@ # Security -+ -1.5 adds short-lived deploy tokens on top of long-lived keys. Mint a token that-expires in an hour for CI:+2.0 organises access around **teams**. Members get roles. Deploy tokens are+minted per role and expire. ```bash+nimbus team invite alex@acme.dev --role deployer nimbus token mint --remote edge --scope deploy --ttl 1h ``` -Plugins are sandboxed and pinned by content hash. Review what a plugin can touch-before adding it:+| Role | Can deploy | Can manage keys | Can invite |+| ---------- | :--------: | :-------------: | :--------: |+| `viewer` | โ | โ | โ |+| `deployer` | โ | โ | โ |+| `admin` | โ | โ | โ |++Edge functions run in a sandbox with no ambient credentials. Secrets are+injected explicitly: ```bash-nimbus plugin inspect image-optimize-# capabilities: read-files, write-files-# network: none+nimbus secret set STRIPE_KEY --remote edge ``` -<div class="callout callout-warn"><div class="callout-title">Heads up</div>Only add plugins whose <code>network</code> capability is <code>none</code> unless you have reviewed the source. A plugin with network access can exfiltrate the files it processes.</div>+<div class="callout callout-warn"><div class="callout-title">Never commit keys</div>Keep <code>NIMBUS_KEY</code> and any function secrets in a secret manager or the environment. <code>nimbus.toml</code> is meant to be committed and must stay free of credentials.</div> For the full history of security-relevant changes, see the [release changelog (PDF)](../documents/changelog.pdf).
changedguides/troubleshooting.md
@@ -5,23 +5,45 @@ # Troubleshooting -+ -**A plugin failed the sync.** Run it in isolation with verbose logging:+## Migrating from 1.x++Two config keys changed in 2.0:++```diff+ [project]+ name = "docs"+-worker_count = 12++concurrency = 16++-[remote.edge]+-single_token = "nk_live_..."++[remote.edge]++# tokens are now minted per role (see Security)+```++Run the migration helper to rewrite an old file in place: ```bash-nimbus plugin run image-optimize ./data -v+nimbus migrate config ./nimbus.toml ``` -**Drain never finishes.** An instance is stuck on a long-lived connection. Cap-the drain window so it force-cycles:+## Common issues++**A function won't build.** Check the runtime matches your code: ```bash-nimbus deploy --remote edge --strategy drain --drain-timeout 30s+nimbus functions check --runtime edge-js@2 ``` -**Traces aren't showing up.** Confirm the collector endpoint resolves from inside-the node and that `metrics = true` is set under `[telemetry]`.+**A region is behind.** Releases are atomic, so a lagging region kept an older+release. Inspect and, if needed, redeploy just that region: -<div class="callout callout-tip"><div class="callout-title">Tip</div>Add <code>-v</code> to any command to see the exact HTTP calls and plugin steps Nimbus runs.</div>+```bash+nimbus releases list --remote edge+nimbus deploy --remote edge --regions fra+``` +<div class="callout callout-note"><div class="callout-title">Still stuck?</div>Add <code>-v</code> for HTTP-level logs, or open the release in the dashboard to see per-region traces.</div>+
changedreference/api.md
@@ -5,31 +5,39 @@ # API reference -1.5 adds plugin and telemetry endpoints. All require a bearer token or a-short-lived deploy token.+The 2.0 REST API adds releases and functions. Authenticate with a bearer key or+a short-lived, role-scoped token. -| Method | Path | Description |-| ------ | ------------ | ------------------------------- |-| `GET` | `/status` | node health and last deploy |-| `GET` | `/manifest` | files currently served |-| `GET` | `/metrics` | Prometheus metrics |-| `GET` | `/audit` | signed deploy history |-| `POST` | `/run` | trigger a deploy |-| `POST` | `/plugins` | register a plugin for a project |+| Method | Path | Description |+| -------- | ----------------- | --------------------------------- |+| `GET` | `/status` | node health and current release |+| `GET` | `/manifest` | files currently served |+| `GET` | `/releases` | immutable release history |+| `GET` | `/metrics` | Prometheus metrics |+| `POST` | `/run` | deploy a new release |+| `POST` | `/rollback` | serve a previous release |+| `GET` | `/functions` | deployed edge functions | -## Example: deploy with a strategy+## Example: deploy a release ```bash curl -X POST https://edge.nimbus.dev/run \ -H "Authorization: Bearer $NIMBUS_TOKEN" \- -d '{"source": "docs", "strategy": "drain", "regions": ["iad", "fra"]}'+ -H "Content-Type: application/json" \+ -d '{+ "source": "docs",+ "functions": ["hello"],+ "strategy": "drain",+ "regions": ["iad", "fra", "sin"]+ }' ``` ```json {- "deploy": "dpl_8b21",+ "release": "rel_9f2a", "strategy": "drain",- "regions": { "iad": "draining", "fra": "queued" }+ "functions": ["hello"],+ "regions": { "iad": "draining", "fra": "queued", "sin": "queued" } } ```
changedreference/cli.md
@@ -7,18 +7,22 @@ ```text nimbus init scaffold a nimbus.toml-nimbus run [--watch] sync, optionally continuously-nimbus deploy --remote <r> deploy (drain by default)-nimbus plugin search|add|inspect manage plugins-nimbus token mint create a short-lived deploy token+nimbus run [--watch] sync (and functions) continuously+nimbus deploy --remote <r> deploy a release (drain by default)+nimbus rollback --remote <r> <id> serve a previous release+nimbus releases list show immutable release history+nimbus functions check|run build and test edge functions+nimbus team invite add a member with a role+nimbus token mint create a short-lived, scoped token+nimbus migrate config <file> upgrade a 1.x config to 2.0 ``` ## Deploy flags -| Flag | Default | Description |-| ------------------ | ------- | ------------------------------------ |-| `--strategy` | `drain` | `drain` or `replace` |-| `--drain-timeout` | `60s` | force-cycle instances after this |-| `--follow` | `false` | stream per-region progress |-| `--regions` | all | limit the deploy to some regions |+| Flag | Default | Description |+| ----------------- | ------- | ---------------------------------- |+| `--strategy` | `drain` | `drain` or `replace` |+| `--regions` | all | limit the release to some regions |+| `--follow` | `false` | stream per-region progress |+| `--dry-run` | `false` | show the plan without deploying |
changedreference/data/api-endpoints.json
@@ -1,13 +1,14 @@ {- "version": "1.5.0",- "auth": ["bearer", "deploy-token"],+ "version": "2.0.0",+ "auth": ["bearer", "scoped-token"], "endpoints": [- { "method": "GET", "path": "/status", "desc": "node health and last deploy" },+ { "method": "GET", "path": "/status", "desc": "node health and current release" }, { "method": "GET", "path": "/manifest", "desc": "files currently served" },+ { "method": "GET", "path": "/releases", "desc": "immutable release history" }, { "method": "GET", "path": "/metrics", "desc": "Prometheus metrics" },- { "method": "GET", "path": "/audit", "desc": "signed deploy history" },- { "method": "POST", "path": "/run", "desc": "trigger a deploy" },- { "method": "POST", "path": "/plugins", "desc": "register a plugin" }+ { "method": "GET", "path": "/functions", "desc": "deployed edge functions" },+ { "method": "POST", "path": "/run", "desc": "deploy a new release" },+ { "method": "POST", "path": "/rollback", "desc": "serve a previous release" } ] }
changedreference/data/config-defaults.csv
@@ -1,8 +1,9 @@ key,default,description-project.concurrency,12,number of parallel workers-plugin.name,,plugin to load during sync+project.team,,team that owns the project+project.concurrency,16,number of parallel workers+functions.dir,./functions,directory of edge functions+functions.runtime,edge-js@2,edge function runtime remote.strategy,drain,deploy strategy (drain or replace)-deploy.drain_timeout,60s,force-cycle instances after this window-telemetry.otlp_endpoint,,OpenTelemetry collector endpoint-telemetry.metrics,false,expose Prometheus metrics+remote.regions,,list of region codes to deploy to+NIMBUS_KEY,,role-scoped API key (env or secret manager only)
changedreferences.md
@@ -5,19 +5,27 @@ # References and further reading -- The plugin author's guide-- Draining, connection lifetimes, and `--drain-timeout`-- Wiring Nimbus telemetry into Grafana+- The edge functions runtime (`edge-js@2`) reference+- Teams, roles, and scoped tokens+- Immutable releases and instant rollback+- Migrating a 1.x project to 2.0 -## What people are building+## What people are saying -<div class="tweet-embed"><div class="tweet-head"><img class="tweet-avatar" src="./guides/images/avatar.jpg" alt="" /><div><div class="tweet-name">Priya Nair</div><div class="tweet-handle">@priya_builds</div></div><span class="tweet-bird">๐ฆ</span></div><p class="tweet-body">Switched our docs + assets pipeline to Nimbus 1.5 plugins. Image optimization and zero-downtime deploys out of the box. Rollouts went from minutes to seconds.</p><p class="tweet-date">10:24 AM ยท Mar 4, 2025</p></div>+<div class="tweet-embed"><div class="tweet-head"><img class="tweet-avatar" src="./guides/images/avatar.jpg" alt="" /><div><div class="tweet-name">Marcus Feld</div><div class="tweet-handle">@marcusships</div></div><span class="tweet-bird">๐ฆ</span></div><p class="tweet-body">Nimbus 2.0 shipped our static docs AND the edge functions behind them in a single atomic release. Rollback is one command. This is how deploys should feel.</p><p class="tweet-date">9:02 AM ยท Jun 18, 2025</p></div> ## Spec sheet -<div class="embed embed-pdf"><object data="./documents/spec-sheet.pdf" type="application/pdf"><a href="./documents/spec-sheet.pdf">Open the Nimbus 1.5 spec sheet (PDF) โ</a></object></div>+<div class="embed embed-pdf"><object data="./documents/spec-sheet.pdf" type="application/pdf"><a href="./documents/spec-sheet.pdf">Open the Nimbus 2.0 spec sheet (PDF) โ</a></object></div>++## Release changelog++<div class="embed embed-pdf"><object data="./documents/changelog.pdf" type="application/pdf"><a href="./documents/changelog.pdf">Open the Nimbus release changelog (PDF) โ</a></object></div> ## Downloads++Every file here is captured in the backup and retrieved from the snapshot on+demand: - [Spec sheet (PDF)](./documents/spec-sheet.pdf) - [Release changelog (PDF)](./documents/changelog.pdf)
changedtheme.css
@@ -1,72 +1,87 @@-/* Nimbus 1.5 docs theme: refined slate, larger headings, dark code blocks. */+/* Nimbus 2.0 docs theme: modern, clean, violet accent, soft cards. */ .doc {- --accent: #6366f1;+ --accent: #7c3aed;+ --accent-soft: #f3efff; font-family: 'Inter', system-ui, -apple-system, sans-serif;- line-height: 1.72;- color: #0f172a;+ line-height: 1.75;+ color: #1c1917;+ font-size: 16px; } .doc h1 {- font-size: 2.1rem;+ font-size: 2.15rem; font-weight: 800; letter-spacing: -0.03em;- color: #0f172a;+ color: #2e1065; } .doc h2 { font-weight: 700; letter-spacing: -0.02em;- color: #1e293b;+ color: #4c1d95; margin-top: 2em;+ padding-bottom: 4px;+ border-bottom: 1px solid #ece9f6; } .doc h3 {- color: #334155;+ color: #5b21b6; } .doc a { color: var(--accent); text-decoration: none; font-weight: 500;+ border-bottom: 1px solid #ddd6fe; } .doc a:hover {- text-decoration: underline;+ border-bottom-color: var(--accent); } .doc code {- background: #eef0fb;- color: #4338ca;- border-radius: 4px;+ background: var(--accent-soft);+ color: #6d28d9;+ border-radius: 5px;+ font-size: 0.9em; } .doc pre {- background: #0f172a;- color: #e2e8f0;- border: 1px solid #1e293b;- border-radius: 10px;- box-shadow: 0 10px 30px -18px rgba(15, 23, 42, 0.7);+ background: #1e1b2e;+ color: #ede9fe;+ border-radius: 12px;+ box-shadow: 0 12px 34px -20px rgba(46, 16, 101, 0.7); } .doc pre code { background: none; color: inherit; } .doc img {- border-radius: 14px;- box-shadow: 0 14px 36px -18px rgba(15, 23, 42, 0.55);+ border-radius: 16px;+ box-shadow: 0 16px 40px -20px rgba(46, 16, 101, 0.45); } .doc thead th {- background: #f1f5f9;- color: #1e293b;+ background: var(--accent-soft);+ color: #4c1d95; } .doc th, .doc td {- border-color: #e2e8f0;+ border-color: #ece9f6;+}+.doc blockquote {+ border-left: 3px solid var(--accent);+ background: var(--accent-soft);+ border-radius: 0 10px 10px 0; } .doc .embed-video {- border-radius: 14px;- box-shadow: 0 16px 40px -20px rgba(15, 23, 42, 0.6);+ border-radius: 16px;+ box-shadow: 0 18px 44px -22px rgba(46, 16, 101, 0.6);+}+.doc .embed-pdf iframe {+ border-radius: 12px;+ border-color: #ece9f6; } .doc .callout {- border-radius: 10px;- background: #f8fafc;+ border-radius: 12px;+ background: #faf9ff; } .doc .tweet-embed {- border-color: #e2e8f0;- box-shadow: 0 10px 30px -20px rgba(15, 23, 42, 0.5);+ border-radius: 16px;+ border-color: #ece9f6;+ box-shadow: 0 12px 34px -22px rgba(46, 16, 101, 0.5); }
changedgetting-started/images/logo.jpg
Binary file. The bytes differ between versions (for example an image or PDF that was replaced).
changedguides/images/architecture.jpg
Binary file. The bytes differ between versions (for example an image or PDF that was replaced).
changedguides/images/avatar.jpg
Binary file. The bytes differ between versions (for example an image or PDF that was replaced).
changedguides/images/dashboard.jpg
Binary file. The bytes differ between versions (for example an image or PDF that was replaced).
changedguides/images/flow.jpg
Binary file. The bytes differ between versions (for example an image or PDF that was replaced).