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
8 changes: 8 additions & 0 deletions .claude/rules/mdx-mechanics.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,14 @@ Every page is also served as plain Markdown (append `.md` to its URL to preview)
- Wrap human-only material in `<llms-ignore>`: UI click-throughs, marketing CTAs, decorative or theme-duplicate images, interactive widgets (`VoiceWidget`). Where a programmatic equivalent exists (CLI/API), give it to agents in a paired `<llms-only>` block — UI steps for humans, commands for agents.
- `noindex: true` (frontmatter) drops a page from llms.txt and search engines; `hidden: true` (nav yml) also removes it from the sidebar.

Format visibility blocks consistently:

- Put opening and closing tags at column 0, with blank lines around the block and around Markdown inside it.
- Wrap a complete block component or complete passage, never only an opening tag, caption, or sentence fragment.
- When a human component contains unique information, put `<llms-ignore>` first and its `<llms-only>` equivalent immediately after it.
- A standalone `<llms-ignore>` is appropriate when nearby prose already contains the component's meaning, or when the content is decorative, duplicated, or interactive-only.
- Keep both tags paired rather than self-closing. `<llms-ignore>` changes LLM endpoints, not access control: the content still renders on the site and is available to site search and Ask Fern.

## Code, links, media

- Every fence declares a language. Label with `title="…"` where a filename or variant helps; highlight lines `{6,9}` and keep highlights aligned across parallel language examples. Mermaid fences render natively.
Expand Down
10 changes: 10 additions & 0 deletions fern/products/apis/pages/core/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,18 @@ For developers who prefer working in Postman, we maintain an official collection

Click **Run in Postman** to fork the collection into your own Postman workspace.

<llms-ignore>

