picked 0.0.101-next.2 → 0.0.101
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 +27 -12
- package/docs/explanation/conditions-and-the-logic-engine.md +94 -0
- package/docs/explanation/content-references.md +99 -0
- package/docs/explanation/feature-flag-allocation.md +218 -0
- package/docs/explanation/how-picked-works.md +124 -0
- package/docs/explanation/how-pickedql-works.md +76 -0
- package/docs/explanation/pages-and-flows.md +64 -0
- package/docs/explanation/the-content-model.md +87 -0
- package/docs/explanation/the-two-apis.md +68 -0
- package/docs/explanation/why-server-side-rendering.md +76 -0
- package/docs/explanation/workspaces-and-versions.md +71 -0
- package/docs/how-to/add-a-step-field-or-action.md +56 -0
- package/docs/how-to/analytics/index.md +324 -0
- package/docs/how-to/archive-or-delete-a-workspace.md +59 -0
- package/docs/how-to/authenticate-the-cli.md +101 -0
- package/docs/how-to/authenticate-with-a-magic-link.md +56 -0
- package/docs/how-to/authenticate-with-a-password.md +68 -0
- package/docs/how-to/authenticate-with-an-api-key.md +60 -0
- package/docs/how-to/authenticate-with-oauth.md +49 -0
- package/docs/how-to/build-a-flow.md +106 -0
- package/docs/how-to/call-an-external-api-from-a-workflow.md +116 -0
- package/docs/how-to/connect-the-mcp-server.md +46 -0
- package/docs/how-to/create-a-content-entry.md +58 -0
- package/docs/how-to/create-a-project.md +40 -0
- package/docs/how-to/create-an-experience.md +51 -0
- package/docs/how-to/create-and-revoke-an-api-key.md +54 -0
- package/docs/how-to/debug-with-the-chrome-extension.md +57 -0
- package/docs/how-to/define-a-page-layout.md +54 -0
- package/docs/how-to/fill-and-publish-a-page.md +82 -0
- package/docs/how-to/install-the-gtm-template.md +84 -0
- package/docs/how-to/install-the-sdk.md +93 -0
- package/docs/how-to/install-the-vite-plugin.md +69 -0
- package/docs/how-to/invite-and-remove-members.md +45 -0
- package/docs/how-to/point-one-entry-at-another.md +75 -0
- package/docs/how-to/preview-a-workspace.md +39 -0
- package/docs/how-to/publish-a-workspace.md +42 -0
- package/docs/how-to/read-a-feature-flag.md +113 -0
- package/docs/how-to/read-a-referenced-entry.md +109 -0
- package/docs/how-to/register-a-component.md +55 -0
- package/docs/how-to/register-an-action-handler.md +85 -0
- package/docs/how-to/register-an-api-that-uses-oauth2.md +107 -0
- package/docs/how-to/render-a-step-form.md +131 -0
- package/docs/how-to/render-an-unpublished-preview.md +41 -0
- package/docs/how-to/retry-a-failed-call-with-a-loop.md +81 -0
- package/docs/how-to/reuse-a-section.md +64 -0
- package/docs/how-to/reuse-a-step-field-or-action.md +39 -0
- package/docs/how-to/roll-back-a-published-version.md +39 -0
- package/docs/how-to/run-an-ab-test.md +59 -0
- package/docs/how-to/run-code-on-a-form-submission.md +125 -0
- package/docs/how-to/server-render-a-page.md +81 -0
- package/docs/how-to/set-a-content-security-policy.md +32 -0
- package/docs/how-to/set-up-mfa.md +126 -0
- package/docs/how-to/switch-workspaces.md +122 -0
- package/docs/how-to/upload-and-use-an-asset.mdx +87 -0
- package/docs/how-to/validate-a-field.md +52 -0
- package/docs/how-to/wait-for-an-action-response.md +182 -0
- package/docs/how-to/write-a-condition.md +57 -0
- package/docs/how-to/write-a-predicate.md +60 -0
- package/docs/index.md +59 -0
- package/docs/reference/dashboard/actions.mdx +65 -0
- package/docs/reference/dashboard/api-keys.mdx +47 -0
- package/docs/reference/dashboard/conditions.mdx +51 -0
- package/docs/reference/dashboard/content/asset-library.mdx +74 -0
- package/docs/reference/dashboard/content/blocks.mdx +66 -0
- package/docs/reference/dashboard/content/content-entries.mdx +109 -0
- package/docs/reference/dashboard/content/models.mdx +119 -0
- package/docs/reference/dashboard/content/pages.mdx +72 -0
- package/docs/reference/dashboard/experiences.mdx +61 -0
- package/docs/reference/dashboard/external-apis.md +182 -0
- package/docs/reference/dashboard/features.mdx +165 -0
- package/docs/reference/dashboard/fields.mdx +120 -0
- package/docs/reference/dashboard/flow-builder/canvas.mdx +58 -0
- package/docs/reference/dashboard/flow-builder/condition-builder.md +69 -0
- package/docs/reference/dashboard/flow-builder/keyboard-shortcuts.md +72 -0
- package/docs/reference/dashboard/flow-builder/nodes.md +74 -0
- package/docs/reference/dashboard/labels.md +321 -0
- package/docs/reference/dashboard/lead-search.md +235 -0
- package/docs/reference/dashboard/projects.mdx +53 -0
- package/docs/reference/dashboard/reports.mdx +53 -0
- package/docs/reference/dashboard/steps.mdx +47 -0
- package/docs/reference/dashboard/team-management.md +38 -0
- package/docs/reference/dashboard/workflow-runs.md +157 -0
- package/docs/reference/dashboard/workflow-templates.md +182 -0
- package/docs/reference/dashboard/workflow-test-runs.md +85 -0
- package/docs/reference/dashboard/workspace-versioning.mdx +42 -0
- package/docs/reference/dashboard/workspaces.mdx +91 -0
- package/docs/reference/delivery-api/experience-content.md +152 -0
- package/docs/reference/delivery-api/index.md +45 -0
- package/docs/reference/delivery-api/preview-caching-crawling.md +79 -0
- package/docs/reference/delivery-api/project-config.md +65 -0
- package/docs/reference/delivery-api/workspace-schema.md +107 -0
- package/docs/reference/glossary.md +201 -0
- package/docs/reference/management-api/authentication.md +87 -0
- package/docs/reference/management-api/authorization-and-scopes.md +291 -0
- package/docs/reference/management-api/error-handling.md +232 -0
- package/docs/reference/management-api/pagination.md +192 -0
- package/docs/reference/management-api/schema/action.md +261 -0
- package/docs/reference/management-api/schema/analytics-session.md +363 -0
- package/docs/reference/management-api/schema/analytics.md +73 -0
- package/docs/reference/management-api/schema/api-key.md +170 -0
- package/docs/reference/management-api/schema/auth.md +1177 -0
- package/docs/reference/management-api/schema/cms-fields.md +954 -0
- package/docs/reference/management-api/schema/cms-models.md +1155 -0
- package/docs/reference/management-api/schema/common.md +362 -0
- package/docs/reference/management-api/schema/condition.md +254 -0
- package/docs/reference/management-api/schema/design-system.md +199 -0
- package/docs/reference/management-api/schema/experience.md +1098 -0
- package/docs/reference/management-api/schema/external-api.md +637 -0
- package/docs/reference/management-api/schema/feature.md +350 -0
- package/docs/reference/management-api/schema/feedback.md +103 -0
- package/docs/reference/management-api/schema/field.md +400 -0
- package/docs/reference/management-api/schema/index.md +243 -0
- package/docs/reference/management-api/schema/integration.md +272 -0
- package/docs/reference/management-api/schema/label.md +349 -0
- package/docs/reference/management-api/schema/lead.md +340 -0
- package/docs/reference/management-api/schema/mcp-server.md +299 -0
- package/docs/reference/management-api/schema/metric.md +223 -0
- package/docs/reference/management-api/schema/operation.md +96 -0
- package/docs/reference/management-api/schema/organization.md +749 -0
- package/docs/reference/management-api/schema/project.md +607 -0
- package/docs/reference/management-api/schema/report.md +243 -0
- package/docs/reference/management-api/schema/saved-view.md +288 -0
- package/docs/reference/management-api/schema/shopify.md +795 -0
- package/docs/reference/management-api/schema/step.md +273 -0
- package/docs/reference/management-api/schema/tenant-branding.md +185 -0
- package/docs/reference/management-api/schema/workbench.md +246 -0
- package/docs/reference/management-api/schema/workflow-run.md +263 -0
- package/docs/reference/management-api/schema/workflow.md +1110 -0
- package/docs/reference/management-api/schema/workspace-version.md +823 -0
- package/docs/reference/management-api/schema/workspace.md +917 -0
- package/docs/reference/pickedql/data-sources.md +174 -0
- package/docs/reference/pickedql/dimensions.md +103 -0
- package/docs/reference/pickedql/filtering.md +64 -0
- package/docs/reference/pickedql/index.md +18 -0
- package/docs/reference/pickedql/schema.md +172 -0
- package/docs/reference/pickedql/virtual-functions.md +248 -0
- package/docs/reference/sdk/actions.md +154 -0
- package/docs/reference/sdk/analytics-events.md +453 -0
- package/docs/reference/sdk/conditions.md +147 -0
- package/docs/reference/sdk/content-security-policy.md +21 -0
- package/docs/reference/sdk/content.md +253 -0
- package/docs/reference/sdk/experiences.md +51 -0
- package/docs/reference/sdk/features.md +256 -0
- package/docs/reference/sdk/fields.md +255 -0
- package/docs/reference/sdk/index.md +68 -0
- package/docs/reference/sdk/plugins/create-experience.md +123 -0
- package/docs/reference/sdk/plugins/dynamic-experiences.md +74 -0
- package/docs/reference/sdk/plugins/fingerprintjs.md +39 -0
- package/docs/reference/sdk/plugins/hotjar.md +60 -0
- package/docs/reference/sdk/plugins/index.md +33 -0
- package/docs/reference/sdk/plugins/sentry.md +51 -0
- package/docs/reference/sdk/plugins/shopify.md +109 -0
- package/docs/reference/sdk/plugins/window-object.md +25 -0
- package/docs/reference/sdk/predicates.md +43 -0
- package/docs/reference/sdk/react.md +61 -0
- package/docs/reference/sdk/ssr/index.md +33 -0
- package/docs/reference/sdk/ssr/rendering-and-hydration.md +103 -0
- package/docs/reference/sdk/ssr/serialize.md +80 -0
- package/docs/reference/sdk/ssr/slots-and-placements.md +113 -0
- package/docs/reference/sdk/steps.md +86 -0
- package/docs/reference/sdk/svelte.md +74 -0
- package/docs/reference/sdk/type-generation.md +265 -0
- package/docs/reference/tools/admin-api-client.md +89 -0
- package/docs/reference/tools/chrome-extension.md +16 -0
- package/docs/reference/tools/cli.md +319 -0
- package/docs/reference/tools/delivery-api-client.md +60 -0
- package/docs/reference/tools/image-optimisation-service.md +104 -0
- package/docs/reference/tools/mcp-run.md +121 -0
- package/docs/reference/tools/mcp.md +391 -0
- package/docs/reference/tools/vite-plugin.md +163 -0
- package/docs/tutorials/first-api-call.md +253 -0
- package/docs/tutorials/first-experience-in-the-dashboard.mdx +160 -0
- package/docs/tutorials/first-experience.mdx +254 -0
- package/docs/tutorials/first-server-rendered-page.mdx +186 -0
- package/package.json +8 -7
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: how-to
|
|
3
|
+
layout: docs
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# How to authenticate with OAuth
|
|
7
|
+
|
|
8
|
+
This guide shows you how to sign a user in through Google.
|
|
9
|
+
|
|
10
|
+
## 1. Get the authorization URL
|
|
11
|
+
|
|
12
|
+
```graphql
|
|
13
|
+
mutation {
|
|
14
|
+
oauthAuthorize(input: {
|
|
15
|
+
provider: GOOGLE
|
|
16
|
+
redirectUrl: "https://app.example.com/auth/callback"
|
|
17
|
+
scopes: ["openid", "email", "profile"]
|
|
18
|
+
}) {
|
|
19
|
+
url
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 2. Send the user to that URL
|
|
25
|
+
|
|
26
|
+
Google authenticates the user and sends them back with a `code` parameter.
|
|
27
|
+
|
|
28
|
+
## 3. Exchange the code
|
|
29
|
+
|
|
30
|
+
```graphql
|
|
31
|
+
mutation {
|
|
32
|
+
oauthCallback(input: { provider: GOOGLE, code: "auth-code-from-google" }) {
|
|
33
|
+
session { accessToken refreshToken expiresAt }
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## API and MCP
|
|
39
|
+
|
|
40
|
+
You can also do this task with the [Management API](/reference/management-api/schema), the [MCP server](/reference/tools/mcp), or code that you send to [`picked_run`](/reference/tools/mcp-run).
|
|
41
|
+
|
|
42
|
+
| Task | GraphQL | MCP tool | Run |
|
|
43
|
+
| --- | --- | --- | --- |
|
|
44
|
+
| Get the authorization URL | [`oauthAuthorize`](/reference/management-api/schema/auth#oauthauthorize) | None | None |
|
|
45
|
+
| Exchange the code | [`oauthCallback`](/reference/management-api/schema/auth#oauthcallback) | None | None |
|
|
46
|
+
|
|
47
|
+
## Related
|
|
48
|
+
|
|
49
|
+
- [Authentication](/reference/management-api/authentication) — every mutation.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: how-to
|
|
3
|
+
layout: docs
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# How to build a flow
|
|
7
|
+
|
|
8
|
+
This guide shows you how to put a flow together on the canvas. You need an experience
|
|
9
|
+
first. See [How to create an experience](/how-to/create-an-experience).
|
|
10
|
+
|
|
11
|
+
## Add nodes
|
|
12
|
+
|
|
13
|
+
Drag a step, an action, or a condition from the library onto the canvas. A new
|
|
14
|
+
node appears where you drop it.
|
|
15
|
+
|
|
16
|
+
You can also drop a block directly onto an arrow that is there already. The flow
|
|
17
|
+
builder puts the node into the line. The first arrow splits into two arrows, with the
|
|
18
|
+
new node between them. A **+** indicator appears when you hold the pointer over a
|
|
19
|
+
valid arrow.
|
|
20
|
+
|
|
21
|
+
## Connect nodes
|
|
22
|
+
|
|
23
|
+
Click the output handle of a node, on the right side. Drag to the input handle of
|
|
24
|
+
another node, on the left side. An arrow then joins the two nodes.
|
|
25
|
+
|
|
26
|
+
The flow follows the arrows from left to right, and it starts at the origin. Every
|
|
27
|
+
node after the origin is part of the experience flow.
|
|
28
|
+
|
|
29
|
+
## Branch with conditions
|
|
30
|
+
|
|
31
|
+
Connect the origin, or any other node, to a condition node. The condition evaluates
|
|
32
|
+
its rule and sends the flow down one of two paths.
|
|
33
|
+
|
|
34
|
+
Connect the green handle, for a true result, to the nodes that must run when the
|
|
35
|
+
condition holds. Connect the red handle, for a false result, to the other path. Each
|
|
36
|
+
path can lead to more steps, more actions, and more conditions.
|
|
37
|
+
|
|
38
|
+
## Assign fields to steps
|
|
39
|
+
|
|
40
|
+
Drag a field from the library onto a step node and drop it. That step then
|
|
41
|
+
holds the field.
|
|
42
|
+
|
|
43
|
+
You can assign more than one field to one step. The step node gives the number of
|
|
44
|
+
assigned fields. To see which fields it holds, choose the step. Then read the **Fields**
|
|
45
|
+
section in the inspector.
|
|
46
|
+
|
|
47
|
+
## Choose nodes
|
|
48
|
+
|
|
49
|
+
Click a node to choose it. Its inspector opens in the right panel.
|
|
50
|
+
|
|
51
|
+
Drag on empty canvas to choose every node inside a rectangle. Press `Cmd/Ctrl+A` to
|
|
52
|
+
choose every node.
|
|
53
|
+
|
|
54
|
+
When you choose more than one node, the inspector gives a count and a list in groups.
|
|
55
|
+
Click an item in that list to open its inspector.
|
|
56
|
+
|
|
57
|
+
## Move nodes
|
|
58
|
+
|
|
59
|
+
Drag a node to move it. Each node snaps to the grid.
|
|
60
|
+
|
|
61
|
+
Use the arrow keys to move a node a small distance. Hold `Shift` to move it further.
|
|
62
|
+
|
|
63
|
+
## Delete nodes
|
|
64
|
+
|
|
65
|
+
Choose one or more nodes. Press `Delete` or `Backspace`. The flow builder removes
|
|
66
|
+
those nodes and every arrow that joins them.
|
|
67
|
+
|
|
68
|
+
## Duplicate nodes
|
|
69
|
+
|
|
70
|
+
Choose one or more nodes. Press `Cmd/Ctrl+D`. A copy of each node appears next to the
|
|
71
|
+
first one.
|
|
72
|
+
|
|
73
|
+
## Undo and redo
|
|
74
|
+
|
|
75
|
+
Press `Cmd/Ctrl+Z` to undo. Press `Cmd/Ctrl+Shift+Z` to redo. You can also use the two
|
|
76
|
+
buttons at the bottom left of the canvas.
|
|
77
|
+
|
|
78
|
+
The flow builder records each change that you make to the flow. This includes each node
|
|
79
|
+
that you add or delete, each connection, each move, and each change in the inspector.
|
|
80
|
+
Text that you type into one field with no stop of more than one second is one change.
|
|
81
|
+
|
|
82
|
+
When the cursor is in a text field, `Cmd/Ctrl+Z` undoes the text in that field. When you
|
|
83
|
+
save the flow or discard your changes, the flow builder starts a new record.
|
|
84
|
+
|
|
85
|
+
You cannot undo the delete of a step, an action, a condition, or a field from the
|
|
86
|
+
workspace. The flow builder removes it from each change in the record.
|
|
87
|
+
|
|
88
|
+
## API and MCP
|
|
89
|
+
|
|
90
|
+
You can also do this task with the [Management API](/reference/management-api/schema), the [MCP server](/reference/tools/mcp), or code that you send to [`picked_run`](/reference/tools/mcp-run).
|
|
91
|
+
|
|
92
|
+
| Task | GraphQL | MCP tool | Run |
|
|
93
|
+
| --- | --- | --- | --- |
|
|
94
|
+
| Add a node | [`experienceFlowUpdate`](/reference/management-api/schema/experience#experienceflowupdate) | [`update_experience_flow`](/reference/tools/mcp#update_experience_flow) | `tools.update_experience_flow({ experience_id, workspace_id, create_nodes })` |
|
|
95
|
+
| Connect two nodes | [`experienceFlowUpdate`](/reference/management-api/schema/experience#experienceflowupdate) | [`update_experience_flow`](/reference/tools/mcp#update_experience_flow) | `tools.update_experience_flow({ experience_id, workspace_id, create_edges })` |
|
|
96
|
+
| Connect the true path and the false path of a condition | [`experienceFlowUpdate`](/reference/management-api/schema/experience#experienceflowupdate) | [`update_experience_flow`](/reference/tools/mcp#update_experience_flow) | `tools.update_experience_flow({ experience_id, workspace_id, create_edges })` |
|
|
97
|
+
| Assign fields to a step | [`stepUpdate`](/reference/management-api/schema/step#stepupdate), [`experienceFlowUpdate`](/reference/management-api/schema/experience#experienceflowupdate) | [`update_experience_flow`](/reference/tools/mcp#update_experience_flow) | `tools.update_experience_flow({ experience_id, workspace_id, update_steps })` |
|
|
98
|
+
| Move a node | [`experienceFlowUpdate`](/reference/management-api/schema/experience#experienceflowupdate) | [`update_experience_flow`](/reference/tools/mcp#update_experience_flow) | `tools.update_experience_flow({ experience_id, workspace_id, update_nodes })` |
|
|
99
|
+
| Delete a node | [`experienceFlowUpdate`](/reference/management-api/schema/experience#experienceflowupdate) | [`update_experience_flow`](/reference/tools/mcp#update_experience_flow) | `tools.update_experience_flow({ experience_id, workspace_id, delete_node_ids })` |
|
|
100
|
+
|
|
101
|
+
## Related
|
|
102
|
+
|
|
103
|
+
- [Canvas](/reference/dashboard/flow-builder/canvas) — the panels and the view controls.
|
|
104
|
+
- [Nodes](/reference/dashboard/flow-builder/nodes) — every node type.
|
|
105
|
+
- [Keyboard shortcuts](/reference/dashboard/flow-builder/keyboard-shortcuts)
|
|
106
|
+
- [About how Picked works](/explanation/how-picked-works) — why a flow is a graph.
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: how-to
|
|
3
|
+
layout: docs
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# How to call an external API from a workflow
|
|
7
|
+
|
|
8
|
+
This guide shows you how to make a workflow send a request to a system outside Picked.
|
|
9
|
+
It also shows you how to read the answer in a later node.
|
|
10
|
+
|
|
11
|
+
A workflow can only call an origin that you register first. An origin is the scheme, the
|
|
12
|
+
host and the optional port of an address, such as `https://api.vendor.test`. When you
|
|
13
|
+
register one, every path on it becomes available to the workflow.
|
|
14
|
+
|
|
15
|
+
## 1. Register the external API
|
|
16
|
+
|
|
17
|
+
1. Open **Integrations**.
|
|
18
|
+
2. Choose **Configure external APIs**.
|
|
19
|
+
3. Choose **New external API**.
|
|
20
|
+
4. Enter a **Display name**. This name is for you. Picked does not send it with the
|
|
21
|
+
request.
|
|
22
|
+
5. Enter the **Origin**, such as `https://api.vendor.test`. Do not enter a path, a query
|
|
23
|
+
or a fragment.
|
|
24
|
+
6. If the API needs an authorization header, set **Credential** to **Authorization
|
|
25
|
+
header**.
|
|
26
|
+
7. Enter the header name and its value.
|
|
27
|
+
8. Choose **Register external API**.
|
|
28
|
+
|
|
29
|
+
For an API whose access tokens expire, refer to
|
|
30
|
+
[How to register an API that uses OAuth2](/how-to/register-an-api-that-uses-oauth2).
|
|
31
|
+
|
|
32
|
+
The header value is write-only. After you save it, Picked shows only the header name and
|
|
33
|
+
a mask. To replace the value, choose **Rotate authorization header**.
|
|
34
|
+
|
|
35
|
+
## 2. Add an External API node
|
|
36
|
+
|
|
37
|
+
1. Open the workflow.
|
|
38
|
+
2. Choose **Add node**.
|
|
39
|
+
3. Choose **Add tool**.
|
|
40
|
+
4. Choose **External API**.
|
|
41
|
+
5. Set `method` to the request method, such as `GET` or `POST`.
|
|
42
|
+
6. Set `url` to the full address, such as `https://api.vendor.test/v1/orders`. Picked
|
|
43
|
+
lists the origins you registered below the field.
|
|
44
|
+
7. For a `POST` or a `PUT`, set `body` to the JSON to send.
|
|
45
|
+
|
|
46
|
+
:::warning
|
|
47
|
+
Do not enter a credential in `headers`. Picked refuses the workflow when you save it.
|
|
48
|
+
Picked sends the authorization header from the registration for you.
|
|
49
|
+
:::
|
|
50
|
+
|
|
51
|
+
## 3. Read the answer
|
|
52
|
+
|
|
53
|
+
A later node reads what the call recorded:
|
|
54
|
+
|
|
55
|
+
- `{{ nodes.<node-id>.status }}` — the HTTP status.
|
|
56
|
+
- `{{ nodes.<node-id>.ok }}` — true for a status from 200 to 299.
|
|
57
|
+
- `{{ nodes.<node-id>.body }}` — the parsed JSON answer.
|
|
58
|
+
|
|
59
|
+
## 4. Continue after an error status
|
|
60
|
+
|
|
61
|
+
By default, a status outside 200 to 299 fails the node and stops the run. The run page
|
|
62
|
+
shows the node that failed. Refer to the [workflow runs reference](/reference/dashboard/workflow-runs). To test
|
|
63
|
+
the status in the workflow instead:
|
|
64
|
+
|
|
65
|
+
1. Set `failOnErrorStatus` to off.
|
|
66
|
+
2. Add a condition node after the External API node.
|
|
67
|
+
3. Test `{{ nodes.<node-id>.status }}` in the condition.
|
|
68
|
+
|
|
69
|
+
## 5. Continue after a failed call
|
|
70
|
+
|
|
71
|
+
A timeout or a connection failure also fails the node. To continue the run after a
|
|
72
|
+
failed call:
|
|
73
|
+
|
|
74
|
+
1. Connect the node's error exit to a condition node.
|
|
75
|
+
2. Test `{{ nodes.<node-id>.error.retryable }}` in the condition.
|
|
76
|
+
3. Connect the condition's `false` exit to the nodes that record the failure.
|
|
77
|
+
|
|
78
|
+
To send the request again, refer to
|
|
79
|
+
[How to retry a failed call with a loop](/how-to/retry-a-failed-call-with-a-loop).
|
|
80
|
+
|
|
81
|
+
The run follows the error exit only when the call fails. These failures stop the run at
|
|
82
|
+
the node:
|
|
83
|
+
|
|
84
|
+
- A required argument has no value.
|
|
85
|
+
- An argument has a value that the tool does not accept. For example, the value has the
|
|
86
|
+
wrong type, `method` is not one of the six methods, or `timeoutMs` is not from
|
|
87
|
+
1000 to 30000.
|
|
88
|
+
- A template cannot be rendered.
|
|
89
|
+
- The workflow does not have a scope that the tool needs.
|
|
90
|
+
- An error occurs in Picked.
|
|
91
|
+
|
|
92
|
+
Refer to the [External APIs reference](/reference/dashboard/external-apis#errors) for each
|
|
93
|
+
reason.
|
|
94
|
+
|
|
95
|
+
## API and MCP
|
|
96
|
+
|
|
97
|
+
You can also do this task with the [Management API](/reference/management-api/schema), the [MCP server](/reference/tools/mcp), or code that you send to [`picked_run`](/reference/tools/mcp-run).
|
|
98
|
+
|
|
99
|
+
| Task | GraphQL | MCP tool | Run |
|
|
100
|
+
| --- | --- | --- | --- |
|
|
101
|
+
| Register the external API | [`externalApiCreate`](/reference/management-api/schema/external-api#externalapicreate) | None | None |
|
|
102
|
+
| Replace the header value | [`externalApiAuthHeaderSet`](/reference/management-api/schema/external-api#externalapiauthheaderset) | None | None |
|
|
103
|
+
| Add an External API node | [`workflowGraphUpdate`](/reference/management-api/schema/workflow#workflowgraphupdate) | [`update_workflow_graph`](/reference/tools/mcp#update_workflow_graph) | `tools.update_workflow_graph({ workflow_id, create_nodes, create_edges })` |
|
|
104
|
+
| Find the node that failed | [`workflowRun`](/reference/management-api/schema/workflow-run#workflowrun) | [`get_workflow_run`](/reference/tools/mcp#get_workflow_run), [`list_workflow_run_tasks`](/reference/tools/mcp#list_workflow_run_tasks) | `tools.get_workflow_run({ run_id })`, `tools.list_workflow_run_tasks({ run_id })` |
|
|
105
|
+
| Add a condition node | [`workflowGraphUpdate`](/reference/management-api/schema/workflow#workflowgraphupdate) | [`update_workflow_graph`](/reference/tools/mcp#update_workflow_graph) | `tools.update_workflow_graph({ workflow_id, create_nodes, create_edges })` |
|
|
106
|
+
|
|
107
|
+
The external API mutations refuse an API key. Use the access token of a user.
|
|
108
|
+
|
|
109
|
+
## Related
|
|
110
|
+
|
|
111
|
+
- [How to retry a failed call with a loop](/how-to/retry-a-failed-call-with-a-loop) — send
|
|
112
|
+
the request again after a wait.
|
|
113
|
+
- [External APIs](/reference/dashboard/external-apis) — every argument, every limit and
|
|
114
|
+
every error message.
|
|
115
|
+
- [Workflow templates](/reference/dashboard/workflow-templates) — the data that a node can
|
|
116
|
+
read, and templates in a condition.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: how-to
|
|
3
|
+
layout: docs
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# How to connect the MCP server
|
|
7
|
+
|
|
8
|
+
This guide shows you how to control your Picked workspace from an AI tool that writes
|
|
9
|
+
code. The server URL is `https://api.picked.app/mcp`.
|
|
10
|
+
|
|
11
|
+
## Claude Desktop
|
|
12
|
+
|
|
13
|
+
1. Open **Settings > Connectors > Add custom connector**.
|
|
14
|
+
2. Set **Name** to `Picked`.
|
|
15
|
+
3. Set **URL** to `https://api.picked.app/mcp`.
|
|
16
|
+
4. Click **Connect**.
|
|
17
|
+
5. Answer the authorization prompt.
|
|
18
|
+
|
|
19
|
+
## Claude Code, Cursor, Windsurf, and others
|
|
20
|
+
|
|
21
|
+
Add `.mcp.json` to the root of your repository:
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"mcpServers": {
|
|
26
|
+
"picked": {
|
|
27
|
+
"type": "http",
|
|
28
|
+
"url": "https://api.picked.app/mcp"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Cursor reads the same content from `.cursor/mcp.json`.
|
|
35
|
+
|
|
36
|
+
## Two-factor authentication
|
|
37
|
+
|
|
38
|
+
The authorization prompt signs you in to Picked. If your account must use MFA, the prompt
|
|
39
|
+
asks for the code from your authenticator app before it connects the tool. Picked staff,
|
|
40
|
+
and members of an organization that requires MFA, must use it. When an organization
|
|
41
|
+
turns the requirement on, the tools its members connected before that point do not
|
|
42
|
+
work. Connect them again to continue.
|
|
43
|
+
|
|
44
|
+
## Related
|
|
45
|
+
|
|
46
|
+
- [MCP server](/reference/tools/mcp) — every tool that the server gives you.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: how-to
|
|
3
|
+
layout: docs
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# How to create a content entry
|
|
7
|
+
|
|
8
|
+
This guide shows you how to make one instance of a Model and fill it with data. You need
|
|
9
|
+
a Model first. See [How to define a page layout](/how-to/define-a-page-layout).
|
|
10
|
+
|
|
11
|
+
A Page makes its own entry when you create the page. Use this guide for the content that
|
|
12
|
+
no Page and no Step owns, such as an author or a product.
|
|
13
|
+
|
|
14
|
+
## 1. Open the entries list
|
|
15
|
+
|
|
16
|
+
1. Open your workspace.
|
|
17
|
+
2. Click **CMS** in the sidebar.
|
|
18
|
+
3. Click **Content entries**.
|
|
19
|
+
|
|
20
|
+
## 2. Create the entry
|
|
21
|
+
|
|
22
|
+
1. Click **New content**.
|
|
23
|
+
2. Choose the **Model** for the entry.
|
|
24
|
+
3. Fill in each field. The form comes from the schema of the Model.
|
|
25
|
+
4. Click **Create entry**.
|
|
26
|
+
|
|
27
|
+
The Model is fixed when you create the entry. To move content to another Model, make a
|
|
28
|
+
new entry and copy the values across.
|
|
29
|
+
|
|
30
|
+
## 3. Correct every error
|
|
31
|
+
|
|
32
|
+
An invalid field shows an error next to it while you edit. The error carries the path to
|
|
33
|
+
the exact field. Correct each one before you publish, because Picked serves valid content
|
|
34
|
+
only.
|
|
35
|
+
|
|
36
|
+
## Find an entry again
|
|
37
|
+
|
|
38
|
+
The entries list shows a title for each entry. The title is the first single-line text
|
|
39
|
+
field of the entry. It shows the entry id when no such field holds a value.
|
|
40
|
+
|
|
41
|
+
Use the **Model** filter to narrow the list to one Model.
|
|
42
|
+
|
|
43
|
+
## API and MCP
|
|
44
|
+
|
|
45
|
+
You can also do this task with the [Management API](/reference/management-api/schema), the [MCP server](/reference/tools/mcp), or code that you send to [`picked_run`](/reference/tools/mcp-run).
|
|
46
|
+
|
|
47
|
+
| Task | GraphQL | MCP tool | Run |
|
|
48
|
+
| --- | --- | --- | --- |
|
|
49
|
+
| Create the content entry | [`contentEntryCreate`](/reference/management-api/schema/cms-models#contententrycreate) | [`create_content_entry`](/reference/tools/mcp#create_content_entry) | `tools.create_content_entry({ content_model_id, data })` |
|
|
50
|
+
| Find and correct the errors | [`workspaceContentEntryValidation`](/reference/management-api/schema/cms-models#workspacecontententryvalidation), [`contentEntryUpdate`](/reference/management-api/schema/cms-models#contententryupdate) | [`validate_workspace_content_entries`](/reference/tools/mcp#validate_workspace_content_entries), [`update_content_entry`](/reference/tools/mcp#update_content_entry) | `tools.validate_workspace_content_entries({ workspace_id })`, `tools.update_content_entry({ content_entry_id, data })` |
|
|
51
|
+
| Find an entry again | [`contentEntries`](/reference/management-api/schema/cms-models#contententries) | [`list_content_entries`](/reference/tools/mcp#list_content_entries) | `tools.list_content_entries({ workspace_id, content_model_id })` |
|
|
52
|
+
|
|
53
|
+
## Related
|
|
54
|
+
|
|
55
|
+
- [Content entries](/reference/dashboard/content/content-entries) — the editor reference.
|
|
56
|
+
- [Models](/reference/dashboard/content/models) — every field type.
|
|
57
|
+
- [How to point one entry at another](/how-to/point-one-entry-at-another)
|
|
58
|
+
- [How to publish a workspace](/how-to/publish-a-workspace)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: how-to
|
|
3
|
+
layout: docs
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# How to create a project
|
|
7
|
+
|
|
8
|
+
This guide shows you how to add a project. A project is one site or one application, and
|
|
9
|
+
it holds its own experiences, content, and options.
|
|
10
|
+
|
|
11
|
+
## Steps
|
|
12
|
+
|
|
13
|
+
1. Open your organization.
|
|
14
|
+
2. Click **New project**.
|
|
15
|
+
3. Enter a name.
|
|
16
|
+
4. Click **Create project**.
|
|
17
|
+
|
|
18
|
+
The project home page opens. It shows your SDK snippet and the setup tasks that are still
|
|
19
|
+
open.
|
|
20
|
+
|
|
21
|
+
## Next
|
|
22
|
+
|
|
23
|
+
Copy the snippet and add it to your site. See
|
|
24
|
+
[How to install the SDK](/how-to/install-the-sdk).
|
|
25
|
+
|
|
26
|
+
## API and MCP
|
|
27
|
+
|
|
28
|
+
You can also do this task with the [Management API](/reference/management-api/schema), the [MCP server](/reference/tools/mcp), or code that you send to [`picked_run`](/reference/tools/mcp-run).
|
|
29
|
+
|
|
30
|
+
| Task | GraphQL | MCP tool | Run |
|
|
31
|
+
| --- | --- | --- | --- |
|
|
32
|
+
| Create the project | [`projectCreate`](/reference/management-api/schema/project#projectcreate) | [`guide_create_project`](/reference/tools/mcp#guide_create_project) | `tools.guide_create_project({ organization_slug })` |
|
|
33
|
+
|
|
34
|
+
The MCP server does not create a project. `guide_create_project` gives the link to
|
|
35
|
+
create it in the dashboard.
|
|
36
|
+
|
|
37
|
+
## Related
|
|
38
|
+
|
|
39
|
+
- [Projects](/reference/dashboard/projects) — the project surface.
|
|
40
|
+
- [Add Picked to your application](/tutorials/first-experience) — the whole path.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: how-to
|
|
3
|
+
layout: docs
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# How to create an experience
|
|
7
|
+
|
|
8
|
+
An experience is a Flow or a Page. This guide adds a **Flow**: the interactive kind, of
|
|
9
|
+
more than one step, which the browser renders. A **Page** is the standalone kind that your
|
|
10
|
+
server renders for a search engine, and
|
|
11
|
+
[How to fill and publish a page](/how-to/fill-and-publish-a-page) covers it.
|
|
12
|
+
|
|
13
|
+
[About pages and flows](/explanation/pages-and-flows) sets out the difference, and which
|
|
14
|
+
kind a piece of work needs.
|
|
15
|
+
|
|
16
|
+
## Steps
|
|
17
|
+
|
|
18
|
+
1. Open your project.
|
|
19
|
+
2. Click **Flows** in the sidebar. The experiences list opens.
|
|
20
|
+
3. Click **New experience**.
|
|
21
|
+
4. Enter a name.
|
|
22
|
+
5. Leave **Type** on the **Flow** option.
|
|
23
|
+
6. Open **Advanced**.
|
|
24
|
+
7. Enter a component name. It must match a component that you register in your
|
|
25
|
+
application.
|
|
26
|
+
8. Click **Create flow**.
|
|
27
|
+
|
|
28
|
+
The flow editor opens with an empty canvas.
|
|
29
|
+
|
|
30
|
+
## Set the options
|
|
31
|
+
|
|
32
|
+
Click the canvas background to open the experience inspector.
|
|
33
|
+
|
|
34
|
+
- **Condition** — the experience starts only for a visitor who matches it. Keep it blank
|
|
35
|
+
to start for every visitor.
|
|
36
|
+
- **Initialize Open** — the experience opens by itself when the page loads.
|
|
37
|
+
|
|
38
|
+
## API and MCP
|
|
39
|
+
|
|
40
|
+
You can also do this task with the [Management API](/reference/management-api/schema), the [MCP server](/reference/tools/mcp), or code that you send to [`picked_run`](/reference/tools/mcp-run).
|
|
41
|
+
|
|
42
|
+
| Task | GraphQL | MCP tool | Run |
|
|
43
|
+
| --- | --- | --- | --- |
|
|
44
|
+
| Create the experience | [`experienceCreate`](/reference/management-api/schema/experience#experiencecreate) | [`create_experience`](/reference/tools/mcp#create_experience) | `tools.create_experience({ workspace_id, name, key })` |
|
|
45
|
+
| Set the options of the experience | [`experienceUpdate`](/reference/management-api/schema/experience#experienceupdate) | [`update_experience_flow`](/reference/tools/mcp#update_experience_flow) | `tools.update_experience_flow({ experience_id, workspace_id, status, condition, targets })` |
|
|
46
|
+
|
|
47
|
+
## Related
|
|
48
|
+
|
|
49
|
+
- [How to build a flow](/how-to/build-a-flow) — add your first node.
|
|
50
|
+
- [About pages and flows](/explanation/pages-and-flows) — Page or Flow.
|
|
51
|
+
- [Experiences](/reference/dashboard/experiences) — every option.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: how-to
|
|
3
|
+
layout: docs
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# How to create and revoke an API key
|
|
7
|
+
|
|
8
|
+
This guide shows you how to give your code access to the Picked API. Use a key where your
|
|
9
|
+
own code calls the API, such as a server-side integration.
|
|
10
|
+
|
|
11
|
+
An API key does not sign the [CLI](/reference/tools/cli) in. The CLI reads a session, which
|
|
12
|
+
`picked login` writes. See
|
|
13
|
+
[How to authenticate the CLI](/how-to/authenticate-the-cli) for the commands that CI can
|
|
14
|
+
run without one.
|
|
15
|
+
|
|
16
|
+
## Create a key
|
|
17
|
+
|
|
18
|
+
1. Open your organization.
|
|
19
|
+
2. Click **API Keys**.
|
|
20
|
+
3. Click **Create API Key**.
|
|
21
|
+
4. Enter a **Name**, such as `Production key`.
|
|
22
|
+
5. Set **Project** to one project. The default, **All projects**, gives the key every
|
|
23
|
+
project.
|
|
24
|
+
6. Choose the **Permissions** that your integration needs.
|
|
25
|
+
7. Click **Create API Key**.
|
|
26
|
+
|
|
27
|
+
:::warning
|
|
28
|
+
Copy the key immediately. The dashboard does not show it again.
|
|
29
|
+
:::
|
|
30
|
+
|
|
31
|
+
## Revoke a key
|
|
32
|
+
|
|
33
|
+
1. Open the API keys list.
|
|
34
|
+
2. Click **Revoke** next to the key.
|
|
35
|
+
3. Click **Revoke Key** to confirm.
|
|
36
|
+
|
|
37
|
+
Picked invalidates the key immediately. No later request can use it.
|
|
38
|
+
|
|
39
|
+
## API and MCP
|
|
40
|
+
|
|
41
|
+
You can also do this task with the [Management API](/reference/management-api/schema), the [MCP server](/reference/tools/mcp), or code that you send to [`picked_run`](/reference/tools/mcp-run).
|
|
42
|
+
|
|
43
|
+
| Task | GraphQL | MCP tool | Run |
|
|
44
|
+
| --- | --- | --- | --- |
|
|
45
|
+
| Create the key | [`apiKeyCreate`](/reference/management-api/schema/api-key#apikeycreate) | None | None |
|
|
46
|
+
| Find the key in the list | [`apiKeys`](/reference/management-api/schema/api-key#apikeys) | None | None |
|
|
47
|
+
| Revoke the key | [`apiKeyRevoke`](/reference/management-api/schema/api-key#apikeyrevoke) | None | None |
|
|
48
|
+
|
|
49
|
+
`apiKeyCreate` needs a user session. An API key cannot create a different key.
|
|
50
|
+
|
|
51
|
+
## Related
|
|
52
|
+
|
|
53
|
+
- [API keys](/reference/dashboard/api-keys) — the scopes.
|
|
54
|
+
- [Authentication](/reference/management-api/authentication) — how to send the key.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: how-to
|
|
3
|
+
layout: docs
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# How to debug with the Chrome extension
|
|
7
|
+
|
|
8
|
+
This guide shows you how to add a Picked panel to Chrome DevTools and check your
|
|
9
|
+
integration on any page that runs the SDK.
|
|
10
|
+
|
|
11
|
+
## 1. Install the extension
|
|
12
|
+
|
|
13
|
+
Install it from the
|
|
14
|
+
[Chrome Web Store](https://chromewebstore.google.com/detail/picked-developer-tools/nimmdamgnhlhdpngnalkpmnleebngidh).
|
|
15
|
+
|
|
16
|
+
## 2. Add the devtools plugin
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import { createClient } from 'picked'
|
|
20
|
+
import { svelteDevtoolsPlugin } from '@picked/svelte/plugins/devtools'
|
|
21
|
+
|
|
22
|
+
const picked = createClient({
|
|
23
|
+
projectId: 'your-project-id',
|
|
24
|
+
plugins: [svelteDevtoolsPlugin()],
|
|
25
|
+
})
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The extension then connects to the SDK.
|
|
29
|
+
|
|
30
|
+
## 3. Add a tool of your own
|
|
31
|
+
|
|
32
|
+
A custom tool is a framework-adapted component, and it receives the live Picked client
|
|
33
|
+
exactly as an experience component does.
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { adaptReactComponent } from '@picked/react'
|
|
37
|
+
import { svelteDevtoolsPlugin } from '@picked/svelte/plugins/devtools'
|
|
38
|
+
import MyTool from './MyTool'
|
|
39
|
+
|
|
40
|
+
const picked = createClient({
|
|
41
|
+
projectId: 'your-project-id',
|
|
42
|
+
plugins: [
|
|
43
|
+
svelteDevtoolsPlugin({
|
|
44
|
+
customTools: [
|
|
45
|
+
{ id: 'my-tool', label: 'My Tool', component: adaptReactComponent(MyTool) },
|
|
46
|
+
],
|
|
47
|
+
}),
|
|
48
|
+
],
|
|
49
|
+
})
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Your tools appear under a **Custom Tools** tab. In React use `usePicked()`, and in Svelte
|
|
53
|
+
use `getPicked()`.
|
|
54
|
+
|
|
55
|
+
## Related
|
|
56
|
+
|
|
57
|
+
- [Chrome extension](/reference/tools/chrome-extension) — the panel reference.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: how-to
|
|
3
|
+
layout: docs
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# How to define a page layout
|
|
7
|
+
|
|
8
|
+
This guide shows you how to define the shape of a page. A page layout sets which fields a
|
|
9
|
+
page can hold, and it holds no data itself.
|
|
10
|
+
|
|
11
|
+
## Steps
|
|
12
|
+
|
|
13
|
+
1. Open your workspace.
|
|
14
|
+
2. Click **Pages** in the sidebar, then **Page Layouts**.
|
|
15
|
+
3. Click **New model**.
|
|
16
|
+
4. Set **Category** to **Page layout**.
|
|
17
|
+
5. Enter a **Name** and a **Key**. The key is stable, and your SDK code and your API
|
|
18
|
+
calls both use it.
|
|
19
|
+
6. Add your fields. Choose a type for each one.
|
|
20
|
+
7. Click **Create model**.
|
|
21
|
+
|
|
22
|
+
The category is fixed when you create the Model. You cannot change it later.
|
|
23
|
+
|
|
24
|
+
## Make a field repeatable
|
|
25
|
+
|
|
26
|
+
Turn on **repeatable** on any field. It then renders as a sortable list of values. Use it
|
|
27
|
+
for a gallery, or for a list of features.
|
|
28
|
+
|
|
29
|
+
## Group related fields
|
|
30
|
+
|
|
31
|
+
Add a **Group** field to hold a set of fields under one key. Make the group repeatable to
|
|
32
|
+
describe a list of objects, such as a list of feature cards.
|
|
33
|
+
|
|
34
|
+
## Define content with no layout role
|
|
35
|
+
|
|
36
|
+
A Model needs no category. Leave **Category** as **None (general content)** for content
|
|
37
|
+
that no Page and no Step renders, such as an author or a product. Reach such a Model
|
|
38
|
+
under **CMS** in the sidebar, and point at its entries with a **Reference** field.
|
|
39
|
+
|
|
40
|
+
## API and MCP
|
|
41
|
+
|
|
42
|
+
You can also do this task with the [Management API](/reference/management-api/schema), the [MCP server](/reference/tools/mcp), or code that you send to [`picked_run`](/reference/tools/mcp-run).
|
|
43
|
+
|
|
44
|
+
| Task | GraphQL | MCP tool | Run |
|
|
45
|
+
| --- | --- | --- | --- |
|
|
46
|
+
| Create the page layout | [`contentModelCreate`](/reference/management-api/schema/cms-models#contentmodelcreate) | [`create_content_model`](/reference/tools/mcp#create_content_model) | `tools.create_content_model({ workspace_id, name, key, schema, category: 'page-layout' })` |
|
|
47
|
+
|
|
48
|
+
## Related
|
|
49
|
+
|
|
50
|
+
- [About the content model](/explanation/the-content-model) — why the schema and the data
|
|
51
|
+
are separate.
|
|
52
|
+
- [Models](/reference/dashboard/content/models) — every field type.
|
|
53
|
+
- [How to reuse a section](/how-to/reuse-a-section)
|
|
54
|
+
- [How to point one entry at another](/how-to/point-one-entry-at-another)
|