Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
62d0800
fix(credential-groups): stop requiring a human subject on workflow op…
TheodoreSpeaks Aug 29, 2026
4e78409
feat(function): mount referenced files into the code sandbox (#7251)
icecrasher321 Aug 29, 2026
bc07d2d
feat(admin): move a workspace between organizations (#7254)
mzxchandra Aug 29, 2026
d7c9f51
feat(library): AI Agents for Marketing Automation: Building Agentic W…
icecrasher321 Aug 29, 2026
95d1969
fix(provenance): let a run that never started report why it failed (#…
icecrasher321 Aug 29, 2026
f607c01
feat(billing): track E2B and Daytona Function sandbox usage (#7184)
BillLeoutsakosvl346 Aug 29, 2026
029ded6
refactor(tables): add column type extension points (#7119)
j15z Aug 29, 2026
7353b7c
feat(tables): add automatic row expiration with TTL (#7071)
j15z Aug 29, 2026
674ca8d
fix(timezone): consolidate table wall-clock conversion (#7072)
j15z Aug 29, 2026
f8f2d5f
feat(tables): trigger workflows on row deletes (#7161)
j15z Aug 29, 2026
2b00d96
fix(elasticsearch): resolve Cloud IDs to the real host and correct th…
waleedlatif1 Aug 30, 2026
c53837f
improvement(integrations): refresh Slack integration page SEO copy (#…
waleedlatif1 Aug 30, 2026
4851ae3
fix(helm): bump chart appVersion to the release it ships with (#7285)
waleedlatif1 Aug 30, 2026
cd42dce
fix(charts): strip ECharts navigation sinks from .chart documents (#7…
waleedlatif1 Aug 30, 2026
553849a
fix(sandbox): spend each file ceiling once across every source (#7288)
icecrasher321 Aug 30, 2026
faec125
fix(admin): report a completed workspace move's true source and its c…
icecrasher321 Aug 30, 2026
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
7 changes: 4 additions & 3 deletions apps/docs/content/docs/integrations/elasticsearch.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ Retrieve index information including settings, mappings, and aliases.

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `index` | json | Index information including aliases, mappings, and settings |
| `indices` | json | Matched indices keyed by index name, each with its aliases, mappings, and settings |

### Elasticsearch Cluster Health

Expand All @@ -324,7 +324,7 @@ Get the health status of the Elasticsearch cluster.
| `username` | string | No | Username for basic auth |
| `password` | string | No | Password for basic auth |
| `waitForStatus` | string | No | Wait until cluster reaches this status: green, yellow, or red |
| `timeout` | string | No | Timeout for the wait operation \(e.g., 30s, 1m\) |
| `clusterTimeout` | string | No | How long Elasticsearch waits for the cluster to reach the requested status, as an Elasticsearch time value \(e.g., 30s, 1m\). Not named "timeout": that name is reserved by the tool transport as a client-side abort deadline in milliseconds. |

#### Output

Expand Down Expand Up @@ -377,12 +377,13 @@ List all indices in the Elasticsearch cluster with their health, status, and sta
| `apiKey` | string | No | Elasticsearch API key |
| `username` | string | No | Username for basic auth |
| `password` | string | No | Password for basic auth |
| `includeSystemIndices` | boolean | No | Include Elasticsearch system indices \(names starting with "."\). Omitted by default. |

#### Output

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Summary message about the indices |
| `indices` | json | Array of index information objects |
| `indices` | json | Array of index information objects \(index, health, status, docsCount, storeSize, primaryShards, replicaShards\). System indices are omitted unless includeSystemIndices is set. |


9 changes: 5 additions & 4 deletions apps/docs/content/docs/integrations/file.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -87,15 +87,16 @@ Fetch and parse a file from a URL with optional custom headers.

### File Write

Create a new workspace file. If a file with the same name already exists, a numeric suffix is added (e.g., "data (1).csv").
Create a new workspace file, either from text content or from an existing file. If a file with the same name already exists, a numeric suffix is added (e.g., "data (1).csv").

#### Input

| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `fileName` | string | Yes | File name \(e.g., "data.csv"\). If a file with this name exists, a numeric suffix is added automatically. |
| `content` | string | Yes | The text content to write to the file. |
| `contentType` | string | No | MIME type for new files \(e.g., "text/plain"\). Auto-detected from file extension if omitted. |
| `fileName` | string | No | File name \(e.g., "data.csv"\). Required when writing text; optional when storing a file, which keeps its own name unless this overrides it. If the name already exists, a numeric suffix is added automatically. |
| `content` | string | No | The text content to write to the file. Provide exactly one of content or fileInput. |
| `fileInput` | file | No | An existing file to store in the workspace, such as one produced by an earlier tool. Use this for anything that is not text — PDFs, images, audio, archives. Provide exactly one of content or fileInput. |
| `contentType` | string | No | MIME type for new files \(e.g., "text/plain"\). Auto-detected from the file extension, or taken from the stored file, if omitted. |

#### Output

Expand Down
3 changes: 3 additions & 0 deletions apps/docs/content/docs/tables/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,16 @@ Every column has a type, which decides how its values are stored and validated.
| **Currency** | An amount in a currency you pick per column | `$1,234.56` |
| **Boolean** | `true` or `false` | `true` |
| **Date** | A date | `2026-03-16` |
| **Expiration** | An absolute row expiration time, stored as Unix epoch seconds (seconds since January 1, 1970 UTC) | `1773671400` |
| **JSON** | An object or array | `{ "tier": "pro" }` |
| **Select** | One of a fixed set of options, or several | `Pro` |

Types are enforced as you enter values, so a Number column only takes numbers.

A Currency column stores a plain number and renders it in the currency you choose for that column, so filters, sorts, and exports all see the amount itself. Changing a column's currency relabels it — it does not convert the amounts.

A table can have one Expiration column. Adding it enables row expiration; rows with a non-empty expiration value become eligible for deletion after that time passes. Cleanup runs periodically, so actual row removal may happen after the expiration timestamp rather than exactly at it. Deleting the Expiration column disables expiration for the table. Expiration cells use the date editor, while APIs and workflows read and write integer Unix epoch seconds.

## Editing a table

Open the **Tables** section in the sidebar and click **New table** to create one. Add columns from the column header, type into a cell to edit it, and paste rows from a spreadsheet to bulk-load. Filter and sort from the toolbar without changing the underlying data. The editor has full keyboard support; see [keyboard shortcuts](/keyboard-shortcuts).
Expand Down
47 changes: 45 additions & 2 deletions apps/docs/content/docs/workflows/blocks/function.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,49 @@ Sim supplies the rendered heredoc privately while preserving the quoted delimite
| --- | --- |
| `<function.result>` | The value your code returns (object, array, string, number, …) |
| `<function.stdout>` | Anything printed with `console.log()` or `print()` |
| `<function.files>` | Files your code wrote to `/tmp/sim/outputs`, ready to attach or upload |

## Files

**Reading.** Reference a file's `path` and it is mounted for you:

```python
import pandas as pd

frame = pd.read_csv(<gmail.attachments[0].path>)
frame.describe().to_csv('/tmp/sim/outputs/summary.csv')
```

`.path` resolves to the file's location on the sandbox filesystem, so any language
can open it — pandas, ffmpeg, a CLI. It is the counterpart to `.base64`, which
inlines the contents instead and works only in JavaScript. Both appear in the
reference dropdown next to `.name` and `.size`.

**Writing.** Anything your code writes to `/tmp/sim/outputs` comes back as
`<function.files>`, a list of file objects any file-accepting block takes directly —
attach them to an email, upload them to storage, or save them to the workspace with
the File block. There is nothing to turn on.

The one exception is a call that names an explicit `outputSandboxPath`. That asks
for particular paths to be exported and answers with that export's own result, so
the output directory is not harvested alongside it — choose one or the other rather
than expecting both in the same run.

<Callout type="info">
Referencing `.path` runs the block in the remote sandbox, since the local
JavaScript VM has no filesystem — expect the slower start of a remote run even for
plain JavaScript. Referencing the file itself (`<gmail.attachments[0]>`, `.name`,
`.url`) does not, and stays local. Up to 20 files come back per run, 50MB total,
nested no more than 11 directories deep; a run that exceeds any of these fails
rather than returning part of what your code wrote.
</Callout>

<Callout type="warn">
Returned files live with the execution rather than in your workspace, and a text
file containing a resolved secret value is refused rather than returned — there is
nowhere on an execution file to record that it carries one. Write such a file to a
workspace path instead, or keep the secret out of the output.
</Callout>

## Language

Expand Down Expand Up @@ -401,8 +444,8 @@ The lazy `sim.files` and `sim.values` helpers are available only in JavaScript f
{ question: "What languages does the Function block support?", answer: "JavaScript, Python, and Shell. JavaScript is the default. Python remains a stable saved language choice; Shell and custom Sandbox controls appear when a remote sandbox provider is enabled. Python and Shell execution require that provider." },
{ question: "When does code run locally vs. in a sandbox?", answer: "JavaScript without external imports runs in a local isolated sandbox for speed. JavaScript that uses import or require, Python, and Shell run in the configured remote sandbox." },
{ question: "Does JavaScript still work without E2B or Daytona?", answer: "Yes. JavaScript without import or require runs in Sim's local isolated VM and does not require a remote provider. JavaScript with external imports, Python, Shell, and custom Sandboxes require E2B or Daytona and fail explicitly when it is unavailable." },
{ question: "How do I reference outputs from other blocks inside my code?", answer: "Use angle-bracket syntax directly, like <agent.content> or <api.data>, with no quotes around the tag — Sim replaces it with the real value before execution. For environment variables, use double curly braces: {{API_KEY}}." },
{ question: "What does the Function block return?", answer: "Two outputs: result and stdout. Use return in JavaScript, assign __sim_result__ in Python, or print an __SIM_RESULT__= marker in Shell to set result. Ordinary console, print, and command output goes to stdout." },
{ question: "How do I reference outputs from other blocks inside my code?", answer: "Use angle-bracket syntax directly, like <agent.content> or <api.data>, with no quotes around the tag — Sim replaces it with the real value before execution. For environment variables, use double curly braces: {{API_KEY}}. To read a file, reference its path — <gmail.attachments[0].path> mounts it and resolves to a location any language can open." },
{ question: "What does the Function block return?", answer: "Three outputs: result, stdout, and files. Use return in JavaScript, assign __sim_result__ in Python, or print an __SIM_RESULT__= marker in Shell to set result. Ordinary console, print, and command output goes to stdout. Anything your code writes to /tmp/sim/outputs comes back in files as a file object later blocks can accept directly." },
{ question: "Can I make HTTP requests from a Function block?", answer: "Yes. fetch() is available in JavaScript with async/await. In Python, use requests or httpx. In Shell, use curl or a CLI available on the selected sandbox." },
{ question: "Is there a timeout for Function block execution?", answer: "Yes, a configurable execution timeout. If your code exceeds it, the run is terminated and the block reports an error. Keep this in mind for external calls or heavy processing." },
]} />
90 changes: 81 additions & 9 deletions apps/docs/openapi-v2-tables.json
Original file line number Diff line number Diff line change
Expand Up @@ -4979,7 +4979,16 @@
},
"type": {
"type": "string",
"enum": ["string", "number", "currency", "boolean", "date", "json", "select"],
"enum": [
"string",
"number",
"currency",
"boolean",
"date",
"ttl",
"json",
"select"
],
"description": "Data type of values stored in the column."
},
"required": {
Expand Down Expand Up @@ -5257,7 +5266,16 @@
},
"type": {
"type": "string",
"enum": ["string", "number", "currency", "boolean", "date", "json", "select"],
"enum": [
"string",
"number",
"currency",
"boolean",
"date",
"ttl",
"json",
"select"
],
"description": "Column data type."
},
"required": {
Expand Down Expand Up @@ -5436,7 +5454,16 @@
},
"type": {
"type": "string",
"enum": ["string", "number", "currency", "boolean", "date", "json", "select"],
"enum": [
"string",
"number",
"currency",
"boolean",
"date",
"ttl",
"json",
"select"
],
"description": "Data type of values stored in the column."
},
"required": {
Expand Down Expand Up @@ -5536,7 +5563,16 @@
},
"type": {
"type": "string",
"enum": ["string", "number", "currency", "boolean", "date", "json", "select"],
"enum": [
"string",
"number",
"currency",
"boolean",
"date",
"ttl",
"json",
"select"
],
"description": "Column data type."
},
"required": {
Expand Down Expand Up @@ -5633,7 +5669,7 @@
"type": {
"description": "Replacement column data type.",
"type": "string",
"enum": ["string", "number", "currency", "boolean", "date", "json", "select"]
"enum": ["string", "number", "currency", "boolean", "date", "ttl", "json", "select"]
},
"required": {
"description": "Whether inserts must supply a value for this column.",
Expand Down Expand Up @@ -7397,7 +7433,16 @@
},
"type": {
"type": "string",
"enum": ["string", "number", "currency", "boolean", "date", "json", "select"],
"enum": [
"string",
"number",
"currency",
"boolean",
"date",
"ttl",
"json",
"select"
],
"description": "Data type of values stored in the column."
},
"required": {
Expand Down Expand Up @@ -7597,7 +7642,16 @@
},
"type": {
"type": "string",
"enum": ["string", "number", "currency", "boolean", "date", "json", "select"],
"enum": [
"string",
"number",
"currency",
"boolean",
"date",
"ttl",
"json",
"select"
],
"description": "Output column data type."
},
"required": {
Expand Down Expand Up @@ -7738,7 +7792,16 @@
},
"type": {
"type": "string",
"enum": ["string", "number", "currency", "boolean", "date", "json", "select"],
"enum": [
"string",
"number",
"currency",
"boolean",
"date",
"ttl",
"json",
"select"
],
"description": "Output column data type."
},
"required": {
Expand Down Expand Up @@ -7856,7 +7919,16 @@
},
"type": {
"type": "string",
"enum": ["string", "number", "currency", "boolean", "date", "json", "select"],
"enum": [
"string",
"number",
"currency",
"boolean",
"date",
"ttl",
"json",
"select"
],
"description": "Data type of values stored in the column."
},
"required": {
Expand Down
1 change: 1 addition & 0 deletions apps/sim/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ CRON_SECRET=your_cron_secret # Use `openssl rand -hex 32` to generate. Authentic
# DATA_DRAINS_ENABLED= / NEXT_PUBLIC_DATA_DRAINS_ENABLED= # Export streams
# FORKING_ENABLED= # Workspace forks
# CREDENTIAL_GROUPS= # Enterprise managed OAuth collections
# TABLE_ROW_TTL= # Table TTL columns and expired-row cleanup
# ORGANIZATIONS_ENABLED= / NEXT_PUBLIC_ORGANIZATIONS_ENABLED= # Organizations only

# Instance organization (Optional). Most enterprise features read their settings from the
Expand Down
10 changes: 6 additions & 4 deletions apps/sim/app/(landing)/integrations/data/seo-content.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,17 @@ export const INTEGRATION_SEO: Record<string, IntegrationSeoContent> = {
'slack workflow automation',
'slack integration',
],
h1: 'Slack Integrations for Workflow Automation',
h1: 'Slack Workflow Automation with Sim',
tagline:
'Build Slack workflow automation in Sim. Send, update, delete, and read messages; manage channels, users, canvases, and modals; and trigger AI agents from mentions, messages, and reactions in real time.',
overview:
'Use Sim as your Slack integration for team communication and operations. Build Slack automation that routes requests, posts alerts, summarises threads, updates tickets, and keeps work moving. Sim supports messages, reactions, canvases, views, channel and user lookups, file downloads, and real-time Slack workflows in one workspace.',
'Sim automates Slack workflows that depend on conversation context, including message routing, alerts, thread summaries, ticket updates, and incident response. Slack messages and events start agent workflows that interpret what was said and choose the next action in Slack or a connected tool, so routine coordination and time-sensitive operations keep moving without anyone relaying details by hand.',
triggersIntro:
'Connect the Slack Webhook trigger to Sim and run Slack workflow automation the moment a mention, message, or reaction happens, no polling, no delay.',
'Sim supports one real-time Slack trigger. Select the Slack events you care about, such as mentions, messages, and reactions, and Sim starts the connected workflow the moment one arrives instead of waiting for a scheduled check. A monitoring alert posted in Slack can open an incident-response workflow, and a ticketing update posted in Slack can be summarised and passed to another connected tool.',
templatesIntro:
'Ready-to-use Slack automation templates for Q&A bots, sales alerts, incident response, standups, digests, and CRM updates. Click any template to launch a workflow faster.',
'Pre-built agent templates turn common Slack workflows into editable starting points: routing templates classify messages and send them to the right channel or owner, summarisation templates condense long threads into updates that preserve decisions and action items, and ticket sync and incident response templates update connected records and coordinate follow-up. Every template is editable, so you can adapt its channels, routing rules, data sources, and approval requirements.',
toolsSubtitleSuffix:
' across messaging, channels, threads, users, reactions and files, and canvases and views. Combine multiple Slack actions in one workflow to summarise a message, route it, update a ticket, and post the ticket update back in Slack',
},
airtable: {
title: 'Airtable Automation with Sim',
Expand Down
Loading
Loading