Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion content/(account)/api-keys.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ Lifetimes differ by kind:
| Space key for an unclaimed Space | Matches that Space's unclaimed window. If you claim with **Claim & keep access**, it keeps working for another 7 days |
| Continuation token | 30 minutes at most |

Share links, passwords, and machine credentials are the Space access model. They are covered in [access and share links](/access).
Share links, passwords, and machine credentials are the Space access model. They are covered in [Spacefast Share](/share).

:::warning[Treat every one of these as a password]
They go in a secret manager or an environment variable, never in a repository, a screenshot, or a chat message. A key pasted anywhere public should be revoked, not rotated later.
Expand Down
6 changes: 4 additions & 2 deletions content/(concepts)/spaces.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,9 @@ The owner depends on how the Space was created:

To move a Space to another team, run `sf spaces transfer <team> --space docs`, or open **Space settings → General → Transfer this space → Transfer space…**. If you are an owner or admin of both teams, the move is instant. The Space keeps serving at its current address. Otherwise the target team has 7 days to accept, and nothing changes until they do. Roles and membership are on [Teams](/teams).

## Access when you create one
<a id="access-when-you-create-one" />

## Sharing when you create one

A new team-owned Space starts at one of two presets. A Space published without an account has no owning team. Its space key and claim link open it until the claim window ends; see [Publish without an account](/anonymous-and-claim).

Expand All @@ -79,7 +81,7 @@ The API still accepts `team` and treats it as `private`.

Set it on the request that creates the Space, with `sf publish --access public` or the `access` field on `createPublish` and [`createSpace`](/api/reference/spaces/createspace). Sending `access` together with a `spaceId` is a validation error, because the field only applies at creation. Omit it and the Space takes the owning team's default for new Spaces.

Everything after that, including people, share links, passwords, and access requests, is on [Access and sharing](/access).
Everything after that, including people, share links, passwords, and access requests, is on [Spacefast Share](/share).

## Find your Spaces

Expand Down
2 changes: 1 addition & 1 deletion content/(concepts)/teams.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ To hand the team over, use **Team settings → Danger zone → Transfer ownershi
| `private` | Access for the owning team |
| `public` | Access for the owning team, plus view access for anyone on the web |

The default is `private`. The API accepts `team` as a legacy spelling of `private`. From a terminal, `sf teams defaults` prints the current value and `sf teams defaults public` sets it. Per-Space access, share links, and passwords are covered in [access and share links](/access).
The default is `private`. The API accepts `team` as a legacy spelling of `private`. From a terminal, `sf teams defaults` prints the current value and `sf teams defaults public` sets it. Per-Space access, share links, and passwords are covered in [Spacefast Share](/share).

## Move a Space to another team

Expand Down
2 changes: 1 addition & 1 deletion content/(dynamic)/wordpress.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ Five Abilities in the `zero-storage` category are registered by the runtime, so
| `zero/storage-move` | write | Moves a file into a folder, creating the folder path if needed | `edit_post` |
| `zero/storage-delete` | write | Trashes a file. It leaves every listing and stays recoverable | `delete_post` |

The "Needs" column is a WordPress capability. The Space projects it from the calling credential's Grant, so what a credential may do is decided per request against the path it asked for. See [Access and sharing](/access).
The "Needs" column is a WordPress capability. The Space projects it from the calling credential's Grant, so what a credential may do is decided per request against the path it asked for. See [Spacefast Share](/share).

WordPress decides which file types `zero/storage-upload` accepts.

Expand Down
2 changes: 1 addition & 1 deletion content/(dynamic)/zero-runtime.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ Outbound access has nothing to do with who can open your space. Calling an API d

### Example: invite People from your app

