@mediamonks/canopy-cli 0.7.5 → 0.7.7
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/dist/docs/cli-create.md +46 -0
- package/dist/docs/cli-db.md +86 -0
- package/dist/docs/cli-delete.md +44 -0
- package/dist/docs/cli-deploy.md +58 -0
- package/dist/docs/cli-dev.md +63 -0
- package/dist/docs/cli-docs.md +47 -0
- package/dist/docs/cli-download.md +42 -0
- package/dist/docs/cli-egress.md +37 -0
- package/dist/docs/cli-feedback.md +51 -0
- package/dist/docs/cli-index.md +61 -0
- package/dist/docs/cli-init.md +46 -0
- package/dist/docs/cli-login.md +43 -0
- package/dist/docs/cli-logout.md +32 -0
- package/dist/docs/cli-logs.md +57 -0
- package/dist/docs/cli-open.md +41 -0
- package/dist/docs/cli-projects.md +43 -0
- package/dist/docs/cli-promote.md +44 -0
- package/dist/docs/cli-rollback.md +45 -0
- package/dist/docs/cli-skill.md +39 -0
- package/dist/docs/cli-staging.md +54 -0
- package/dist/docs/cli-token.md +47 -0
- package/dist/docs/cli-upgrade.md +43 -0
- package/dist/docs/cli-usage.md +43 -0
- package/dist/docs/cli-whoami.md +46 -0
- package/dist/docs/developers-agents-and-ai.md +95 -0
- package/dist/docs/developers-architecture.md +106 -0
- package/dist/docs/index.json +331 -0
- package/dist/docs/infrastructure.md +5 -8
- package/dist/docs/overview-faq.md +105 -0
- package/dist/docs/overview-how-it-works.md +81 -0
- package/dist/docs/overview-use-cases.md +76 -0
- package/dist/docs/overview-what-is-canopy.md +75 -0
- package/dist/docs/platform-ai-usage.md +65 -0
- package/dist/docs/platform-client-access.md +53 -0
- package/dist/docs/platform-deploys-and-rollbacks.md +93 -0
- package/dist/docs/platform-egress.md +75 -0
- package/dist/docs/platform-feedback.md +79 -0
- package/dist/docs/platform-members-and-access.md +71 -0
- package/dist/docs/platform-project-data.md +66 -0
- package/dist/docs/platform-schedules.md +90 -0
- package/dist/docs/platform-sites-and-profiles.md +61 -0
- package/dist/docs/static-serving.md +5 -8
- package/dist/docs/troubleshooting.md +6 -8
- package/dist/{docs-DQmUReJR.mjs → docs-DOiL2Sw-.mjs} +42 -20
- package/dist/feedback-BZG8E8zG.mjs +258 -0
- package/dist/index.mjs +10 -9
- package/dist/{logs-DBLDS3aQ.mjs → logs-DuzM-_Rn.mjs} +1 -1
- package/dist/{package-yVoO2pq4.mjs → package-BNiOibhj.mjs} +1 -1
- package/dist/{projects-D2fDeWNU.mjs → projects-C9TBoiW7.mjs} +5 -8
- package/dist/skill/canopy/SKILL.md +17 -8
- package/dist/{skill-12Ga-2UT.mjs → skill-DRTg-mJR.mjs} +1 -1
- package/dist/templates/worker/AGENTS.md +0 -3
- package/dist/templates/worker/README.md +1 -5
- package/dist/{upgrade-Du6U0xjp.mjs → upgrade-BDaM4M6Y.mjs} +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use cases
|
|
3
|
+
description: What kinds of projects belong on Canopy — and which ones should live somewhere else.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Canopy is built for many small projects, not one big one. It shines when you
|
|
7
|
+
want to get an idea in front of colleagues or a client quickly, with real data
|
|
8
|
+
and real AI behind it, without asking anyone to set up infrastructure.
|
|
9
|
+
|
|
10
|
+
## Good fits
|
|
11
|
+
|
|
12
|
+
**Client-facing prototypes.** You're pitching a concept and want the client to
|
|
13
|
+
click through something real, not a slide deck. Build it with your agent,
|
|
14
|
+
deploy it, and share the link with a project password — the client sees a
|
|
15
|
+
working app without needing a Monks account, and nobody else on the internet
|
|
16
|
+
can.
|
|
17
|
+
|
|
18
|
+
**Internal tools.** A small utility your team needs: a content checker, a
|
|
19
|
+
campaign asset tracker, a review queue. It sits behind Monks sign-in
|
|
20
|
+
automatically, saves its data to its own database, and stays available without
|
|
21
|
+
anyone babysitting a server.
|
|
22
|
+
|
|
23
|
+
**Demos and experiments with AI.** You want to show what a model can do with
|
|
24
|
+
your workflow — a summarizer, a brief generator, a chat over project material.
|
|
25
|
+
Canopy gives the project AI access with a hard spend cap, so an enthusiastic
|
|
26
|
+
demo (or a runaway loop) can never turn into a scary bill.
|
|
27
|
+
|
|
28
|
+
**Microsites that need data or uploads.** A small site for a workshop, an
|
|
29
|
+
internal survey, a moodboard collector. Structured data and file uploads work
|
|
30
|
+
through simple calls — no database setup, and uploaded files are never left
|
|
31
|
+
publicly exposed.
|
|
32
|
+
|
|
33
|
+
**Projects with client or project data.** Canopy projects may hold real client
|
|
34
|
+
material. Each project's data is isolated — its own database, its own storage
|
|
35
|
+
space — and everything sits behind sign-in, so work-in-progress with real
|
|
36
|
+
content is a normal use, not an exception.
|
|
37
|
+
|
|
38
|
+
### A few concrete scenarios
|
|
39
|
+
|
|
40
|
+
- A strategist vibecoding a pitch prototype over a weekend, sharing it Monday
|
|
41
|
+
behind a client password.
|
|
42
|
+
- A producer building a tracker the whole team uses daily, with teammates
|
|
43
|
+
invited as collaborators.
|
|
44
|
+
- A developer prototyping an AI-assisted workflow with a custom backend,
|
|
45
|
+
scheduled jobs, and secrets — still inside platform auth and budgets.
|
|
46
|
+
|
|
47
|
+
## Not a fit
|
|
48
|
+
|
|
49
|
+
Canopy has deliberate anti-goals. If your project is one of these, it belongs
|
|
50
|
+
on another platform from day one:
|
|
51
|
+
|
|
52
|
+
- **Public production apps.** Nothing on Canopy is reachable without OneLogin
|
|
53
|
+
or a project password. A public marketing site, a consumer app, or anything
|
|
54
|
+
meant for anonymous visitors can't live here.
|
|
55
|
+
- **Apps that need production guarantees.** There are no SLAs, no autoscaling,
|
|
56
|
+
no multi-region hosting. If downtime would be a real incident, you need
|
|
57
|
+
dedicated hosting.
|
|
58
|
+
- **Arbitrary server stacks.** Canopy is not a general-purpose cloud — no
|
|
59
|
+
bring-your-own database, no arbitrary long-running servers or containers.
|
|
60
|
+
Projects use the platform's building blocks.
|
|
61
|
+
- **Data pipelines and integration hubs.** Canopy can talk to existing internal
|
|
62
|
+
services, but it's not the place where data warehousing or pipelines live.
|
|
63
|
+
|
|
64
|
+
> **Note:** The rule of thumb: Canopy is the greenhouse, not the forest. When a project proves itself and
|
|
65
|
+
> needs scale, guarantees, or a public audience, it graduates — exporting its code, database, and
|
|
66
|
+
> files cleanly to dedicated hosting.
|
|
67
|
+
|
|
68
|
+
## Not sure?
|
|
69
|
+
|
|
70
|
+
If your project mostly needs to be seen by Monks or a specific client, saves a
|
|
71
|
+
modest amount of data, and would benefit from shipping this week instead of
|
|
72
|
+
this quarter — it's probably a Canopy project. If in doubt, start on Canopy;
|
|
73
|
+
graduation is a supported path, not a rewrite.
|
|
74
|
+
|
|
75
|
+
- [What is Canopy?](https://docs.canopy.website/overview/what-is-canopy) — The platform in plain language — who it's for and what's managed.
|
|
76
|
+
- [FAQ](https://docs.canopy.website/overview/faq) — Who can see my project, what happens when a deploy breaks, and more.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: What is Canopy?
|
|
3
|
+
description: A fully managed home for vibecoded Monks projects — hosting, sign-in, data, files, and AI, all set up before your first prompt.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Canopy is where Monks put the projects they vibecode with AI tools. You describe
|
|
7
|
+
an idea, your AI agent builds it, and Canopy runs it — with sign-in, a database,
|
|
8
|
+
file storage, and AI access already wired up and safe before you write (or
|
|
9
|
+
prompt) a single line.
|
|
10
|
+
|
|
11
|
+
Think of it as a greenhouse: a protected place where small projects can grow
|
|
12
|
+
quickly. When one proves its value, it can graduate to its own dedicated home —
|
|
13
|
+
nothing is trapped here.
|
|
14
|
+
|
|
15
|
+
## Who it's for
|
|
16
|
+
|
|
17
|
+
Canopy serves two kinds of builders on one platform:
|
|
18
|
+
|
|
19
|
+
- **Vibers** — producers, designers, PMs, and strategists who build with AI
|
|
20
|
+
agents. The platform is your guardrail: you can't accidentally publish
|
|
21
|
+
something to the open internet, leak a file, or run up a runaway AI bill,
|
|
22
|
+
because the safe path is the only path.
|
|
23
|
+
- **Coders** — developers who want the same paved road (auth, database, storage
|
|
24
|
+
arranged for them) plus escape hatches like raw SQL and their own backend
|
|
25
|
+
code when they need more control.
|
|
26
|
+
|
|
27
|
+
If you can prompt an AI coding agent, you can ship on Canopy.
|
|
28
|
+
|
|
29
|
+
## What "fully managed" means
|
|
30
|
+
|
|
31
|
+
You never touch infrastructure. The platform team owns and operates everything
|
|
32
|
+
behind the scenes, so for you it looks like this:
|
|
33
|
+
|
|
34
|
+
- **Hosting.** Every project gets its own web address on `canopy.website`. You
|
|
35
|
+
don't set up servers, domains, or certificates.
|
|
36
|
+
- **Sign-in, always on.** Every project sits behind Monks OneLogin
|
|
37
|
+
automatically. Any Monk can open it by default; you can tighten access to
|
|
38
|
+
collaborators only, or add a shared password so clients without a Monks
|
|
39
|
+
account can see work-in-progress. Nothing on Canopy is ever truly public.
|
|
40
|
+
- **Data and files.** Each project has its own private database and file
|
|
41
|
+
storage. No tables to design, no migrations, no connection strings — and no
|
|
42
|
+
other project can see your data.
|
|
43
|
+
- **AI with guardrails.** Projects can talk to the major AI models through the
|
|
44
|
+
platform, with a hard spend cap per project and full visibility of what
|
|
45
|
+
you've spent.
|
|
46
|
+
- **Deploys.** Putting a new version online is one step — from the terminal,
|
|
47
|
+
from the dashboard, or automatically when code lands in your repository. Every
|
|
48
|
+
deploy becomes a version you can preview and roll back to.
|
|
49
|
+
|
|
50
|
+
> **Note:** Curious how a project moves from idea to live URL? See [How it works](https://docs.canopy.website/overview/how-it-works).
|
|
51
|
+
|
|
52
|
+
## What you need to get access
|
|
53
|
+
|
|
54
|
+
- **A Monks account.** You sign in to everything — the dashboard and every
|
|
55
|
+
project — with OneLogin. Your Canopy account is created automatically the
|
|
56
|
+
first time you sign in.
|
|
57
|
+
- **The dashboard.** [dashboard.canopy.website](https://dashboard.canopy.website)
|
|
58
|
+
is where you see your projects, invite teammates, browse data, check usage,
|
|
59
|
+
and manage settings.
|
|
60
|
+
- **The Canopy CLI (optional but usual).** A small command-line tool your AI
|
|
61
|
+
agent uses to create, preview, and deploy projects. The
|
|
62
|
+
[getting started guide](https://docs.canopy.website/guides/getting-started) walks you through
|
|
63
|
+
installing it and connecting your coding agent — the agent does most of the
|
|
64
|
+
typing for you.
|
|
65
|
+
|
|
66
|
+
## What Canopy is not
|
|
67
|
+
|
|
68
|
+
Canopy is deliberately not a production hosting platform. There are no uptime
|
|
69
|
+
guarantees, no autoscaling, and nothing reachable by the anonymous public
|
|
70
|
+
internet. Projects that outgrow the greenhouse graduate: they export cleanly
|
|
71
|
+
(code, database, files) and move to dedicated hosting. See
|
|
72
|
+
[Use cases](https://docs.canopy.website/overview/use-cases) for what belongs here and what doesn't.
|
|
73
|
+
|
|
74
|
+
- [How it works](https://docs.canopy.website/overview/how-it-works) — The life of a project, from creation to rollback, in plain words.
|
|
75
|
+
- [Getting started](https://docs.canopy.website/guides/getting-started) — Install the CLI, sign in, and ship your first project.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: AI access & usage
|
|
3
|
+
description: Projects talk to AI models through the platform — no API keys to manage, a hard daily budget per project, and full visibility of spend.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Canopy projects can call AI models without you ever handling an API key. The
|
|
7
|
+
platform routes every request through its own metered gateway, tracks what
|
|
8
|
+
each project spends, and enforces a hard daily budget — so a runaway loop in
|
|
9
|
+
a vibecoded app becomes a capped bill and a visible chart, not a surprise
|
|
10
|
+
invoice.
|
|
11
|
+
|
|
12
|
+
## What your app gets
|
|
13
|
+
|
|
14
|
+
The SDK exposes AI as a first-class building block:
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
const reply = await canopy.ai.chat({
|
|
18
|
+
messages: [{ role: "user", content: "Summarize this note…" }],
|
|
19
|
+
});
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
- **No keys in your code.** Requests authenticate as the project; the
|
|
23
|
+
platform holds the provider credentials.
|
|
24
|
+
- **A curated model list.** Each site enables a set of models
|
|
25
|
+
(`provider/model`, e.g. `anthropic/claude-haiku-4-5`) with a sensible
|
|
26
|
+
default — ask for a model outside the list and the API tells you what _is_
|
|
27
|
+
available.
|
|
28
|
+
- **Streaming** via `canopy.ai.chatStream()` for chat-style UIs.
|
|
29
|
+
- **An OpenAI-compatible endpoint.** `canopy.ai.endpoint()` returns a base
|
|
30
|
+
URL and model list you can plug into ecosystem tools (like the Vercel AI
|
|
31
|
+
SDK) — same key handling, same budget, same tracking.
|
|
32
|
+
|
|
33
|
+
## The daily budget
|
|
34
|
+
|
|
35
|
+
Every project has a daily AI budget in USD. When a project's spend for the
|
|
36
|
+
day crosses it, further AI calls answer with an `ai_budget_exceeded` error
|
|
37
|
+
until the day rolls over. The budget is enforced from the same spend ledger
|
|
38
|
+
the dashboard displays, so what you see and what's enforced can never
|
|
39
|
+
disagree.
|
|
40
|
+
|
|
41
|
+
> **Note:** Hitting the cap doesn't break the rest of your app — pages, data, and files keep working. Only AI
|
|
42
|
+
> calls pause until the next day.
|
|
43
|
+
|
|
44
|
+
## The Usage tab
|
|
45
|
+
|
|
46
|
+
Open a project in the dashboard and the **Usage** tab shows where it stands:
|
|
47
|
+
|
|
48
|
+
- **LLM spend** — estimated cost, request count, and tokens over the recent
|
|
49
|
+
window, broken down by model and by day.
|
|
50
|
+
- **Activity** — page loads today and over the last 7 days, plus when the
|
|
51
|
+
project was last visited. A quick answer to "is anyone actually using
|
|
52
|
+
this?"
|
|
53
|
+
- **Storage & deploys** — database size, blob storage footprint, and how many
|
|
54
|
+
versions have shipped.
|
|
55
|
+
|
|
56
|
+
## From the terminal
|
|
57
|
+
|
|
58
|
+
`canopy usage` prints the same view without leaving your shell:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
canopy usage # AI spend, activity, storage, deploys
|
|
62
|
+
canopy usage --json # machine-readable, for agents and scripts
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
- [Getting started](https://docs.canopy.website/guides/getting-started) — Create a project and let your coding agent wire up AI, data, and files.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Client access
|
|
3
|
+
description: Share a project with clients who have no Monks account — a shared password unlocks that one project's URL and nothing else.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Everything on Canopy normally requires a Monks sign-in — which is exactly
|
|
7
|
+
right until you want a client to see work-in-progress. Client access solves
|
|
8
|
+
that: you set a shared password on a project, send the client the URL and the
|
|
9
|
+
password, and they're in. No account creation, no invitations, no exceptions
|
|
10
|
+
punched through the platform for anyone else.
|
|
11
|
+
|
|
12
|
+
## How it works
|
|
13
|
+
|
|
14
|
+
With client access enabled, a visitor without a Monks session who opens the
|
|
15
|
+
project's URL gets a simple password page instead of the SSO redirect. Enter
|
|
16
|
+
the right password and the app loads; Monks can still click through to
|
|
17
|
+
company sign-in from the same page.
|
|
18
|
+
|
|
19
|
+
The unlock is deliberately narrow:
|
|
20
|
+
|
|
21
|
+
- **One project only.** The password grants access to that project's own
|
|
22
|
+
subdomain and nothing else — it can't be used on any other project or on
|
|
23
|
+
the dashboard.
|
|
24
|
+
- **The live app only.** Clients see what a signed-in viewer would see. They
|
|
25
|
+
never get the dashboard, the data browser, deploy history, or settings.
|
|
26
|
+
- **It expires.** Access is a temporary session on that browser; when it
|
|
27
|
+
lapses, the password page comes back.
|
|
28
|
+
|
|
29
|
+
## Enabling it
|
|
30
|
+
|
|
31
|
+
Open the project's **Settings** tab and use the **Client access** card:
|
|
32
|
+
|
|
33
|
+
1. Set a password. Pick something you're comfortable saying out loud on a
|
|
34
|
+
call — it's a shared secret, not a personal credential.
|
|
35
|
+
2. Send the client the project URL and the password.
|
|
36
|
+
|
|
37
|
+
To change the password, set a new one — previously handed-out passwords stop
|
|
38
|
+
working for new sign-ins. To turn client access off entirely, remove the
|
|
39
|
+
password from the same card; visitors are back to Monks-only immediately.
|
|
40
|
+
|
|
41
|
+
> **Warning:** A shared password is deliberately lightweight protection — right for work-in-progress previews,
|
|
42
|
+
> wrong for anything sensitive. Anyone who has it can view the app and share it further, so rotate
|
|
43
|
+
> it when a review round ends.
|
|
44
|
+
|
|
45
|
+
## Playing well with other access controls
|
|
46
|
+
|
|
47
|
+
Client access is independent of
|
|
48
|
+
[collaborators-only mode](https://docs.canopy.website/platform/members-and-access): you can lock
|
|
49
|
+
the app down for Monks outside the team while a client with the password
|
|
50
|
+
still gets in. That combination — "the client and the project team, nobody
|
|
51
|
+
else" — is a common setup during a review phase.
|
|
52
|
+
|
|
53
|
+
- [Members & access](https://docs.canopy.website/platform/members-and-access) — Who can view and who can manage a project, and how to tighten it.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Deploys & rollbacks
|
|
3
|
+
description: Every deploy is a numbered version you can preview, download, and make live again — rolling back is instant and loses nothing.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Every time you publish a project, Canopy records it as a numbered version —
|
|
7
|
+
v1, v2, v3, and so on. The live site is simply a pointer at one of those
|
|
8
|
+
versions. That one idea powers everything on this page: previews, rollbacks,
|
|
9
|
+
and downloads are all just different ways of looking at (or pointing at) a
|
|
10
|
+
version that already exists.
|
|
11
|
+
|
|
12
|
+
## What a deploy contains
|
|
13
|
+
|
|
14
|
+
A deploy is the built files of your app — the HTML, JavaScript, CSS, and other
|
|
15
|
+
assets your build produces. Projects with a custom backend also ship their
|
|
16
|
+
worker code in the same deploy, so frontend and backend always move together
|
|
17
|
+
as one version.
|
|
18
|
+
|
|
19
|
+
A deploy only goes live after every file has been uploaded and validated. A
|
|
20
|
+
connection that drops halfway never leaves your project in a broken state —
|
|
21
|
+
the previous version keeps serving until the new one is complete.
|
|
22
|
+
|
|
23
|
+
## Ways to deploy
|
|
24
|
+
|
|
25
|
+
- **From the terminal** — `canopy deploy` builds your project and publishes a
|
|
26
|
+
new version. This is what your coding agent runs. See the
|
|
27
|
+
[deploy guide](https://docs.canopy.website/guides/deploy) for details.
|
|
28
|
+
- **From the dashboard** — on the project's Overview tab, upload a new version
|
|
29
|
+
by dragging in a zip, a folder, or loose files. No command line required.
|
|
30
|
+
- **Automatically from CI** — create a project-scoped deploy token, add it to
|
|
31
|
+
your repository's secrets, and merging to `main` ships a new version on its
|
|
32
|
+
own. See [CI and deploy tokens](https://docs.canopy.website/guides/ci).
|
|
33
|
+
|
|
34
|
+
The dashboard's deploy history shows every version with who published it and
|
|
35
|
+
where it came from (CLI, dashboard, or CI).
|
|
36
|
+
|
|
37
|
+
## Rolling back
|
|
38
|
+
|
|
39
|
+
If a deploy goes wrong, point the site back at an earlier version. Rollback
|
|
40
|
+
moves the live pointer — nothing is copied, rebuilt, or deleted, so it takes
|
|
41
|
+
effect immediately and every version keeps its identity. Projects with a
|
|
42
|
+
custom backend roll their backend back to the matching version too.
|
|
43
|
+
|
|
44
|
+
- **Dashboard** — open the project's Overview tab and pick the version to make
|
|
45
|
+
live from the deploy history.
|
|
46
|
+
- **CLI**:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
canopy rollback # pick a version from a list
|
|
50
|
+
canopy rollback v3 # make v3 live directly
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
You can also "roll forward": after reverting to v3, making v5 live again is
|
|
54
|
+
the same one-step operation. Any version in the history can be live.
|
|
55
|
+
|
|
56
|
+
## The staging channel
|
|
57
|
+
|
|
58
|
+
Beyond previews, every project can have a full **staging channel**: a staged
|
|
59
|
+
version served at `https://staging-dot-<slug>.canopy.website` with its own
|
|
60
|
+
database (a copy of live), its own files, and its own backend. Deploy there
|
|
61
|
+
with `canopy deploy --staging` (or the dashboard's upload dialog), verify, and
|
|
62
|
+
**promote** — the exact staged version becomes live, schema migrations
|
|
63
|
+
replaying against the live database first. See
|
|
64
|
+
[Staging & promoting](https://docs.canopy.website/guides/staging).
|
|
65
|
+
|
|
66
|
+
## Previewing any version
|
|
67
|
+
|
|
68
|
+
Every version has its own stable preview URL, so you can open an old build
|
|
69
|
+
next to the current one without touching what's live:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
https://v12-dot-<slug>.canopy.website
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Preview URLs sit behind the same sign-in as the live site — they're for
|
|
76
|
+
comparing builds and reviewing history, not for sharing something different
|
|
77
|
+
from what access settings allow. A preview shows an old frontend against the
|
|
78
|
+
live data; for a full candidate environment (frontend + backend + own
|
|
79
|
+
database) use the staging channel above.
|
|
80
|
+
|
|
81
|
+
## Downloading a version
|
|
82
|
+
|
|
83
|
+
You can download the exact files behind any past version as a zip — handy for
|
|
84
|
+
comparing builds or restoring something by hand:
|
|
85
|
+
|
|
86
|
+
- **Dashboard** — from the version's entry in the deploy history.
|
|
87
|
+
- **CLI** — `canopy download`, which lets you pick a version.
|
|
88
|
+
|
|
89
|
+
Downloads are limited to the project's members; the deploy bundle is your
|
|
90
|
+
source, not the public site.
|
|
91
|
+
|
|
92
|
+
- [Deploying](https://docs.canopy.website/guides/deploy) — Build commands, canopy.json, and what canopy deploy does step by step.
|
|
93
|
+
- [CI and deploy tokens](https://docs.canopy.website/guides/ci) — Ship a new version automatically on every push to main.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Outbound requests
|
|
3
|
+
description: Which external hosts your project's backend may fetch — a per-project allowlist you manage yourself.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Outbound `fetch` from a project's backend worker is **deny-by-default**: the
|
|
7
|
+
platform only lets requests through to platform infrastructure (your database,
|
|
8
|
+
files, AI, the Canopy API) and to the hosts on your project's own
|
|
9
|
+
**egress allowlist**. Anything else is answered locally with a 403
|
|
10
|
+
`egress_denied` — the request never leaves the runtime.
|
|
11
|
+
|
|
12
|
+
That default is deliberate: a thousand idle vibecoded projects should not be
|
|
13
|
+
able to call arbitrary internet hosts. When your project genuinely needs an
|
|
14
|
+
external API, you allow that host yourself — no platform-team ticket.
|
|
15
|
+
|
|
16
|
+
> **Note:** Enforcement applies on every target. On GCP the runtime answers the 403 itself; on Cloudflare the
|
|
17
|
+
> platform vets each outbound request outside your worker. Same rule, same error, one allowlist.
|
|
18
|
+
|
|
19
|
+
## Allowing a host
|
|
20
|
+
|
|
21
|
+
CLI, from the project directory:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
canopy egress allow generativelanguage.googleapis.com
|
|
25
|
+
canopy egress list
|
|
26
|
+
canopy egress remove generativelanguage.googleapis.com
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Or in the dashboard: **Settings → Outbound hosts**.
|
|
30
|
+
|
|
31
|
+
Changes apply to the **running** workers within moments — the platform re-rolls
|
|
32
|
+
the project's services with the new list, no deploy needed. Live and staging
|
|
33
|
+
share one list, like secrets: the staging worker is the same code and needs the
|
|
34
|
+
same hosts.
|
|
35
|
+
|
|
36
|
+
## What an entry looks like
|
|
37
|
+
|
|
38
|
+
- A bare hostname: `api.example.com` — matches exactly that host.
|
|
39
|
+
- A subdomain wildcard: `*.googleapis.com` — matches any subdomain
|
|
40
|
+
(`storage.googleapis.com`, `a.b.googleapis.com`) but **not** the apex
|
|
41
|
+
`googleapis.com`.
|
|
42
|
+
|
|
43
|
+
Hostnames only: no IP addresses, CIDR ranges, ports, schemes, or paths, and no
|
|
44
|
+
`*` catch-all. Entries are case-insensitive; unicode names are stored in their
|
|
45
|
+
punycode form. A project can list up to **32** hosts.
|
|
46
|
+
|
|
47
|
+
## What doesn't count as egress
|
|
48
|
+
|
|
49
|
+
Everything you reach through the SDK — `canopy.db`, `canopy.blob`,
|
|
50
|
+
`canopy.ai`, and `env.CANOPY.fetch` — goes through the platform and is always
|
|
51
|
+
allowed. The allowlist only governs direct `fetch` calls from your worker code
|
|
52
|
+
to the outside world. (Frontend code in the browser is unaffected — this is
|
|
53
|
+
about the worker.)
|
|
54
|
+
|
|
55
|
+
## When a request is denied
|
|
56
|
+
|
|
57
|
+
The blocked `fetch` resolves (in ~2ms, no network attempt) with status 403 and
|
|
58
|
+
body:
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{ "error": "egress_denied", "detail": "host api.example.com is not on the project allowlist" }
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Allow the host and retry — see the
|
|
65
|
+
[troubleshooting entry](https://docs.canopy.website/guides/troubleshooting#egress_denied-403).
|
|
66
|
+
|
|
67
|
+
## Recently blocked hosts
|
|
68
|
+
|
|
69
|
+
You don't have to guess what got denied: the runtime reports every blocked
|
|
70
|
+
host back to the platform, and they show up as **Recently blocked** in
|
|
71
|
+
Settings → Outbound hosts (and in `canopy egress list`), with how often and
|
|
72
|
+
how recently each was hit. One click on **Allow** puts the host on the list
|
|
73
|
+
and clears it from the blocked section. Hosts that keep a low profile drop
|
|
74
|
+
off — the list remembers the 50 most recent — and allowing a host removes its
|
|
75
|
+
blocked entry immediately.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Feedback & bug reports
|
|
3
|
+
description: A built-in feedback widget on every project, a ticket-lite inbox behind it, and a CLI that lets agents work the backlog.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Every Canopy project gets an in-app feedback channel without writing a line of
|
|
7
|
+
code: signed-in Monks see a small floating button on the live app, pick **Bug**
|
|
8
|
+
or **Feedback**, type what happened, and send. The report lands in the
|
|
9
|
+
project's **Feedback tab** on the dashboard, with everything an investigator
|
|
10
|
+
needs captured automatically — page URL, the deploy version that served it,
|
|
11
|
+
viewport, and recent console errors.
|
|
12
|
+
|
|
13
|
+
It is deliberately **not** a ticketing product: an item has a status, an
|
|
14
|
+
append-only comment trail, and nothing else. No assignees, priorities, or
|
|
15
|
+
boards.
|
|
16
|
+
|
|
17
|
+
## The widget
|
|
18
|
+
|
|
19
|
+
- Appears only for **signed-in Monks**. Client-password visitors never see it —
|
|
20
|
+
the platform doesn't even send them the script.
|
|
21
|
+
- On by default for every project. Turn it off per project in
|
|
22
|
+
**Settings → Feedback widget**; the change applies on the next page load.
|
|
23
|
+
- Submissions are always identified (your company sign-in), so there's no
|
|
24
|
+
anonymous spam and no reporter field to fill in.
|
|
25
|
+
- The widget also shows your own previous reports for that project with their
|
|
26
|
+
current status.
|
|
27
|
+
- A page can reshape the chooser with meta tags — this docs site does exactly
|
|
28
|
+
that: `<meta name="canopy-feedback-kinds" content="docs,feedback">` swaps
|
|
29
|
+
"Bug" for "Docs issue", and `canopy-feedback-prompt` replaces the textarea
|
|
30
|
+
placeholder. Kinds are limited to `bug`, `feedback`, `docs`.
|
|
31
|
+
|
|
32
|
+
## The inbox
|
|
33
|
+
|
|
34
|
+
Project members triage reports on the **Feedback tab**:
|
|
35
|
+
|
|
36
|
+
- Statuses: `new → accepted → in_progress → resolved`, plus `declined`.
|
|
37
|
+
**`accepted` means "this is valid — an agent may pick it up."**
|
|
38
|
+
- Every status change and comment is recorded on the item's trail.
|
|
39
|
+
- Reporters follow their submissions on the **Reports page** (dashboard
|
|
40
|
+
header) and can comment on or withdraw their own items; only project
|
|
41
|
+
members change statuses.
|
|
42
|
+
|
|
43
|
+
## Working the backlog with an agent
|
|
44
|
+
|
|
45
|
+
Because the CLI exposes the inbox, "work through the accepted feedback" is a
|
|
46
|
+
prompt, not a process:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
canopy feedback list --status accepted # what a human marked valid
|
|
50
|
+
canopy feedback show <id> # body + captured context + trail
|
|
51
|
+
canopy feedback comment <id> "root cause: …" # append findings
|
|
52
|
+
canopy feedback status <id> resolved --comment "fixed in v42"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
`show` includes the deploy version that served the page when the bug was
|
|
56
|
+
reported — reproduce against that, not whatever is live now. An agent that
|
|
57
|
+
investigates but can't fix should `comment` its findings and leave the status
|
|
58
|
+
for a human; one that pushes back should `status <id> declined` with a comment
|
|
59
|
+
saying why.
|
|
60
|
+
|
|
61
|
+
## Reporting problems with Canopy itself
|
|
62
|
+
|
|
63
|
+
When a `canopy` command fails while you (or your agent) are building a
|
|
64
|
+
project, file it against the **platform inbox** — not your own project:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
canopy feedback report "deploy failed after upload" \
|
|
68
|
+
--command "canopy deploy --staging" --error "upload_grant_expired …"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
With no `--project`, the report goes to the platform team automatically, with
|
|
72
|
+
your CLI version, site, and the project you were working on attached. Before
|
|
73
|
+
filing: rule out user error first (`canopy docs troubleshooting`,
|
|
74
|
+
`vp env doctor` for toolchain issues), and skim `canopy feedback mine` to
|
|
75
|
+
avoid filing the same issue twice.
|
|
76
|
+
|
|
77
|
+
## CLI reference
|
|
78
|
+
|
|
79
|
+
See [canopy feedback](https://docs.canopy.website/cli/feedback) for every subcommand and flag.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Members & access
|
|
3
|
+
description: Everything on Canopy sits behind Monks sign-in. Collaborators manage a project; other Monks can view the live app — unless you tighten it.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Nothing on Canopy is reachable by the anonymous internet. Every project URL
|
|
7
|
+
and the dashboard itself sit behind Monks OneLogin — visitors sign in with
|
|
8
|
+
their company account before they see anything. On top of that wall, each
|
|
9
|
+
project has its own roster that decides who can _manage_ it and, optionally,
|
|
10
|
+
who can _view_ it.
|
|
11
|
+
|
|
12
|
+
## The default: any Monk can look, members can manage
|
|
13
|
+
|
|
14
|
+
Out of the box:
|
|
15
|
+
|
|
16
|
+
- **Any signed-in Monk** can open a project's live URL and see the app. The
|
|
17
|
+
project also appears in the company-wide list on the dashboard.
|
|
18
|
+
- **Only the project's members** (and platform admins) can open its
|
|
19
|
+
management pages — deploy history, data browser, usage, and settings.
|
|
20
|
+
|
|
21
|
+
That default fits most internal work: colleagues can try what you built, but
|
|
22
|
+
nobody outside the team can touch its data or settings.
|
|
23
|
+
|
|
24
|
+
## Roles
|
|
25
|
+
|
|
26
|
+
- **Owner** — the person who created the project. Owners govern it: they
|
|
27
|
+
invite and remove collaborators, change access settings, and can delete
|
|
28
|
+
the project.
|
|
29
|
+
- **Collaborator** — invited teammates. They can do day-to-day work — deploy,
|
|
30
|
+
roll back, browse and edit data, manage schedules and secrets — but not
|
|
31
|
+
delete the project or manage its roster.
|
|
32
|
+
- **Platform admin** — can manage any project from the dashboard. Admins keep
|
|
33
|
+
governance access, but they do not silently bypass a collaborators-only
|
|
34
|
+
live app (see below).
|
|
35
|
+
|
|
36
|
+
## Inviting collaborators
|
|
37
|
+
|
|
38
|
+
Open the project's **Settings** tab and use the **Collaborators** card. A
|
|
39
|
+
searchable people picker finds anyone who has signed in to Canopy; adding
|
|
40
|
+
them takes effect immediately. Owners (and admins) can also remove people
|
|
41
|
+
from the same card.
|
|
42
|
+
|
|
43
|
+
## Collaborators-only mode
|
|
44
|
+
|
|
45
|
+
Sometimes "any Monk can look" is too open — payroll prototypes, sensitive
|
|
46
|
+
client work, unfinished things you'd rather not demo by accident. Flip on
|
|
47
|
+
**Settings → Collaborators only** and the live app is limited to the
|
|
48
|
+
project's roster:
|
|
49
|
+
|
|
50
|
+
- Other Monks who open the URL get a clear "limited to its collaborators"
|
|
51
|
+
page instead of the app.
|
|
52
|
+
- The project still appears in the company list — it isn't hidden, just
|
|
53
|
+
closed.
|
|
54
|
+
- Platform admins can still manage the project in the dashboard, but they
|
|
55
|
+
must add themselves as collaborators if they need to open the live app.
|
|
56
|
+
- [Client password access](https://docs.canopy.website/platform/client-access), if you've enabled
|
|
57
|
+
it, is unaffected — the two controls are independent.
|
|
58
|
+
|
|
59
|
+
Turning it off again is the same toggle.
|
|
60
|
+
|
|
61
|
+
> **Note:** Collaborators-only gates the **live app**. Management access (settings, data, deploys) is always
|
|
62
|
+
> members-only, regardless of this toggle.
|
|
63
|
+
|
|
64
|
+
## Platform admins and the Users page
|
|
65
|
+
|
|
66
|
+
Platform admins get an extra **Users** page in the dashboard listing everyone
|
|
67
|
+
on Canopy — name, email, and when they first signed in — with a one-click way
|
|
68
|
+
to grant or remove admin. Accounts are created automatically on first
|
|
69
|
+
OneLogin sign-in; there is nothing to provision.
|
|
70
|
+
|
|
71
|
+
- [Client access](https://docs.canopy.website/platform/client-access) — Share work-in-progress with clients who don't have a Monks account.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Project data
|
|
3
|
+
description: Every project gets its own private database and file storage — browse it in the dashboard, snapshot it before risky changes, and pull it locally.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Every Canopy project comes with its own private database and file storage,
|
|
7
|
+
created automatically the moment the project exists. There are no connection
|
|
8
|
+
strings to configure and no servers to run — your app reads and writes through
|
|
9
|
+
the Canopy SDK, and no other project can ever see your data.
|
|
10
|
+
|
|
11
|
+
## The Data tab
|
|
12
|
+
|
|
13
|
+
Open a project in the dashboard and the **Data** tab shows what your app has
|
|
14
|
+
stored:
|
|
15
|
+
|
|
16
|
+
- **Collections** — the document-style data your app writes with
|
|
17
|
+
`canopy.db.collection(...)`. Pick a collection and page through its rows.
|
|
18
|
+
- **Tables** — a browser for the underlying database tables, for when your
|
|
19
|
+
app uses raw SQL or you want to see exactly what's on disk.
|
|
20
|
+
- **SQL console** — run a query directly against the project's database from
|
|
21
|
+
the browser. Useful for quick checks and one-off fixes.
|
|
22
|
+
|
|
23
|
+
The **Files** tab next to it lists the project's blob storage — the uploads
|
|
24
|
+
and files your app has saved.
|
|
25
|
+
|
|
26
|
+
## Snapshots and restores
|
|
27
|
+
|
|
28
|
+
The Data tab's **Data safety** card is your undo button for data:
|
|
29
|
+
|
|
30
|
+
- **Snapshot** stores a full dump of the database on the platform. Take one
|
|
31
|
+
before a risky change — a big import, a cleanup script, letting an agent
|
|
32
|
+
loose on production data.
|
|
33
|
+
- **Restore** replaces the project's current data with a snapshot. This is
|
|
34
|
+
destructive by design (that's the point), so the dashboard asks you to
|
|
35
|
+
confirm.
|
|
36
|
+
- **Export** downloads a dump to your machine.
|
|
37
|
+
|
|
38
|
+
Snapshots live server-side and stay available until you delete the project,
|
|
39
|
+
so you can restore from days ago, not just from your last session.
|
|
40
|
+
|
|
41
|
+
> **Warning:** Restoring replaces **all** current data with the snapshot's contents. Take a fresh snapshot first
|
|
42
|
+
> if there's anything recent you might want back.
|
|
43
|
+
|
|
44
|
+
## The same tools from the terminal
|
|
45
|
+
|
|
46
|
+
Everything above is also available to you (and your coding agent) via the CLI:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
canopy db pull # download a fresh SQL dump
|
|
50
|
+
canopy db snapshot # store a dump server-side
|
|
51
|
+
canopy db snapshots # list stored snapshots
|
|
52
|
+
canopy db restore # replace project data with a snapshot
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
`canopy db pull` is also how you develop against realistic data: pull a dump,
|
|
56
|
+
then run `canopy dev --local --pull` for a throwaway sandbox seeded with it.
|
|
57
|
+
|
|
58
|
+
## Portable by default, SQL when you need it
|
|
59
|
+
|
|
60
|
+
The SDK's document API (`canopy.db.collection(...)`) behaves the same
|
|
61
|
+
everywhere Canopy runs. Raw SQL via `canopy.db.sql()` passes straight through
|
|
62
|
+
to the underlying database — SQLite on the Cloudflare sites, Postgres on the
|
|
63
|
+
GCP pilot — so anything that database supports works. Your code can ask
|
|
64
|
+
`canopy.db.dialect()` which one it's talking to.
|
|
65
|
+
|
|
66
|
+
- [Working with project data](https://docs.canopy.website/guides/data) — Collection naming rules, dialects and raw SQL, dumps, and restore workflows in depth.
|