[<img src="https://run.pstmn.io/button.svg" alt="Run In Postman" style={{ width: "128px", height: "32px" }} />](https://god.gw.postman.com/run-collection/16445495-86c9916b-baa8-4bb3-b62d-d4ae86b12d61?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D16445495-86c9916b-baa8-4bb3-b62d-d4ae86b12d61%26entityType%3Dcollection%26workspaceId%3D4f34e511-485e-4462-a432-20fbc2d1db33)

</llms-ignore>

<llms-only>

[Open the SignalWire REST API collection in Postman](https://god.gw.postman.com/run-collection/16445495-86c9916b-baa8-4bb3-b62d-d4ae86b12d61?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D16445495-86c9916b-baa8-4bb3-b62d-d4ae86b12d61%26entityType%3Dcollection%26workspaceId%3D4f34e511-485e-4462-a432-20fbc2d1db33).

</llms-only>

### Set your credentials

Open the collection's **Variables** tab and fill in the three values from the [API pane](https://my.signalwire.com?page=credentials) of your SignalWire Dashboard:
Expand Down
34 changes: 33 additions & 1 deletion fern/products/call-flow-builder/pages/core/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,14 @@ It features a simple drag-and-drop interface for creating complex call flows wit
All elements of the call flow are represented as nodes in a tree structure.
You can easily add, remove, and rearrange elements in the call flow using the visual interface.

<llms-ignore>

<Frame caption="A sample Call Flow showcasing input-gathering, recording, AI Agent, and TTS features.">
![A sample call flow created with Call Flow Builder, showing connections between nodes.](/assets/images/call-flow/sample-flow.webp)
</Frame>

</llms-ignore>

Add or remove any element from the call flow by dragging it into the desired location,
and define links between them using the connection lines.

Expand All @@ -46,6 +50,8 @@ To get started with Call Flow Builder, open the **Tools** tab in the left menu o

Check out this brief demo to see how to add, configure, and connect nodes in Call Flow Builder.

<llms-ignore>

<iframe
src="https://www.youtube.com/embed/ZPnwEKOhYH4?si=Q1cEQi9RrG6L6VZw"
title="YouTube video player"
Expand All @@ -56,17 +62,29 @@ Check out this brief demo to see how to add, configure, and connect nodes in Cal
style="width: 100%; aspect-ratio: 16/9;">
</iframe>

</llms-ignore>

<llms-only>

The [Call Flow Builder demonstration](https://www.youtube.com/watch?v=ZPnwEKOhYH4) shows how to add, configure, and connect nodes on the canvas.

</llms-only>

### Creating a New Call Flow

To create a new call flow, click on the `Add New` button in the Call Flow Builder section of the Dashboard.
From here, you can give your call flow a name, and then click `Save` to create the new call flow.
After creating the call flow, the Call Flow will show up in the list of call flows in the Dashboard.


<llms-ignore>

<Frame caption="Creating a new Call Flow." ogImage>
![Creating a new Call Flow in the SignalWire Dashboard.](/assets/images/call-flow/create_flow.webp)
</Frame>

</llms-ignore>


---

Expand All @@ -75,10 +93,14 @@ After creating the call flow, the Call Flow will show up in the list of call flo
Once a Call Flow has been created, you can click on the `More Options` button to open the Call Flow Builder interface.
From here, click on the `Edit` option to open the Call Flow Builder page.

<llms-ignore>

<Frame caption="Editing a Call Flow.">
![Clicking on the edit option for a Call Flow.](/assets/images/call-flow/edit_flow.webp)
</Frame>

</llms-ignore>


#### Add a node
When you first open a new Call Flow, you will see a canvas with a single node:
Expand All @@ -94,30 +116,40 @@ Starting with the [Handle Call](/docs/call-flow-builder/reference/handle-call) n
clicking and dragging from the output connector (right side of node) to the input connector (left side of node) of another node.
You will see an arrow connecting the two nodes, indicating that they are connected.

<llms-ignore>

<Frame caption="Adding a new node to a Call Flow.">
![Adding a new node to a Call Flow.](/assets/images/call-flow/add_node.webp)
</Frame>

</llms-ignore>

---

#### Configure nodes
Some nodes have configuration options that can be set by clicking on the node.
This will open a configuration panel where you can set the options for that node.
For example, the [Play Audio or TTS](/docs/call-flow-builder/reference/play-audio-or-tts) node allows you to select an audio file or enter text to be played to the caller.

<llms-ignore>

<Frame caption="Configuring a node in a Call Flow.">
![Configuring a node in a Call Flow.](/assets/images/call-flow/configure_node.webp)
</Frame>

</llms-ignore>

---

#### Delete a node

To delete a node, you can click on the delete icon located on the right side of the node.
Additionally, you can delete a node if they have configuration options open by clicking the `Delete node` button in the configuration panel.

<llms-ignore>

<Frame caption="Deleting a node from a Call Flow.">
![Deleting a node from a Call Flow.](/assets/images/call-flow/delete_node.webp)
</Frame>


</llms-ignore>
Original file line number Diff line number Diff line change
Expand Up @@ -241,8 +241,18 @@ You can expect several parameters to be present in the request associated to the

#### Request parameters for the `recordingStatusCallback` URL [#conference_recordingStatusCallback]

<llms-ignore>

<WebhookPayloadSnippet webhook="recordingStatusCallback" />

</llms-ignore>

<llms-only>

See the [Recording status callback reference](/docs/compatibility-api/rest/recordings/webhooks/recording-status-callback) for the request fields sent to `recordingStatusCallback`.

</llms-only>




Expand Down
10 changes: 10 additions & 0 deletions fern/products/compatibility-api/pages/cxml/voice/dial.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,18 @@ The `record` attribute allows for recordings in **mono-channel** or **dual-chann

#### Request parameters for `recordingStatusCallback` [#dial_recordingStatusCallback]

<llms-ignore>

<WebhookPayloadSnippet webhook="recordingStatusCallback" />

</llms-ignore>

<llms-only>

See the [Recording status callback reference](/docs/compatibility-api/rest/recordings/webhooks/recording-status-callback) for the request fields sent to `recordingStatusCallback`.

</llms-only>

## Examples

### A simple dial
Expand Down
10 changes: 10 additions & 0 deletions fern/products/compatibility-api/pages/cxml/voice/number-noun.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,18 @@ The `statusCallbackEvent` attribute has the following call status values:

### Request parameters for the `statusCallback` URL [#number_statusCallback]

<llms-ignore>

<WebhookPayloadSnippet webhook="voiceStatusCallback" />

</llms-ignore>

<llms-only>

See the [Voice status callback reference](/docs/compatibility-api/rest/calls/webhooks/voice-status-callback) for the request fields sent to `statusCallback`.

</llms-only>

## Examples

### Dialing an extension
Expand Down
20 changes: 20 additions & 0 deletions fern/products/compatibility-api/pages/cxml/voice/record.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -104,13 +104,33 @@ The `action` request contains the [Standard Request Parameters](/docs/compatibil

#### Request parameters for `recordingStatusCallback` [#record_recordingStatusCallback]

<llms-ignore>

<WebhookPayloadSnippet webhook="recordingStatusCallback" />

</llms-ignore>

<llms-only>

See the [Recording status callback reference](/docs/compatibility-api/rest/recordings/webhooks/recording-status-callback) for the request fields sent to `recordingStatusCallback`.

</llms-only>


#### Request parameters for `transcribeCallback` [#record_transcribeCallback]

<llms-ignore>

<WebhookPayloadSnippet webhook="transcriptionStatusCallback" />

</llms-ignore>

<llms-only>

See the [Transcription status callback reference](/docs/compatibility-api/rest/recording-transcriptions/webhooks/transcription-status-callback) for the request fields sent to `transcribeCallback`.

</llms-only>

## Nesting

No other verbs can be nested within `<Record>` and you cannot nest `<Record>` within any other verbs.
Expand Down
10 changes: 10 additions & 0 deletions fern/products/compatibility-api/pages/cxml/voice/sip-noun.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -166,8 +166,18 @@ The `statusCallbackEvent` attribute has the following call status values:

#### Request parameters for the `statusCallback` URL [#sip_statusCallback]

<llms-ignore>

<WebhookPayloadSnippet webhook="voiceStatusCallback" />

</llms-ignore>

<llms-only>

See the [Voice status callback reference](/docs/compatibility-api/rest/calls/webhooks/voice-status-callback) for the request fields sent to `statusCallback`.

</llms-only>


## Examples

Expand Down
10 changes: 10 additions & 0 deletions fern/products/compatibility-api/pages/rest-api/core/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,18 @@ For developers who prefer working in Postman, we maintain an official Compatibil

Click **Run in Postman** to fork the collection into your own Postman workspace.

<llms-ignore>

[<img src="https://run.pstmn.io/button.svg" alt="Run In Postman" style={{ width: "128px", height: "32px" }} />](https://god.gw.postman.com/run-collection/16445495-16e14ee0-3762-42ac-9f4d-a61401e05209?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D16445495-16e14ee0-3762-42ac-9f4d-a61401e05209%26entityType%3Dcollection%26workspaceId%3D4f34e511-485e-4462-a432-20fbc2d1db33)

</llms-ignore>

<llms-only>

[Open the SignalWire Compatibility API collection in Postman](https://god.gw.postman.com/run-collection/16445495-16e14ee0-3762-42ac-9f4d-a61401e05209?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D16445495-16e14ee0-3762-42ac-9f4d-a61401e05209%26entityType%3Dcollection%26workspaceId%3D4f34e511-485e-4462-a432-20fbc2d1db33).

</llms-only>

### Set your credentials

Open the collection's **Variables** tab and fill in the three values from the [API pane](https://my.signalwire.com?page=credentials) of your SignalWire Dashboard:
Expand Down
38 changes: 38 additions & 0 deletions fern/products/home/pages/welcome.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ layout: custom

<Markdown src="/snippets/llms-hint.mdx" />

<llms-ignore>

<div class="lp-page-container">
<div class="main-content">
{/* Dashed Pattern */}
Expand Down Expand Up @@ -114,3 +116,39 @@ layout: custom

</div>
</div>

</llms-ignore>

<llms-only>

SignalWire is a programmable communications platform for building voice, video, messaging, and AI applications.
Use the build type or interface below to choose the shortest path into the documentation.

## Choose what to build

| Goal | Start here | Use it for |
|---|---|---|
| AI voice agent | [AI application path](/docs/platform/getting-started#ai-application) | LLM-powered phone agents and virtual assistants |
| Browser or mobile experience | [Browser or mobile path](/docs/platform/getting-started#browser-or-mobile-app) | WebRTC voice, video, and chat in an application |
| Server application | [Server application path](/docs/platform/getting-started#server-application) | Backend call routing, messaging, interactive voice response, and realtime control |
| No-code application | [No-code and low-code path](/docs/platform/getting-started#no-code--low-code) | Dashboard AI agents and drag-and-drop call flows |
| Twilio migration | [Compatibility API](/docs/compatibility-api) | Existing applications that use Twilio-compatible REST APIs or TwiML-compatible markup |

## Choose an interface

| Interface | Start here | Best fit |
|---|---|---|
| REST APIs | [REST API documentation](/docs/apis) | Programmatic management of calls, messages, phone numbers, video rooms, and resources |
| SWML | [SignalWire Markup Language](/docs/swml) | Declarative call and messaging applications returned from webhooks or hosted by SignalWire |
| Server SDKs | [Server SDK documentation](/docs/server-sdks) | AI agents and realtime call control in a supported programming language |
| Browser SDK | [Browser SDK documentation](/docs/browser-sdk) | Voice, video, and chat inside browser applications |
| Call Flow Builder | [Call Flow Builder documentation](/docs/call-flow-builder) | Visual, no-code voice applications |
| Platform and Dashboard | [Platform documentation](/docs/platform) | Spaces, credentials, phone numbers, resources, and operational configuration |
| Wirestarter | [Wirestarter documentation](/docs/platform/wirestarter) | Scaffolding a new SignalWire project |
| SWSH | [SWSH documentation](/docs/platform/swsh) | Interactively testing SWML scripts and API calls |

[Create a SignalWire account](https://signalwire.com/signup), or follow the [Platform getting-started guide](/docs/platform/getting-started) to configure an existing Space.

\*Twilio and TwiML are trademarks of Twilio, Inc. SignalWire, Inc. and its products are not affiliated with or endorsed by Twilio, Inc.

</llms-only>
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,12 @@ with `"content_type": "text/swaig"`; the fields around those describe the call a
belongs to. If `web_hook_url` carries credentials in `username:password@host` form, they arrive as
HTTP basic authentication.

<llms-ignore>

<WebhookPayloadSnippet webhook="aiSwaigToolWebhook" />

</llms-ignore>

The [AI SWAIG tool webhook][swaig-webhook] documents every field, and the
[`SWAIG.functions` reference][swaig-functions] documents the same fields next to the configuration
that declares them.
Expand Down
Loading
Loading