There is no `ctx.people`. To invite someone to a private space, or resend their invite, call the People API from an action with a [machine credential](/access#machine-credentials).
There is no `ctx.people`. To invite someone to a private space, or resend their invite, call the People API from an action with a [machine credential](/share#machine-credentials).

```bash
sf share token create --name invites --path '/**' --role manager --show-secret --json \
Expand Down
6 changes: 4 additions & 2 deletions content/(reference)/config-file.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -208,13 +208,15 @@ See [Functions](/functions).

`sf.jsonc` is the only writer. See [Crons](/crons) for the schedule grammar.

## Access
<a id="access" />

## Sharing

| Key | Type | Default | What it does |
| --- | --- | --- | --- |
| `access` | `"public"` or `{ public: string[] }` | none | Live paths that stay public whatever the Space's access setting is |

`"public"` is shorthand for `{ "public": ["/**"] }`. Prefix a pattern with `!` to exclude it, and use `*` and `**` as whole-segment wildcards. Patterns must be unique, and a non-empty list needs at least one inclusion. The declaration is inactive until the Space is claimed. See [Access](/access).
`"public"` is shorthand for `{ "public": ["/**"] }`. Prefix a pattern with `!` to exclude it, and use `*` and `**` as whole-segment wildcards. Patterns must be unique, and a non-empty list needs at least one inclusion. The declaration is inactive until the Space is claimed. See [Spacefast Share](/share).

## Routing

Expand Down
2 changes: 1 addition & 1 deletion content/(reference)/glossary.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ The runtime for shipping a worker alongside your site — npm packages, framewor

## Grant

One rule in a Space's access list: it names an audience (public, team, one person, a link, a password, a machine, or an external identity) and what that audience can do. A Space has no public-or-private flag — its access is just the sum of its grants. See [Access and sharing](/access).
One rule in a Space's access list: it names an audience (public, team, one person, a link, a password, a machine, or an external identity) and what that audience can do. A Space has no public-or-private flag — its access is just the sum of its grants. See [Spacefast Share](/share).

## Live (the live channel)

Expand Down
2 changes: 1 addition & 1 deletion content/(serve)/meta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export default defineMeta({
"routing",
"caching",
"stats",
"access",
"share",
"customization",
"site-pages",
],
Expand Down
2 changes: 1 addition & 1 deletion content/(serve)/routing.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ Header names must match `^[A-Za-z0-9-]+$`. Some names are owned by the platform
| `cdn-cache-control`, `cloudflare-cdn-cache-control`, `netlify-cdn-cache-control`, `surrogate-control` | `header_cdn_cache_unsupported` |
| `Basic-Auth` | `header_basic_auth_unsupported` |

`Basic-Auth` is rejected before anything else. The offending line is redacted from the diagnostics and stripped from the compiled bytes, so the credential never reaches a log. For real access control, see [Access and sharing](/access).
`Basic-Auth` is rejected before anything else. The offending line is redacted from the diagnostics and stripped from the compiled bytes, so the credential never reaches a log. For real access control, see [Spacefast Share](/share).

`Cache-Control` is allowed and warns with `header_cache_control_platform_managed`. It applies to browser responses; shared caching is managed for you. See [Caching](/caching).

Expand Down
10 changes: 6 additions & 4 deletions content/(serve)/access.mdx → content/(serve)/share.mdx
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
---
title: Access and sharing
title: Spacefast Share
description: Make a Space public, hand out scoped share links or a password, invite people, and revoke any of it
sidebar: { order: 5 }
---

Visitor access comes from additive grants. Removing a public grant closes that route to the public only if no other public grant matches; links, people, and team access can remain.
Spacefast Share (formerly Spacefast Access) decides who can open a Space. Visitor access comes from additive grants. Removing a public grant closes that route to the public only if no other public grant matches; links, people, and team access can remain.
Comment thread
batuhan marked this conversation as resolved.
Resolved

## Access is a list, not a switch
<a id="access-is-a-list-not-a-switch" />

## Sharing uses grants

Access is a set of additive **grants**, each one naming an audience, a set of capabilities, the paths it covers, and which published target it applies to. A matching grant admits a visitor. Revoking one grant does not revoke other matching grants or remove the owning team's permissions.

Expand Down Expand Up @@ -39,7 +41,7 @@ Share links and passwords are forwardable secrets, so they cap at `viewer` or `c

## In the dashboard

Open the Space and go to **Access**. The page is titled **Manage access**.
Open the Space and go to **Share**.

The **General access** card holds a segmented control with two options:

Expand Down
2 changes: 1 addition & 1 deletion content/(serve)/urls.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ A share link is the page you want with the secret in the query string:
https://my-site.space.fast/docs?__=sfl_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

At the current hostname, one request returns that page without an access redirect or interstitial, so `curl` and an agent get the same document a browser does. Creating, scoping, and revoking them is on [Access and sharing](/access).
At the current hostname, one request returns that page without an access redirect or interstitial, so `curl` and an agent get the same document a browser does. Creating, scoping, and revoking them is on [Spacefast Share](/share).

## Hostnames you cannot claim

Expand Down
4 changes: 2 additions & 2 deletions content/agents/share-claude-artifact.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ See [Claude Code setup](/agents/claude-code) or [Claude Desktop setup](/agents/c

## Choose who can open it

New personal Spaces are private by default, and a bare URL to a private Space does not grant access. To let anyone on the web open it, set **General access** to **Public** in the Space's **Access** settings.
New personal Spaces are private by default, and a bare URL to a private Space does not grant access. To let anyone on the web open it, set **General access** to **Public** in the Space's **Share** settings.

For a restricted audience, keep the Space private and create a share link on the **Share link** card instead. Anyone with the share link can open the Space without an account. [Access and sharing](/access) explains the choices and how to revoke access.
For a restricted audience, keep the Space private and create a share link on the **Share link** card instead. Anyone with the share link can open the Space without an account. [Spacefast Share](/share) explains the choices and how to revoke access.

## Update the same link

Expand Down
4 changes: 3 additions & 1 deletion content/cli/publish.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,9 @@ sf publish ./dist --prebuilt # you built it, upload it unchanged

`--remote` creates a build you can follow with [`sf builds logs`](/cli/builds).

## Access for a new Space
<a id="access-for-a-new-space" />

## Sharing a new Space

`--access` sets root access at creation time only.

Expand Down
2 changes: 1 addition & 1 deletion content/cli/share.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Access is a list of **Grants**. Each Grant says who (audience), what they may do

Credential-backed audiences get their own commands (`link`, `password`, `token`, `identity`) so the proof and its Grant are created in one write. `sf share grant` is for the two audiences that need no proof: `public` and `team`.

See [Access and sharing](/access) for the concepts.
See [Spacefast Share](/share) for the concepts.

## Space selection flags

Expand Down
2 changes: 1 addition & 1 deletion content/cli/spaces.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ sf spaces add --name docs

### Output

The Space summary. `--json` returns the created Space with its state entry. A new team-owned Space has no automatic share link, so the receipt can omit `access`. The owning team signs in at the live URL. Create a [share link](/access#share-links) when you need one. Any access URL or claim link in a receipt is masked unless you pass `--show-secret`.
The Space summary. `--json` returns the created Space with its state entry. A new team-owned Space has no automatic share link, so the receipt can omit `access`. The owning team signs in at the live URL. Create a [share link](/share#share-links) when you need one. Any access URL or claim link in a receipt is masked unless you pass `--show-secret`.

## sf spaces update

Expand Down
5 changes: 3 additions & 2 deletions redirects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
// Blume prefixes deployment.base on both sides.

export const redirects: { from: string; to: string; status: 301 }[] = [
{ from: "/access-control", to: "/access", status: 301 },
{ from: "/access", to: "/share", status: 301 },
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
{ from: "/access-control", to: "/share", status: 301 },
{ from: "/analytics", to: "/stats", status: 301 },
{ from: "/anonymous-publish", to: "/anonymous-and-claim", status: 301 },
{ from: "/api/docs", to: "/api/reference#docs", status: 301 },
Expand All @@ -23,7 +24,7 @@ export const redirects: { from: string; to: string; status: 301 }[] = [
{ from: "/api/versioning", to: "/api", status: 301 },
{ from: "/builds", to: "/git", status: 301 },
{ from: "/claim", to: "/anonymous-and-claim", status: 301 },
{ from: "/cli/access", to: "/access", status: 301 },
{ from: "/cli/access", to: "/share", status: 301 },
{ from: "/cli/analytics", to: "/stats", status: 301 },
{ from: "/cli/channels", to: "/cli/versions", status: 301 },
{ from: "/cli/docs", to: "/cli", status: 301 },
Expand Down
2 changes: 1 addition & 1 deletion scripts/docs-experience.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ const firstFactCases = [
evidence: [/Space-level value/iu, /wins/iu, /team/iu],
},
{
route: "/access",
route: "/share",
question: "Does removing one public grant remove all access?",
evidence: [/removing a public grant/iu, /no other public grant matches/iu, /links, people, and team access can remain/iu],
},
Expand Down
3 changes: 3 additions & 0 deletions scripts/redirect-rules.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ test("the complete compatibility map reserves the website's splats and host-spec
assert.deepEqual(compilation.diagnostics.filter(({ severity }) => severity === "error"), []);
assert.ok(compilation.stats.dynamicRedirectCount <= 100, JSON.stringify(compilation.stats));
for (const [source, destination] of [
["/access", "/share/"],
["/access-control", "/share/"],
["/cli/access", "/share/"],
["/platform-api", "/platforms/api/reference/"],
["/platform-api/spaces/getspace", "/platforms/api/reference/spaces/getspace/"],
]) {
Expand Down
Loading