@cloudgrid-io/mcp 0.16.2 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -39
- package/package.json +1 -1
- package/src/corpus/capability-map.md +7 -7
- package/src/corpus/cloudgrid-yaml.md +5 -5
- package/src/corpus/cookbook.md +1 -1
- package/src/corpus/install.md +1 -1
- package/src/corpus/rules/publish-fallbacks.md +1 -1
- package/src/corpus/skill-claim.md +1 -1
- package/src/corpus/skill-drop.md +2 -2
- package/src/corpus/skill-login.md +2 -2
- package/src/corpus/skills-readme.md +1 -1
- package/src/corpus/templates/ai-knowledge-base/AGENTS.md +1 -1
- package/src/corpus/templates/ai-knowledge-base/index.md +1 -1
- package/src/corpus/templates/api-docs/README.md +3 -3
- package/src/corpus/templates/api-docs/index.md +3 -3
- package/src/corpus/templates/appointment-booking/AGENTS.md +9 -9
- package/src/corpus/templates/appointment-booking/index.md +6 -6
- package/src/corpus/templates/approval-workflow/AGENTS.md +2 -2
- package/src/corpus/templates/approval-workflow/index.md +2 -2
- package/src/corpus/templates/billing-dashboard/index.md +1 -1
- package/src/corpus/templates/calendar-scheduler/AGENTS.md +1 -1
- package/src/corpus/templates/calendar-scheduler/index.md +1 -1
- package/src/corpus/templates/changelog/README.md +3 -3
- package/src/corpus/templates/changelog/index.md +3 -3
- package/src/corpus/templates/company-website/README.md +3 -3
- package/src/corpus/templates/company-website/cloudgrid.yaml +1 -1
- package/src/corpus/templates/company-website/index.md +3 -3
- package/src/corpus/templates/course-platform/index.md +1 -1
- package/src/corpus/templates/dashboard/cloudgrid.yaml +1 -1
- package/src/corpus/templates/dashboard/index.md +3 -3
- package/src/corpus/templates/deck/cloudgrid.yaml +1 -1
- package/src/corpus/templates/deck/index.md +3 -3
- package/src/corpus/templates/docs-site/README.md +3 -3
- package/src/corpus/templates/docs-site/index.md +3 -3
- package/src/corpus/templates/forum/AGENTS.md +6 -6
- package/src/corpus/templates/forum/index.md +1 -1
- package/src/corpus/templates/hr-portal/index.md +1 -1
- package/src/corpus/templates/internal-tools-portal/index.md +1 -1
- package/src/corpus/templates/landing-page/cloudgrid.yaml +1 -1
- package/src/corpus/templates/landing-page/index.md +3 -3
- package/src/corpus/templates/lms/index.md +1 -1
- package/src/corpus/templates/marketplace/AGENTS.md +1 -1
- package/src/corpus/templates/marketplace/index.md +1 -1
- package/src/corpus/templates/membership-site/AGENTS.md +9 -9
- package/src/corpus/templates/membership-site/index.md +6 -6
- package/src/corpus/templates/online-store/index.md +1 -1
- package/src/corpus/templates/portfolio/README.md +3 -3
- package/src/corpus/templates/portfolio/index.md +3 -3
- package/src/corpus/templates/product-launch/README.md +3 -3
- package/src/corpus/templates/product-launch/cloudgrid.yaml +1 -1
- package/src/corpus/templates/product-launch/index.md +3 -3
- package/src/corpus/templates/report/cloudgrid.yaml +1 -1
- package/src/corpus/templates/report/index.md +3 -3
- package/src/corpus/templates/restaurant-reservations/AGENTS.md +9 -9
- package/src/corpus/templates/restaurant-reservations/index.md +2 -2
- package/src/corpus/templates/saas-marketing/README.md +3 -3
- package/src/corpus/templates/saas-marketing/index.md +3 -3
- package/src/corpus/templates/status-page/README.md +3 -3
- package/src/corpus/templates/status-page/index.md +3 -3
- package/src/corpus/templates/subscription-management/AGENTS.md +9 -9
- package/src/corpus/templates/subscription-management/index.md +6 -6
- package/src/corpus/templates/waitlist/README.md +3 -3
- package/src/corpus/templates/waitlist/index.md +3 -3
- package/src/corpus/templates/web-app/cloudgrid.yaml +1 -1
- package/src/corpus/templates/web-app/index.md +3 -3
- package/src/corpus/troubleshooting/deploy-errors.md +1 -1
- package/src/corpus/troubleshooting/persistent-apps.md +1 -1
- package/src/corpus/usage.md +2 -2
- package/src/corpus/workflows/admin-dashboard.md +6 -6
- package/src/corpus/workflows/ai-app.md +8 -8
- package/src/corpus/workflows/ai-knowledge-base.md +6 -6
- package/src/corpus/workflows/analytics-dashboard.md +6 -6
- package/src/corpus/workflows/api-dashboard.md +6 -6
- package/src/corpus/workflows/api-docs.md +3 -3
- package/src/corpus/workflows/api-service.md +8 -8
- package/src/corpus/workflows/app-with-data.md +8 -8
- package/src/corpus/workflows/appointment-booking.md +8 -8
- package/src/corpus/workflows/approval-workflow.md +6 -6
- package/src/corpus/workflows/billing-dashboard.md +8 -8
- package/src/corpus/workflows/blog-cms.md +6 -6
- package/src/corpus/workflows/booking-system.md +7 -7
- package/src/corpus/workflows/calendar-scheduler.md +6 -6
- package/src/corpus/workflows/changelog.md +3 -3
- package/src/corpus/workflows/company-website.md +4 -4
- package/src/corpus/workflows/course-platform.md +7 -7
- package/src/corpus/workflows/crm.md +7 -7
- package/src/corpus/workflows/dashboard.md +4 -4
- package/src/corpus/workflows/directory.md +6 -6
- package/src/corpus/workflows/docs-site.md +3 -3
- package/src/corpus/workflows/erp.md +7 -7
- package/src/corpus/workflows/event-board.md +6 -6
- package/src/corpus/workflows/expense-tracker.md +6 -6
- package/src/corpus/workflows/feature-request-board.md +6 -6
- package/src/corpus/workflows/financial-dashboard.md +6 -6
- package/src/corpus/workflows/forum.md +7 -7
- package/src/corpus/workflows/hr-portal.md +7 -7
- package/src/corpus/workflows/internal-tools-portal.md +7 -7
- package/src/corpus/workflows/inventory.md +6 -6
- package/src/corpus/workflows/invoice.md +6 -6
- package/src/corpus/workflows/job-board.md +6 -6
- package/src/corpus/workflows/kanban.md +7 -7
- package/src/corpus/workflows/landing-page.md +4 -4
- package/src/corpus/workflows/lms.md +7 -7
- package/src/corpus/workflows/marketplace.md +6 -6
- package/src/corpus/workflows/membership-site.md +8 -8
- package/src/corpus/workflows/monitoring-dashboard.md +6 -6
- package/src/corpus/workflows/online-store.md +8 -8
- package/src/corpus/workflows/portfolio.md +3 -3
- package/src/corpus/workflows/presentation.md +4 -4
- package/src/corpus/workflows/product-catalog.md +6 -6
- package/src/corpus/workflows/product-launch.md +4 -4
- package/src/corpus/workflows/project-management.md +6 -6
- package/src/corpus/workflows/property-listings.md +6 -6
- package/src/corpus/workflows/quiz-platform.md +6 -6
- package/src/corpus/workflows/report.md +4 -4
- package/src/corpus/workflows/restaurant-reservations.md +7 -7
- package/src/corpus/workflows/revenue-dashboard.md +6 -6
- package/src/corpus/workflows/saas-marketing.md +3 -3
- package/src/corpus/workflows/semantic-search.md +7 -7
- package/src/corpus/workflows/status-page.md +3 -3
- package/src/corpus/workflows/subscription-management.md +8 -8
- package/src/corpus/workflows/task-manager.md +6 -6
- package/src/corpus/workflows/ticket-system.md +6 -6
- package/src/corpus/workflows/time-tracking.md +6 -6
- package/src/corpus/workflows/travel-booking.md +7 -7
- package/src/corpus/workflows/waitlist.md +3 -3
- package/src/corpus/workflows/web-app.md +4 -4
- package/src/docs.js +5 -5
- package/src/index.js +1 -1
- package/src/tools.js +116 -116
- package/src/web.js +1 -1
- package/src/widgets/live-result.html +1 -1
- package/src/widgets/org-picker.html +1 -1
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
# THIS TEMPLATE (deck): a single self-contained static page. The active fields
|
|
17
17
|
# are exactly name + services.web{type: static, path: /}; there are no needs.
|
|
18
18
|
# This cloudgrid.yaml is the reference for plugging it as an OWNED static
|
|
19
|
-
# runtime; the fast path is to deploy it as an INSPIRATION via
|
|
19
|
+
# runtime; the fast path is to deploy it as an INSPIRATION via grid_drop
|
|
20
20
|
# (instant, and works on the hosted edition too).
|
|
21
21
|
# ============================================================================
|
|
22
22
|
|
|
@@ -5,14 +5,14 @@ no `needs:`. State (if any) lives only in memory and is lost on refresh.
|
|
|
5
5
|
|
|
6
6
|
## How it deploys
|
|
7
7
|
|
|
8
|
-
To publish this page, use **`
|
|
8
|
+
To publish this page, use **`grid_drop`** (or `grid_plug` with the inline
|
|
9
9
|
HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
|
|
10
10
|
edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
|
|
11
11
|
directory (`type: static`) is ONLY for plugging the page as an OWNED static
|
|
12
|
-
runtime (async, local edition only); the fast path is `
|
|
12
|
+
runtime (async, local edition only); the fast path is `grid_drop`.
|
|
13
13
|
|
|
14
14
|
The fillable HTML is the real template — fetch it with
|
|
15
|
-
`
|
|
15
|
+
`grid_fetch("template", "deck")` and fill in the user's content.
|
|
16
16
|
|
|
17
17
|
## cloudgrid.yaml (reference only)
|
|
18
18
|
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
A single self-contained HTML documentation site: a sidebar nav, a scrolling content column with headings and code blocks, and a client-side search box that filters the nav. No backend.
|
|
4
4
|
|
|
5
5
|
Static inspiration — a single self-contained `index.html` (inline CSS and JS,
|
|
6
|
-
no external CDNs). It deploys instantly via `
|
|
6
|
+
no external CDNs). It deploys instantly via `grid_drop` and works on every
|
|
7
7
|
CloudGrid edition, including hosted.
|
|
8
8
|
|
|
9
9
|
## Fill it in
|
|
10
10
|
|
|
11
|
-
Fetch the template with `
|
|
11
|
+
Fetch the template with `grid_fetch("template", "docs-site")`, then replace the
|
|
12
12
|
placeholders:
|
|
13
13
|
|
|
14
14
|
- The project/doc name and the sidebar section links.
|
|
@@ -22,7 +22,7 @@ stylesheets, fonts, or large embedded media.
|
|
|
22
22
|
## Deploy
|
|
23
23
|
|
|
24
24
|
- Hosted MCP edition: call the drop tool with the HTML.
|
|
25
|
-
- Local MCP / CLI edition: write the HTML to a file and run `
|
|
25
|
+
- Local MCP / CLI edition: write the HTML to a file and run `grid plug`.
|
|
26
26
|
|
|
27
27
|
It deploys as an inspiration and returns a live share URL right away. Re-deploy
|
|
28
28
|
with the same entity id to update the same URL.
|
|
@@ -5,14 +5,14 @@ State (if any) lives only in memory and is lost on refresh.
|
|
|
5
5
|
|
|
6
6
|
## How it deploys
|
|
7
7
|
|
|
8
|
-
To publish this page, use **`
|
|
8
|
+
To publish this page, use **`grid_drop`** (or `grid_plug` with the inline
|
|
9
9
|
HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
|
|
10
10
|
edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
|
|
11
11
|
directory (`type: static`) is ONLY for plugging the page as an OWNED static
|
|
12
|
-
runtime (async, local edition only); the fast path is `
|
|
12
|
+
runtime (async, local edition only); the fast path is `grid_drop`.
|
|
13
13
|
|
|
14
14
|
The fillable HTML is the real template — fetch it with
|
|
15
|
-
`
|
|
15
|
+
`grid_fetch("template", "docs-site")` and fill in the user's content.
|
|
16
16
|
|
|
17
17
|
## cloudgrid.yaml (reference only)
|
|
18
18
|
|
|
@@ -104,7 +104,7 @@ dev` and runtime.
|
|
|
104
104
|
injects that vault item as `process.env.ENV_VAR`. This blueprint maps
|
|
105
105
|
`AUTH_PROVIDER_SECRET_KEY` and `AUTH_PROVIDER_PUBLISHABLE_KEY`. Rename the env
|
|
106
106
|
keys to whatever the provider SDK expects (see §4) and set the vault items with
|
|
107
|
-
`
|
|
107
|
+
`grid_secrets` / the org vault — do not commit keys.
|
|
108
108
|
- **AI (optional)** — if you add `needs: { ai: true }` (e.g. auto-moderation or
|
|
109
109
|
summarize-thread), the grid injects **`AI_GATEWAY_URL`**; call it via
|
|
110
110
|
`@cloudgrid-io/ai`. Not required for the base forum.
|
|
@@ -167,19 +167,19 @@ inline a key in code or `env:`.
|
|
|
167
167
|
A forum is a runtime (built + deployed container) app — **local edition**
|
|
168
168
|
(Claude Desktop / Claude Code / CLI), async build.
|
|
169
169
|
|
|
170
|
-
1. `
|
|
170
|
+
1. `grid_login_status` → `grid_login` if needed. Respect the grid picker
|
|
171
171
|
(ask which grid if the user has more than one).
|
|
172
|
-
2. `
|
|
172
|
+
2. `grid_init` an app `<name>` — creates the entity + `.cloudgrid/link.json`
|
|
173
173
|
and a `cloudgrid.yaml` with empty `services: {}`. Run `init` FIRST (`plug`
|
|
174
174
|
needs a linked dir).
|
|
175
175
|
3. Write the app under `services/web/` per §1, then fill `cloudgrid.yaml` to the
|
|
176
176
|
active shape: `name`, `services.web { type: nextjs, path: / }`, `needs:
|
|
177
177
|
{ database: true }`, and the `vault:` mappings for the auth keys.
|
|
178
|
-
4. Set the auth secrets: `
|
|
178
|
+
4. Set the auth secrets: `grid_secrets` (or the org vault) for the provider
|
|
179
179
|
keys. Do NOT set `DATABASE_MONGODB_URL` — the grid injects it.
|
|
180
180
|
5. (Optional) `grid dev` to run locally against injected Mongo before shipping.
|
|
181
|
-
6. `
|
|
182
|
-
is `status: building`, not a live URL. Poll `
|
|
181
|
+
6. `grid_plug` to deploy. A runtime deploy is **ASYNC** — the first response
|
|
182
|
+
is `status: building`, not a live URL. Poll `grid_status` (or the returned
|
|
183
183
|
poll_url) until live; surface a liveness signal while it builds, never a bare
|
|
184
184
|
spinner.
|
|
185
185
|
7. Only once live, return the deployed app URL. Re-plug the SAME entity to update
|
|
@@ -7,7 +7,7 @@ moderation, on Next.js + grid-shared MongoDB, auth via a hosted provider
|
|
|
7
7
|
under `services/web/` following it. The shape mirrors the proven `app-with-data`
|
|
8
8
|
template (lazy Mongo getter, App-Router routes, `needs: { database: true }`).
|
|
9
9
|
|
|
10
|
-
**Fetch the bundle:** `
|
|
10
|
+
**Fetch the bundle:** `grid_fetch("template", "forum")` returns this
|
|
11
11
|
directory — `cloudgrid.yaml`, `AGENTS.md` (the structure guide), and this file.
|
|
12
12
|
|
|
13
13
|
**Key rules:**
|
|
@@ -28,7 +28,7 @@ Runtime app → **local edition only**, async deploy (poll to a live URL).
|
|
|
28
28
|
|
|
29
29
|
## Fetch bundle
|
|
30
30
|
|
|
31
|
-
Fetch this blueprint with `
|
|
31
|
+
Fetch this blueprint with `grid_fetch("template", "hr-portal")`. It returns
|
|
32
32
|
`cloudgrid.yaml`, `AGENTS.md` (the structure guide), and this README — no app
|
|
33
33
|
code. Follow `AGENTS.md` to build, then `grid init → fill → grid plug → poll`.
|
|
34
34
|
|
|
@@ -34,7 +34,7 @@ Runtime app → **local edition only**, async deploy (poll to a live URL).
|
|
|
34
34
|
|
|
35
35
|
## Fetch bundle
|
|
36
36
|
|
|
37
|
-
Fetch this blueprint with `
|
|
37
|
+
Fetch this blueprint with `grid_fetch("template", "internal-tools-portal")`. It
|
|
38
38
|
returns `cloudgrid.yaml`, `AGENTS.md` (the structure guide), and this README — no
|
|
39
39
|
app code. Follow `AGENTS.md` to build, then `grid init → fill → grid plug → poll`.
|
|
40
40
|
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
# THIS TEMPLATE (landing-page): a single self-contained static page. The active fields
|
|
17
17
|
# are exactly name + services.web{type: static, path: /}; there are no needs.
|
|
18
18
|
# This cloudgrid.yaml is the reference for plugging it as an OWNED static
|
|
19
|
-
# runtime; the fast path is to deploy it as an INSPIRATION via
|
|
19
|
+
# runtime; the fast path is to deploy it as an INSPIRATION via grid_drop
|
|
20
20
|
# (instant, and works on the hosted edition too).
|
|
21
21
|
# ============================================================================
|
|
22
22
|
|
|
@@ -5,14 +5,14 @@ no `needs:`. State (if any) lives only in memory and is lost on refresh.
|
|
|
5
5
|
|
|
6
6
|
## How it deploys
|
|
7
7
|
|
|
8
|
-
To publish this page, use **`
|
|
8
|
+
To publish this page, use **`grid_drop`** (or `grid_plug` with the inline
|
|
9
9
|
HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
|
|
10
10
|
edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
|
|
11
11
|
directory (`type: static`) is ONLY for plugging the page as an OWNED static
|
|
12
|
-
runtime (async, local edition only); the fast path is `
|
|
12
|
+
runtime (async, local edition only); the fast path is `grid_drop`.
|
|
13
13
|
|
|
14
14
|
The fillable HTML is the real template — fetch it with
|
|
15
|
-
`
|
|
15
|
+
`grid_fetch("template", "landing-page")` and fill in the user's content.
|
|
16
16
|
|
|
17
17
|
## cloudgrid.yaml (reference only)
|
|
18
18
|
|
|
@@ -8,7 +8,7 @@ Next.js + Mongo app with role-based (instructor/student) auth.
|
|
|
8
8
|
**This is a blueprint, not app code.** It ships the correct `cloudgrid.yaml` and
|
|
9
9
|
an `AGENTS.md` structure guide. Read `AGENTS.md`, then build the app under
|
|
10
10
|
`services/web/` following it. Fetch the guide with
|
|
11
|
-
`
|
|
11
|
+
`grid_fetch("template", "lms")`.
|
|
12
12
|
|
|
13
13
|
**Key rules:**
|
|
14
14
|
|
|
@@ -181,7 +181,7 @@ Runtime app → **local edition** only (Claude Desktop / Claude Code / CLI); the
|
|
|
181
181
|
hosted edition cannot build a runtime container. Order matters — `plug` needs a
|
|
182
182
|
linked directory, so `init` first.
|
|
183
183
|
|
|
184
|
-
1. `grid init` (or `
|
|
184
|
+
1. `grid init` (or `grid_init`) an app `<name>` — creates the entity +
|
|
185
185
|
`.cloudgrid/link.json` and a starter `cloudgrid.yaml` with empty `services:{}`.
|
|
186
186
|
2. Fill: put the app under `services/web/` and set `cloudgrid.yaml` to this
|
|
187
187
|
blueprint's active fields (`services.web` nextjs `/`, `needs:{database:true}`,
|
|
@@ -10,7 +10,7 @@ code** — read the structure guide, then build the app following it.
|
|
|
10
10
|
`AGENTS.md`. Fetch the bundle, read `AGENTS.md`, then generate the files under
|
|
11
11
|
`services/web/` and deploy.
|
|
12
12
|
|
|
13
|
-
- **Structure guide:** `
|
|
13
|
+
- **Structure guide:** `grid_fetch("template", "marketplace")` → read
|
|
14
14
|
**`AGENTS.md`** (file tree, Mongo collections, CloudGrid injection table, auth +
|
|
15
15
|
Stripe Connect wiring, deploy steps, edition note).
|
|
16
16
|
|
|
@@ -9,7 +9,7 @@ rules — they are what make it deploy.
|
|
|
9
9
|
|
|
10
10
|
The proven persistent shape is `app-with-data` (Next.js + Mongo). This blueprint
|
|
11
11
|
extends it with auth + Stripe. Fetch that template for the Mongo lazy-client and
|
|
12
|
-
App-Router API pattern: `
|
|
12
|
+
App-Router API pattern: `grid_fetch("template", "app-with-data")`.
|
|
13
13
|
|
|
14
14
|
## 1. File tree
|
|
15
15
|
|
|
@@ -78,7 +78,7 @@ A user is a member when a `memberships` doc for their `authId` has
|
|
|
78
78
|
STRIPE_WEBHOOK_SECRET: stripe-webhook-secret
|
|
79
79
|
AUTH_PROVIDER_KEY: auth-provider-key
|
|
80
80
|
```
|
|
81
|
-
Set the vault items ONCE with `
|
|
81
|
+
Set the vault items ONCE with `grid_secrets` (or `grid secrets set`), then
|
|
82
82
|
the deployer injects each as the named env var (`process.env.STRIPE_KEY`, etc.)
|
|
83
83
|
at runtime and under `grid dev`. Do NOT commit keys; do NOT set them in
|
|
84
84
|
`services.web.env` (that block is for non-secret config only). Read them
|
|
@@ -130,21 +130,21 @@ A user is a member when a `memberships` doc for their `authId` has
|
|
|
130
130
|
|
|
131
131
|
## 5. Deploy steps
|
|
132
132
|
|
|
133
|
-
1. `
|
|
133
|
+
1. `grid_login_status` → `grid_login` if needed. Respect the grid picker
|
|
134
134
|
(ask which grid if the user has more than one).
|
|
135
|
-
2. `
|
|
135
|
+
2. `grid_init` an app `<name>` FIRST — it creates the entity, writes
|
|
136
136
|
`.cloudgrid/link.json`, and a `cloudgrid.yaml` with empty `services: {}`.
|
|
137
137
|
`plug` needs a linked directory.
|
|
138
138
|
3. Write the app under `services/web/` and set `cloudgrid.yaml` to the active
|
|
139
139
|
shape: `name` + `services.web{type: nextjs, path: /}` + `needs:{database:true}`
|
|
140
140
|
+ the `vault:` block.
|
|
141
|
-
4. Set the secrets: `
|
|
141
|
+
4. Set the secrets: `grid_secrets` for `stripe-live-key`,
|
|
142
142
|
`stripe-webhook-secret`, `auth-provider-key` (the vault item keys the
|
|
143
143
|
`vault:` block maps from). Non-secret config (publishable auth key, price id)
|
|
144
|
-
→ `
|
|
144
|
+
→ `grid_env` / `services.web.env`. Do NOT set `DATABASE_MONGODB_URL`
|
|
145
145
|
yourself — the grid injects it.
|
|
146
|
-
5. `
|
|
147
|
-
is `status: building`, not a live URL. Poll `
|
|
146
|
+
5. `grid_plug` to deploy. A runtime deploy is **ASYNC** — the first response
|
|
147
|
+
is `status: building`, not a live URL. Poll `grid_status` (or the returned
|
|
148
148
|
poll_url) until live; surface a liveness signal while it builds, never a bare
|
|
149
149
|
silent wait.
|
|
150
150
|
6. Once live, add the `/api/webhook` URL as the Stripe webhook endpoint and copy
|
|
@@ -157,4 +157,4 @@ A membership site is a built + deployed runtime container, so it requires the
|
|
|
157
157
|
**local edition** (Claude Desktop / Claude Code) or the CLI. The **hosted**
|
|
158
158
|
edition (Claude Web / hosted MCP) is inline-only and can only publish static
|
|
159
159
|
pages — it CANNOT build this app. On hosted, say so plainly and offer a static
|
|
160
|
-
paywall-landing page (via `
|
|
160
|
+
paywall-landing page (via `grid_drop`) instead, then stop the runtime path.
|
|
@@ -9,8 +9,8 @@ adapt plans/content/fields, then deploy (async — poll to a live URL). Local
|
|
|
9
9
|
edition only.
|
|
10
10
|
|
|
11
11
|
**Fetch the bundle:**
|
|
12
|
-
- `
|
|
13
|
-
- `
|
|
12
|
+
- `grid_fetch("template", "membership-site")` — this blueprint (`cloudgrid.yaml` + `AGENTS.md`).
|
|
13
|
+
- `grid_fetch("template", "app-with-data")` — the proven Next.js + Mongo shape to extend (lazy db client, App-Router API).
|
|
14
14
|
|
|
15
15
|
**Key rules:**
|
|
16
16
|
|
|
@@ -24,7 +24,7 @@ edition only.
|
|
|
24
24
|
the getter, never at module top level (top-level read fails `next build`).
|
|
25
25
|
4. **Secrets via the `vault:` block** → env vars. `STRIPE_KEY`,
|
|
26
26
|
`STRIPE_WEBHOOK_SECRET`, `AUTH_PROVIDER_KEY` map to vault items; set them with
|
|
27
|
-
`
|
|
27
|
+
`grid_secrets`, and the deployer injects them at runtime. Read lazily; do
|
|
28
28
|
not commit keys or put secrets in `services.web.env`.
|
|
29
29
|
5. **Gate server-side.** Auth answers "who are you"; the `memberships`
|
|
30
30
|
collection answers "have you paid". `app/members/layout.js` checks membership
|
|
@@ -60,7 +60,7 @@ vault:
|
|
|
60
60
|
|
|
61
61
|
## Deploy (async, local edition)
|
|
62
62
|
|
|
63
|
-
`
|
|
64
|
-
`services/web/`, set the vault secrets with `
|
|
65
|
-
(async — poll `
|
|
63
|
+
`grid_init` first (creates the entity + link.json), write the app under
|
|
64
|
+
`services/web/`, set the vault secrets with `grid_secrets`, `grid_plug`
|
|
65
|
+
(async — poll `grid_status` to a live URL), then register the `/api/webhook`
|
|
66
66
|
URL in Stripe and re-plug. Re-plug the same entity to update the same URL.
|
|
@@ -74,7 +74,7 @@ needs:
|
|
|
74
74
|
|
|
75
75
|
## Build it
|
|
76
76
|
|
|
77
|
-
Fetch `
|
|
77
|
+
Fetch `grid_fetch("template", "online-store")` and read **`AGENTS.md`** — it
|
|
78
78
|
has the checkout + webhook wiring, the vault/secret setup, and the deploy steps
|
|
79
79
|
(`grid init` → write under `services/web/` → `grid secrets set` → `grid plug`,
|
|
80
80
|
async → poll to a live URL → register the webhook endpoint in Stripe). Adapt the
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
A single self-contained HTML personal / freelancer portfolio: a hero intro, an about section, a skills list, a projects grid, and a contact section.
|
|
4
4
|
|
|
5
5
|
Static inspiration — a single self-contained `index.html` (inline CSS and JS,
|
|
6
|
-
no external CDNs). It deploys instantly via `
|
|
6
|
+
no external CDNs). It deploys instantly via `grid_drop` and works on every
|
|
7
7
|
CloudGrid edition, including hosted.
|
|
8
8
|
|
|
9
9
|
## Fill it in
|
|
10
10
|
|
|
11
|
-
Fetch the template with `
|
|
11
|
+
Fetch the template with `grid_fetch("template", "portfolio")`, then replace the
|
|
12
12
|
placeholders:
|
|
13
13
|
|
|
14
14
|
- The person's name, role/title, and short intro.
|
|
@@ -23,7 +23,7 @@ stylesheets, fonts, or large embedded media.
|
|
|
23
23
|
## Deploy
|
|
24
24
|
|
|
25
25
|
- Hosted MCP edition: call the drop tool with the HTML.
|
|
26
|
-
- Local MCP / CLI edition: write the HTML to a file and run `
|
|
26
|
+
- Local MCP / CLI edition: write the HTML to a file and run `grid plug`.
|
|
27
27
|
|
|
28
28
|
It deploys as an inspiration and returns a live share URL right away. Re-deploy
|
|
29
29
|
with the same entity id to update the same URL.
|
|
@@ -5,14 +5,14 @@ State (if any) lives only in memory and is lost on refresh.
|
|
|
5
5
|
|
|
6
6
|
## How it deploys
|
|
7
7
|
|
|
8
|
-
To publish this page, use **`
|
|
8
|
+
To publish this page, use **`grid_drop`** (or `grid_plug` with the inline
|
|
9
9
|
HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
|
|
10
10
|
edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
|
|
11
11
|
directory (`type: static`) is ONLY for plugging the page as an OWNED static
|
|
12
|
-
runtime (async, local edition only); the fast path is `
|
|
12
|
+
runtime (async, local edition only); the fast path is `grid_drop`.
|
|
13
13
|
|
|
14
14
|
The fillable HTML is the real template — fetch it with
|
|
15
|
-
`
|
|
15
|
+
`grid_fetch("template", "portfolio")` and fill in the user's content.
|
|
16
16
|
|
|
17
17
|
## cloudgrid.yaml (reference only)
|
|
18
18
|
|
|
@@ -34,13 +34,13 @@ A one-page launch announcement with:
|
|
|
34
34
|
## How it deploys
|
|
35
35
|
|
|
36
36
|
Deploys as an **inspiration** — instant, and works on the **hosted** edition
|
|
37
|
-
(Claude Web) as well as local. Use **`
|
|
37
|
+
(Claude Web) as well as local. Use **`grid_drop`** (or `grid_plug` with the
|
|
38
38
|
inline HTML): you get a live share URL right away. Re-dropping the same entity
|
|
39
39
|
updates the same URL, so the user iterates on one link.
|
|
40
40
|
|
|
41
41
|
The reference `cloudgrid.yaml` in this directory (`type: static`) is ONLY for
|
|
42
42
|
plugging the page as an OWNED static runtime (async, local edition only); the
|
|
43
|
-
fast path is `
|
|
43
|
+
fast path is `grid_drop`.
|
|
44
44
|
|
|
45
45
|
The fillable HTML is the real template — fetch it with
|
|
46
|
-
`
|
|
46
|
+
`grid_fetch("template", "product-launch")` and fill in the user's content.
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# active fields are exactly name + services.web{type: static, path: /}; there
|
|
18
18
|
# are no needs. This cloudgrid.yaml is the reference for plugging the page as an
|
|
19
19
|
# OWNED static runtime; the fast path is to deploy it as an INSPIRATION via
|
|
20
|
-
#
|
|
20
|
+
# grid_drop (instant, and works on the hosted edition too).
|
|
21
21
|
# ============================================================================
|
|
22
22
|
|
|
23
23
|
|
|
@@ -8,14 +8,14 @@ client-side.
|
|
|
8
8
|
|
|
9
9
|
## How it deploys
|
|
10
10
|
|
|
11
|
-
To publish this page, use **`
|
|
11
|
+
To publish this page, use **`grid_drop`** (or `grid_plug` with the inline
|
|
12
12
|
HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
|
|
13
13
|
edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
|
|
14
14
|
directory (`type: static`) is ONLY for plugging the page as an OWNED static
|
|
15
|
-
runtime (async, local edition only); the fast path is `
|
|
15
|
+
runtime (async, local edition only); the fast path is `grid_drop`.
|
|
16
16
|
|
|
17
17
|
The fillable HTML is the real template — fetch it with
|
|
18
|
-
`
|
|
18
|
+
`grid_fetch("template", "product-launch")` and fill in the user's content
|
|
19
19
|
(product name, hero copy, countdown target, features, offer, quotes). Keep it a
|
|
20
20
|
single self-contained file: inline SVG / `data:` URIs only, no external scripts,
|
|
21
21
|
stylesheets, fonts, or CDNs.
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
# THIS TEMPLATE (report): a single self-contained static page. The active fields
|
|
17
17
|
# are exactly name + services.web{type: static, path: /}; there are no needs.
|
|
18
18
|
# This cloudgrid.yaml is the reference for plugging it as an OWNED static
|
|
19
|
-
# runtime; the fast path is to deploy it as an INSPIRATION via
|
|
19
|
+
# runtime; the fast path is to deploy it as an INSPIRATION via grid_drop
|
|
20
20
|
# (instant, and works on the hosted edition too).
|
|
21
21
|
# ============================================================================
|
|
22
22
|
|
|
@@ -5,14 +5,14 @@ no `needs:`. State (if any) lives only in memory and is lost on refresh.
|
|
|
5
5
|
|
|
6
6
|
## How it deploys
|
|
7
7
|
|
|
8
|
-
To publish this page, use **`
|
|
8
|
+
To publish this page, use **`grid_drop`** (or `grid_plug` with the inline
|
|
9
9
|
HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
|
|
10
10
|
edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
|
|
11
11
|
directory (`type: static`) is ONLY for plugging the page as an OWNED static
|
|
12
|
-
runtime (async, local edition only); the fast path is `
|
|
12
|
+
runtime (async, local edition only); the fast path is `grid_drop`.
|
|
13
13
|
|
|
14
14
|
The fillable HTML is the real template — fetch it with
|
|
15
|
-
`
|
|
15
|
+
`grid_fetch("template", "report")` and fill in the user's content.
|
|
16
16
|
|
|
17
17
|
## cloudgrid.yaml (reference only)
|
|
18
18
|
|
|
@@ -115,9 +115,9 @@ You never provision infra or set connection strings by hand. Declare intent in
|
|
|
115
115
|
`STRIPE_KEY: stripe-live-key`, `SENDGRID_API_KEY: sendgrid-key`,
|
|
116
116
|
`AUTH_PROVIDER_KEY: auth-provider-secret`. The platform reads the named item
|
|
117
117
|
from the org vault and injects it as that env var at runtime. Store the actual
|
|
118
|
-
secret value with `
|
|
118
|
+
secret value with `grid_secrets` (or the org vault UI) — never commit it. In
|
|
119
119
|
code read `process.env.STRIPE_KEY`, `process.env.SENDGRID_API_KEY`, etc. Vault
|
|
120
|
-
is the CloudGrid-correct path for third-party keys; `
|
|
120
|
+
is the CloudGrid-correct path for third-party keys; `grid_env` is for
|
|
121
121
|
non-secret config only.
|
|
122
122
|
|
|
123
123
|
- **AI (optional).** If you add AI (e.g. menu-copy generation, natural-language
|
|
@@ -154,7 +154,7 @@ Reserved env var names you must NOT set: `PORT`, `APP_NAME`, `SERVICE_NAME`,
|
|
|
154
154
|
provider; leave `/`, `/reserve`, `/api/menu`, `/api/reservations` (POST),
|
|
155
155
|
`/api/webhooks/stripe` public.
|
|
156
156
|
3. Initialize the SDK from `process.env.AUTH_PROVIDER_KEY` (+ any public
|
|
157
|
-
publishable key via `
|
|
157
|
+
publishable key via `grid_env`). The public booking flow needs no login.
|
|
158
158
|
|
|
159
159
|
Keep the public reservation POST open; only staff read/mutate endpoints
|
|
160
160
|
(`GET /api/reservations`, `PATCH/DELETE /api/reservations/[id]`, `/staff/*`) sit
|
|
@@ -167,20 +167,20 @@ behind auth.
|
|
|
167
167
|
Runtime app → **local edition** only (Claude Desktop / Claude Code / CLI); the
|
|
168
168
|
build is **asynchronous**.
|
|
169
169
|
|
|
170
|
-
1. `
|
|
170
|
+
1. `grid_login_status` (→ `grid_login` if needed). Pick the grid if the
|
|
171
171
|
user has more than one.
|
|
172
|
-
2. `
|
|
172
|
+
2. `grid_init` an app `<name>` — creates the entity + `.cloudgrid/link.json`
|
|
173
173
|
and a `cloudgrid.yaml` with empty `services: {}`. Run `init` FIRST (plug needs
|
|
174
174
|
a linked dir).
|
|
175
175
|
3. **Fill** — write the app under `services/web/`, then set `cloudgrid.yaml` to
|
|
176
176
|
this blueprint's active fields: `name`, `services.web { type: nextjs, path: / }`,
|
|
177
177
|
`needs: { database: true }`, and the `vault:` mappings you actually use.
|
|
178
|
-
4. Store secrets: `
|
|
179
|
-
auth). Non-secret config (publishable keys, feature flags) → `
|
|
178
|
+
4. Store secrets: `grid_secrets` for the vault item values (Stripe/SendGrid/
|
|
179
|
+
auth). Non-secret config (publishable keys, feature flags) → `grid_env`.
|
|
180
180
|
5. (Optional) `grid dev` — runs Next.js locally with `DATABASE_MONGODB_URL` and
|
|
181
181
|
vault vars injected against dev Mongo. Seed `menu`, test a booking.
|
|
182
|
-
6. `
|
|
183
|
-
response is `status: building`, not a URL. Poll `
|
|
182
|
+
6. `grid_plug` — builds + deploys `services/web/`. **Async**: the first
|
|
183
|
+
response is `status: building`, not a URL. Poll `grid_status` (or the
|
|
184
184
|
returned poll URL) until live; surface a liveness signal while it builds
|
|
185
185
|
(never a bare silent wait). Only then return the **live app URL** (not the
|
|
186
186
|
build/log link).
|
|
@@ -20,7 +20,7 @@ app under `services/web/` following it — the proven `app-with-data` shape with
|
|
|
20
20
|
`MONGODB_URL` fallback — the grid injects it; never hardcode, never commit.
|
|
21
21
|
3. **Third-party secrets go through the `vault:` block** (Stripe `STRIPE_KEY`,
|
|
22
22
|
email `SENDGRID_API_KEY`, optional `AUTH_PROVIDER_KEY`) → injected env vars;
|
|
23
|
-
store values with `
|
|
23
|
+
store values with `grid_secrets`.
|
|
24
24
|
4. **Declare `needs: { database: true }`** (canonical) — never mix `needs:` and
|
|
25
25
|
`requires:`.
|
|
26
26
|
5. **Cron reminder service is documented but NOT deployable yet** (platform issue
|
|
@@ -29,7 +29,7 @@ app under `services/web/` following it — the proven `app-with-data` shape with
|
|
|
29
29
|
## Fetch bundle
|
|
30
30
|
|
|
31
31
|
```
|
|
32
|
-
|
|
32
|
+
grid_fetch("template", "restaurant-reservations") # cloudgrid.yaml + AGENTS.md + README
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
Then read `AGENTS.md` (file tree, `menu`/`reservations`/`tables` collections,
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
A single self-contained HTML SaaS marketing site (hero, features, pricing tiers, testimonials, FAQ, and a closing call to action). Richer than the landing-page template.
|
|
4
4
|
|
|
5
5
|
Static inspiration — a single self-contained `index.html` (inline CSS and JS,
|
|
6
|
-
no external CDNs). It deploys instantly via `
|
|
6
|
+
no external CDNs). It deploys instantly via `grid_drop` and works on every
|
|
7
7
|
CloudGrid edition, including hosted.
|
|
8
8
|
|
|
9
9
|
## Fill it in
|
|
10
10
|
|
|
11
|
-
Fetch the template with `
|
|
11
|
+
Fetch the template with `grid_fetch("template", "saas-marketing")`, then replace the
|
|
12
12
|
placeholders:
|
|
13
13
|
|
|
14
14
|
- The product name, tagline, and hero eyebrow/headline/subheadline.
|
|
@@ -24,7 +24,7 @@ stylesheets, fonts, or large embedded media.
|
|
|
24
24
|
## Deploy
|
|
25
25
|
|
|
26
26
|
- Hosted MCP edition: call the drop tool with the HTML.
|
|
27
|
-
- Local MCP / CLI edition: write the HTML to a file and run `
|
|
27
|
+
- Local MCP / CLI edition: write the HTML to a file and run `grid plug`.
|
|
28
28
|
|
|
29
29
|
It deploys as an inspiration and returns a live share URL right away. Re-deploy
|
|
30
30
|
with the same entity id to update the same URL.
|
|
@@ -5,14 +5,14 @@ State (if any) lives only in memory and is lost on refresh.
|
|
|
5
5
|
|
|
6
6
|
## How it deploys
|
|
7
7
|
|
|
8
|
-
To publish this page, use **`
|
|
8
|
+
To publish this page, use **`grid_drop`** (or `grid_plug` with the inline
|
|
9
9
|
HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
|
|
10
10
|
edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
|
|
11
11
|
directory (`type: static`) is ONLY for plugging the page as an OWNED static
|
|
12
|
-
runtime (async, local edition only); the fast path is `
|
|
12
|
+
runtime (async, local edition only); the fast path is `grid_drop`.
|
|
13
13
|
|
|
14
14
|
The fillable HTML is the real template — fetch it with
|
|
15
|
-
`
|
|
15
|
+
`grid_fetch("template", "saas-marketing")` and fill in the user's content.
|
|
16
16
|
|
|
17
17
|
## cloudgrid.yaml (reference only)
|
|
18
18
|
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
A single self-contained HTML service status page: an overall banner, a component list with up / degraded / down pills, per-component uptime bars, and an incident history log. Status is baked into the page.
|
|
4
4
|
|
|
5
5
|
Static inspiration — a single self-contained `index.html` (inline CSS and JS,
|
|
6
|
-
no external CDNs). It deploys instantly via `
|
|
6
|
+
no external CDNs). It deploys instantly via `grid_drop` and works on every
|
|
7
7
|
CloudGrid edition, including hosted.
|
|
8
8
|
|
|
9
9
|
## Fill it in
|
|
10
10
|
|
|
11
|
-
Fetch the template with `
|
|
11
|
+
Fetch the template with `grid_fetch("template", "status-page")`, then replace the
|
|
12
12
|
placeholders:
|
|
13
13
|
|
|
14
14
|
- The overall status banner text and state class (`ok` / `degraded` / `down`).
|
|
@@ -22,7 +22,7 @@ stylesheets, fonts, or large embedded media.
|
|
|
22
22
|
## Deploy
|
|
23
23
|
|
|
24
24
|
- Hosted MCP edition: call the drop tool with the HTML.
|
|
25
|
-
- Local MCP / CLI edition: write the HTML to a file and run `
|
|
25
|
+
- Local MCP / CLI edition: write the HTML to a file and run `grid plug`.
|
|
26
26
|
|
|
27
27
|
It deploys as an inspiration and returns a live share URL right away. Re-deploy
|
|
28
28
|
with the same entity id to update the same URL.
|
|
@@ -5,14 +5,14 @@ State (if any) lives only in memory and is lost on refresh.
|
|
|
5
5
|
|
|
6
6
|
## How it deploys
|
|
7
7
|
|
|
8
|
-
To publish this page, use **`
|
|
8
|
+
To publish this page, use **`grid_drop`** (or `grid_plug` with the inline
|
|
9
9
|
HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
|
|
10
10
|
edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
|
|
11
11
|
directory (`type: static`) is ONLY for plugging the page as an OWNED static
|
|
12
|
-
runtime (async, local edition only); the fast path is `
|
|
12
|
+
runtime (async, local edition only); the fast path is `grid_drop`.
|
|
13
13
|
|
|
14
14
|
The fillable HTML is the real template — fetch it with
|
|
15
|
-
`
|
|
15
|
+
`grid_fetch("template", "status-page")` and fill in the user's content.
|
|
16
16
|
|
|
17
17
|
## cloudgrid.yaml (reference only)
|
|
18
18
|
|
|
@@ -18,7 +18,7 @@ The two share the same Stripe + Mongo wiring.
|
|
|
18
18
|
The proven persistent shape is `app-with-data` (Next.js + Mongo). This blueprint
|
|
19
19
|
extends it with Stripe subscriptions + the Billing Portal. Fetch that template
|
|
20
20
|
for the Mongo lazy-client and App-Router API pattern:
|
|
21
|
-
`
|
|
21
|
+
`grid_fetch("template", "app-with-data")`.
|
|
22
22
|
|
|
23
23
|
## 1. File tree
|
|
24
24
|
|
|
@@ -89,7 +89,7 @@ client for plan/status — read this (kept current by the webhook).
|
|
|
89
89
|
STRIPE_KEY: stripe-live-key
|
|
90
90
|
STRIPE_WEBHOOK_SECRET: stripe-webhook-secret
|
|
91
91
|
```
|
|
92
|
-
Set the vault items ONCE with `
|
|
92
|
+
Set the vault items ONCE with `grid_secrets` (or `grid secrets set`), then
|
|
93
93
|
the deployer injects each as the named env var (`process.env.STRIPE_KEY`, etc.)
|
|
94
94
|
at runtime and under `grid dev`. Do NOT commit keys; do NOT set them in
|
|
95
95
|
`services.web.env` (that block is for non-secret config only). Read them lazily
|
|
@@ -158,22 +158,22 @@ known user — otherwise anyone could change anyone's plan.
|
|
|
158
158
|
|
|
159
159
|
## 5. Deploy steps
|
|
160
160
|
|
|
161
|
-
1. `
|
|
161
|
+
1. `grid_login_status` → `grid_login` if needed. Respect the grid picker
|
|
162
162
|
(ask which grid if the user has more than one).
|
|
163
|
-
2. `
|
|
163
|
+
2. `grid_init` an app `<name>` FIRST — it creates the entity, writes
|
|
164
164
|
`.cloudgrid/link.json`, and a `cloudgrid.yaml` with empty `services: {}`.
|
|
165
165
|
`plug` needs a linked directory.
|
|
166
166
|
3. Write the app under `services/web/` and set `cloudgrid.yaml` to the active
|
|
167
167
|
shape: `name` + `services.web{type: nextjs, path: /}` + `needs:{database:true}`
|
|
168
168
|
+ the `vault:` block.
|
|
169
|
-
4. Set the secrets: `
|
|
169
|
+
4. Set the secrets: `grid_secrets` for `stripe-live-key`,
|
|
170
170
|
`stripe-webhook-secret` (and `auth-provider-key` if you use an auth SDK) — the
|
|
171
171
|
vault item keys the `vault:` block maps from. Non-secret config (Stripe
|
|
172
|
-
publishable key, price ids, auth publishable key) → `
|
|
172
|
+
publishable key, price ids, auth publishable key) → `grid_env` /
|
|
173
173
|
`services.web.env`. Do NOT set `DATABASE_MONGODB_URL` yourself — the grid
|
|
174
174
|
injects it.
|
|
175
|
-
5. `
|
|
176
|
-
is `status: building`, not a live URL. Poll `
|
|
175
|
+
5. `grid_plug` to deploy. A runtime deploy is **ASYNC** — the first response
|
|
176
|
+
is `status: building`, not a live URL. Poll `grid_status` (or the returned
|
|
177
177
|
poll_url) until live; surface a liveness signal while it builds, never a bare
|
|
178
178
|
silent wait.
|
|
179
179
|
6. Once live, add the `/api/webhook` URL as the Stripe webhook endpoint, copy
|
|
@@ -187,5 +187,5 @@ A subscription-management app is a built + deployed runtime container, so it
|
|
|
187
187
|
requires the **local edition** (Claude Desktop / Claude Code) or the CLI. The
|
|
188
188
|
**hosted** edition (Claude Web / hosted MCP) is inline-only and can only publish
|
|
189
189
|
static pages — it CANNOT build this app. On hosted, say so plainly and offer a
|
|
190
|
-
static pricing/plans page (via `
|
|
190
|
+
static pricing/plans page (via `grid_drop`) instead, then stop the runtime
|
|
191
191
|
path.
|