From 16e3e38b79b471b4c5d0345d51334db3a5ce6c8c Mon Sep 17 00:00:00 2001 From: martmull Date: Wed, 1 Apr 2026 22:39:44 +0200 Subject: [PATCH] Improve getting started doc (#19138) - improves `packages/twenty-docs/developers/extend/apps/getting-started.mdx` --------- Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --- .github/workflows/ci-create-app-e2e.yaml | 2 +- .github/workflows/ci-test-docker-compose.yaml | 6 +- packages/create-twenty-app/README.md | 161 +- packages/create-twenty-app/package.json | 2 +- packages/create-twenty-app/src/cli.ts | 8 +- .../src/create-app.command.ts | 4 +- .../function-execute-app/.oxlintrc.json | 19 + .../fixtures/invalid-app/.oxlintrc.json | 19 + .../fixtures/invalid-app/package.json | 12 +- .../fixtures/minimal-app/.oxlintrc.json | 19 + .../fixtures/minimal-app/package.json | 12 +- .../fixtures/postcard-app/.oxlintrc.json | 19 + .../fixtures/postcard-app/package.json | 4 +- packages/twenty-apps/hello-world/README.md | 4 +- .../internal/call-recording/README.md | 4 +- packages/twenty-client-sdk/package.json | 2 +- .../dependencies.d/twenty-worker | 0 .../s6-overlay/s6-rc.d/register-crons/type | 1 + .../etc/s6-overlay/s6-rc.d/register-crons/up | 1 + .../s6-rc.d/user/contents.d/register-crons | 0 .../rootfs/etc/s6-overlay/scripts/init-db.sh | 31 +- .../etc/s6-overlay/scripts/register-crons.sh | 9 + packages/twenty-docker/twenty/Dockerfile | 10 +- .../developers/extend/apps/building.mdx | 1540 ++++++++++++----- .../extend/apps/getting-started.mdx | 473 +++-- .../developers/extend/apps/publishing.mdx | 226 +-- .../developers/extend/capabilities/apps.mdx | 1420 +-------------- .../developers/extends/apps/app-in-ui-1.png | Bin 0 -> 1298023 bytes .../developers/extends/apps/app-in-ui-2.png | Bin 0 -> 1331724 bytes .../developers/extends/apps/app-in-ui-3.png | Bin 0 -> 1335834 bytes .../developers/extends/apps/app-in-ui-4.png | Bin 0 -> 1415822 bytes .../developers/extends/apps/authorize.png | Bin 0 -> 1669509 bytes .../docs/developers/extends/apps/dev.jpg | Bin 0 -> 322381 bytes .../docs/developers/extends/apps/login.png | Bin 0 -> 807391 bytes .../developers/extends/apps/quick-action.png | Bin 0 -> 1020119 bytes .../developers/extends/apps/scaffolded.png | Bin 0 -> 176768 bytes .../extends/apps/start-instance.png | Bin 0 -> 90368 bytes packages/twenty-sdk/README.md | 347 +--- packages/twenty-sdk/package.json | 2 +- .../src/cli/commands/app-command.ts | 5 +- packages/twenty-sdk/src/cli/commands/exec.ts | 22 +- .../twenty-sdk/src/cli/commands/remote.ts | 50 +- .../twenty-sdk/src/cli/operations/execute.ts | 8 + .../src/cli/operations/server-start.ts | 91 +- .../steps/check-server-orchestrator-step.ts | 2 +- .../cli/utilities/server/docker-container.ts | 8 +- .../src/sdk/get-public-asset-url.ts | 42 + packages/twenty-sdk/src/sdk/index.ts | 1 + .../commands/cron-register-all.command.ts | 39 +- .../core/handlers/rest-api-base.handler.ts | 6 + 50 files changed, 2001 insertions(+), 2630 deletions(-) create mode 100644 packages/twenty-apps/fixtures/function-execute-app/.oxlintrc.json create mode 100644 packages/twenty-apps/fixtures/invalid-app/.oxlintrc.json create mode 100644 packages/twenty-apps/fixtures/minimal-app/.oxlintrc.json create mode 100644 packages/twenty-apps/fixtures/postcard-app/.oxlintrc.json create mode 100644 packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/s6-rc.d/register-crons/dependencies.d/twenty-worker create mode 100644 packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/s6-rc.d/register-crons/type create mode 100644 packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/s6-rc.d/register-crons/up create mode 100644 packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/register-crons create mode 100644 packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/scripts/register-crons.sh create mode 100644 packages/twenty-docs/images/docs/developers/extends/apps/app-in-ui-1.png create mode 100644 packages/twenty-docs/images/docs/developers/extends/apps/app-in-ui-2.png create mode 100644 packages/twenty-docs/images/docs/developers/extends/apps/app-in-ui-3.png create mode 100644 packages/twenty-docs/images/docs/developers/extends/apps/app-in-ui-4.png create mode 100644 packages/twenty-docs/images/docs/developers/extends/apps/authorize.png create mode 100644 packages/twenty-docs/images/docs/developers/extends/apps/dev.jpg create mode 100644 packages/twenty-docs/images/docs/developers/extends/apps/login.png create mode 100644 packages/twenty-docs/images/docs/developers/extends/apps/quick-action.png create mode 100644 packages/twenty-docs/images/docs/developers/extends/apps/scaffolded.png create mode 100644 packages/twenty-docs/images/docs/developers/extends/apps/start-instance.png create mode 100644 packages/twenty-sdk/src/sdk/get-public-asset-url.ts diff --git a/.github/workflows/ci-create-app-e2e.yaml b/.github/workflows/ci-create-app-e2e.yaml index 88877a27f1..cf779ce3f9 100644 --- a/.github/workflows/ci-create-app-e2e.yaml +++ b/.github/workflows/ci-create-app-e2e.yaml @@ -156,7 +156,7 @@ jobs: SEED_API_KEY: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyMDIwMjAyMC1lNmI1LTQ2ODAtOGEzMi1iODIwOTczNzE1NmIiLCJ1c2VySWQiOiIyMDIwMjAyMC1lNmI1LTQ2ODAtOGEzMi1iODIwOTczNzE1NmIiLCJ3b3Jrc3BhY2VJZCI6IjIwMjAyMDIwLTFjMjUtNGQwMi1iZjI1LTZhZWNjZjdlYTQxOSIsIndvcmtzcGFjZU1lbWJlcklkIjoiMjAyMDIwMjAtNDYzZi00MzViLTgyOGMtMTA3ZTAwN2EyNzExIiwidXNlcldvcmtzcGFjZUlkIjoiMjAyMDIwMjAtMWU3Yy00M2Q5LWE1ZGItNjg1YjUwNjlkODE2IiwidHlwZSI6IkFDQ0VTUyIsImF1dGhQcm92aWRlciI6InBhc3N3b3JkIiwiaWF0IjoxNzUxMjgxNzA0LCJleHAiOjIwNjY4NTc3MDR9.HMGqCsVlOAPVUBhKSGlD1X86VoHKt4LIUtET3CGIdik' run: | cd /tmp/e2e-test-workspace/test-app - npx --no-install twenty remote add --token $SEED_API_KEY --url http://localhost:3000 + npx --no-install twenty remote add --api-key $SEED_API_KEY --api-url http://localhost:3000 - name: Deploy scaffolded app run: | diff --git a/.github/workflows/ci-test-docker-compose.yaml b/.github/workflows/ci-test-docker-compose.yaml index 8503312b24..d2575f6136 100644 --- a/.github/workflows/ci-test-docker-compose.yaml +++ b/.github/workflows/ci-test-docker-compose.yaml @@ -121,7 +121,7 @@ jobs: - name: Start container run: | docker run -d --name twenty-app-dev \ - -p 3000:3000 \ + -p 2020:2020 \ twenty-app-dev-ci docker logs twenty-app-dev -f & - name: Wait for server health @@ -129,10 +129,10 @@ jobs: echo "Waiting for twenty-app-dev to become healthy..." count=0 while true; do - status=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:3000/healthz 2>/dev/null || echo "000") + status=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:2020/healthz 2>/dev/null || echo "000") if [ "$status" = "200" ]; then echo "Server is healthy!" - curl -s http://localhost:3000/healthz + curl -s http://localhost:2020/healthz break fi diff --git a/packages/create-twenty-app/README.md b/packages/create-twenty-app/README.md index e0b063da46..47142a8b73 100644 --- a/packages/create-twenty-app/README.md +++ b/packages/create-twenty-app/README.md @@ -12,164 +12,49 @@ -Create Twenty App is the official scaffolding CLI for building apps on top of [Twenty CRM](https://twenty.com). It sets up a ready‑to‑run project that works seamlessly with the [twenty-sdk](https://www.npmjs.com/package/twenty-sdk). - -- Zero‑config project bootstrap -- Preconfigured scripts for auth, dev mode (watch & sync), uninstall, and function management -- Strong TypeScript support and typed client generation - -## Documentation - -See Twenty application documentation https://docs.twenty.com/developers/extend/capabilities/apps - -## Prerequisites - -- Node.js 24+ (recommended) and Yarn 4 -- Docker (for the local Twenty dev server) +The official scaffolding CLI for building apps on top of [Twenty CRM](https://twenty.com). Sets up a ready-to-run project with [twenty-sdk](https://www.npmjs.com/package/twenty-sdk). ## Quick start ```bash -# Scaffold a new app — the CLI will offer to start a local Twenty server npx create-twenty-app@latest my-twenty-app cd my-twenty-app - -# The scaffolder can automatically: -# 1. Start a local Twenty server (Docker) -# 2. Open the browser to log in (tim@apple.dev / tim@apple.dev) -# 3. Authenticate your app via OAuth - -# Or do it manually: -yarn twenty server start # Start local Twenty server -yarn twenty remote add http://localhost:2020 --as local # Authenticate via OAuth - -# Start dev mode: watches, builds, and syncs local changes to your workspace -# (also auto-generates typed CoreApiClient — MetadataApiClient ships pre-built — both available via `twenty-client-sdk`) yarn twenty dev - -# Watch your application's function logs -yarn twenty logs - -# Execute a function with a JSON payload -yarn twenty exec -n my-function -p '{"key": "value"}' - -# Execute the pre-install function -yarn twenty exec --preInstall - -# Execute the post-install function -yarn twenty exec --postInstall - -# Build the app for distribution -yarn twenty build - -# Publish the app to npm or directly to a Twenty server -yarn twenty publish - -# Uninstall the application from the current workspace -yarn twenty uninstall ``` +The scaffolder will: + +1. Create a new project with TypeScript, linting, and a preconfigured `twenty` CLI +2. Optionally start a local Twenty server (Docker) +3. Open the browser for OAuth authentication +4. Scaffold example entities and an integration test + ## Scaffolding modes -Control which example files are included when creating a new app: +| Flag | Behavior | +| -------------- | -------------------------------------------------------------------------------------------------------------- | +| `--minimal` | **(default)** Creates only core files (`application-config.ts`, `default-role.ts`, pre/post-install functions) | +| `--exhaustive` | Creates all example entities | -| Flag | Behavior | -| ------------------ | ----------------------------------------------------------------------- | -| `-e, --exhaustive` | **(default)** Creates all example files | -| `-m, --minimal` | Creates only core files (`application-config.ts` and `default-role.ts`) | +Other flags: -```bash -# Default: all examples included -npx create-twenty-app@latest my-app +- `--name ` — set the app name (skips the prompt) +- `--display-name ` — set the display name (skips the prompt) +- `--description ` — set the description (skips the prompt) +- `--skip-local-instance` — skip the local server setup prompt -# Minimal: only core files -npx create-twenty-app@latest my-app -m -``` +## Documentation -## What gets scaffolded +Full documentation is available at **[docs.twenty.com/developers/extend/apps](https://docs.twenty.com/developers/extend/apps/getting-started)**: -**Core files (always created):** - -- `application-config.ts` — Application metadata configuration -- `roles/default-role.ts` — Default role for logic functions -- `logic-functions/pre-install.ts` — Pre-install logic function (runs before app installation) -- `logic-functions/post-install.ts` — Post-install logic function (runs after app installation) -- TypeScript configuration, Oxlint, package.json, .gitignore -- A prewired `twenty` script that delegates to the `twenty` CLI from twenty-sdk - -**Example files (controlled by scaffolding mode):** - -- `objects/example-object.ts` — Example custom object with a text field -- `fields/example-field.ts` — Example standalone field extending the example object -- `logic-functions/hello-world.ts` — Example logic function with HTTP trigger -- `front-components/hello-world.tsx` — Example front component -- `views/example-view.ts` — Example saved view for the example object -- `navigation-menu-items/example-navigation-menu-item.ts` — Example sidebar navigation link -- `skills/example-skill.ts` — Example AI agent skill definition -- `__tests__/app-install.integration-test.ts` — Integration test that builds, installs, and verifies the app (includes `vitest.config.ts`, `tsconfig.spec.json`, and a setup file) - -## Local server - -The scaffolder can start a local Twenty dev server for you (all-in-one Docker image with PostgreSQL, Redis, server, and worker on port 2020). These commands only apply to the Docker-based dev server — they do not manage a Twenty instance started from source (e.g. `npx nx start twenty-server` on port 3000). You can also manage it manually: - -```bash -yarn twenty server start # Start (pulls image if needed) -yarn twenty server status # Check if it's healthy -yarn twenty server logs # Stream logs -yarn twenty server stop # Stop (data is preserved) -yarn twenty server reset # Wipe all data and start fresh -``` - -The server is pre-seeded with a workspace and user (`tim@apple.dev` / `tim@apple.dev`). - -## Next steps - -- Run `yarn twenty help` to see all available commands. -- Use `yarn twenty remote add ` to authenticate with your Twenty workspace via OAuth. -- Explore the generated project and add your first entity with `yarn twenty add` (logic functions, front components, objects, roles, views, navigation menu items, skills). -- Use `yarn twenty dev` while you iterate — it watches, builds, and syncs changes to your workspace in real time. -- `CoreApiClient` is auto-generated by `yarn twenty dev`. `MetadataApiClient` (for workspace configuration and file uploads via `/metadata`) ships pre-built with the SDK. Both are available via `import { CoreApiClient } from 'twenty-client-sdk/core'` and `import { MetadataApiClient } from 'twenty-client-sdk/metadata'`. - -## Build and publish your application - -Once your app is ready, build and publish it using the CLI: - -```bash -# Build the app (output goes to .twenty/output/) -yarn twenty build - -# Build and create a tarball (.tgz) for distribution -yarn twenty build --tarball - -# Publish to npm (requires npm login) -yarn twenty publish - -# Publish with a dist-tag (e.g. beta, next) -yarn twenty publish --tag beta - -# Deploy directly to a Twenty server (builds, uploads, and installs in one step) -yarn twenty deploy -``` - -### Publish to the Twenty marketplace - -You can also contribute your application to the curated marketplace: - -```bash -git clone https://github.com/twentyhq/twenty.git -cd twenty -git checkout -b feature/my-awesome-app -``` - -- Copy your app folder into `twenty/packages/twenty-apps`. -- Commit your changes and open a pull request on https://github.com/twentyhq/twenty - -Our team reviews contributions for quality, security, and reusability before merging. +- [Getting Started](https://docs.twenty.com/developers/extend/apps/getting-started) — step-by-step setup, project structure, server management, CI +- [Building Apps](https://docs.twenty.com/developers/extend/apps/building) — entity definitions, API clients, testing +- [Publishing](https://docs.twenty.com/developers/extend/apps/publishing) — deploy, npm publish, marketplace ## Troubleshooting - Server not starting: check Docker is running (`docker info`), then try `yarn twenty server logs`. -- Auth not working: make sure you're logged in to Twenty in the browser first, then run `yarn twenty remote add `. +- Auth not working: make sure you are logged in to Twenty in the browser, then run `yarn twenty remote add`. - Types not generated: ensure `yarn twenty dev` is running — it auto-generates the typed client. ## Contributing diff --git a/packages/create-twenty-app/package.json b/packages/create-twenty-app/package.json index c845329fe4..5c94b49114 100644 --- a/packages/create-twenty-app/package.json +++ b/packages/create-twenty-app/package.json @@ -1,6 +1,6 @@ { "name": "create-twenty-app", - "version": "0.8.0-canary.7", + "version": "0.8.0-canary.8", "description": "Command-line interface to create Twenty application", "main": "dist/cli.cjs", "bin": "dist/cli.cjs", diff --git a/packages/create-twenty-app/src/cli.ts b/packages/create-twenty-app/src/cli.ts index 9737149cea..8913c6a1de 100644 --- a/packages/create-twenty-app/src/cli.ts +++ b/packages/create-twenty-app/src/cli.ts @@ -13,10 +13,10 @@ const program = new Command(packageJson.name) 'Output the current version of create-twenty-app.', ) .argument('[directory]') - .option('-e, --exhaustive', 'Create all example entities (default)') + .option('-e, --exhaustive', 'Create all example entities') .option( '-m, --minimal', - 'Create only core entities (application-config and default-role)', + 'Create only core entities (application-config and default-role) (default)', ) .option('-n, --name ', 'Application name (skips prompt)') .option( @@ -69,7 +69,9 @@ const program = new Command(packageJson.name) process.exit(1); } - const mode: ScaffoldingMode = options?.minimal ? 'minimal' : 'exhaustive'; + const mode: ScaffoldingMode = options?.exhaustive + ? 'exhaustive' + : 'minimal'; await new CreateAppCommand().execute({ directory, diff --git a/packages/create-twenty-app/src/create-app.command.ts b/packages/create-twenty-app/src/create-app.command.ts index 5f46301c31..0c5d1be3ed 100644 --- a/packages/create-twenty-app/src/create-app.command.ts +++ b/packages/create-twenty-app/src/create-app.command.ts @@ -39,7 +39,7 @@ export class CreateAppCommand { try { const exampleOptions = this.resolveExampleOptions( - options.mode ?? 'exhaustive', + options.mode ?? 'minimal', ); await this.validateDirectory(appDirectory); @@ -163,7 +163,7 @@ export class CreateAppCommand { includeExampleNavigationMenuItem: false, includeExampleSkill: false, includeExampleAgent: false, - includeExampleIntegrationTest: false, + includeExampleIntegrationTest: true, }; } diff --git a/packages/twenty-apps/fixtures/function-execute-app/.oxlintrc.json b/packages/twenty-apps/fixtures/function-execute-app/.oxlintrc.json new file mode 100644 index 0000000000..87c62c5183 --- /dev/null +++ b/packages/twenty-apps/fixtures/function-execute-app/.oxlintrc.json @@ -0,0 +1,19 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript"], + "categories": { + "correctness": "off" + }, + "ignorePatterns": ["node_modules", "dist"], + "rules": { + "no-unused-vars": "off", + + "typescript/no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_" + } + ], + "typescript/no-explicit-any": "off" + } +} diff --git a/packages/twenty-apps/fixtures/invalid-app/.oxlintrc.json b/packages/twenty-apps/fixtures/invalid-app/.oxlintrc.json new file mode 100644 index 0000000000..87c62c5183 --- /dev/null +++ b/packages/twenty-apps/fixtures/invalid-app/.oxlintrc.json @@ -0,0 +1,19 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript"], + "categories": { + "correctness": "off" + }, + "ignorePatterns": ["node_modules", "dist"], + "rules": { + "no-unused-vars": "off", + + "typescript/no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_" + } + ], + "typescript/no-explicit-any": "off" + } +} diff --git a/packages/twenty-apps/fixtures/invalid-app/package.json b/packages/twenty-apps/fixtures/invalid-app/package.json index d1864a7f0e..485dbe2208 100644 --- a/packages/twenty-apps/fixtures/invalid-app/package.json +++ b/packages/twenty-apps/fixtures/invalid-app/package.json @@ -9,17 +9,7 @@ }, "packageManager": "yarn@4.9.2", "scripts": { - "remote:add": "twenty remote add --local", - "remote:status": "twenty remote status", - "remote:switch": "twenty remote switch", - "remote:list": "twenty remote list", - "remote:remove": "twenty remote remove", - "dev": "twenty dev", - "add": "twenty add", - "logs": "twenty logs", - "exec": "twenty exec", - "uninstall": "twenty uninstall", - "help": "twenty help", + "twenty": "twenty", "lint": "oxlint -c .oxlintrc.json .", "lint:fix": "oxlint --fix -c .oxlintrc.json ." }, diff --git a/packages/twenty-apps/fixtures/minimal-app/.oxlintrc.json b/packages/twenty-apps/fixtures/minimal-app/.oxlintrc.json new file mode 100644 index 0000000000..87c62c5183 --- /dev/null +++ b/packages/twenty-apps/fixtures/minimal-app/.oxlintrc.json @@ -0,0 +1,19 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript"], + "categories": { + "correctness": "off" + }, + "ignorePatterns": ["node_modules", "dist"], + "rules": { + "no-unused-vars": "off", + + "typescript/no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_" + } + ], + "typescript/no-explicit-any": "off" + } +} diff --git a/packages/twenty-apps/fixtures/minimal-app/package.json b/packages/twenty-apps/fixtures/minimal-app/package.json index 14b4b0ddfc..7f6c16b771 100644 --- a/packages/twenty-apps/fixtures/minimal-app/package.json +++ b/packages/twenty-apps/fixtures/minimal-app/package.json @@ -9,17 +9,7 @@ }, "packageManager": "yarn@4.9.2", "scripts": { - "remote:add": "twenty remote add --local", - "remote:status": "twenty remote status", - "remote:switch": "twenty remote switch", - "remote:list": "twenty remote list", - "remote:remove": "twenty remote remove", - "dev": "twenty dev", - "add": "twenty add", - "logs": "twenty logs", - "exec": "twenty exec", - "uninstall": "twenty uninstall", - "help": "twenty help", + "twenty": "twenty", "lint": "oxlint -c .oxlintrc.json .", "lint:fix": "oxlint --fix -c .oxlintrc.json ." }, diff --git a/packages/twenty-apps/fixtures/postcard-app/.oxlintrc.json b/packages/twenty-apps/fixtures/postcard-app/.oxlintrc.json new file mode 100644 index 0000000000..87c62c5183 --- /dev/null +++ b/packages/twenty-apps/fixtures/postcard-app/.oxlintrc.json @@ -0,0 +1,19 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript"], + "categories": { + "correctness": "off" + }, + "ignorePatterns": ["node_modules", "dist"], + "rules": { + "no-unused-vars": "off", + + "typescript/no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_" + } + ], + "typescript/no-explicit-any": "off" + } +} diff --git a/packages/twenty-apps/fixtures/postcard-app/package.json b/packages/twenty-apps/fixtures/postcard-app/package.json index bf09dab12b..c91688dd60 100644 --- a/packages/twenty-apps/fixtures/postcard-app/package.json +++ b/packages/twenty-apps/fixtures/postcard-app/package.json @@ -9,7 +9,9 @@ }, "packageManager": "yarn@4.9.2", "scripts": { - "twenty": "twenty" + "twenty": "twenty", + "lint": "oxlint -c .oxlintrc.json .", + "lint:fix": "oxlint --fix -c .oxlintrc.json ." }, "dependencies": { "twenty-sdk": "latest", diff --git a/packages/twenty-apps/hello-world/README.md b/packages/twenty-apps/hello-world/README.md index c96bb8324e..4901275bfa 100644 --- a/packages/twenty-apps/hello-world/README.md +++ b/packages/twenty-apps/hello-world/README.md @@ -5,7 +5,7 @@ This is a [Twenty](https://twenty.com) application project bootstrapped with [`c First, authenticate to your workspace: ```bash -yarn twenty remote add http://localhost:2020 --as local +yarn twenty remote add --api-url http://localhost:2020 --as local ``` Then, start development mode to sync your app and watch for changes: @@ -22,7 +22,7 @@ Run `yarn twenty help` to list all available commands. Common commands: ```bash # Remotes & Authentication -yarn twenty remote add http://localhost:2020 --as local # Authenticate with Twenty +yarn twenty remote add --api-url http://localhost:2020 --as local # Authenticate with Twenty yarn twenty remote status # Check auth status yarn twenty remote switch # Switch default remote yarn twenty remote list # List all configured remotes diff --git a/packages/twenty-apps/internal/call-recording/README.md b/packages/twenty-apps/internal/call-recording/README.md index 19e6b99201..47a33a8914 100644 --- a/packages/twenty-apps/internal/call-recording/README.md +++ b/packages/twenty-apps/internal/call-recording/README.md @@ -5,7 +5,7 @@ This is a [Twenty](https://twenty.com) application project bootstrapped with [`c First, authenticate to your workspace: ```bash -yarn twenty remote add http://localhost:2020 --as local +yarn twenty remote add --api-url http://localhost:2020 --as local ``` Then, start development mode to sync your app and watch for changes: @@ -22,7 +22,7 @@ Run `yarn twenty help` to list all available commands. Common commands: ```bash # Remotes & Authentication -yarn twenty remote add http://localhost:2020 --as local # Authenticate with Twenty +yarn twenty remote add --api-url http://localhost:2020 --as local # Authenticate with Twenty yarn twenty remote status # Check auth status yarn twenty remote switch # Switch default remote yarn twenty remote list # List all configured remotes diff --git a/packages/twenty-client-sdk/package.json b/packages/twenty-client-sdk/package.json index 65f5c51c4c..4c6dfac159 100644 --- a/packages/twenty-client-sdk/package.json +++ b/packages/twenty-client-sdk/package.json @@ -1,6 +1,6 @@ { "name": "twenty-client-sdk", - "version": "0.8.0-canary.7", + "version": "0.8.0-canary.8", "sideEffects": false, "license": "AGPL-3.0", "scripts": { diff --git a/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/s6-rc.d/register-crons/dependencies.d/twenty-worker b/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/s6-rc.d/register-crons/dependencies.d/twenty-worker new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/s6-rc.d/register-crons/type b/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/s6-rc.d/register-crons/type new file mode 100644 index 0000000000..bdd22a1850 --- /dev/null +++ b/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/s6-rc.d/register-crons/type @@ -0,0 +1 @@ +oneshot diff --git a/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/s6-rc.d/register-crons/up b/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/s6-rc.d/register-crons/up new file mode 100644 index 0000000000..893e512e83 --- /dev/null +++ b/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/s6-rc.d/register-crons/up @@ -0,0 +1 @@ +/bin/sh /etc/s6-overlay/scripts/register-crons.sh diff --git a/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/register-crons b/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/register-crons new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/scripts/init-db.sh b/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/scripts/init-db.sh index 2f3e5174f8..50ad6d2538 100755 --- a/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/scripts/init-db.sh +++ b/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/scripts/init-db.sh @@ -1,10 +1,13 @@ #!/bin/sh set -e +step_start() { echo "==> START $1"; } +step_done() { echo "==> DONE"; } + # Wait for PostgreSQL to be ready (timeout after 60s) -echo "Waiting for PostgreSQL..." +step_start "Waiting for PostgreSQL" TRIES=0 -until su-exec postgres pg_isready -h localhost; do +until su-exec postgres pg_isready -h localhost > /dev/null 2>&1; do TRIES=$((TRIES + 1)) if [ "$TRIES" -ge 120 ]; then echo "ERROR: PostgreSQL did not become ready within 60s" @@ -12,7 +15,7 @@ until su-exec postgres pg_isready -h localhost; do fi sleep 0.5 done -echo "PostgreSQL is ready." +step_done # Create role if it doesn't exist su-exec postgres psql -h localhost -tc \ @@ -31,26 +34,36 @@ has_schema=$(PGPASSWORD=twenty psql -h localhost -U twenty -d default -tAc \ "SELECT EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = 'core')") if [ "$has_schema" = "f" ]; then - echo "Database appears to be empty, running initial setup..." + step_start "Running initial database setup" NODE_OPTIONS="--max-old-space-size=1500" node ./dist/database/scripts/setup-db.js + step_done fi -# Always run migrations (idempotent — skips already-applied ones) +step_start "Running migrations" yarn database:migrate:prod --force +step_done +step_start "Flushing cache" yarn command:prod cache:flush +step_done + +step_start "Running upgrade" yarn command:prod upgrade +step_done + +step_start "Flushing cache" yarn command:prod cache:flush +step_done # Only seed on first boot — check if the dev workspace already exists has_workspace=$(PGPASSWORD=twenty psql -h localhost -U twenty -d default -tAc \ "SELECT EXISTS (SELECT 1 FROM core.workspace WHERE id = '20202020-1c25-4d02-bf25-6aeccf7ea419')") if [ "$has_workspace" = "f" ]; then - echo "Seeding app dev data..." + step_start "Seeding workspace data" yarn command:prod workspace:seed:dev --light || true -else - echo "Dev workspace already seeded, skipping." + step_done fi -echo "Database initialization complete." +echo "==> START Database ready" +echo "==> DONE" diff --git a/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/scripts/register-crons.sh b/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/scripts/register-crons.sh new file mode 100644 index 0000000000..89975dede5 --- /dev/null +++ b/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/scripts/register-crons.sh @@ -0,0 +1,9 @@ +#!/bin/sh +set -e + +echo "==> START Registering cron jobs" + +cd /app/packages/twenty-server +yarn command:prod cron:register:all --dev-mode + +echo "==> DONE" diff --git a/packages/twenty-docker/twenty/Dockerfile b/packages/twenty-docker/twenty/Dockerfile index c7f0b382e0..c1a59904fe 100644 --- a/packages/twenty-docker/twenty/Dockerfile +++ b/packages/twenty-docker/twenty/Dockerfile @@ -195,9 +195,9 @@ RUN find /app/packages/twenty-server/dist -name '*.js.map' -delete # s6 service definitions COPY packages/twenty-docker/twenty-app-dev/rootfs/ / -RUN mkdir -p /data/postgres /data/redis /app/.local-storage \ +RUN mkdir -p /data/postgres /data/redis /app/packages/twenty-server/.local-storage \ && chown -R postgres:postgres /data/postgres \ - && chown 1000:1000 /data/redis /app/.local-storage + && chown 1000:1000 /data/redis /app/packages/twenty-server/.local-storage ARG REACT_APP_SERVER_BASE_URL ARG APP_VERSION=0.0.0 @@ -211,14 +211,14 @@ ENV PG_DATABASE_URL=postgres://twenty:twenty@localhost:5432/default \ REACT_APP_SERVER_BASE_URL=$REACT_APP_SERVER_BASE_URL \ APP_VERSION=$APP_VERSION \ NODE_ENV=development \ - NODE_PORT=3000 \ + NODE_PORT=2020 \ DISABLE_DB_MIGRATIONS=true \ DISABLE_CRON_JOBS_REGISTRATION=true \ IS_BILLING_ENABLED=false \ SIGN_IN_PREFILLED=true -EXPOSE 3000 -VOLUME ["/data/postgres", "/app/.local-storage"] +EXPOSE 2020 +VOLUME ["/data/postgres", "/app/packages/twenty-server/.local-storage"] LABEL org.opencontainers.image.source=https://github.com/twentyhq/twenty LABEL org.opencontainers.image.description="All-in-one Twenty image for local development and SDK usage. Includes PostgreSQL, Redis, server, and worker." diff --git a/packages/twenty-docs/developers/extend/apps/building.mdx b/packages/twenty-docs/developers/extend/apps/building.mdx index 37bfa854cb..4fe2c22066 100644 --- a/packages/twenty-docs/developers/extend/apps/building.mdx +++ b/packages/twenty-docs/developers/extend/apps/building.mdx @@ -4,41 +4,174 @@ description: Define objects, logic functions, front components, and more with th --- -Apps are currently in alpha testing. The feature is functional but still evolving. + Apps are currently in alpha. The feature works but is still evolving. -## Use the SDK resources (types & config) +The `twenty-sdk` package provides typed building blocks to create your app. This page covers every entity type and API client available in the SDK. -The twenty-sdk provides typed building blocks and helper functions you use inside your app. Below are the key pieces you'll touch most often. +## DefineEntity functions -### Helper functions +The SDK provides functions to define your app entities. You must use `export default defineEntity({...})` for the SDK to detect your entities. These functions validate your configuration at build time and provide IDE autocompletion and type safety. -The SDK provides helper functions for defining your app entities. As described in [Entity detection](/developers/extend/apps/getting-started#entity-detection), you must use `export default define({...})` for your entities to be detected: + + **File organization is up to you.** + Entity detection is AST-based — the SDK finds `export default defineEntity(...)` calls regardless of where the file lives. Grouping files by type (e.g., `logic-functions/`, `roles/`) is just a convention, not a requirement. + -| Function | Purpose | -|----------|---------| -| `defineApplication` | Configure application metadata (required, one per app) | -| `defineObject` | Define custom objects with fields | -| `defineField` | Extend existing objects with additional fields or define standalone relation fields | -| `defineLogicFunction` | Define logic functions with handlers | -| `definePreInstallLogicFunction` | Define a pre-install logic function (one per app) | -| `definePostInstallLogicFunction` | Define a post-install logic function (one per app) | -| `defineFrontComponent` | Define front components for custom UI | -| `defineRole` | Configure role permissions and object access | -| `defineView` | Define saved views for objects | -| `defineNavigationMenuItem` | Define sidebar navigation links | -| `defineSkill` | Define AI agent skills | -| `defineAgent` | Define AI agents | -| `definePageLayout` | Define custom page layouts | + + -These functions validate your configuration at build time and provide IDE autocompletion and type safety. +Roles encapsulate permissions on your workspace's objects and actions. -### Defining objects +```ts restricted-company-role.ts +import { + defineRole, + PermissionFlag, + STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, +} from 'twenty-sdk'; + +export default defineRole({ + universalIdentifier: '2c80f640-2083-4803-bb49-003e38279de6', + label: 'My new role', + description: 'A role that can be used in your workspace', + canReadAllObjectRecords: false, + canUpdateAllObjectRecords: false, + canSoftDeleteAllObjectRecords: false, + canDestroyAllObjectRecords: false, + canUpdateAllSettings: false, + canBeAssignedToAgents: false, + canBeAssignedToUsers: false, + canBeAssignedToApiKeys: false, + objectPermissions: [ + { + objectUniversalIdentifier: + STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.company.universalIdentifier, + canReadObjectRecords: true, + canUpdateObjectRecords: true, + canSoftDeleteObjectRecords: false, + canDestroyObjectRecords: false, + }, + ], + fieldPermissions: [ + { + objectUniversalIdentifier: + STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.company.universalIdentifier, + fieldUniversalIdentifier: + STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.company.fields.name.universalIdentifier, + canReadFieldValue: false, + canUpdateFieldValue: false, + }, + ], + permissionFlags: [PermissionFlag.APPLICATIONS], +}); +``` + + + + +Every app must have exactly one `defineApplication` call that describes: + +- **Identity**: identifiers, display name, and description. +- **Permissions**: which role its functions and front components use. +- **(Optional) Variables**: key–value pairs exposed to your functions as environment variables. +- **(Optional) Pre-install / post-install functions**: logic functions that run before or after installation. + +```ts src/application-config.ts +import { defineApplication } from 'twenty-sdk'; +import { DEFAULT_ROLE_UNIVERSAL_IDENTIFIER } from 'src/roles/default-role'; + +export default defineApplication({ + universalIdentifier: '4ec0391d-18d5-411c-b2f3-266ddc1c3ef7', + displayName: 'My Twenty App', + description: 'My first Twenty app', + icon: 'IconWorld', + applicationVariables: { + DEFAULT_RECIPIENT_NAME: { + universalIdentifier: '19e94e59-d4fe-4251-8981-b96d0a9f74de', + description: 'Default recipient name for postcards', + value: 'Jane Doe', + isSecret: false, + }, + }, + defaultRoleUniversalIdentifier: DEFAULT_ROLE_UNIVERSAL_IDENTIFIER, +}); +``` + +Notes: +- `universalIdentifier` fields are deterministic IDs you own. Generate them once and keep them stable across syncs. +- `applicationVariables` become environment variables for your functions and front components (e.g., `DEFAULT_RECIPIENT_NAME` is available as `process.env.DEFAULT_RECIPIENT_NAME`). +- `defaultRoleUniversalIdentifier` must reference a role defined with `defineRole()` (see above). +- Pre-install and post-install functions are detected automatically during the manifest build — you do not need to reference them in `defineApplication()`. + +#### Marketplace metadata + +If you plan to [publish your app](/developers/extend/apps/publishing), these optional fields control how it appears in the marketplace: + +| Field | Description | +|-------|-------------| +| `author` | Author or company name | +| `category` | App category for marketplace filtering | +| `logoUrl` | Path to your app logo (e.g., `public/logo.png`) | +| `screenshots` | Array of screenshot paths (e.g., `public/screenshot-1.png`) | +| `aboutDescription` | Longer markdown description for the "About" tab. If omitted, the marketplace uses the package's `README.md` from npm | +| `websiteUrl` | Link to your website | +| `termsUrl` | Link to terms of service | +| `emailSupport` | Support email address | +| `issueReportUrl` | Link to issue tracker | + +#### Roles and permissions + +The `defaultRoleUniversalIdentifier` in `application-config.ts` designates the default role used by your app's logic functions and front components. See `defineRole` above for details. + +- The runtime token injected as `TWENTY_APP_ACCESS_TOKEN` is derived from this role. +- The typed client is restricted to the permissions granted to that role. +- Follow least-privilege: create a dedicated role with only the permissions your functions need. + +##### Default function role + +When you scaffold a new app, the CLI creates a default role file: + +```ts src/roles/default-role.ts +import { defineRole, PermissionFlag } from 'twenty-sdk'; + +export const DEFAULT_ROLE_UNIVERSAL_IDENTIFIER = + 'b648f87b-1d26-4961-b974-0908fd991061'; + +export default defineRole({ + universalIdentifier: DEFAULT_ROLE_UNIVERSAL_IDENTIFIER, + label: 'Default function role', + description: 'Default role for function Twenty client', + canReadAllObjectRecords: true, + canUpdateAllObjectRecords: false, + canSoftDeleteAllObjectRecords: false, + canDestroyAllObjectRecords: false, + canUpdateAllSettings: false, + canBeAssignedToAgents: false, + canBeAssignedToUsers: false, + canBeAssignedToApiKeys: false, + objectPermissions: [], + fieldPermissions: [], + permissionFlags: [], +}); +``` + +This role's `universalIdentifier` is referenced in `application-config.ts` as `defaultRoleUniversalIdentifier`: + +- **\*.role.ts** defines what the role can do. +- **application-config.ts** points to that role so your functions inherit its permissions. + +Notes: +- Start from the scaffolded role, then progressively restrict it following least-privilege. +- Replace `objectPermissions` and `fieldPermissions` with the objects and fields your functions actually need. +- `permissionFlags` control access to platform-level capabilities. Keep them minimal. +- See a working example: [`hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts). + + + Custom objects describe both schema and behavior for records in your workspace. Use `defineObject()` to define objects with built-in validation: -```typescript -// src/objects/postCard.object.ts +```ts postCard.object.ts import { defineObject, FieldType } from 'twenty-sdk'; enum PostCardStatus { @@ -122,12 +255,12 @@ Key points: but this is not recommended. -### Defining fields on existing objects + + Use `defineField()` to add fields to objects you don't own — such as standard Twenty objects (Person, Company, etc.) or objects from other apps. Unlike inline fields in `defineObject()`, standalone fields require an `objectUniversalIdentifier` to specify which object they extend: -```typescript -// src/fields/company-loyalty-tier.field.ts +```ts src/fields/company-loyalty-tier.field.ts import { defineField, FieldType } from 'twenty-sdk'; export default defineField({ @@ -150,7 +283,8 @@ Key points: - When defining fields inline in `defineObject()`, you do **not** need `objectUniversalIdentifier` — it's inherited from the parent object. - `defineField()` is the only way to add fields to objects you didn't create with `defineObject()`. -### Relations + + Relations connect objects together. In Twenty, relations are always **bidirectional** — you define both sides, and each side references the other. @@ -176,8 +310,7 @@ Suppose a `PostCard` can be sent to many `PostCardRecipient` records. Each recip **Step 1: Define the ONE_TO_MANY side on PostCard** (the "one" side): -```typescript -// src/fields/post-card-recipients-on-post-card.field.ts +```ts src/fields/post-card-recipients-on-post-card.field.ts import { defineField, FieldType, RelationType } from 'twenty-sdk'; import { POST_CARD_UNIVERSAL_IDENTIFIER } from '../objects/post-card.object'; import { POST_CARD_RECIPIENT_UNIVERSAL_IDENTIFIER } from '../objects/post-card-recipient.object'; @@ -204,8 +337,7 @@ export default defineField({ **Step 2: Define the MANY_TO_ONE side on PostCardRecipient** (the "many" side — holds the foreign key): -```typescript -// src/fields/post-card-on-post-card-recipient.field.ts +```ts src/fields/post-card-on-post-card-recipient.field.ts import { defineField, FieldType, RelationType, OnDeleteAction } from 'twenty-sdk'; import { POST_CARD_UNIVERSAL_IDENTIFIER } from '../objects/post-card.object'; import { POST_CARD_RECIPIENT_UNIVERSAL_IDENTIFIER } from '../objects/post-card-recipient.object'; @@ -240,8 +372,7 @@ export default defineField({ To create a relation with a built-in Twenty object (Person, Company, etc.), use `STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS`: -```typescript -// src/fields/person-on-self-hosting-user.field.ts +```ts src/fields/person-on-self-hosting-user.field.ts import { defineField, FieldType, @@ -288,7 +419,7 @@ export default defineField({ You can also define relation fields directly inside `defineObject()`. In that case, omit `objectUniversalIdentifier` — it's inherited from the parent object: -```typescript +```ts export default defineObject({ universalIdentifier: '...', nameSingular: 'postCardRecipient', @@ -311,135 +442,15 @@ export default defineObject({ ], }); ``` - -### Application config (application-config.ts) - -Every app has a single `application-config.ts` file that describes: - -- **Who the app is**: identifiers, display name, and description. -- **How its functions run**: which role they use for permissions. -- **(Optional) variables**: key–value pairs exposed to your functions as environment variables. -- **(Optional) pre-install function**: a logic function that runs before the app is installed. -- **(Optional) post-install function**: a logic function that runs after the app is installed. - -Use `defineApplication()` to define your application configuration: - -```typescript -// src/application-config.ts -import { defineApplication } from 'twenty-sdk'; -import { DEFAULT_ROLE_UNIVERSAL_IDENTIFIER } from 'src/roles/default-role'; - -export default defineApplication({ - universalIdentifier: '4ec0391d-18d5-411c-b2f3-266ddc1c3ef7', - displayName: 'My Twenty App', - description: 'My first Twenty app', - icon: 'IconWorld', - applicationVariables: { - DEFAULT_RECIPIENT_NAME: { - universalIdentifier: '19e94e59-d4fe-4251-8981-b96d0a9f74de', - description: 'Default recipient name for postcards', - value: 'Jane Doe', - isSecret: false, - }, - }, - defaultRoleUniversalIdentifier: DEFAULT_ROLE_UNIVERSAL_IDENTIFIER, -}); -``` - -Notes: -- `universalIdentifier` fields are deterministic IDs you own; generate them once and keep them stable across syncs. -- `applicationVariables` become environment variables for your functions (for example, `DEFAULT_RECIPIENT_NAME` is available as `process.env.DEFAULT_RECIPIENT_NAME`). -- `defaultRoleUniversalIdentifier` must match the role file (see below). -- Pre-install and post-install functions are automatically detected during the manifest build. See [Pre-install functions](#pre-install-functions) and [Post-install functions](#post-install-functions). - -#### Marketplace metadata - -If you plan to [publish your app](/developers/extend/apps/publishing), these optional fields control how your app appears in the marketplace: - -| Field | Description | -|-------|-------------| -| `author` | Author or company name | -| `category` | App category for marketplace filtering | -| `logoUrl` | Path to your app logo (relative to `./assets/`) | -| `screenshots` | Array of screenshot paths (relative to `./assets/`) | -| `aboutDescription` | Longer markdown description for the "About" tab. If omitted, the marketplace uses the package's `README.md` from npm | -| `websiteUrl` | Link to your website | -| `termsUrl` | Link to terms of service | -| `emailSupport` | Support email address | -| `issueReportUrl` | Link to issue tracker | - -#### Roles and permissions - -Applications can define roles that encapsulate permissions on your workspace's objects and actions. The field `defaultRoleUniversalIdentifier` in `application-config.ts` designates the default role used by your app's logic functions. - -- The runtime API key injected as `TWENTY_API_KEY` is derived from this default function role. -- The typed client will be restricted to the permissions granted to that role. -- Follow least-privilege: create a dedicated role with only the permissions your functions need, then reference its universal identifier. - -##### Default function role (*.role.ts) - -When you scaffold a new app, the CLI also creates a default role file. Use `defineRole()` to define roles with built-in validation: - -```typescript -// src/roles/default-role.ts -import { defineRole, PermissionFlag } from 'twenty-sdk'; - -export const DEFAULT_ROLE_UNIVERSAL_IDENTIFIER = - 'b648f87b-1d26-4961-b974-0908fd991061'; - -export default defineRole({ - universalIdentifier: DEFAULT_ROLE_UNIVERSAL_IDENTIFIER, - label: 'Default function role', - description: 'Default role for function Twenty client', - canReadAllObjectRecords: false, - canUpdateAllObjectRecords: false, - canSoftDeleteAllObjectRecords: false, - canDestroyAllObjectRecords: false, - canUpdateAllSettings: false, - canBeAssignedToAgents: false, - canBeAssignedToUsers: false, - canBeAssignedToApiKeys: false, - objectPermissions: [ - { - objectUniversalIdentifier: '9f9882af-170c-4879-b013-f9628b77c050', - canReadObjectRecords: true, - canUpdateObjectRecords: true, - canSoftDeleteObjectRecords: false, - canDestroyObjectRecords: false, - }, - ], - fieldPermissions: [ - { - objectUniversalIdentifier: '9f9882af-170c-4879-b013-f9628b77c050', - fieldUniversalIdentifier: 'b2c37dc0-8ae7-470e-96cd-1476b47dfaff', - canReadFieldValue: false, - canUpdateFieldValue: false, - }, - ], - permissionFlags: [PermissionFlag.APPLICATIONS], -}); -``` - -The `universalIdentifier` of this role is then referenced in `application-config.ts` as `defaultRoleUniversalIdentifier`. In other words: - -- **\*.role.ts** defines what the default function role can do. -- **application-config.ts** points to that role so your functions inherit its permissions. - -Notes: -- Start from the scaffolded role, then progressively restrict it following least-privilege. -- Replace the `objectPermissions` and `fieldPermissions` with the objects/fields your functions need. -- `permissionFlags` control access to platform-level capabilities. Keep them minimal; add only what you need. -- See a working example in the Hello World app: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts). - -### Logic function config and entrypoint + + Each function file uses `defineLogicFunction()` to export a configuration with a handler and optional triggers. -```typescript -// src/logic-functions/createPostCard.logic-function.ts +```ts src/logic-functions/createPostCard.logic-function.ts import { defineLogicFunction } from 'twenty-sdk'; import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; -import { CoreApiClient, type Person } from 'twenty-sdk/generated'; +import { CoreApiClient, type Person } from 'twenty-client-sdk/core'; const handler = async (params: RoutePayload) => { const client = new CoreApiClient(); @@ -462,151 +473,56 @@ export default defineLogicFunction({ name: 'create-new-post-card', timeoutSeconds: 2, handler, - triggers: [ - // Public HTTP route trigger '/s/post-card/create' - { - universalIdentifier: 'c9f84c8d-b26d-40d1-95dd-4f834ae5a2c6', - type: 'route', - path: '/post-card/create', - httpMethod: 'GET', - isAuthRequired: false, - }, - // Cron trigger (CRON pattern) - // { - // universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', - // type: 'cron', - // pattern: '0 0 1 1 *', - // }, - // Database event trigger - // { - // universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', - // type: 'databaseEvent', - // eventName: 'person.updated', - // updatedFields: ['name'], - // }, - ], + httpRouteTriggerSettings: { + path: '/post-card/create', + httpMethod: 'GET', + isAuthRequired: false, + }, + /*databaseEventTriggerSettings: { + eventName: 'people.created', + },*/ + /*cronTriggerSettings: { + pattern: '0 0 1 1 *', + },*/ }); ``` -Common trigger types: -- **route**: Exposes your function on an HTTP path and method **under the `/s/` endpoint**: -> e.g. `path: '/post-card/create',` -> call on `/s/post-card/create` +Available trigger types: +- **httpRoute**: Exposes your function on an HTTP path and method **under the `/s/` endpoint**: +> e.g. `path: '/post-card/create'` is callable at `https://your-twenty-server.com/s/post-card/create` - **cron**: Runs your function on a schedule using a CRON expression. - **databaseEvent**: Runs on workspace object lifecycle events. When the event operation is `updated`, specific fields to listen to can be specified in the `updatedFields` array. If left undefined or empty, any update will trigger the function. -> e.g. `person.updated` +> e.g. `person.updated`, `*.created`, `company.*` -Notes: -- The `triggers` array is optional. Functions without triggers can be used as utility functions called by other functions. -- You can mix multiple trigger types in a single function. - -### Pre-install functions - -A pre-install function is a logic function that runs automatically before your app is installed on a workspace. This is useful for validation tasks, prerequisite checks, or preparing workspace state before the main installation proceeds. - -When you scaffold a new app with `create-twenty-app`, a pre-install function is generated for you at `src/logic-functions/pre-install.ts`: - -```typescript -// src/logic-functions/pre-install.ts -import { definePreInstallLogicFunction, type InstallLogicFunctionPayload } from 'twenty-sdk'; - -const handler = async (payload: InstallLogicFunctionPayload): Promise => { - console.log('Pre install logic function executed successfully!', payload.previousVersion); -}; - -export default definePreInstallLogicFunction({ - universalIdentifier: '', - name: 'pre-install', - description: 'Runs before installation to prepare the application.', - timeoutSeconds: 300, - handler, -}); -``` - -You can also manually execute the pre-install function at any time using the CLI: + +You can also manually execute a function using the CLI: ```bash filename="Terminal" -yarn twenty exec --preInstall +yarn twenty exec -n create-new-post-card -p '{"key": "value"}' ``` -Key points: -- Pre-install functions use `definePreInstallLogicFunction()` — a specialized variant that omits trigger settings (`cronTriggerSettings`, `databaseEventTriggerSettings`, `httpRouteTriggerSettings`, `isTool`). -- The handler receives an `InstallLogicFunctionPayload` with `{ previousVersion: string }` — the version of the app that was previously installed (or an empty string for fresh installs). -- Only one pre-install function is allowed per application. The manifest build will error if more than one is detected. -- The function's `universalIdentifier` is automatically set as `preInstallLogicFunctionUniversalIdentifier` on the application manifest during the build — you do not need to reference it in `defineApplication()`. -- The default timeout is set to 300 seconds (5 minutes) to allow for longer preparation tasks. -- Pre-install functions do not need triggers — they are invoked by the platform before installation or manually via `exec --preInstall`. - -### Post-install functions - -A post-install function is a logic function that runs automatically after your app is installed on a workspace. This is useful for one-time setup tasks such as seeding default data, creating initial records, or configuring workspace settings. - -When you scaffold a new app with `create-twenty-app`, a post-install function is generated for you at `src/logic-functions/post-install.ts`: - -```typescript -// src/logic-functions/post-install.ts -import { definePostInstallLogicFunction, type InstallLogicFunctionPayload } from 'twenty-sdk'; - -const handler = async (payload: InstallLogicFunctionPayload): Promise => { - console.log('Post install logic function executed successfully!', payload.previousVersion); -}; - -export default definePostInstallLogicFunction({ - universalIdentifier: '', - name: 'post-install', - description: 'Runs after installation to set up the application.', - timeoutSeconds: 300, - handler, -}); -``` - -You can also manually execute the post-install function at any time using the CLI: - ```bash filename="Terminal" -yarn twenty exec --postInstall +yarn twenty exec -y e56d363b-0bdc-4d8a-a393-6f0d1c75bdcf ``` -Key points: -- Post-install functions use `definePostInstallLogicFunction()` — a specialized variant that omits trigger settings (`cronTriggerSettings`, `databaseEventTriggerSettings`, `httpRouteTriggerSettings`, `isTool`). -- The handler receives an `InstallLogicFunctionPayload` with `{ previousVersion: string }` — the version of the app that was previously installed (or an empty string for fresh installs). -- Only one post-install function is allowed per application. The manifest build will error if more than one is detected. -- The function's `universalIdentifier` is automatically set as `postInstallLogicFunctionUniversalIdentifier` on the application manifest during the build — you do not need to reference it in `defineApplication()`. -- The default timeout is set to 300 seconds (5 minutes) to allow for longer setup tasks like data seeding. -- Post-install functions do not need triggers — they are invoked by the platform during installation or manually via `exec --postInstall`. +You can watch logs with: -### Route trigger payload - - -**Breaking change (v1.16, January 2026):** The route trigger payload format has changed. Prior to v1.16, query parameters, path parameters, and body were sent directly as the payload. Starting with v1.16, they are nested inside a structured `RoutePayload` object. - -**Before v1.16:** -```typescript -const handler = async (params) => { - const { param1, param2 } = params; // Direct access -}; +```bash filename="Terminal" +yarn twenty logs ``` + -**After v1.16:** -```typescript -const handler = async (event: RoutePayload) => { - const { param1, param2 } = event.body; // Access via .body - const { queryParam } = event.queryStringParameters; - const { id } = event.pathParameters; -}; -``` +#### Route trigger payload -**To migrate existing functions:** Update your handler to destructure from `event.body`, `event.queryStringParameters`, or `event.pathParameters` instead of directly from the params object. - +When a route trigger invokes your logic function, it receives a `RoutePayload` object that follows the +[AWS HTTP API v2 format](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html). +Import the `RoutePayload` type from `twenty-sdk`: -When a route trigger invokes your logic function, it receives a `RoutePayload` object that follows the AWS HTTP API v2 format. Import the type from `twenty-sdk`: - -```typescript +```ts import { defineLogicFunction, type RoutePayload } from 'twenty-sdk'; const handler = async (event: RoutePayload) => { - // Access request data const { headers, queryStringParameters, pathParameters, body } = event; - - // HTTP method and path are available in requestContext const { method, path } = event.requestContext.http; return { message: 'Success' }; @@ -615,41 +531,39 @@ const handler = async (event: RoutePayload) => { The `RoutePayload` type has the following structure: -| Property | Type | Description | -|----------|------|-------------| -| `headers` | `Record` | HTTP headers (only those listed in `forwardedRequestHeaders`) | -| `queryStringParameters` | `Record` | Query string parameters (multiple values joined with commas) | -| `pathParameters` | `Record` | Path parameters extracted from the route pattern (e.g., `/users/:id` -> `{ id: '123' }`) | -| `body` | `object \| null` | Parsed request body (JSON) | -| `isBase64Encoded` | `boolean` | Whether the body is base64 encoded | -| `requestContext.http.method` | `string` | HTTP method (GET, POST, PUT, PATCH, DELETE) | -| `requestContext.http.path` | `string` | Raw request path | + | Property | Type | Description | Example | + |----------|------|-------------|---------| + | `headers` | `Record` | HTTP headers (only those listed in `forwardedRequestHeaders`) | see section below | + | `queryStringParameters` | `Record` | Query string parameters (multiple values joined with commas) | `/users?ids=1&ids=2&ids=3&name=Alice` -> `{ ids: '1,2,3', name: 'Alice' }`| + | `pathParameters` | `Record` | Path parameters extracted from the route pattern | `/users/:id`, `/users/123` -> `{ id: '123' }` | + | `body` | `object \| null` | Parsed request body (JSON) | `{ id: 1 }` -> `{ id: 1 }` | + | `isBase64Encoded` | `boolean` | Whether the body is base64 encoded | | + | `requestContext.http.method` | `string` | HTTP method (GET, POST, PUT, PATCH, DELETE) | | + | `requestContext.http.path` | `string` | Raw request path | | -### Forwarding HTTP headers -By default, HTTP headers from incoming requests are **not** passed to your logic function for security reasons. To access specific headers, explicitly list them in the `forwardedRequestHeaders` array: +#### forwardedRequestHeaders -```typescript +By default, HTTP headers from incoming requests are **not** passed to your logic function for security reasons. +To access specific headers, list them in the `forwardedRequestHeaders` array: + +```ts export default defineLogicFunction({ universalIdentifier: 'e56d363b-0bdc-4d8a-a393-6f0d1c75bdcf', name: 'webhook-handler', handler, - triggers: [ - { - universalIdentifier: 'c9f84c8d-b26d-40d1-95dd-4f834ae5a2c6', - type: 'route', - path: '/webhook', - httpMethod: 'POST', - isAuthRequired: false, - forwardedRequestHeaders: ['x-webhook-signature', 'content-type'], - }, - ], + httpRouteTriggerSettings: { + path: '/webhook', + httpMethod: 'POST', + isAuthRequired: false, + forwardedRequestHeaders: ['x-webhook-signature', 'content-type'], + }, }); ``` -In your handler, you can then access these headers: +In your handler, access the forwarded headers like this: -```typescript +```ts const handler = async (event: RoutePayload) => { const signature = event.headers['x-webhook-signature']; const contentType = event.headers['content-type']; @@ -660,22 +574,16 @@ const handler = async (event: RoutePayload) => { ``` - Header names are normalized to lowercase. Access them using lowercase keys (for example, `event.headers['content-type']`). +Header names are normalized to lowercase. Access them using lowercase keys (e.g., `event.headers['content-type']`). -You can create new functions in two ways: +#### Exposing a function as a tool -- **Scaffolded**: Run `yarn twenty add` and choose the option to add a new logic function. This generates a starter file with a handler and config. -- **Manual**: Create a new `*.logic-function.ts` file and use `defineLogicFunction()`, following the same pattern. +Logic functions can be exposed as **tools** for AI agents and workflows. When marked as a tool, a function becomes discoverable by Twenty's AI features and can be used in workflow automations. -### Marking a logic function as a tool +To mark a logic function as a tool, set `isTool: true`: -Logic functions can be exposed as **tools** for AI agents and workflows. When a function is marked as a tool, it becomes discoverable by Twenty's AI features and can be selected as a step in workflow automations. - -To mark a logic function as a tool, set `isTool: true` and provide a `toolInputSchema` describing the expected input parameters using [JSON Schema](https://json-schema.org/): - -```typescript -// src/logic-functions/enrich-company.logic-function.ts +```ts src/logic-functions/enrich-company.logic-function.ts import { defineLogicFunction } from 'twenty-sdk'; import { CoreApiClient } from 'twenty-client-sdk/core'; @@ -704,6 +612,17 @@ export default defineLogicFunction({ timeoutSeconds: 10, handler, isTool: true, +}); +``` + +Key points: + +- You can combine `isTool` with triggers — a function can be both a tool (callable by AI agents) and triggered by events at the same time. +- **`toolInputSchema`** (optional): A JSON Schema object describing the parameters your function accepts. The schema is computed automatically from source code static analysis, but you can set it explicitly: + +```ts +export default defineLogicFunction({ + ..., toolInputSchema: { type: 'object', properties: { @@ -721,59 +640,364 @@ export default defineLogicFunction({ }); ``` -Key points: - -- **`isTool`** (`boolean`, default: `false`): When set to `true`, the function is registered as a tool and becomes available to AI agents and workflow automations. -- **`toolInputSchema`** (`object`, optional): A JSON Schema object that describes the parameters your function accepts. AI agents use this schema to understand what inputs the tool expects and to validate calls. If omitted, the schema defaults to `{ type: 'object', properties: {} }` (no parameters). -- Functions with `isTool: false` (or unset) are **not** exposed as tools. They can still be executed directly or called by other functions, but will not appear in tool discovery. -- **Tool naming**: When exposed as a tool, the function name is automatically normalized to `logic_function_` (lowercased, non-alphanumeric characters replaced with underscores). For example, `enrich-company` becomes `logic_function_enrich_company`. -- You can combine `isTool` with triggers — a function can be both a tool (callable by AI agents) and triggered by events (cron, database events, routes) at the same time. - **Write a good `description`.** AI agents rely on the function's `description` field to decide when to use the tool. Be specific about what the tool does and when it should be called. -### Front components + + -Front components let you build custom React components that render within Twenty's UI. Use `defineFrontComponent()` to define components with built-in validation: +A pre-install function is a logic function that runs automatically before your app is installed on a workspace. This is useful for validation tasks, prerequisite checks, or preparing workspace state before the main installation proceeds. -```typescript -// src/front-components/my-widget.tsx +```ts src/logic-functions/pre-install.ts +import { definePreInstallLogicFunction, type InstallLogicFunctionPayload } from 'twenty-sdk'; + +const handler = async (payload: InstallLogicFunctionPayload): Promise => { + console.log('Pre install logic function executed successfully!', payload.previousVersion); +}; + +export default definePreInstallLogicFunction({ + universalIdentifier: 'e0604b9e-e946-456b-886d-3f27d9a6b324', + name: 'pre-install', + description: 'Runs before installation to prepare the application.', + timeoutSeconds: 300, + handler, +}); +``` + +You can also manually execute the pre-install function at any time using the CLI: + +```bash filename="Terminal" +yarn twenty exec --preInstall +``` + +Key points: +- Pre-install functions use `definePreInstallLogicFunction()` — a specialized variant that omits trigger settings (`cronTriggerSettings`, `databaseEventTriggerSettings`, `httpRouteTriggerSettings`, `isTool`). +- The handler receives an `InstallLogicFunctionPayload` with `{ previousVersion: string }` — the version of the app that was previously installed (or an empty string for fresh installs). +- Only one pre-install function is allowed per application. The manifest build will error if more than one is detected. +- The function's `universalIdentifier` is automatically set as `preInstallLogicFunctionUniversalIdentifier` on the application manifest during the build — you do not need to reference it in `defineApplication()`. +- The default timeout is set to 300 seconds (5 minutes) to allow for longer preparation tasks. + + + + +A post-install function is a logic function that runs automatically after your app is installed on a workspace. This is useful for one-time setup tasks such as seeding default data, creating initial records, or configuring workspace settings. + +```ts src/logic-functions/post-install.ts +import { definePostInstallLogicFunction, type InstallLogicFunctionPayload } from 'twenty-sdk'; + +const handler = async (payload: InstallLogicFunctionPayload): Promise => { + console.log('Post install logic function executed successfully!', payload.previousVersion); +}; + +export default definePostInstallLogicFunction({ + universalIdentifier: 'f7a2b9c1-3d4e-5678-abcd-ef9876543210', + name: 'post-install', + description: 'Runs after installation to set up the application.', + timeoutSeconds: 300, + handler, +}); +``` + +You can also manually execute the post-install function at any time using the CLI: + +```bash filename="Terminal" +yarn twenty exec --postInstall +``` + +Key points: +- Post-install functions use `definePostInstallLogicFunction()` — a specialized variant that omits trigger settings (`cronTriggerSettings`, `databaseEventTriggerSettings`, `httpRouteTriggerSettings`, `isTool`). +- The handler receives an `InstallLogicFunctionPayload` with `{ previousVersion: string }` — the version of the app that was previously installed (or an empty string for fresh installs). +- Only one post-install function is allowed per application. The manifest build will error if more than one is detected. +- The function's `universalIdentifier` is automatically set as `postInstallLogicFunctionUniversalIdentifier` on the application manifest during the build — you do not need to reference it in `defineApplication()`. +- The default timeout is set to 300 seconds (5 minutes) to allow for longer setup tasks like data seeding. + + + + +Front components are React components that render directly inside Twenty's UI. They run in an **isolated Web Worker** using Remote DOM — your code is sandboxed but renders natively in the page, not in an iframe. + +#### Basic example + +The quickest way to see a front component in action is to register it as a **command**. Adding a `command` field with `isPinned: true` makes it appear as a quick-action button in the top-right corner of the page — no page layout needed: + +```tsx src/front-components/hello-world.tsx import { defineFrontComponent } from 'twenty-sdk'; -const MyWidget = () => { +const HelloWorld = () => { return (
-

My Custom Widget

-

This is a custom front component for Twenty.

+

Hello from my app!

+

This component renders inside Twenty.

); }; export default defineFrontComponent({ - universalIdentifier: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', - name: 'my-widget', - description: 'A custom widget component', - component: MyWidget, + universalIdentifier: '74c526eb-cb68-4cf7-b05c-0dd8c288d948', + name: 'hello-world', + description: 'A simple front component', + component: HelloWorld, + command: { + universalIdentifier: 'd4e5f6a7-b8c9-0123-defa-456789012345', + shortLabel: 'Hello', + label: 'Hello World', + icon: 'IconBolt', + isPinned: true, + availabilityType: 'GLOBAL', + }, }); ``` -Key points: -- Front components are React components that render in isolated contexts within Twenty. -- The `component` field references your React component. -- Components are built and synced automatically during `yarn twenty dev`. +After syncing with `yarn twenty dev`, the quick action appears in the top-right corner of the page: -You can create new front components in two ways: +
+ Quick action button in the top-right corner +
-- **Scaffolded**: Run `yarn twenty add` and choose the option to add a new front component. -- **Manual**: Create a new `.tsx` file and use `defineFrontComponent()`, following the same pattern. +Click it to render the component inline. -### Skills +{/* TODO: add screenshot of the rendered front component */} + +#### Configuration fields + +| Field | Required | Description | +|-------|----------|-------------| +| `universalIdentifier` | Yes | Stable unique ID for this component | +| `component` | Yes | A React component function | +| `name` | No | Display name | +| `description` | No | Description of what the component does | +| `isHeadless` | No | Set to `true` if the component has no visible UI (see below) | +| `command` | No | Register the component as a command (see [command options](#command-options) below) | + +#### Placing a front component on a page + +Beyond commands, you can embed a front component directly into a record page by adding it as a widget in a **page layout**. See the [definePageLayout](#definepagelayout) section for details. + +#### Headless components (`isHeadless: true`) + +Headless components render no visible UI but still run React logic. This is useful for **effect components** — components that perform side effects when mounted, such as syncing data, starting a timer, listening to events, or triggering a notification. + +```tsx src/front-components/sync-tracker.tsx +import { defineFrontComponent, useRecordId, enqueueSnackbar } from 'twenty-sdk'; +import { useEffect } from 'react'; + +const SyncTracker = () => { + const recordId = useRecordId(); + + useEffect(() => { + enqueueSnackbar({ message: `Tracking record ${recordId}`, variant: 'info' }); + }, [recordId]); + + return null; +}; + +export default defineFrontComponent({ + universalIdentifier: '...', + name: 'sync-tracker', + description: 'Tracks record views silently', + isHeadless: true, + component: SyncTracker, +}); +``` + +Because the component returns `null`, Twenty skips rendering a container for it — no empty space appears in the layout. The component still has access to all hooks and the host communication API. + +#### Accessing runtime context + +Inside your component, use SDK hooks to access the current user, record, and component instance: + +```tsx src/front-components/record-info.tsx +import { + defineFrontComponent, + useUserId, + useRecordId, + useFrontComponentId, +} from 'twenty-sdk'; + +const RecordInfo = () => { + const userId = useUserId(); + const recordId = useRecordId(); + const componentId = useFrontComponentId(); + + return ( +
+

User: {userId}

+

Record: {recordId ?? 'No record context'}

+

Component: {componentId}

+
+ ); +}; + +export default defineFrontComponent({ + universalIdentifier: 'b2c3d4e5-f6a7-8901-bcde-f23456789012', + name: 'record-info', + component: RecordInfo, +}); +``` + +Available hooks: + +| Hook | Returns | Description | +|------|---------|-------------| +| `useUserId()` | `string` or `null` | The current user's ID | +| `useRecordId()` | `string` or `null` | The current record's ID (when placed on a record page) | +| `useFrontComponentId()` | `string` | This component instance's ID | +| `useFrontComponentExecutionContext(selector)` | varies | Access the full execution context with a selector function | + +#### Host communication API + +Front components can trigger navigation, modals, and notifications using functions from `twenty-sdk`: + +| Function | Description | +|----------|-------------| +| `navigate(to, params?, queryParams?, options?)` | Navigate to a page in the app | +| `openSidePanelPage(params)` | Open a side panel | +| `closeSidePanel()` | Close the side panel | +| `openCommandConfirmationModal(params)` | Show a confirmation dialog | +| `enqueueSnackbar(params)` | Show a toast notification | +| `unmountFrontComponent()` | Unmount the component | +| `updateProgress(progress)` | Update a progress indicator | + +#### Command options + +Adding a `command` field to `defineFrontComponent` registers the component in the command menu (Cmd+K). If `isPinned` is `true`, it also appears as a quick-action button in the top-right corner of the page. + +| Field | Required | Description | +|-------|----------|-------------| +| `universalIdentifier` | Yes | Stable unique ID for the command | +| `label` | Yes | Full label shown in the command menu (Cmd+K) | +| `shortLabel` | No | Shorter label displayed on the pinned quick-action button | +| `icon` | No | Icon name displayed next to the label (e.g. `'IconBolt'`, `'IconSend'`) | +| `isPinned` | No | When `true`, shows the command as a quick-action button in the top-right corner of the page | +| `availabilityType` | No | Controls where the command appears: `'GLOBAL'` (always available), `'RECORD_SELECTION'` (only when records are selected), or `'FALLBACK'` (shown when no other commands match) | +| `availabilityObjectUniversalIdentifier` | No | Restrict the command to pages of a specific object type (e.g. only on Company records) | +| `conditionalAvailabilityExpression` | No | A boolean expression to dynamically control whether the command is visible (see below) | + +#### Conditional availability expressions + +The `conditionalAvailabilityExpression` field lets you control when a command is visible based on the current page context. Import typed variables and operators from `twenty-sdk` to build expressions: + +```tsx +import { + defineFrontComponent, + pageType, + numberOfSelectedRecords, + objectPermissions, + everyEquals, + isDefined, +} from 'twenty-sdk'; + +export default defineFrontComponent({ + universalIdentifier: '...', + name: 'bulk-action', + component: BulkAction, + command: { + universalIdentifier: '...', + label: 'Bulk Update', + availabilityType: 'RECORD_SELECTION', + conditionalAvailabilityExpression: everyEquals( + objectPermissions, + 'canUpdateObjectRecords', + true, + ), + }, +}); +``` + +**Context variables** — these represent the current state of the page: + +| Variable | Type | Description | +|----------|------|-------------| +| `pageType` | `string` | Current page type (e.g. `'RecordIndexPage'`, `'RecordShowPage'`) | +| `isInSidePanel` | `boolean` | Whether the component is rendered in a side panel | +| `numberOfSelectedRecords` | `number` | Number of currently selected records | +| `isSelectAll` | `boolean` | Whether "select all" is active | +| `selectedRecords` | `array` | The selected record objects | +| `favoriteRecordIds` | `array` | IDs of favorited records | +| `objectPermissions` | `object` | Permissions for the current object type | +| `targetObjectReadPermissions` | `object` | Read permissions for the target object | +| `targetObjectWritePermissions` | `object` | Write permissions for the target object | +| `featureFlags` | `object` | Active feature flags | +| `objectMetadataItem` | `object` | Metadata of the current object type | +| `hasAnySoftDeleteFilterOnView` | `boolean` | Whether the current view has a soft-delete filter | + +**Operators** — combine variables into boolean expressions: + +| Operator | Description | +|----------|-------------| +| `isDefined(value)` | `true` if the value is not null/undefined | +| `isNonEmptyString(value)` | `true` if the value is a non-empty string | +| `includes(array, value)` | `true` if the array contains the value | +| `includesEvery(array, prop, value)` | `true` if every item's property includes the value | +| `every(array, prop)` | `true` if the property is truthy on every item | +| `everyDefined(array, prop)` | `true` if the property is defined on every item | +| `everyEquals(array, prop, value)` | `true` if the property equals the value on every item | +| `some(array, prop)` | `true` if the property is truthy on at least one item | +| `someDefined(array, prop)` | `true` if the property is defined on at least one item | +| `someEquals(array, prop, value)` | `true` if the property equals the value on at least one item | +| `someNonEmptyString(array, prop)` | `true` if the property is a non-empty string on at least one item | +| `none(array, prop)` | `true` if the property is falsy on every item | +| `noneDefined(array, prop)` | `true` if the property is undefined on every item | +| `noneEquals(array, prop, value)` | `true` if the property does not equal the value on any item | + +#### Public assets + +Front components can access files from the app's `public/` directory using `getPublicAssetUrl`: + +```tsx +import { defineFrontComponent, getPublicAssetUrl } from 'twenty-sdk'; + +const Logo = () => Logo; + +export default defineFrontComponent({ + universalIdentifier: '...', + name: 'logo', + component: Logo, +}); +``` + +See the [public assets section](#accessing-public-assets-with-getpublicasseturl) for details. + +#### Styling + +Front components support multiple styling approaches. You can use: + +- **Inline styles** — `style={{ color: 'red' }}` +- **Twenty UI components** — import from `twenty-sdk/ui` (Button, Tag, Status, Chip, Avatar, and more) +- **Emotion** — CSS-in-JS with `@emotion/react` +- **Styled-components** — `styled.div` patterns +- **Tailwind CSS** — utility classes +- **Any CSS-in-JS library** compatible with React + +```tsx +import { defineFrontComponent } from 'twenty-sdk'; +import { Button, Tag, Status } from 'twenty-sdk/ui'; + +const StyledWidget = () => { + return ( +
+
+ ); +}; + +export default defineFrontComponent({ + universalIdentifier: 'e5f6a7b8-c9d0-1234-efab-567890123456', + name: 'styled-widget', + component: StyledWidget, +}); +``` + +
+ + Skills define reusable instructions and capabilities that AI agents can use within your workspace. Use `defineSkill()` to define skills with built-in validation: -```typescript -// src/skills/example-skill.ts +```ts src/skills/example-skill.ts import { defineSkill } from 'twenty-sdk'; export default defineSkill({ @@ -797,25 +1021,327 @@ Key points: - `icon` (optional) sets the icon displayed in the UI. - `description` (optional) provides additional context about the skill's purpose. -You can create new skills in two ways: + + -- **Scaffolded**: Run `yarn twenty add` and choose the option to add a new skill. -- **Manual**: Create a new file and use `defineSkill()`, following the same pattern. +Agents are AI assistants that live inside your workspace. Use `defineAgent()` to create agents with a custom system prompt: -### Typed API clients (`twenty-client-sdk`) +```ts src/agents/example-agent.ts +import { defineAgent } from 'twenty-sdk'; -The `twenty-client-sdk` package provides two typed GraphQL clients for interacting with the Twenty API from your logic functions and front components: +export default defineAgent({ + universalIdentifier: 'b3c4d5e6-f7a8-9012-bcde-f34567890123', + name: 'sales-assistant', + label: 'Sales Assistant', + description: 'Helps the sales team draft outreach emails and research prospects', + icon: 'IconRobot', + prompt: 'You are a helpful sales assistant. Help users with their questions and tasks.', +}); +``` + +Key points: +- `name` is the unique identifier string for the agent (kebab-case recommended). +- `label` is the display name shown in the UI. +- `prompt` is the system prompt that defines the agent's behavior. +- `description` (optional) provides context about what the agent does. +- `icon` (optional) sets the icon displayed in the UI. +- `modelId` (optional) overrides the default AI model used by the agent. + + + + +Views are saved configurations for how records of an object are displayed — including which fields are visible, their order, and any filters or groups applied. Use `defineView()` to ship pre-configured views with your app: + +```ts src/views/example-view.ts +import { defineView, ViewKey } from 'twenty-sdk'; +import { EXAMPLE_OBJECT_UNIVERSAL_IDENTIFIER } from '../objects/example-object'; +import { NAME_FIELD_UNIVERSAL_IDENTIFIER } from '../objects/example-object'; + +export default defineView({ + universalIdentifier: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', + name: 'All example items', + objectUniversalIdentifier: EXAMPLE_OBJECT_UNIVERSAL_IDENTIFIER, + icon: 'IconList', + key: ViewKey.INDEX, + position: 0, + fields: [ + { + universalIdentifier: 'f926bdb7-6af7-4683-9a09-adbca56c29f0', + fieldMetadataUniversalIdentifier: NAME_FIELD_UNIVERSAL_IDENTIFIER, + position: 0, + isVisible: true, + size: 200, + }, + ], +}); +``` + +Key points: +- `objectUniversalIdentifier` specifies which object this view applies to. +- `key` determines the view type (e.g., `ViewKey.INDEX` for the main list view). +- `fields` controls which columns appear and their order. Each field references a `fieldMetadataUniversalIdentifier`. +- You can also define `filters`, `filterGroups`, `groups`, and `fieldGroups` for more advanced configurations. +- `position` controls the ordering when multiple views exist for the same object. + + + + +Navigation menu items add custom entries to the workspace sidebar. Use `defineNavigationMenuItem()` to link to views, external URLs, or objects: + +```ts src/navigation-menu-items/example-navigation-menu-item.ts +import { defineNavigationMenuItem, NavigationMenuItemType } from 'twenty-sdk'; +import { EXAMPLE_VIEW_UNIVERSAL_IDENTIFIER } from '../views/example-view'; + +export default defineNavigationMenuItem({ + universalIdentifier: '9327db91-afa1-41b6-bd9d-2b51a26efb4c', + name: 'example-navigation-menu-item', + icon: 'IconList', + color: 'blue', + position: 0, + type: NavigationMenuItemType.VIEW, + viewUniversalIdentifier: EXAMPLE_VIEW_UNIVERSAL_IDENTIFIER, +}); +``` + +Key points: +- `type` determines what the menu item links to: `NavigationMenuItemType.VIEW` for a saved view, or `NavigationMenuItemType.LINK` for an external URL. +- For view links, set `viewUniversalIdentifier`. For external links, set `link`. +- `position` controls the ordering in the sidebar. +- `icon` and `color` (optional) customize the appearance. + + + + +Page layouts let you customize how a record detail page looks — which tabs appear, what widgets are inside each tab, and how they are arranged. Use `definePageLayout()` to ship custom layouts with your app: + +```ts src/page-layouts/example-record-page-layout.ts +import { definePageLayout, PageLayoutTabLayoutMode } from 'twenty-sdk'; +import { EXAMPLE_OBJECT_UNIVERSAL_IDENTIFIER } from '../objects/example-object'; +import { HELLO_WORLD_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER } from '../front-components/hello-world'; + +export default definePageLayout({ + universalIdentifier: '203aeb94-6701-46d6-9af1-be2bbcc9e134', + name: 'Example Record Page', + type: 'RECORD_PAGE', + objectUniversalIdentifier: EXAMPLE_OBJECT_UNIVERSAL_IDENTIFIER, + tabs: [ + { + universalIdentifier: '6ed26b60-a51d-4ad7-86dd-1c04c7f3cac5', + title: 'Hello World', + position: 50, + icon: 'IconWorld', + layoutMode: PageLayoutTabLayoutMode.CANVAS, + widgets: [ + { + universalIdentifier: 'aa4234e0-2e5f-4c02-a96a-573449e2351d', + title: 'Hello World', + type: 'FRONT_COMPONENT', + configuration: { + configurationType: 'FRONT_COMPONENT', + frontComponentUniversalIdentifier: + HELLO_WORLD_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER, + }, + }, + ], + }, + ], +}); +``` + +Key points: +- `type` is typically `'RECORD_PAGE'` to customize the detail view of a specific object. +- `objectUniversalIdentifier` specifies which object this layout applies to. +- Each `tab` defines a section of the page with a `title`, `position`, and `layoutMode` (`CANVAS` for free-form layout). +- Each `widget` inside a tab can render a front component, a relation list, or other built-in widget types. +- `position` on tabs controls their order. Use higher values (e.g., 50) to place custom tabs after built-in ones. + + +
+ +## Public assets (`public/` folder) + +The `public/` folder at the root of your app holds static files — images, icons, fonts, or any other assets your app needs at runtime. These files are automatically included in builds, synced during dev mode, and uploaded to the server. + +Files placed in `public/` are: + +- **Publicly accessible** — once synced to the server, assets are served at a public URL. No authentication is needed to access them. +- **Available in front components** — use asset URLs to display images, icons, or any media inside your React components. +- **Available in logic functions** — reference asset URLs in emails, API responses, or any server-side logic. +- **Used for marketplace metadata** — the `logoUrl` and `screenshots` fields in `defineApplication()` reference files from this folder (e.g., `public/logo.png`). These are displayed in the marketplace when your app is published. +- **Auto-synced in dev mode** — when you add, update, or delete a file in `public/`, it is synced to the server automatically. No restart needed. +- **Included in builds** — `yarn twenty build` bundles all public assets into the distribution output. + +### Accessing public assets with `getPublicAssetUrl` + +Use the `getPublicAssetUrl` helper from `twenty-sdk` to get the full URL of a file in your `public/` directory. It works in both **logic functions** and **front components**. + +**In a logic function:** + +```ts src/logic-functions/send-invoice.ts +import { defineLogicFunction, getPublicAssetUrl } from 'twenty-sdk'; + +const handler = async (): Promise => { + const logoUrl = getPublicAssetUrl('logo.png'); + const invoiceUrl = getPublicAssetUrl('templates/invoice.png'); + + // Fetch the file content (no auth required — public endpoint) + const response = await fetch(invoiceUrl); + const buffer = await response.arrayBuffer(); + + return { logoUrl, size: buffer.byteLength }; +}; + +export default defineLogicFunction({ + universalIdentifier: 'a1b2c3d4-...', + name: 'send-invoice', + description: 'Sends an invoice with the app logo', + timeoutSeconds: 10, + handler, +}); +``` + +**In a front component:** + +```tsx src/front-components/company-card.tsx +import { defineFrontComponent, getPublicAssetUrl } from 'twenty-sdk'; + +export default defineFrontComponent(() => { + const logoUrl = getPublicAssetUrl('logo.png'); + + return App logo; +}); +``` + +The `path` argument is relative to your app's `public/` folder. Both `getPublicAssetUrl('logo.png')` and `getPublicAssetUrl('public/logo.png')` resolve to the same URL — the `public/` prefix is stripped automatically if present. + +## Using npm packages + +You can install and use any npm package in your app. Both logic functions and front components are bundled with [esbuild](https://esbuild.github.io/), which inlines all dependencies into the output — no `node_modules` are needed at runtime. + +### Installing a package + +```bash filename="Terminal" +yarn add axios +``` + +Then import it in your code: + +```ts src/logic-functions/fetch-data.ts +import { defineLogicFunction } from 'twenty-sdk'; +import axios from 'axios'; + +const handler = async (): Promise => { + const { data } = await axios.get('https://api.example.com/data'); + + return { data }; +}; + +export default defineLogicFunction({ + universalIdentifier: '...', + name: 'fetch-data', + description: 'Fetches data from an external API', + timeoutSeconds: 10, + handler, +}); +``` + +The same works for front components: + +```tsx src/front-components/chart.tsx +import { defineFrontComponent } from 'twenty-sdk'; +import { format } from 'date-fns'; + +const DateWidget = () => { + return

Today is {format(new Date(), 'MMMM do, yyyy')}

; +}; + +export default defineFrontComponent({ + universalIdentifier: '...', + name: 'date-widget', + component: DateWidget, +}); +``` + +### How bundling works + +The build step (`yarn twenty dev` or `yarn twenty build`) uses esbuild to produce a single self-contained file per logic function and per front component. All imported packages are inlined into the bundle. + +**Logic functions** run in a Node.js environment. Node built-in modules (`fs`, `path`, `crypto`, `http`, etc.) are available and do not need to be installed. + +**Front components** run in a Web Worker. Node built-in modules are **not** available — only browser APIs and npm packages that work in a browser environment. + +Both environments have `twenty-client-sdk/core` and `twenty-client-sdk/metadata` available as pre-provided modules — these are not bundled but resolved at runtime by the server. + +## Scaffolding entities with `yarn twenty add` + +Instead of creating entity files by hand, you can use the interactive scaffolder: + +```bash filename="Terminal" +yarn twenty add +``` + +This prompts you to pick an entity type and walks you through the required fields. It generates a ready-to-use file with a stable `universalIdentifier` and the correct `defineEntity()` call. + +You can also pass the entity type directly to skip the first prompt: + +```bash filename="Terminal" +yarn twenty add object +yarn twenty add logicFunction +yarn twenty add frontComponent +``` + +### Available entity types + +| Entity type | Command | Generated file | +|-------------|---------|----------------| +| Object | `yarn twenty add object` | `src/objects/.ts` | +| Field | `yarn twenty add field` | `src/fields/.ts` | +| Logic function | `yarn twenty add logicFunction` | `src/logic-functions/.ts` | +| Front component | `yarn twenty add frontComponent` | `src/front-components/.tsx` | +| Role | `yarn twenty add role` | `src/roles/.ts` | +| Skill | `yarn twenty add skill` | `src/skills/.ts` | +| Agent | `yarn twenty add agent` | `src/agents/.ts` | +| View | `yarn twenty add view` | `src/views/.ts` | +| Navigation menu item | `yarn twenty add navigationMenuItem` | `src/navigation-menu-items/.ts` | +| Page layout | `yarn twenty add pageLayout` | `src/page-layouts/.ts` | + +### What the scaffolder generates + +Each entity type has its own template. For example, `yarn twenty add object` asks for: + +1. **Name (singular)** — e.g., `invoice` +2. **Name (plural)** — e.g., `invoices` +3. **Label (singular)** — auto-populated from the name (e.g., `Invoice`) +4. **Label (plural)** — auto-populated (e.g., `Invoices`) +5. **Create a view and navigation item?** — if you answer yes, the scaffolder also generates a matching view and sidebar link for the new object. + +Other entity types have simpler prompts — most only ask for a name. + +The `field` entity type is more detailed: it asks for the field name, label, type (from a list of all available field types like `TEXT`, `NUMBER`, `SELECT`, `RELATION`, etc.), and the target object's `universalIdentifier`. + +### Custom output path + +Use the `--path` flag to place the generated file in a custom location: + +```bash filename="Terminal" +yarn twenty add logicFunction --path src/custom-folder +``` + +## Typed API clients (twenty-client-sdk) + +The `twenty-client-sdk` package provides two typed GraphQL clients for interacting with the Twenty API from your logic functions and front components. | Client | Import | Endpoint | Generated? | |--------|--------|----------|------------| | `CoreApiClient` | `twenty-client-sdk/core` | `/graphql` — workspace data (records, objects) | Yes, at dev/build time | | `MetadataApiClient` | `twenty-client-sdk/metadata` | `/metadata` — workspace config, file uploads | No, ships pre-built | -#### CoreApiClient + + -`CoreApiClient` is the main client for querying and mutating workspace data. It is **generated from your workspace schema** during `yarn twenty dev` or `yarn twenty build`, so it's fully typed to match your objects and fields. +`CoreApiClient` is the main client for querying and mutating workspace data. It is **generated from your workspace schema** during `yarn twenty dev` or `yarn twenty build`, so it is fully typed to match your objects and fields. -```typescript +```ts import { CoreApiClient } from 'twenty-client-sdk/core'; const client = new CoreApiClient(); @@ -827,7 +1353,10 @@ const { companies } = await client.query({ node: { id: true, name: true, - domainName: true, + domainName: { + primaryLinkLabel: true, + primaryLinkUrl: true, + }, }, }, }, @@ -850,14 +1379,14 @@ const { createCompany } = await client.mutation({ The client uses a selection-set syntax: pass `true` to include a field, use `__args` for arguments, and nest objects for relations. You get full autocompletion and type checking based on your workspace schema. -**CoreApiClient is generated at dev/build time.** If you try to use it without running `yarn twenty dev` or `yarn twenty build` first, it throws an error. The generation happens automatically — the CLI introspects your workspace's GraphQL schema, generates a typed client using `@genql/cli`, writes the generated sources to `node_modules/twenty-client-sdk/dist/core/generated/`, and replaces the stubs in `node_modules/twenty-client-sdk/dist/core.mjs` and `node_modules/twenty-client-sdk/dist/core.cjs`. +**CoreApiClient is generated at dev/build time.** If you use it without running `yarn twenty dev` or `yarn twenty build` first, it throws an error. The generation happens automatically — the CLI introspects your workspace's GraphQL schema and generates a typed client using `@genql/cli`. #### Using CoreSchema for type annotations -`CoreSchema` provides TypeScript types matching your workspace objects, useful for typing component state or function parameters: +`CoreSchema` provides TypeScript types matching your workspace objects — useful for typing component state or function parameters: -```typescript +```ts import { CoreApiClient, CoreSchema } from 'twenty-client-sdk/core'; import { useState } from 'react'; @@ -876,44 +1405,41 @@ const result = await client.query({ setCompany(result.company); ``` -#### MetadataApiClient + + -`MetadataApiClient` ships pre-built with the SDK (no generation required). It queries the `/metadata` endpoint for workspace configuration, applications, and file uploads: +`MetadataApiClient` ships pre-built with the SDK (no generation required). It queries the `/metadata` endpoint for workspace configuration, applications, and file uploads. -```typescript +```ts import { MetadataApiClient } from 'twenty-client-sdk/metadata'; const metadataClient = new MetadataApiClient(); -// Query workspace info -const { currentWorkspace } = await metadataClient.query({ - currentWorkspace: { id: true, displayName: true }, -}); - -// List installed applications -const { findManyApplications } = await metadataClient.query({ - findManyApplications: { - id: true, - name: true, - version: true, +// List first 10 objects in the workspace +const { objects } = await metadataClient.query({ + objects: { + edges: { + node: { + id: true, + nameSingular: true, + namePlural: true, + labelSingular: true, + isCustom: true, + }, + }, + __args: { + filter: {}, + paging: { first: 10 }, + }, }, }); ``` -#### Runtime credentials - -When your code runs on Twenty (logic functions or front components), the platform injects credentials as environment variables: - -- `TWENTY_API_URL` — Base URL of the Twenty API -- `TWENTY_API_KEY` — Short-lived key scoped to your application's default function role - -You do **not** need to pass these to the clients — they read from `process.env` automatically. The API key's permissions are determined by the role referenced in `defaultRoleUniversalIdentifier` in your `application-config.ts`. - #### Uploading files -`MetadataApiClient` includes an `uploadFile` method for attaching files to file-type fields. It implements the [GraphQL multipart request specification](https://github.com/jaydenseric/graphql-multipart-request-spec): +`MetadataApiClient` includes an `uploadFile` method for attaching files to file-type fields: -```typescript +```ts import { MetadataApiClient } from 'twenty-client-sdk/metadata'; import * as fs from 'fs'; @@ -936,13 +1462,255 @@ console.log(uploadedFile); |-----------|------|-------------| | `fileBuffer` | `Buffer` | The raw file contents | | `filename` | `string` | The name of the file (used for storage and display) | -| `contentType` | `string` | MIME type of the file (defaults to `application/octet-stream` if omitted) | +| `contentType` | `string` | MIME type (defaults to `application/octet-stream` if omitted) | | `fieldMetadataUniversalIdentifier` | `string` | The `universalIdentifier` of the file-type field on your object | Key points: - Uses the field's `universalIdentifier` (not its workspace-specific ID), so your upload code works across any workspace where your app is installed. - The returned `url` is a signed URL you can use to access the uploaded file. -### Hello World example + + -Explore a minimal, end-to-end example that demonstrates objects, logic functions, front components, and multiple triggers [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-apps/hello-world). + + + When your code runs on Twenty (logic functions or front components), the platform injects credentials as environment variables: + + - `TWENTY_API_URL` — Base URL of the Twenty API + - `TWENTY_APP_ACCESS_TOKEN` — Short-lived key scoped to your application's default function role + + You do **not** need to pass these to the clients — they read from `process.env` automatically. The API key's permissions are determined by the role referenced in `defaultRoleUniversalIdentifier` in your `application-config.ts`. + + +## Testing your app + +The SDK provides programmatic APIs that let you build, deploy, install, and uninstall your app from test code. Combined with [Vitest](https://vitest.dev/) and the typed API clients, you can write integration tests that verify your app works end-to-end against a real Twenty server. + +### Setup + +The scaffolded app already includes Vitest. If you set it up manually, install the dependencies: + +```bash filename="Terminal" +yarn add -D vitest vite-tsconfig-paths +``` + +Create a `vitest.config.ts` at the root of your app: + +```ts vitest.config.ts +import tsconfigPaths from 'vite-tsconfig-paths'; +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + plugins: [ + tsconfigPaths({ + projects: ['tsconfig.spec.json'], + ignoreConfigErrors: true, + }), + ], + test: { + testTimeout: 120_000, + hookTimeout: 120_000, + include: ['src/**/*.integration-test.ts'], + setupFiles: ['src/__tests__/setup-test.ts'], + env: { + TWENTY_API_URL: 'http://localhost:2020', + TWENTY_API_KEY: 'your-api-key', + }, + }, +}); +``` + +Create a setup file that verifies the server is reachable before tests run: + +```ts src/__tests__/setup-test.ts +import * as fs from 'fs'; +import * as os from 'os'; +import * as path from 'path'; +import { beforeAll } from 'vitest'; + +const TWENTY_API_URL = process.env.TWENTY_API_URL ?? 'http://localhost:2020'; +const TEST_CONFIG_DIR = path.join(os.tmpdir(), '.twenty-sdk-test'); + +beforeAll(async () => { + // Verify the server is running + const response = await fetch(`${TWENTY_API_URL}/healthz`); + + if (!response.ok) { + throw new Error( + `Twenty server is not reachable at ${TWENTY_API_URL}. ` + + 'Start the server before running integration tests.', + ); + } + + // Write a temporary config for the SDK + fs.mkdirSync(TEST_CONFIG_DIR, { recursive: true }); + + fs.writeFileSync( + path.join(TEST_CONFIG_DIR, 'config.json'), + JSON.stringify({ + remotes: { + local: { + apiUrl: process.env.TWENTY_API_URL, + apiKey: process.env.TWENTY_API_KEY, + }, + }, + defaultRemote: 'local', + }, null, 2), + ); +}); +``` + +### Programmatic SDK APIs + +The `twenty-sdk/cli` subpath exports functions you can call directly from test code: + +| Function | Description | +|----------|-------------| +| `appBuild` | Build the app and optionally pack a tarball | +| `appDeploy` | Upload a tarball to the server | +| `appInstall` | Install the app on the active workspace | +| `appUninstall` | Uninstall the app from the active workspace | + +Each function returns a result object with `success: boolean` and either `data` or `error`. + +### Writing an integration test + +Here is a full example that builds, deploys, and installs the app, then verifies it appears in the workspace: + +```ts src/__tests__/app-install.integration-test.ts +import { APPLICATION_UNIVERSAL_IDENTIFIER } from 'src/application-config'; +import { appBuild, appDeploy, appInstall, appUninstall } from 'twenty-sdk/cli'; +import { MetadataApiClient } from 'twenty-client-sdk/metadata'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; + +const APP_PATH = process.cwd(); + +describe('App installation', () => { + beforeAll(async () => { + const buildResult = await appBuild({ + appPath: APP_PATH, + tarball: true, + onProgress: (message: string) => console.log(`[build] ${message}`), + }); + + if (!buildResult.success) { + throw new Error(`Build failed: ${buildResult.error?.message}`); + } + + const deployResult = await appDeploy({ + tarballPath: buildResult.data.tarballPath!, + onProgress: (message: string) => console.log(`[deploy] ${message}`), + }); + + if (!deployResult.success) { + throw new Error(`Deploy failed: ${deployResult.error?.message}`); + } + + const installResult = await appInstall({ appPath: APP_PATH }); + + if (!installResult.success) { + throw new Error(`Install failed: ${installResult.error?.message}`); + } + }); + + afterAll(async () => { + await appUninstall({ appPath: APP_PATH }); + }); + + it('should find the installed app in the workspace', async () => { + const metadataClient = new MetadataApiClient(); + + const result = await metadataClient.query({ + findManyApplications: { + id: true, + name: true, + universalIdentifier: true, + }, + }); + + const installedApp = result.findManyApplications.find( + (app: { universalIdentifier: string }) => + app.universalIdentifier === APPLICATION_UNIVERSAL_IDENTIFIER, + ); + + expect(installedApp).toBeDefined(); + }); +}); +``` + +### Running tests + +Make sure your local Twenty server is running, then: + +```bash filename="Terminal" +yarn test +``` + +Or in watch mode during development: + +```bash filename="Terminal" +yarn test:watch +``` + +### Type checking + +You can also run type checking on your app without running tests: + +```bash filename="Terminal" +yarn twenty typecheck +``` + +This runs `tsc --noEmit` and reports any type errors. + +## CLI reference + +Beyond `dev`, `build`, `add`, and `typecheck`, the CLI provides commands for executing functions, viewing logs, and managing app installations. + +### Executing functions (`yarn twenty exec`) + +Run a logic function manually without triggering it via HTTP, cron, or database event: + +```bash filename="Terminal" +# Execute by function name +yarn twenty exec -n create-new-post-card + +# Execute by universalIdentifier +yarn twenty exec -u e56d363b-0bdc-4d8a-a393-6f0d1c75bdcf + +# Pass a JSON payload +yarn twenty exec -n create-new-post-card -p '{"name": "Hello"}' + +# Execute pre-install or post-install functions +yarn twenty exec --preInstall +yarn twenty exec --postInstall +``` + +### Viewing function logs (`yarn twenty logs`) + +Stream execution logs for your app's logic functions: + +```bash filename="Terminal" +# Stream all function logs +yarn twenty logs + +# Filter by function name +yarn twenty logs -n create-new-post-card + +# Filter by universalIdentifier +yarn twenty logs -u e56d363b-0bdc-4d8a-a393-6f0d1c75bdcf +``` + + +This is different from `yarn twenty server logs`, which shows the Docker container logs. `yarn twenty logs` shows your app's function execution logs from the Twenty server. + + +### Uninstalling an app (`yarn twenty uninstall`) + +Remove your app from the active workspace: + +```bash filename="Terminal" +yarn twenty uninstall + +# Skip the confirmation prompt +yarn twenty uninstall --yes +``` diff --git a/packages/twenty-docs/developers/extend/apps/getting-started.mdx b/packages/twenty-docs/developers/extend/apps/getting-started.mdx index ac6152bff6..3b0001b0f8 100644 --- a/packages/twenty-docs/developers/extend/apps/getting-started.mdx +++ b/packages/twenty-docs/developers/extend/apps/getting-started.mdx @@ -4,72 +4,142 @@ description: Create your first Twenty app in minutes. --- -Apps are currently in alpha testing. The feature is functional but still evolving. +Apps are currently in alpha. The feature works but is still evolving. Apps let you extend Twenty with custom objects, fields, logic functions, AI skills, and UI components — all managed as code. -**What you can build:** -- Custom objects, fields, views, and navigation items to shape your data model -- Logic functions triggered by HTTP routes, cron schedules, or database events -- Front components that render directly inside Twenty's UI -- Skills that extend Twenty's AI agents -- Deploy an app across multiple workspaces - ## Prerequisites -- Node.js 24+ -- Yarn 4 -- Docker (or a running local Twenty instance) +Before you begin, make sure the following is installed on your machine: -## Getting Started +- **Node.js 24+** — [Download here](https://nodejs.org/) +- **Yarn 4** — Comes with Node.js via Corepack. Enable it by running `corepack enable` +- **Docker** — [Download here](https://www.docker.com/products/docker-desktop/). Required to run a local Twenty instance. Not needed if you already have a Twenty server running. -Create a new app using the official scaffolder, then authenticate and start developing: +## Step 1: Scaffold your app + +Open a terminal and run: ```bash filename="Terminal" -# Scaffold a new app (includes all examples by default) npx create-twenty-app@latest my-twenty-app ``` -> Use `--minimal` option to scaffold a minimal installation +You will be prompted to enter a name and a description for your app. Press **Enter** to accept the defaults. -From here you can: +This creates a new folder called `my-twenty-app` with everything you need. + + +The scaffolder supports these flags: + +- `--minimal` — scaffold only the essential files, no examples (default) +- `--exhaustive` — scaffold all example entities +- `--name ` — set the app name (skips the prompt) +- `--display-name ` — set the display name (skips the prompt) +- `--description ` — set the description (skips the prompt) +- `--skip-local-instance` — skip the local server setup prompt + + +## Step 2: Set up a local Twenty instance + +The scaffolder will ask: + +> **Would you like to set up a local Twenty instance?** + +- **Type `yes`** (recommended) — This pulls the `twenty-app-dev` Docker image and starts a local Twenty server on port `2020`. Make sure Docker is running before you continue. +- **Type `no`** — Choose this if you already have a Twenty server running locally. + +
+ Should start local instance? +
+ +## Step 3: Sign in to your workspace + +Next, a browser window will open with the Twenty login page. Sign in with the pre-seeded demo account: + +- **Email:** `tim@apple.dev` +- **Password:** `tim@apple.dev` + +
+ Twenty login screen +
+ +## Step 4: Authorize the app + +After you sign in, you will see an authorization screen. This lets your app interact with your workspace. + +Click **Authorize** to continue. + +
+ Twenty CLI authorization screen +
+ +Once authorized, your terminal will confirm that everything is set up. + +
+ App scaffolded successfully +
+ +## Step 5: Start developing + +Go into your new app folder and start the development server: ```bash filename="Terminal" -# Add a new entity to your application (guided) -yarn twenty add - -# Watch your application's function logs -yarn twenty function:logs - -# Execute a function by name -yarn twenty function:execute -n my-function -p '{"name": "test"}' - -# Execute the pre-install function -yarn twenty function:execute --preInstall - -# Execute the post-install function -yarn twenty function:execute --postInstall - -# Uninstall the application from the current workspace -yarn twenty uninstall - -# Display commands' help -yarn twenty help +cd my-twenty-app +yarn twenty dev ``` -See also: the CLI reference pages for [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) and [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk). +This watches your source files, rebuilds on every change, and syncs your app to the local Twenty server automatically. You should see a live status panel in your terminal. -## Project structure (scaffolded) +For more detailed output (build logs, sync requests, error traces), use the `--verbose` flag: -When you run `npx create-twenty-app@latest my-twenty-app`, the scaffolder: +```bash filename="Terminal" +yarn twenty dev --verbose +``` -- Copies a minimal base application into `my-twenty-app/` -- Adds a local `twenty-sdk` dependency and Yarn 4 configuration -- Creates config files and scripts wired to the `twenty` CLI -- Generates core files (application config, default function role, pre-install and post-install functions) plus example files based on the scaffolding mode + +Dev mode is only available on Twenty instances running in development (`NODE_ENV=development`). Production instances reject dev sync requests. Use `yarn twenty deploy` to deploy to production servers — see [Publishing Apps](/developers/extend/apps/publishing) for details. + -A freshly scaffolded app with the default `--exhaustive` mode looks like this: +
+ Dev mode terminal output +
+ +## Step 6: See your app in Twenty + +Open [http://localhost:2020/settings/applications#developer](http://localhost:2020/settings/applications#developer) in your browser. Navigate to **Settings > Apps** and select the **Developer** tab. You should see your app listed under **Your Apps**: + +
+ Your Apps list showing My twenty app +
+ +Click on **My twenty app** to open its **application registration**. A registration is a server-level record that describes your app — its name, unique identifier, OAuth credentials, and source (local, npm, or tarball). It lives on the server, not inside any specific workspace. When you install an app into a workspace, Twenty creates a workspace-scoped **application** that points back to this registration. One registration can be installed across multiple workspaces on the same server. + +
+ Application registration details +
+ +Click **View installed app** to see the installed app. The **About** tab shows the current version and management options: + +
+ Installed app — About tab +
+ +Switch to the **Content** tab to see everything your app provides — objects, fields, logic functions, and agents: + +
+ Installed app — Content tab +
+ +You are all set! Edit any file in `src/` and the changes will be picked up automatically. + +Head over to [Building Apps](/developers/extend/apps/building) for a detailed guide on creating objects, logic functions, front components, skills, and more. + +--- + +## Project structure + +The scaffolder generates the following file structure (shown with `--exhaustive` mode, which includes examples for every entity type): ```text filename="my-twenty-app/" my-twenty-app/ @@ -82,123 +152,238 @@ my-twenty-app/ install-state.gz .oxlintrc.json tsconfig.json + tsconfig.spec.json # TypeScript config for tests + vitest.config.ts # Vitest test runner configuration + LLMS.md README.md - public/ # Public assets folder (images, fonts, etc.) + .github/ + └── workflows/ + └── ci.yml # GitHub Actions CI workflow + public/ # Public assets (images, fonts, etc.) src/ - ├── application-config.ts # Required - main application configuration + ├── application-config.ts # Required — main application configuration + ├── __tests__/ + │ ├── setup-test.ts # Test setup (server health check, config) + │ └── app-install.integration-test.ts # Example integration test ├── roles/ - │ └── default-role.ts # Default role for logic functions + │ └── default-role.ts # Default role for logic functions ├── objects/ - │ └── example-object.ts # Example custom object definition + │ └── example-object.ts # Example custom object definition ├── fields/ - │ └── example-field.ts # Example standalone field definition + │ └── example-field.ts # Example standalone field definition ├── logic-functions/ - │ ├── hello-world.ts # Example logic function - │ ├── pre-install.ts # Pre-install logic function - │ └── post-install.ts # Post-install logic function + │ ├── hello-world.ts # Example logic function + │ ├── create-hello-world-company.ts # Example logic function using CoreApiClient + │ ├── pre-install.ts # Runs before installation + │ └── post-install.ts # Runs after installation ├── front-components/ - │ └── hello-world.tsx # Example front component + │ └── hello-world.tsx # Example front component + ├── page-layouts/ + │ └── example-record-page-layout.ts # Example page layout with front component ├── views/ - │ └── example-view.ts # Example saved view definition + │ └── example-view.ts # Example saved view definition ├── navigation-menu-items/ │ └── example-navigation-menu-item.ts # Example sidebar navigation link - └── skills/ - └── example-skill.ts # Example AI agent skill definition + ├── skills/ + │ └── example-skill.ts # Example AI agent skill definition + └── agents/ + └── example-agent.ts # Example AI agent definition ``` -With `--minimal`, only the core files are created (`application-config.ts`, `roles/default-role.ts`, `logic-functions/pre-install.ts`, and `logic-functions/post-install.ts`). +By default (`--minimal`), only the core files are created: `application-config.ts`, `roles/default-role.ts`, `logic-functions/pre-install.ts`, and `logic-functions/post-install.ts`. Use `--exhaustive` to include all the example files shown above. -At a high level: +### Key files -- **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus a `twenty` script that delegates to the local `twenty` CLI. Run `yarn twenty help` to list all available commands. -- **.gitignore**: Ignores common artifacts such as `node_modules`, `.yarn`, `.twenty/`, `dist/`, `build/`, coverage folders, log files, and `.env*` files. -- **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Lock and configure the Yarn 4 toolchain used by the project. -- **.nvmrc**: Pins the Node.js version expected by the project. -- **.oxlintrc.json** and **tsconfig.json**: Provide linting and TypeScript configuration for your app's TypeScript sources. -- **README.md**: A short README in the app root with basic instructions. -- **public/**: A folder for storing public assets (images, fonts, static files) that will be served with your application. Files placed here are uploaded during sync and accessible at runtime. -- **src/**: The main place where you define your application-as-code +| File / Folder | Purpose | +|---|---| +| `package.json` | Declares your app name, version, and dependencies. Includes a `twenty` script so you can run `yarn twenty help` to see all commands. | +| `src/application-config.ts` | **Required.** The main configuration file for your app. | +| `src/roles/` | Defines roles that control what your logic functions can access. | +| `src/logic-functions/` | Server-side functions triggered by routes, cron schedules, or database events. | +| `src/front-components/` | React components that render inside Twenty's UI. | +| `src/objects/` | Custom object definitions to extend your data model. | +| `src/fields/` | Custom fields added to existing objects. | +| `src/views/` | Saved view configurations. | +| `src/navigation-menu-items/` | Custom links in the sidebar navigation. | +| `src/skills/` | Skills that extend Twenty's AI agents. | +| `src/agents/` | AI agents with custom prompts. | +| `src/page-layouts/` | Custom page layouts for record views. | +| `src/__tests__/` | Integration tests (setup + example test). | +| `public/` | Static assets (images, fonts) served with your app. | -### Entity detection +## Managing remotes -The SDK detects entities by parsing your TypeScript files for **`export default define({...})`** calls. Each entity type has a corresponding helper function exported from `twenty-sdk`: - -| Helper function | Entity type | -|-----------------|-------------| -| `defineObject` | Custom object definitions | -| `defineLogicFunction` | Logic function definitions | -| `definePreInstallLogicFunction` | Pre-install logic function (runs before installation) | -| `definePostInstallLogicFunction` | Post-install logic function (runs after installation) | -| `defineFrontComponent` | Front component definitions | -| `defineRole` | Role definitions | -| `defineField` | Field extensions for existing objects | -| `defineView` | Saved view definitions | -| `defineNavigationMenuItem` | Navigation menu item definitions | -| `defineSkill` | AI agent skill definitions | - - -**File naming is flexible.** Entity detection is AST-based — the SDK scans your source files for the `export default define({...})` pattern. You can organize your files and folders however you like. Grouping by entity type (e.g., `logic-functions/`, `roles/`) is just a convention for code organization, not a requirement. - - -Example of a detected entity: -```typescript -// This file can be named anything and placed anywhere in src/ -import { defineObject, FieldType } from 'twenty-sdk'; - -export default defineObject({ - universalIdentifier: '...', - nameSingular: 'postCard', - // ... rest of config -}); -``` - -Later commands will add more files and folders: - -- `yarn twenty dev` will auto-generate the typed `CoreApiClient` (for workspace data via `/graphql`) into `node_modules/twenty-client-sdk/`. The `MetadataApiClient` (for workspace configuration and file uploads via `/metadata`) ships pre-built and is available immediately. Import them from `twenty-client-sdk/core` and `twenty-client-sdk/metadata` respectively. -- `yarn twenty add` will add entity definition files under `src/` for your custom objects, functions, front components, roles, skills, and more. - -## Authentication - -The first time you run `yarn twenty auth:login`, you'll be prompted for: - -- API URL (defaults to http://localhost:3000 or your current workspace profile) -- API key - -Your credentials are stored per-user in `~/.twenty/config.json`. You can maintain multiple profiles and switch between them. - -### Managing workspaces +A **remote** is a Twenty server that your app connects to. During setup, the scaffolder creates one for you automatically. You can add more remotes or switch between them at any time. ```bash filename="Terminal" -# Login interactively (recommended) -yarn twenty auth:login +# Add a new remote (opens a browser for OAuth login) +yarn twenty remote add -# Login to a specific workspace profile -yarn twenty auth:login --workspace my-custom-workspace +# Connect to a local Twenty server (auto-detects port 2020 or 3000) +yarn twenty remote add --local -# List all configured workspaces -yarn twenty auth:list +# Add a remote non-interactively (useful for CI) +yarn twenty remote add --api-url https://your-twenty-server.com --api-key $TWENTY_API_KEY --as my-remote -# Switch the default workspace (interactive) -yarn twenty auth:switch +# List all configured remotes +yarn twenty remote list -# Switch to a specific workspace -yarn twenty auth:switch production - -# Check current authentication status -yarn twenty auth:status +# Switch the active remote +yarn twenty remote switch ``` -Once you've switched workspaces with `yarn twenty auth:switch`, all subsequent commands will use that workspace by default. You can still override it temporarily with `--workspace `. +Your credentials are stored in `~/.twenty/config.json`. + +## Local development server (`yarn twenty server`) + +The CLI can manage a local Twenty server running in Docker. This is the same server started automatically when you scaffold an app with `create-twenty-app`, but you can also manage it manually. + +### Starting the server + +```bash filename="Terminal" +yarn twenty server start +``` + +This pulls the `twentycrm/twenty-app-dev:latest` Docker image (if not already present), creates a container named `twenty-app-dev`, and starts it on port **2020**. The CLI waits until the server passes its health check before returning. + +Two Docker volumes are created to persist data between restarts: +- `twenty-app-dev-data` — PostgreSQL database +- `twenty-app-dev-storage` — file storage + +If port 2020 is already in use, you can start on a different port: + +```bash filename="Terminal" +yarn twenty server start --port 3030 +``` + +The CLI automatically configures the container's internal `NODE_PORT` and `SERVER_URL` to match the chosen port, so logic functions, OAuth, and all other internal networking work correctly. + +Once started, the server is automatically registered as the `local` remote in your CLI config. + +### Checking server status + +```bash filename="Terminal" +yarn twenty server status +``` + +Displays whether the server is running, its URL, and the default login credentials (`tim@apple.dev` / `tim@apple.dev`). + +### Viewing server logs + +```bash filename="Terminal" +yarn twenty server logs +``` + +Streams the container logs. Use `--lines` to control how many recent lines to show: + +```bash filename="Terminal" +yarn twenty server logs --lines 100 +``` + +### Stopping the server + +```bash filename="Terminal" +yarn twenty server stop +``` + +Stops the container. Your data is preserved in the Docker volumes — the next `start` picks up where you left off. + +### Resetting the server + +```bash filename="Terminal" +yarn twenty server reset +``` + +Removes the container **and** deletes both Docker volumes, wiping all data. The next `start` creates a fresh instance. + + + The server requires **Docker** to be running. If you see a "Docker not running" error, make sure Docker Desktop (or the Docker daemon) is started. + + +### Command reference + +| Command | Description | +|---------|-------------| +| `yarn twenty server start` | Start the local server (pulls image if needed) | +| `yarn twenty server start --port 3030` | Start on a custom port | +| `yarn twenty server stop` | Stop the server (preserves data) | +| `yarn twenty server status` | Show server status, URL, and credentials | +| `yarn twenty server logs` | Stream server logs | +| `yarn twenty server logs --lines 100` | Show the last 100 log lines | +| `yarn twenty server reset` | Delete all data and start fresh | + + +## CI with GitHub Actions + +The scaffolder generates a ready-to-use GitHub Actions workflow at `.github/workflows/ci.yml`. It runs your integration tests automatically on every push to `main` and on pull requests. + +The workflow: + +1. Checks out your code +2. Spins up a temporary Twenty server using the `twentyhq/twenty/.github/actions/spawn-twenty-docker-image` action +3. Installs dependencies with `yarn install --immutable` +4. Runs `yarn test` with `TWENTY_API_URL` and `TWENTY_API_KEY` injected from the action outputs + +```yaml .github/workflows/ci.yml +name: CI + +on: + push: + branches: + - main + pull_request: {} + +env: + TWENTY_VERSION: latest + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Spawn Twenty instance + id: twenty + uses: twentyhq/twenty/.github/actions/spawn-twenty-docker-image@main + with: + twenty-version: ${{ env.TWENTY_VERSION }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Enable Corepack + run: corepack enable + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + + - name: Install dependencies + run: yarn install --immutable + + - name: Run integration tests + run: yarn test + env: + TWENTY_API_URL: ${{ steps.twenty.outputs.server-url }} + TWENTY_API_KEY: ${{ steps.twenty.outputs.access-token }} +``` + +You don't need to configure any secrets — the `spawn-twenty-docker-image` action starts an ephemeral Twenty server directly in the runner and outputs the connection details. The `GITHUB_TOKEN` secret is provided automatically by GitHub. + +To pin a specific Twenty version instead of `latest`, change the `TWENTY_VERSION` environment variable at the top of the workflow. ## Manual setup (without the scaffolder) -While we recommend using `create-twenty-app` for the best getting-started experience, you can also set up a project manually. Do not install the CLI globally. Instead, add `twenty-sdk` as a local dependency and wire a single script in your package.json: +If you prefer to set things up yourself instead of using `create-twenty-app`, you can do it in two steps. + +**1. Add `twenty-sdk` and `twenty-client-sdk` as dependencies:** ```bash filename="Terminal" -yarn add -D twenty-sdk +yarn add twenty-sdk twenty-client-sdk ``` -Then add a `twenty` script: +**2. Add a `twenty` script to your `package.json`:** ```json filename="package.json" { @@ -208,25 +393,19 @@ Then add a `twenty` script: } ``` -Now you can run all commands via `yarn twenty `, e.g. `yarn twenty dev`, `yarn twenty help`, etc. +You can now run `yarn twenty dev`, `yarn twenty help`, and all other commands. -## How to use a local Twenty instance - -If you're already running a Twenty instance locally (e.g. via `npx nx start twenty-server`), you can connect to it instead of using Docker: - -```bash filename="Terminal" -# During scaffolding — skip Docker, connect to your running instance -npx create-twenty-app@latest my-app --port 3000 - -# Or after scaffolding — add a remote pointing to your instance -yarn twenty remote add --local --port 3000 -``` + +Do not install `twenty-sdk` globally. Always use it as a local project dependency so that each project can pin its own version. + ## Troubleshooting -- Authentication errors: run `yarn twenty auth:login` and ensure your API key has the required permissions. -- Cannot connect to server: verify the API URL and that the Twenty server is reachable. -- Types or client missing/outdated: restart `yarn twenty dev` — it auto-generates the typed client. -- Dev mode not syncing: ensure `yarn twenty dev` is running and that changes are not ignored by your environment. +If you run into issues: -Discord Help Channel: https://discord.com/channels/1130383047699738754/1130386664812982322 +- Make sure **Docker is running** before starting the scaffolder with a local instance. +- Make sure you are using **Node.js 24+** (`node -v` to check). +- Make sure **Corepack is enabled** (`corepack enable`) so Yarn 4 is available. +- Try deleting `node_modules` and running `yarn install` again if dependencies seem broken. + +Still stuck? Ask for help on the [Twenty Discord](https://discord.com/channels/1130383047699738754/1130386664812982322). diff --git a/packages/twenty-docs/developers/extend/apps/publishing.mdx b/packages/twenty-docs/developers/extend/apps/publishing.mdx index a7e1f42c31..c3f8bd3ab4 100644 --- a/packages/twenty-docs/developers/extend/apps/publishing.mdx +++ b/packages/twenty-docs/developers/extend/apps/publishing.mdx @@ -4,34 +4,76 @@ description: Distribute your Twenty app to the marketplace or deploy it internal --- -Apps are currently in alpha testing. The feature is functional but still evolving. + Apps are currently in alpha. The feature works but is still evolving. ## Overview Once your app is [built and tested locally](/developers/extend/apps/building), you have two paths for distributing it: -- **Publish to npm** — list your app in the Twenty marketplace for any workspace to discover and install. - **Deploy a tarball** — upload your app directly to a specific Twenty server for internal or private use. +- **Publish to npm** — list your app in the Twenty marketplace for any workspace to discover and install. Both paths start from the same **build** step. ## Building your app -The `build` command compiles your TypeScript sources, transpiles logic functions and front components, and generates a `manifest.json` that describes your app's contents: +Run the build command to compile your app and generate a distribution-ready `manifest.json`: ```bash filename="Terminal" yarn twenty build ``` -The output is written to `.twenty/output/`. This directory contains everything needed for distribution: compiled code, assets, the manifest, and a copy of your `package.json`. +This compiles TypeScript sources, transpiles logic functions and front components, and writes everything to `.twenty/output/`. Add `--tarball` to also produce a `.tgz` package for manual distribution or the deploy command. -To also create a `.tgz` tarball (used by the deploy command internally, or for manual distribution): +## Deploying to a server (tarball) + +For apps you don't want publicly available — proprietary tools, enterprise-only integrations, or experimental builds — you can deploy a tarball directly to a Twenty server. + +### Prerequisites + +Before deploying, you need a configured remote pointing to the target server. Remotes store the server URL and authentication credentials locally in `~/.twenty/config.json`. + +Add a remote: ```bash filename="Terminal" -yarn twenty build --tarball +yarn twenty remote add --api-url https://your-twenty-server.com --as production ``` +### Deploying + +Build and upload your app to the server in one step: + +```bash filename="Terminal" +yarn twenty deploy +# To deploy to a specific remote: +# yarn twenty deploy --remote production +``` + +### Sharing a deployed app + +Tarball apps are not listed in the public marketplace, so other workspaces on the same server won't discover them by browsing. To share a deployed app: + +1. Go to **Settings > Applications > Registrations** and open your app +2. In the **Distribution** tab, click **Copy share link** +3. Share this link with users on other workspaces — it takes them directly to the app's install page + +The share link uses the server's base URL (without any workspace subdomain) so it works for any workspace on the server. + + +Sharing private apps is an Enterprise feature. Go to [Settings > Admin Panel > Enterprise](/settings/admin-panel#enterprise) to enable it. + + +### Version management + +To release an update: + +1. Bump the `version` field in your `package.json` +2. Run `yarn twenty deploy` (or `yarn twenty deploy --remote production`) +3. Workspaces that have the app installed will see the upgrade available in their settings + +{/* TODO: add screenshot of the Upgrade button */} + ## Publishing to npm Publishing to npm makes your app discoverable in the Twenty marketplace. Any Twenty workspace can browse, install, and upgrade marketplace apps directly from the UI. @@ -39,41 +81,42 @@ Publishing to npm makes your app discoverable in the Twenty marketplace. Any Twe ### Requirements - An [npm](https://www.npmjs.com) account -- The `twenty-app` keyword **must** be listed in your `package.json` `keywords` array - -### Adding the required keyword - -The Twenty marketplace discovers apps by searching the npm registry for packages with the `twenty-app` keyword. Add it to your `package.json`: +- The `twenty-app` keyword in your `package.json` `keywords` array (already included when you scaffold with `create-twenty-app`) ```json filename="package.json" { "name": "twenty-app-postcard-sender", "version": "1.0.0", - "keywords": ["twenty-app"], - ... + "keywords": ["twenty-app"] } ``` - -The marketplace searches for `keywords:twenty-app` on the npm registry. Without this keyword, your package won't appear in the marketplace even if it has the `twenty-app-` name prefix. - +### Marketplace metadata -### Steps +The `defineApplication()` config supports optional fields that control how your app appears in the marketplace. Use `logoUrl` and `screenshots` to reference images from the `public/` folder: -1. **Build your app:** - -```bash filename="Terminal" -yarn twenty build +```ts src/application-config.ts +export default defineApplication({ + universalIdentifier: '...', + displayName: 'My App', + description: 'A great app', + defaultRoleUniversalIdentifier: DEFAULT_ROLE_UNIVERSAL_IDENTIFIER, + logoUrl: 'public/logo.png', + screenshots: [ + 'public/screenshot-1.png', + 'public/screenshot-2.png', + ], +}); ``` -2. **Publish to npm:** +See the [defineApplication accordion](/developers/extend/apps/building#defineentity-functions) in the Building Apps page for the full list of marketplace fields (`author`, `category`, `aboutDescription`, `websiteUrl`, `termsUrl`, etc.). + +### Publish ```bash filename="Terminal" yarn twenty publish ``` -This runs `npm publish` from the `.twenty/output/` directory. - To publish under a specific dist-tag (e.g., `beta` or `next`): ```bash filename="Terminal" @@ -82,25 +125,17 @@ yarn twenty publish --tag beta ### How marketplace discovery works -The Twenty server syncs its marketplace catalog from the npm registry **every hour**: +The Twenty server syncs its marketplace catalog from the npm registry **every hour**. -1. It searches for all npm packages with the `keywords:twenty-app` keyword -2. For each package, it fetches the `manifest.json` from the npm CDN -3. The app's metadata (name, description, author, logo, screenshots, category) is extracted from the manifest and displayed in the marketplace - -After publishing, your app can take up to one hour to appear in the marketplace. To trigger the sync immediately instead of waiting for the next hourly run: +You can trigger the sync immediately instead of waiting: ```bash filename="Terminal" yarn twenty catalog-sync +# To target a specific remote: +# yarn twenty catalog-sync --remote production ``` -To target a specific remote: - -```bash filename="Terminal" -yarn twenty catalog-sync -r production -``` - -The metadata shown in the marketplace comes from your `defineApplication()` call in your app source code — fields like `displayName`, `description`, `author`, `category`, `logoUrl`, `screenshots`, `aboutDescription`, `websiteUrl`, and `termsUrl`. +The metadata shown in the marketplace comes from your `defineApplication()` config — fields like `displayName`, `description`, `author`, `category`, `logoUrl`, `screenshots`, `aboutDescription`, `websiteUrl`, and `termsUrl`. If your app does not define an `aboutDescription` in `defineApplication()`, the marketplace will automatically use your package's `README.md` from npm as the about page content. This means you can maintain a single README for both npm and the Twenty marketplace. If you want a different description in the marketplace, explicitly set `aboutDescription`. @@ -108,7 +143,7 @@ If your app does not define an `aboutDescription` in `defineApplication()`, the ### CI publishing -The scaffolded project includes a GitHub Actions workflow that publishes on every release: +Use this GitHub Actions workflow to publish automatically on every release (uses [OIDC](https://docs.npmjs.com/trusted-publishers)): ```yaml filename=".github/workflows/publish.yml" name: Publish @@ -133,121 +168,24 @@ jobs: - run: npx twenty build - run: npm publish --provenance --access public working-directory: .twenty/output - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} ``` For other CI systems (GitLab CI, CircleCI, etc.), the same three commands apply: `yarn install`, `yarn twenty build`, then `npm publish` from `.twenty/output`. - + **npm provenance** is optional but recommended. Publishing with `--provenance` adds a trust badge to your npm listing, letting users verify the package was built from a specific commit in a public CI pipeline. See the [npm provenance docs](https://docs.npmjs.com/generating-provenance-statements) for setup instructions. - - -## Deploying to a server (tarball) - -For apps you don't want publicly available — proprietary tools, enterprise-only integrations, or experimental builds — you can deploy a tarball directly to a Twenty server. - -### Prerequisites - -Before deploying, you need a configured remote pointing to the target server. Remotes store the server URL and authentication credentials locally in `~/.twenty/config.json`. - -Add a remote: - -```bash filename="Terminal" -yarn twenty remote add --url https://your-twenty-server.com --as production -``` - -For a local development server: - -```bash filename="Terminal" -yarn twenty remote add --local --as local -``` - -You can also authenticate with an API key for non-interactive environments: - -```bash filename="Terminal" -yarn twenty remote add --url https://your-twenty-server.com --token --as production -``` - -Manage your remotes: - -```bash filename="Terminal" -yarn twenty remote list # List all configured remotes -yarn twenty remote switch prod # Set the default remote -yarn twenty remote status # Show active remote and auth status -yarn twenty remote remove old # Remove a remote -``` - -### Deploying - -Build and upload your app to the server in one step: - -```bash filename="Terminal" -yarn twenty deploy -``` - -This builds the app with `--tarball`, then uploads the tarball to the default remote via a GraphQL multipart upload. - -To deploy to a specific remote: - -```bash filename="Terminal" -yarn twenty deploy -r production -``` - -### Sharing a deployed app - -Tarball apps are not listed in the public marketplace, so other workspaces on the same server won't discover them by browsing. To share a deployed app: - -1. Go to **Settings > Applications > Registrations** and open your app -2. In the **Distribution** tab, click **Copy share link** -3. Share this link with users on other workspaces — it takes them directly to the app's install page - -The share link uses the server's base URL (without any workspace subdomain) so it works for any workspace on the server. - -### Version management - -To release an update: - -1. Bump the `version` field in your `package.json` -2. Run `yarn twenty deploy` (or `yarn twenty deploy -r production`) -3. Workspaces that have the app installed will see the upgrade available in their settings + ## Installing apps -Once an app is published (npm) or deployed (tarball), workspaces install it through the UI: +Once an app is published (npm) or deployed (tarball), workspaces can install it through the UI. + +Go to the **Settings > Applications** page in Twenty, where both marketplace and tarball-deployed apps can be browsed and installed. + +{/* TODO: add screenshot of the UI when the app is registered */} + +You can also install apps from the command line: ```bash filename="Terminal" yarn twenty install ``` - -Or from the **Settings > Applications** page in the Twenty UI, where both marketplace and tarball-deployed apps can be browsed and installed. - -## App distribution categories - -Twenty organizes apps into three categories based on how they're distributed: - -| Category | How it works | Visible in marketplace? | -|----------|-------------|------------------------| -| **Development** | Local dev mode apps running via `yarn twenty dev`. Used for building and testing. | No | -| **Published (npm)** | Apps published to npm with the `twenty-app` keyword. Listed in the marketplace for any workspace to install. | Yes | -| **Internal (tarball)** | Apps deployed via tarball to a specific server. Available only to workspaces on that server via a share link. | No | - - -Start in **Development** mode while building your app. When it's ready, choose **Published** (npm) for broad distribution or **Internal** (tarball) for private deployment. - - -## CLI reference - -| Command | Description | Key flags | -|---------|-------------|-----------| -| `yarn twenty build` | Compile app and generate manifest | `--tarball` — also create a `.tgz` package | -| `yarn twenty publish` | Build and publish to npm | `--tag ` — npm dist-tag (e.g., `beta`, `next`) | -| `yarn twenty deploy` | Build and upload tarball to a server | `-r, --remote ` — target remote | -| `yarn twenty catalog-sync` | Trigger marketplace catalog sync on the server | `-r, --remote ` — target remote | -| `yarn twenty install` | Install a deployed app on a workspace | `-r, --remote ` — target remote | -| `yarn twenty dev` | Watch and sync local changes | Uses default remote | -| `yarn twenty remote add` | Add a server connection | `--url`, `--token`, `--as`, `--local`, `--port` | -| `yarn twenty remote list` | List configured remotes | — | -| `yarn twenty remote switch` | Set default remote | — | -| `yarn twenty remote status` | Show connection status | — | -| `yarn twenty remote remove` | Remove a remote | — | diff --git a/packages/twenty-docs/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/developers/extend/capabilities/apps.mdx index 3b6de5319a..668c769152 100644 --- a/packages/twenty-docs/developers/extend/capabilities/apps.mdx +++ b/packages/twenty-docs/developers/extend/capabilities/apps.mdx @@ -4,1408 +4,78 @@ description: Build and manage Twenty customizations as code. --- -Apps are currently in alpha testing. The feature is functional but still evolving. +Apps are currently in alpha. The feature works but is still evolving. -## What Are Apps? +## What are apps? -Apps let you build and manage Twenty customizations **as code**. Instead of configuring everything through the UI, you define your data model and logic functions in code — making it faster to build, maintain, and roll out to multiple workspaces. +Apps let you extend Twenty with custom objects, fields, logic functions, front components, AI skills, and more — all managed as code. Instead of configuring everything through the UI, you define your data model and logic in TypeScript and deploy it to one or more workspaces. -**What you can do today:** -- Define custom objects and fields as code (managed data model) -- Build logic functions with custom triggers -- Define skills and agents for AI -- Deploy the same app across multiple workspaces +**What you can build:** -## Prerequisites +- **Custom objects and fields** — extend your data model with new entities or add fields to existing objects like Company or Person +- **Logic functions** — server-side functions triggered by database events, cron schedules, or HTTP routes +- **Front components** — React components that render inside Twenty's UI (record pages, command menu, side panels) +- **AI skills and agents** — extend Twenty's AI with custom capabilities +- **Views and navigation** — preconfigured saved views and sidebar links -- Node.js 24+ and Yarn 4 -- Docker (for the local Twenty dev server) - -## Getting Started - -Create a new app using the official scaffolder. It can automatically start a local Twenty instance for you: +## Quick start ```bash filename="Terminal" -# Scaffold a new app — the CLI will offer to start a local Twenty server npx create-twenty-app@latest my-twenty-app cd my-twenty-app - -# Start dev mode: automatically syncs local changes to your workspace yarn twenty dev ``` -### Local Server Management +This scaffolds a new app, optionally starts a local Twenty server, and begins watching your files for changes. See the [Getting Started](/developers/extend/apps/getting-started) guide for the full walkthrough. -The SDK includes commands to manage a local Twenty dev server (all-in-one Docker image with PostgreSQL, Redis, server, and worker on port 2020). These commands only apply to the Docker-based dev server — they do not manage a Twenty instance started from source (e.g. `npx nx start twenty-server` on port 3000): +## Detailed guides -```bash filename="Terminal" -# Start the local server (pulls the image if needed) -yarn twenty server start +| Guide | Description | +|-------|-------------| +| [Getting Started](/developers/extend/apps/getting-started) | Scaffold an app, set up a local server, project structure, CI | +| [Building Apps](/developers/extend/apps/building) | Entity definitions (`defineObject`, `defineLogicFunction`, `defineFrontComponent`, etc.), API clients, npm packages, public assets, testing | +| [Publishing](/developers/extend/apps/publishing) | Deploy to a server, publish to npm, marketplace | -# Check server status -yarn twenty server status - -# Stream server logs -yarn twenty server logs - -# Stop the server -yarn twenty server stop - -# Reset all data and start fresh -yarn twenty server reset -``` - -The local server comes pre-seeded with a workspace and user (`tim@apple.dev` / `tim@apple.dev`), so you can start developing immediately without any manual setup. - -### Authentication - -Connect your app to the local server using OAuth: - -```bash filename="Terminal" -# Authenticate via OAuth (opens browser) -yarn twenty remote add --local -``` - -The scaffolder supports two modes for controlling which example files are included: - -```bash filename="Terminal" -# Default (exhaustive): all examples (object, field, logic function, front component, view, navigation menu item, skill, agent) -npx create-twenty-app@latest my-app - -# Minimal: only core files (application-config.ts and default-role.ts) -npx create-twenty-app@latest my-app --minimal -``` - -### How to use a local Twenty instance - -If you're already running a local Twenty instance, you can connect to it instead of using Docker. Pass the port your local server is listening on (default: `3000`): - -```bash filename="Terminal" -# During scaffolding -npx create-twenty-app@latest my-app --port 3000 - -# Or after scaffolding -yarn twenty remote add --local --port 3000 -``` - -From here you can: - -```bash filename="Terminal" -# Add a new entity to your application (guided) -yarn twenty entity:add - -# Watch your application's function logs -yarn twenty function:logs - -# Execute a function by name -yarn twenty function:execute -n my-function -p '{"name": "test"}' - -# Execute the pre-install function -yarn twenty function:execute --preInstall - -# Execute the post-install function -yarn twenty function:execute --postInstall - -# Build the app for distribution -yarn twenty build - -# Publish the app to npm or a Twenty server -yarn twenty publish - -# Uninstall the application from the current workspace -yarn twenty uninstall - -# Display commands' help -yarn twenty help -``` - -See also: the CLI reference pages for [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) and [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk). - -## Project structure (scaffolded) - -When you run `npx create-twenty-app@latest my-twenty-app`, the scaffolder: - -- Copies a minimal base application into `my-twenty-app/` -- Adds a local `twenty-sdk` dependency and Yarn 4 configuration -- Creates config files and scripts wired to the `twenty` CLI -- Generates core files (application config, default function role, pre-install and post-install functions) plus example files based on the scaffolding mode - -A freshly scaffolded app with the default `--exhaustive` mode looks like this: - -```text filename="my-twenty-app/" -my-twenty-app/ - package.json - yarn.lock - .gitignore - .nvmrc - .yarnrc.yml - .yarn/ - install-state.gz - .oxlintrc.json - tsconfig.json - README.md - public/ # Public assets folder (images, fonts, etc.) - src/ - ├── application-config.ts # Required - main application configuration - ├── roles/ - │ └── default-role.ts # Default role for logic functions - ├── objects/ - │ └── example-object.ts # Example custom object definition - ├── fields/ - │ └── example-field.ts # Example standalone field definition - ├── logic-functions/ - │ ├── hello-world.ts # Example logic function - │ ├── pre-install.ts # Pre-install logic function - │ └── post-install.ts # Post-install logic function - ├── front-components/ - │ └── hello-world.tsx # Example front component - ├── views/ - │ └── example-view.ts # Example saved view definition - ├── navigation-menu-items/ - │ └── example-navigation-menu-item.ts # Example sidebar navigation link - ├── skills/ - │ └── example-skill.ts # Example AI agent skill definition - └── agents/ - └── example-agent.ts # Example AI agent definition -``` - -With `--minimal`, only the core files are created (`application-config.ts`, `roles/default-role.ts`, `logic-functions/pre-install.ts`, and `logic-functions/post-install.ts`). - -At a high level: - -- **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus a `twenty` script that delegates to the local `twenty` CLI. Run `yarn twenty help` to list all available commands. -- **.gitignore**: Ignores common artifacts such as `node_modules`, `.yarn`, `generated/` (typed client), `dist/`, `build/`, coverage folders, log files, and `.env*` files. -- **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Lock and configure the Yarn 4 toolchain used by the project. -- **.nvmrc**: Pins the Node.js version expected by the project. -- **.oxlintrc.json** and **tsconfig.json**: Provide linting and TypeScript configuration for your app's TypeScript sources. -- **README.md**: A short README in the app root with basic instructions. -- **public/**: A folder for storing public assets (images, fonts, static files) that will be served with your application. Files placed here are uploaded during sync and accessible at runtime. -- **src/**: The main place where you define your application-as-code +## Key concepts ### Entity detection -The SDK detects entities by parsing your TypeScript files for **`export default define({...})`** calls. Each entity type has a corresponding helper function exported from `twenty-sdk`: +The SDK detects entities by scanning your TypeScript files for `export default define({...})` calls. File naming and folder structure are flexible — detection is AST-based, not path-based. -| Helper function | Entity type | -|-----------------|-------------| -| `defineObject()` | Custom object definitions | -| `defineLogicFunction()` | Logic function definitions | -| `definePreInstallLogicFunction()` | Pre-install logic function (runs before installation) | -| `definePostInstallLogicFunction()` | Post-install logic function (runs after installation) | -| `defineFrontComponent()` | Front component definitions | -| `defineRole()` | Role definitions | -| `defineField()` | Field extensions for existing objects | -| `defineView()` | Saved view definitions | -| `defineNavigationMenuItem()` | Navigation menu item definitions | -| `defineSkill()` | AI agent skill definitions | -| `defineAgent()` | AI agent definitions | - - -**File naming is flexible.** Entity detection is AST-based — the SDK scans your source files for the `export default define({...})` pattern. You can organize your files and folders however you like. Grouping by entity type (e.g., `logic-functions/`, `roles/`) is just a convention for code organization, not a requirement. - - -Example of a detected entity: -```typescript -// This file can be named anything and placed anywhere in src/ -import { defineObject, FieldType } from 'twenty-sdk'; - -export default defineObject({ - universalIdentifier: '...', - nameSingular: 'postCard', - // ... rest of config -}); -``` - -Later commands will add more files and folders: - -- `yarn twenty dev` will auto-generate two typed API clients in `node_modules/twenty-sdk/clients`: `CoreApiClient` (for workspace data via `/graphql`) and `MetadataApiClient` (for workspace configuration and file uploads via `/metadata`). -- `yarn twenty entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, roles, skills, and more. - -## Authentication - -The first time you run `yarn twenty auth:login`, you'll be prompted for: - -- API URL (defaults to http://localhost:3000 or your current workspace profile) -- API key - -Your credentials are stored per-user in `~/.twenty/config.json`. You can maintain multiple profiles and switch between them. - -### Managing workspaces - -```bash filename="Terminal" -# Login interactively (recommended) -yarn twenty auth:login - -# Login to a specific workspace profile -yarn twenty auth:login --workspace my-custom-workspace - -# List all configured workspaces -yarn twenty auth:list - -# Switch the default workspace (interactive) -yarn twenty auth:switch - -# Switch to a specific workspace -yarn twenty auth:switch production - -# Check current authentication status -yarn twenty auth:status -``` - -Once you've switched workspaces with `yarn twenty auth:switch`, all subsequent commands will use that workspace by default. You can still override it temporarily with `--workspace `. - -## Use the SDK resources (types & config) - -The twenty-sdk provides typed building blocks and helper functions you use inside your app. Below are the key pieces you'll touch most often. - -### Helper functions - -The SDK provides helper functions for defining your app entities. As described in [Entity detection](#entity-detection), you must use `export default define({...})` for your entities to be detected: +### Available entity types | Function | Purpose | |----------|---------| -| `defineApplication()` | Configure application metadata (required, one per app) | -| `defineObject()` | Define custom objects with fields | -| `defineLogicFunction()` | Define logic functions with handlers | -| `definePreInstallLogicFunction()` | Define a pre-install logic function (one per app) | -| `definePostInstallLogicFunction()` | Define a post-install logic function (one per app) | -| `defineFrontComponent()` | Define front components for custom UI | -| `defineRole()` | Configure role permissions and object access | -| `defineField()` | Extend existing objects with additional fields | -| `defineView()` | Define saved views for objects | -| `defineNavigationMenuItem()` | Define sidebar navigation links | -| `defineSkill()` | Define AI agent skills | -| `defineAgent()` | Define AI agents with system prompts | +| `defineApplication()` | Application metadata (required, one per app) | +| `defineObject()` | Custom objects with fields | +| `defineField()` | Fields on existing objects | +| `defineLogicFunction()` | Server-side logic with triggers | +| `defineFrontComponent()` | React components in Twenty's UI | +| `defineRole()` | Permission roles | +| `defineView()` | Saved view configurations | +| `defineNavigationMenuItem()` | Sidebar navigation links | +| `defineSkill()` | AI agent skills | +| `defineAgent()` | AI agents with prompts | +| `definePageLayout()` | Custom record page layouts | +| `definePreInstallLogicFunction()` | Runs before app installation | +| `definePostInstallLogicFunction()` | Runs after app installation | -These functions validate your configuration at build time and provide IDE autocompletion and type safety. +### Development workflow -### Defining objects +1. **`yarn twenty dev`** — watches source files, rebuilds on change, syncs to the server, generates typed API clients +2. **`yarn twenty build`** — produces a distributable build +3. **`yarn twenty deploy`** — deploys to a remote Twenty server +4. **`yarn twenty add`** — scaffolds a new entity interactively -Custom objects describe both schema and behavior for records in your workspace. Use `defineObject()` to define objects with built-in validation: - -```typescript -// src/app/postCard.object.ts -import { defineObject, FieldType } from 'twenty-sdk'; - -enum PostCardStatus { - DRAFT = 'DRAFT', - SENT = 'SENT', - DELIVERED = 'DELIVERED', - RETURNED = 'RETURNED', -} - -export default defineObject({ - universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', - nameSingular: 'postCard', - namePlural: 'postCards', - labelSingular: 'Post Card', - labelPlural: 'Post Cards', - description: 'A post card object', - icon: 'IconMail', - fields: [ - { - universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', - name: 'content', - type: FieldType.TEXT, - label: 'Content', - description: "Postcard's content", - icon: 'IconAbc', - }, - { - universalIdentifier: 'c6aa31f3-da76-4ac6-889f-475e226009ac', - name: 'recipientName', - type: FieldType.FULL_NAME, - label: 'Recipient name', - icon: 'IconUser', - }, - { - universalIdentifier: '95045777-a0ad-49ec-98f9-22f9fc0c8266', - name: 'recipientAddress', - type: FieldType.ADDRESS, - label: 'Recipient address', - icon: 'IconHome', - }, - { - universalIdentifier: '87b675b8-dd8c-4448-b4ca-20e5a2234a1e', - name: 'status', - type: FieldType.SELECT, - label: 'Status', - icon: 'IconSend', - defaultValue: `'${PostCardStatus.DRAFT}'`, - options: [ - { value: PostCardStatus.DRAFT, label: 'Draft', position: 0, color: 'gray' }, - { value: PostCardStatus.SENT, label: 'Sent', position: 1, color: 'orange' }, - { value: PostCardStatus.DELIVERED, label: 'Delivered', position: 2, color: 'green' }, - { value: PostCardStatus.RETURNED, label: 'Returned', position: 3, color: 'orange' }, - ], - }, - { - universalIdentifier: 'e06abe72-5b44-4e7f-93be-afc185a3c433', - name: 'deliveredAt', - type: FieldType.DATE_TIME, - label: 'Delivered at', - icon: 'IconCheck', - isNullable: true, - defaultValue: null, - }, - ], -}); -``` - -Key points: - -- Use `defineObject()` for built-in validation and better IDE support. -- The `universalIdentifier` must be unique and stable across deployments. -- Each field requires a `name`, `type`, `label`, and its own stable `universalIdentifier`. -- The `fields` array is optional — you can define objects without custom fields. -- You can scaffold new objects using `yarn twenty entity:add`, which guides you through naming, fields, and relationships. - - -**Base fields are created automatically.** When you define a custom object, Twenty automatically adds standard fields - such as `id`, `name`, `createdAt`, `updatedAt`, `createdBy`, `updatedBy` and `deletedAt`. - You don't need to define these in your `fields` array — only add your custom fields. - You can override default fields by defining a field with the same name in your `fields` array, - but this is not recommended. - - -### Defining fields on existing objects - -Use `defineField()` to add custom fields to existing objects — both standard objects (like `company`, `person`, `opportunity`) and custom objects defined by other apps. Each field lives in its own file and references the target object by its `universalIdentifier`. - -To reference standard objects, import `STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS` from `twenty-sdk`. This constant provides stable identifiers for all built-in objects and their fields: - -```typescript -// src/fields/apollo-total-funding.field.ts -import { - defineField, - FieldType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, -} from 'twenty-sdk'; - -export default defineField({ - universalIdentifier: 'c90ae72d-4ddf-4f22-882f-eef98c91e40e', - objectUniversalIdentifier: - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.company.universalIdentifier, - type: FieldType.CURRENCY, - name: 'apolloTotalFunding', - label: 'Total Funding', - description: 'Total funding raised by the company', - icon: 'IconCash', -}); -``` - -Key points: - -- `objectUniversalIdentifier` tells Twenty which object to attach the field to. Use `STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS..universalIdentifier` for standard objects. -- Each field requires its own stable `universalIdentifier`, a `name`, `type`, `label`, and the target `objectUniversalIdentifier`. -- You can scaffold new fields using `yarn twenty entity:add` and choosing the field option. -- `STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS` is also exported as `STANDARD_OBJECT` for convenience — both refer to the same constant. - -Available standard objects include: `attachment`, `blocklist`, `calendarChannel`, `calendarEvent`, `calendarEventParticipant`, `company`, `connectedAccount`, `dashboard`, `favorite`, `favoriteFolder`, `message`, `messageChannel`, `messageParticipant`, `messageThread`, `note`, `noteTarget`, `opportunity`, `person`, `task`, `taskTarget`, `timelineActivity`, `workflow`, `workflowAutomatedTrigger`, `workflowRun`, `workflowVersion`, and `workspaceMember`. - -Each standard object also exposes its field identifiers. For example, to reference a specific field on a standard object in role permissions: - -```typescript -STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.company.fields.name.universalIdentifier -``` - -#### Relation fields on existing objects - -You can also define relation fields that link existing objects to your custom objects: - -```typescript -// src/fields/people-on-call-recording.field.ts -import { defineField, FieldType, RelationType, STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS } from 'twenty-sdk'; -import { CALL_RECORDING_OBJECT_UNIVERSAL_IDENTIFIER } from 'src/objects/call-recording'; -import { CALL_RECORDING_ON_PERSON_ID } from 'src/fields/call-recording-on-person.field'; - -export default defineField({ - universalIdentifier: '4a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d', - objectUniversalIdentifier: - CALL_RECORDING_OBJECT_UNIVERSAL_IDENTIFIER, - type: FieldType.RELATION, - name: 'person', - label: 'Person', - relationTargetObjectMetadataUniversalIdentifier: - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.person.universalIdentifier, - relationTargetFieldMetadataUniversalIdentifier: - CALL_RECORDING_ON_PERSON_ID, - relationType: RelationType.MANY_TO_ONE, -}); -``` - -### Application config (application-config.ts) - -Every app has a single `application-config.ts` file that describes: - -- **Who the app is**: identifiers, display name, and description. -- **How its functions run**: which role they use for permissions. -- **(Optional) variables**: key–value pairs exposed to your functions as environment variables. -- **(Optional) pre-install function**: a logic function that runs before the app is installed. -- **(Optional) post-install function**: a logic function that runs after the app is installed. - -Use `defineApplication()` to define your application configuration: - -```typescript -// src/application-config.ts -import { defineApplication } from 'twenty-sdk'; -import { DEFAULT_ROLE_UNIVERSAL_IDENTIFIER } from 'src/roles/default-role'; - -export default defineApplication({ - universalIdentifier: '4ec0391d-18d5-411c-b2f3-266ddc1c3ef7', - displayName: 'My Twenty App', - description: 'My first Twenty app', - icon: 'IconWorld', - applicationVariables: { - DEFAULT_RECIPIENT_NAME: { - universalIdentifier: '19e94e59-d4fe-4251-8981-b96d0a9f74de', - description: 'Default recipient name for postcards', - value: 'Jane Doe', - isSecret: false, - }, - }, - defaultRoleUniversalIdentifier: DEFAULT_ROLE_UNIVERSAL_IDENTIFIER, -}); -``` - -Notes: -- `universalIdentifier` fields are deterministic IDs you own; generate them once and keep them stable across syncs. -- `applicationVariables` become environment variables for your functions (for example, `DEFAULT_RECIPIENT_NAME` is available as `process.env.DEFAULT_RECIPIENT_NAME`). -- `defaultRoleUniversalIdentifier` must match the role file (see below). -- Pre-install and post-install functions are automatically detected during the manifest build. See [Pre-install functions](#pre-install-functions) and [Post-install functions](#post-install-functions). - -#### Roles and permissions - -Applications can define roles that encapsulate permissions on your workspace's objects and actions. The field `defaultRoleUniversalIdentifier` in `application-config.ts` designates the default role used by your app's logic functions. - -- The runtime API key injected as `TWENTY_API_KEY` is derived from this default function role. -- The typed client will be restricted to the permissions granted to that role. -- Follow least‑privilege: create a dedicated role with only the permissions your functions need, then reference its universal identifier. - -##### Default function role (*.role.ts) - -When you scaffold a new app, the CLI also creates a default role file. Use `defineRole()` to define roles with built-in validation: - -```typescript -// src/roles/default-role.ts -import { defineRole, PermissionFlag } from 'twenty-sdk'; - -export const DEFAULT_ROLE_UNIVERSAL_IDENTIFIER = - 'b648f87b-1d26-4961-b974-0908fd991061'; - -export default defineRole({ - universalIdentifier: DEFAULT_ROLE_UNIVERSAL_IDENTIFIER, - label: 'Default function role', - description: 'Default role for function Twenty client', - canReadAllObjectRecords: false, - canUpdateAllObjectRecords: false, - canSoftDeleteAllObjectRecords: false, - canDestroyAllObjectRecords: false, - canUpdateAllSettings: false, - canBeAssignedToAgents: false, - canBeAssignedToUsers: false, - canBeAssignedToApiKeys: false, - objectPermissions: [ - { - objectUniversalIdentifier: '9f9882af-170c-4879-b013-f9628b77c050', - canReadObjectRecords: true, - canUpdateObjectRecords: true, - canSoftDeleteObjectRecords: false, - canDestroyObjectRecords: false, - }, - ], - fieldPermissions: [ - { - objectUniversalIdentifier: '9f9882af-170c-4879-b013-f9628b77c050', - fieldUniversalIdentifier: 'b2c37dc0-8ae7-470e-96cd-1476b47dfaff', - canReadFieldValue: false, - canUpdateFieldValue: false, - }, - ], - permissionFlags: [PermissionFlag.APPLICATIONS], -}); -``` - -The `universalIdentifier` of this role is then referenced in `application-config.ts` as `defaultRoleUniversalIdentifier`. In other words: - -- **\*.role.ts** defines what the default function role can do. -- **application-config.ts** points to that role so your functions inherit its permissions. - -Notes: -- Start from the scaffolded role, then progressively restrict it following least‑privilege. -- Replace the `objectPermissions` and `fieldPermissions` with the objects/fields your functions need. -- `permissionFlags` control access to platform-level capabilities. Keep them minimal; add only what you need. -- See a working example in the Hello World app: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts). - -### Logic function config and entrypoint - -Each function file uses `defineLogicFunction()` to export a configuration with a handler and optional triggers. - -```typescript -// src/app/createPostCard.logic-function.ts -import { defineLogicFunction } from 'twenty-sdk'; -import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; -import { CoreApiClient, type Person } from 'twenty-client-sdk/core'; - -const handler = async (params: RoutePayload) => { - const client = new CoreApiClient(); - const name = 'name' in params.queryStringParameters - ? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' - : 'Hello world'; - - const result = await client.mutation({ - createPostCard: { - __args: { data: { name } }, - id: true, - name: true, - }, - }); - return result; -}; - -export default defineLogicFunction({ - universalIdentifier: 'e56d363b-0bdc-4d8a-a393-6f0d1c75bdcf', - name: 'create-new-post-card', - timeoutSeconds: 2, - handler, - triggers: [ - // Public HTTP route trigger '/s/post-card/create' - { - universalIdentifier: 'c9f84c8d-b26d-40d1-95dd-4f834ae5a2c6', - type: 'route', - path: '/post-card/create', - httpMethod: 'GET', - isAuthRequired: false, - }, - // Cron trigger (CRON pattern) - // { - // universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', - // type: 'cron', - // pattern: '0 0 1 1 *', - // }, - // Database event trigger - // { - // universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', - // type: 'databaseEvent', - // eventName: 'person.updated', - // updatedFields: ['name'], - // }, - ], -}); -``` - -Common trigger types: -- **route**: Exposes your function on an HTTP path and method **under the `/s/` endpoint**: -> e.g. `path: '/post-card/create',` -> call on `/s/post-card/create` -- **cron**: Runs your function on a schedule using a CRON expression. -- **databaseEvent**: Runs on workspace object lifecycle events. When the event operation is `updated`, specific fields to listen to can be specified in the `updatedFields` array. If left undefined or empty, any update will trigger the function. -> e.g. `person.updated` - -Notes: -- The `triggers` array is optional. Functions without triggers can be used as utility functions called by other functions. -- You can mix multiple trigger types in a single function. - -### Pre-install functions - -A pre-install function is a logic function that runs automatically before your app is installed on a workspace. This is useful for validation tasks, prerequisite checks, or preparing workspace state before the main installation proceeds. - -When you scaffold a new app with `create-twenty-app`, a pre-install function is generated for you at `src/logic-functions/pre-install.ts`: - -```typescript -// src/logic-functions/pre-install.ts -import { definePreInstallLogicFunction, type InstallLogicFunctionPayload } from 'twenty-sdk'; - -const handler = async (payload: InstallLogicFunctionPayload): Promise => { - console.log('Pre install logic function executed successfully!', payload.previousVersion); -}; - -export default definePreInstallLogicFunction({ - universalIdentifier: '', - name: 'pre-install', - description: 'Runs before installation to prepare the application.', - timeoutSeconds: 300, - handler, -}); -``` - -You can also manually execute the pre-install function at any time using the CLI: +### CLI reference ```bash filename="Terminal" -yarn twenty function:execute --preInstall +yarn twenty help # List all commands +yarn twenty server start # Start local dev server +yarn twenty remote add # Connect to a Twenty server +yarn twenty exec -n fn # Execute a logic function +yarn twenty logs -n fn # Stream function logs ``` -Key points: -- Pre-install functions use `definePreInstallLogicFunction()` — a specialized variant that omits trigger settings (`cronTriggerSettings`, `databaseEventTriggerSettings`, `httpRouteTriggerSettings`, `isTool`). -- The handler receives an `InstallLogicFunctionPayload` with `{ previousVersion: string }` — the version of the app that was previously installed (or an empty string for fresh installs). -- Only one pre-install function is allowed per application. The manifest build will error if more than one is detected. -- The function's `universalIdentifier` is automatically set as `preInstallLogicFunctionUniversalIdentifier` on the application manifest during the build — you do not need to reference it in `defineApplication()`. -- The default timeout is set to 300 seconds (5 minutes) to allow for longer preparation tasks. -- Pre-install functions do not need triggers — they are invoked by the platform before installation or manually via `function:execute --preInstall`. - -### Post-install functions - -A post-install function is a logic function that runs automatically after your app is installed on a workspace. This is useful for one-time setup tasks such as seeding default data, creating initial records, or configuring workspace settings. - -When you scaffold a new app with `create-twenty-app`, a post-install function is generated for you at `src/logic-functions/post-install.ts`: - -```typescript -// src/logic-functions/post-install.ts -import { definePostInstallLogicFunction, type InstallLogicFunctionPayload } from 'twenty-sdk'; - -const handler = async (payload: InstallLogicFunctionPayload): Promise => { - console.log('Post install logic function executed successfully!', payload.previousVersion); -}; - -export default definePostInstallLogicFunction({ - universalIdentifier: '', - name: 'post-install', - description: 'Runs after installation to set up the application.', - timeoutSeconds: 300, - handler, -}); -``` - -You can also manually execute the post-install function at any time using the CLI: - -```bash filename="Terminal" -yarn twenty function:execute --postInstall -``` - -Key points: -- Post-install functions use `definePostInstallLogicFunction()` — a specialized variant that omits trigger settings (`cronTriggerSettings`, `databaseEventTriggerSettings`, `httpRouteTriggerSettings`, `isTool`). -- The handler receives an `InstallLogicFunctionPayload` with `{ previousVersion: string }` — the version of the app that was previously installed (or an empty string for fresh installs). -- Only one post-install function is allowed per application. The manifest build will error if more than one is detected. -- The function's `universalIdentifier` is automatically set as `postInstallLogicFunctionUniversalIdentifier` on the application manifest during the build — you do not need to reference it in `defineApplication()`. -- The default timeout is set to 300 seconds (5 minutes) to allow for longer setup tasks like data seeding. -- Post-install functions do not need triggers — they are invoked by the platform during installation or manually via `function:execute --postInstall`. - -### Route trigger payload - - -**Breaking change (v1.16, January 2026):** The route trigger payload format has changed. Prior to v1.16, query parameters, path parameters, and body were sent directly as the payload. Starting with v1.16, they are nested inside a structured `RoutePayload` object. - -**Before v1.16:** -```typescript -const handler = async (params) => { - const { param1, param2 } = params; // Direct access -}; -``` - -**After v1.16:** -```typescript -const handler = async (event: RoutePayload) => { - const { param1, param2 } = event.body; // Access via .body - const { queryParam } = event.queryStringParameters; - const { id } = event.pathParameters; -}; -``` - -**To migrate existing functions:** Update your handler to destructure from `event.body`, `event.queryStringParameters`, or `event.pathParameters` instead of directly from the params object. - - -When a route trigger invokes your logic function, it receives a `RoutePayload` object that follows the AWS HTTP API v2 format. Import the type from `twenty-sdk`: - -```typescript -import { defineLogicFunction, type RoutePayload } from 'twenty-sdk'; - -const handler = async (event: RoutePayload) => { - // Access request data - const { headers, queryStringParameters, pathParameters, body } = event; - - // HTTP method and path are available in requestContext - const { method, path } = event.requestContext.http; - - return { message: 'Success' }; -}; -``` - -The `RoutePayload` type has the following structure: - -| Property | Type | Description | -|----------|------|-------------| -| `headers` | `Record` | HTTP headers (only those listed in `forwardedRequestHeaders`) | -| `queryStringParameters` | `Record` | Query string parameters (multiple values joined with commas) | -| `pathParameters` | `Record` | Path parameters extracted from the route pattern (e.g., `/users/:id` → `{ id: '123' }`) | -| `body` | `object \| null` | Parsed request body (JSON) | -| `isBase64Encoded` | `boolean` | Whether the body is base64 encoded | -| `requestContext.http.method` | `string` | HTTP method (GET, POST, PUT, PATCH, DELETE) | -| `requestContext.http.path` | `string` | Raw request path | - -### Forwarding HTTP headers - -By default, HTTP headers from incoming requests are **not** passed to your logic function for security reasons. To access specific headers, explicitly list them in the `forwardedRequestHeaders` array: - -```typescript -export default defineLogicFunction({ - universalIdentifier: 'e56d363b-0bdc-4d8a-a393-6f0d1c75bdcf', - name: 'webhook-handler', - handler, - triggers: [ - { - universalIdentifier: 'c9f84c8d-b26d-40d1-95dd-4f834ae5a2c6', - type: 'route', - path: '/webhook', - httpMethod: 'POST', - isAuthRequired: false, - forwardedRequestHeaders: ['x-webhook-signature', 'content-type'], - }, - ], -}); -``` - -In your handler, you can then access these headers: - -```typescript -const handler = async (event: RoutePayload) => { - const signature = event.headers['x-webhook-signature']; - const contentType = event.headers['content-type']; - - // Validate webhook signature... - return { received: true }; -}; -``` - - - Header names are normalized to lowercase. Access them using lowercase keys (for example, `event.headers['content-type']`). - - -You can create new functions in two ways: - -- **Scaffolded**: Run `yarn twenty entity:add` and choose the option to add a new logic function. This generates a starter file with a handler and config. -- **Manual**: Create a new `*.logic-function.ts` file and use `defineLogicFunction()`, following the same pattern. - -### Marking a logic function as a tool - -Logic functions can be exposed as **tools** for AI agents and workflows. When a function is marked as a tool, it becomes discoverable by Twenty's AI features and can be selected as a step in workflow automations. - -To mark a logic function as a tool, set `isTool: true` and provide a `toolInputSchema` describing the expected input parameters using [JSON Schema](https://json-schema.org/): - -```typescript -// src/logic-functions/enrich-company.logic-function.ts -import { defineLogicFunction } from 'twenty-sdk'; -import { CoreApiClient } from 'twenty-client-sdk/core'; - -const handler = async (params: { companyName: string; domain?: string }) => { - const client = new CoreApiClient(); - - const result = await client.mutation({ - createTask: { - __args: { - data: { - title: `Enrich data for ${params.companyName}`, - body: `Domain: ${params.domain ?? 'unknown'}`, - }, - }, - id: true, - }, - }); - - return { taskId: result.createTask.id }; -}; - -export default defineLogicFunction({ - universalIdentifier: 'f47ac10b-58cc-4372-a567-0e02b2c3d479', - name: 'enrich-company', - description: 'Enrich a company record with external data', - timeoutSeconds: 10, - handler, - isTool: true, - toolInputSchema: { - type: 'object', - properties: { - companyName: { - type: 'string', - description: 'The name of the company to enrich', - }, - domain: { - type: 'string', - description: 'The company website domain (optional)', - }, - }, - required: ['companyName'], - }, -}); -``` - -Key points: - -- **`isTool`** (`boolean`, default: `false`): When set to `true`, the function is registered as a tool and becomes available to AI agents and workflow automations. -- **`toolInputSchema`** (`object`, optional): A JSON Schema object that describes the parameters your function accepts. AI agents use this schema to understand what inputs the tool expects and to validate calls. If omitted, the schema defaults to `{ type: 'object', properties: {} }` (no parameters). -- Functions with `isTool: false` (or unset) are **not** exposed as tools. They can still be executed directly or called by other functions, but will not appear in tool discovery. -- **Tool naming**: When exposed as a tool, the function name is automatically normalized to `logic_function_` (lowercased, non-alphanumeric characters replaced with underscores). For example, `enrich-company` becomes `logic_function_enrich_company`. -- You can combine `isTool` with triggers — a function can be both a tool (callable by AI agents) and triggered by events (cron, database events, routes) at the same time. - - -**Write a good `description`.** AI agents rely on the function's `description` field to decide when to use the tool. Be specific about what the tool does and when it should be called. - - -### Front components - -Front components let you build custom React components that render within Twenty's UI. Use `defineFrontComponent()` to define components with built-in validation: - -```typescript -// src/front-components/my-widget.tsx -import { defineFrontComponent } from 'twenty-sdk'; - -const MyWidget = () => { - return ( -
-

My Custom Widget

-

This is a custom front component for Twenty.

-
- ); -}; - -export default defineFrontComponent({ - universalIdentifier: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', - name: 'my-widget', - description: 'A custom widget component', - component: MyWidget, -}); -``` - -Key points: -- Front components are React components that render in isolated contexts within Twenty. -- The `component` field references your React component. -- Components are built and synced automatically during `yarn twenty dev`. - -You can create new front components in two ways: - -- **Scaffolded**: Run `yarn twenty entity:add` and choose the option to add a new front component. -- **Manual**: Create a new `.tsx` file and use `defineFrontComponent()`, following the same pattern. - -#### Where front components can be used - -Front components can render in two locations within Twenty: - -- **Side panel** — Non-headless front components open in the right-hand side panel. This is the default behavior when a front component is triggered from the command menu. -- **Widgets (dashboards and record pages)** — Front components can be embedded as widgets inside page layouts. When configuring a dashboard or a record page layout, users can add a front component widget. - -#### Headless vs non-headless - -Front components come in two rendering modes controlled by the `isHeadless` option: - -**Non-headless (default)** — The component renders a visible UI. When triggered from the command menu it opens in the side panel. This is the default behavior when `isHeadless` is `false` or omitted. - -**Headless** — The component mounts invisibly in the background. It does not open the side panel. Headless components are designed for actions that execute logic and then unmount themselves — for example, running an async task, navigating to a page, or showing a confirmation modal. They pair naturally with the SDK Command components described below. - -```typescript -export default defineFrontComponent({ - universalIdentifier: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', - name: 'my-action', - description: 'Runs an action without opening the side panel', - component: MyAction, - isHeadless: true, - command: { - universalIdentifier: 'b2c3d4e5-f6a7-8901-bcde-f12345678901', - label: 'Run my action', - }, -}); -``` - -#### Adding command menu items - -To make a front component appear as an item in Twenty's command menu, add the `command` property to `defineFrontComponent()`. When users open the command menu (Cmd+K / Ctrl+K), the item shows up and triggers the front component on click. - -The `command` object accepts the following fields: - -| Field | Type | Description | -|-------|------|-------------| -| `universalIdentifier` | `string` (required) | Unique ID for the command menu item | -| `label` | `string` (required) | Display label shown in the command menu | -| `icon` | `string` (optional) | Icon name (e.g., `'IconSparkles'`) | -| `isPinned` | `boolean` (optional) | Whether the command is pinned at the top of the menu | -| `availabilityType` | `'GLOBAL' \| 'RECORD_SELECTION'` (optional) | `GLOBAL` shows the command everywhere; `RECORD_SELECTION` shows it only in record contexts | -| `availabilityObjectUniversalIdentifier` | `string` (optional) | Restrict the command to a specific object type (e.g., Person) | - -Here is an example from the call-recording app that adds a command scoped to Person records: - -```typescript -import { defineFrontComponent } from 'twenty-sdk'; - -export default defineFrontComponent({ - universalIdentifier: 'c3d4e5f6-a7b8-9012-cdef-123456789012', - name: 'Summarize Person Call Recordings', - description: 'Generates a summary of call recordings for a person', - component: SummarizePersonRecordings, - command: { - universalIdentifier: 'd4e5f6a7-b8c9-0123-defa-234567890123', - label: 'Summarize call recordings', - icon: 'IconSparkles', - isPinned: false, - availabilityType: 'RECORD_SELECTION', - availabilityObjectUniversalIdentifier: - '20202020-e674-48e5-a542-72570eee7213', - }, -}); -``` - -When the command is synced, it appears in the command menu. If the front component is non-headless the side panel opens with the component rendered inside. If it is headless the component mounts in the background and executes its logic. - -#### SDK Command components - -The `twenty-sdk` package provides four Command helper components designed for headless front components. Each component executes an action on mount, handles errors by showing a snackbar notification, and automatically unmounts the front component when done. - -Import them from `twenty-sdk/command`: - -- **`Command`** — Runs an async callback via the `execute` prop. -- **`CommandLink`** — Navigates to an app path. Props: `to`, `params`, `queryParams`, `options`. -- **`CommandModal`** — Opens a confirmation modal. If the user confirms, executes the `execute` callback. Props: `title`, `subtitle`, `execute`, `confirmButtonText`, `confirmButtonAccent`. -- **`CommandOpenSidePanelPage`** — Opens a specific side panel page. Props: `page`, `pageTitle`, `pageIcon`. - -Here is a full example of a headless front component using `Command` to run an action from the command menu: - -```typescript -// src/front-components/run-action.tsx -import { defineFrontComponent } from 'twenty-sdk'; -import { Command } from 'twenty-sdk/command'; -import { CoreApiClient } from 'twenty-sdk/clients'; - -const RunAction = () => { - const execute = async () => { - const client = new CoreApiClient(); - - await client.mutation({ - createTask: { - __args: { data: { title: 'Created by my app' } }, - id: true, - }, - }); - }; - - return ; -}; - -export default defineFrontComponent({ - universalIdentifier: 'e5f6a7b8-c9d0-1234-efab-345678901234', - name: 'run-action', - description: 'Creates a task from the command menu', - component: RunAction, - isHeadless: true, - command: { - universalIdentifier: 'f6a7b8c9-d0e1-2345-fabc-456789012345', - label: 'Run my action', - icon: 'IconPlayerPlay', - }, -}); -``` - -And an example using `CommandModal` to ask for confirmation before executing: - -```typescript -// src/front-components/delete-draft.tsx -import { defineFrontComponent } from 'twenty-sdk'; -import { CommandModal } from 'twenty-sdk/command'; - -const DeleteDraft = () => { - const execute = async () => { - // perform the deletion - }; - - return ( - - ); -}; - -export default defineFrontComponent({ - universalIdentifier: 'a7b8c9d0-e1f2-3456-abcd-567890123456', - name: 'delete-draft', - description: 'Deletes a draft with confirmation', - component: DeleteDraft, - isHeadless: true, - command: { - universalIdentifier: 'b8c9d0e1-f2a3-4567-bcde-678901234567', - label: 'Delete draft', - icon: 'IconTrash', - }, -}); -``` - -#### Execution context - -Every front component receives an execution context that provides information about where and how it is running. Access context values using hooks from `twenty-sdk`: - -| Hook | Return type | Description | -|------|-------------|-------------| -| `useFrontComponentId()` | `string` | The unique ID of the current front component instance | -| `useRecordId()` | `string \| null` | The ID of the current record, when the component runs in a record context (e.g., a record page widget or a command scoped to a record). Returns `null` otherwise. | -| `useUserId()` | `string \| null` | The ID of the current user | - -```typescript -import { useRecordId, useUserId } from 'twenty-sdk'; - -const MyWidget = () => { - const recordId = useRecordId(); - const userId = useUserId(); - - return ( -
-

Record: {recordId ?? 'none'}

-

User: {userId ?? 'anonymous'}

-
- ); -}; -``` - -The context is reactive — if the surrounding record changes, hooks automatically return the updated values. - -#### Host API functions - -Front components run in an isolated sandbox but can interact with Twenty's UI through a set of functions provided by the host. Import them directly from `twenty-sdk`: - -```typescript -import { - navigate, - closeSidePanel, - enqueueSnackbar, - unmountFrontComponent, - openSidePanelPage, - openCommandConfirmationModal, -} from 'twenty-sdk'; -``` - -| Function | Signature | Description | -|----------|-----------|-------------| -| `navigate` | `(to, params?, queryParams?, options?) => Promise` | Navigate to a typed app path within Twenty | -| `closeSidePanel` | `() => Promise` | Close the side panel | -| `enqueueSnackbar` | `(params) => Promise` | Show a snackbar notification. Params: `message`, `variant` (`'error'`, `'success'`, `'info'`, `'warning'`), optional `duration`, `detailedMessage`, `dedupeKey` | -| `unmountFrontComponent` | `() => Promise` | Unmount the current front component (used by headless components to clean up after execution) | -| `openSidePanelPage` | `(params) => Promise` | Open a page in the side panel. Params: `page`, `pageTitle`, `pageIcon`, `shouldResetSearchState` | -| `openCommandConfirmationModal` | `(params) => Promise<'confirm' \| 'cancel'>` | Show a confirmation modal and wait for the user's response. Params: `title`, `subtitle`, `confirmButtonText`, `confirmButtonAccent` (`'default'`, `'blue'`, `'danger'`) | - -Here is an example that uses the host API to show a snackbar and close the side panel after an action completes: - -```typescript -import { defineFrontComponent, useRecordId } from 'twenty-sdk'; -import { enqueueSnackbar, closeSidePanel } from 'twenty-sdk'; -import { CoreApiClient } from 'twenty-sdk/clients'; - -const ArchiveRecord = () => { - const recordId = useRecordId(); - - const handleArchive = async () => { - const client = new CoreApiClient(); - - await client.mutation({ - updateTask: { - __args: { id: recordId, data: { status: 'ARCHIVED' } }, - id: true, - }, - }); - - await enqueueSnackbar({ - message: 'Record archived', - variant: 'success', - }); - - await closeSidePanel(); - }; - - return ( -
-

Archive this record?

- -
- ); -}; - -export default defineFrontComponent({ - universalIdentifier: 'c9d0e1f2-a3b4-5678-cdef-789012345678', - name: 'archive-record', - description: 'Archives the current record', - component: ArchiveRecord, -}); -``` - -### Skills - -Skills define reusable instructions and capabilities that AI agents can use within your workspace. Use `defineSkill()` to define skills with built-in validation: - -```typescript -// src/skills/example-skill.ts -import { defineSkill } from 'twenty-sdk'; - -export default defineSkill({ - universalIdentifier: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', - name: 'sales-outreach', - label: 'Sales Outreach', - description: 'Guides the AI agent through a structured sales outreach process', - icon: 'IconBrain', - content: `You are a sales outreach assistant. When reaching out to a prospect: -1. Research the company and recent news -2. Identify the prospect's role and likely pain points -3. Draft a personalized message referencing specific details -4. Keep the tone professional but conversational`, -}); -``` - -Key points: -- `name` is a unique identifier string for the skill (kebab-case recommended). -- `label` is the human-readable display name shown in the UI. -- `content` contains the skill instructions — this is the text the AI agent uses. -- `icon` (optional) sets the icon displayed in the UI. -- `description` (optional) provides additional context about the skill's purpose. - -You can create new skills in two ways: - -- **Scaffolded**: Run `yarn twenty entity:add` and choose the option to add a new skill. -- **Manual**: Create a new file and use `defineSkill()`, following the same pattern. - -### Agents - -Agents define AI agents with system prompts that can operate within your workspace. Use `defineAgent()` to define agents with built-in validation: - -```typescript -// src/agents/example-agent.ts -import { defineAgent } from 'twenty-sdk'; - -export default defineAgent({ - universalIdentifier: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', - name: 'sales-assistant', - label: 'Sales Assistant', - description: 'An AI agent that helps with sales tasks', - icon: 'IconRobot', - prompt: `You are a sales assistant. Help users with: -1. Researching prospects and companies -2. Drafting personalized outreach messages -3. Tracking follow-ups and next steps -4. Analyzing deal pipeline and suggesting actions`, -}); -``` - -Key points: -- `name` is a unique identifier string for the agent (kebab-case recommended). -- `label` is the human-readable display name shown in the UI. -- `prompt` contains the system prompt — this is the instruction text that defines the agent's behavior. -- `icon` (optional) sets the icon displayed in the UI. -- `description` (optional) provides additional context about the agent's purpose. - -You can create new agents in two ways: - -- **Scaffolded**: Run `yarn twenty entity:add` and choose the option to add a new agent. -- **Manual**: Create a new file and use `defineAgent()`, following the same pattern. - -### Generated typed clients - -Two typed clients are auto-generated by `yarn twenty dev` and stored in `node_modules/twenty-sdk/clients` based on your workspace schema: - -- **`CoreApiClient`** — queries the `/graphql` endpoint for workspace data -- **`MetadataApiClient`** — queries the `/metadata` endpoint for workspace configuration and file uploads - -```typescript -import { CoreApiClient } from 'twenty-client-sdk/core'; -import { MetadataApiClient } from 'twenty-client-sdk/metadata'; - -const client = new CoreApiClient(); -const { me } = await client.query({ me: { id: true, displayName: true } }); - -const metadataClient = new MetadataApiClient(); -const { currentWorkspace } = await metadataClient.query({ currentWorkspace: { id: true } }); -``` - -`CoreApiClient` is re-generated automatically by `yarn twenty dev` whenever your objects or fields change. `MetadataApiClient` ships pre-built with the SDK. - -#### Runtime credentials in logic functions - -When your function runs on Twenty, the platform injects credentials as environment variables before your code executes: - -- `TWENTY_API_URL`: Base URL of the Twenty API your app targets. -- `TWENTY_API_KEY`: Short‑lived key scoped to your application's default function role. - -Notes: -- You do not need to pass URL or API key to the generated client. It reads `TWENTY_API_URL` and `TWENTY_API_KEY` from process.env at runtime. -- The API key's permissions are determined by the role referenced in your `application-config.ts` via `defaultRoleUniversalIdentifier`. This is the default role used by logic functions of your application. -- Applications can define roles to follow least‑privilege. Grant only the permissions your functions need, then point `defaultRoleUniversalIdentifier` to that role's universal identifier. - -#### Uploading files - -The `MetadataApiClient` includes an `uploadFile` method for attaching files to file-type fields on your workspace objects. Because standard GraphQL clients do not support multipart file uploads natively, the client provides this dedicated method that implements the [GraphQL multipart request specification](https://github.com/jaydenseric/graphql-multipart-request-spec) under the hood. - -```typescript -import { MetadataApiClient } from 'twenty-client-sdk/metadata'; -import * as fs from 'fs'; - -const metadataClient = new MetadataApiClient(); - -const fileBuffer = fs.readFileSync('./invoice.pdf'); - -const uploadedFile = await metadataClient.uploadFile( - fileBuffer, // file contents as a Buffer - 'invoice.pdf', // filename - 'application/pdf', // MIME type (defaults to 'application/octet-stream') - '58a0a314-d7ea-4865-9850-7fb84e72f30b', // field universal identifier -); - -console.log(uploadedFile); -// { id: '...', path: '...', size: 12345, createdAt: '...', url: 'https://...' } -``` - -The method signature: - -```typescript -uploadFile( - fileBuffer: Buffer, - filename: string, - contentType: string, - fieldMetadataUniversalIdentifier: string, -): Promise<{ id: string; path: string; size: number; createdAt: string; url: string }> -``` - -| Parameter | Type | Description | -|-----------|------|-------------| -| `fileBuffer` | `Buffer` | The raw file contents | -| `filename` | `string` | The name of the file (used for storage and display) | -| `contentType` | `string` | MIME type of the file (defaults to `application/octet-stream` if omitted) | -| `fieldMetadataUniversalIdentifier` | `string` | The `universalIdentifier` of the file-type field on your object | - -Key points: -- The `uploadFile` method is available on `MetadataApiClient` because the upload mutation is resolved by the `/metadata` endpoint. -- It uses the field's `universalIdentifier` (not its workspace-specific ID), so your upload code works across any workspace where your app is installed — consistent with how apps reference fields everywhere else. -- The returned `url` is a signed URL you can use to access the uploaded file. - -### Hello World example - -Explore a minimal, end-to-end example that demonstrates objects, logic functions, front components, and multiple triggers [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-apps/hello-world): - -## Building your app - -Once you've developed your app with `app:dev`, use `app:build` to compile it into a distributable package. - -```bash filename="Terminal" -# Build the app (output goes to .twenty/output/) -yarn twenty build - -# Build and create a tarball (.tgz) for distribution -yarn twenty build --tarball -``` - -The build process: - -1. **Parses and validates the manifest** — reads all `defineX()` entities from your source files and validates the manifest structure. -2. **Compiles logic functions and front components** — bundles TypeScript sources into ESM `.mjs` files using esbuild. -3. **Generates checksums** — computes MD5 hashes for each built file, stored in the manifest as `builtHandlerChecksum` / `builtComponentChecksum`. -4. **Generates the typed API client** — introspects the GraphQL schema and generates typed `CoreApiClient` and `MetadataApiClient` clients. -5. **Runs a TypeScript type check** — runs `tsc --noEmit` to catch type errors before publishing. -6. **Rebuilds with the generated client** — performs a second compilation pass so the generated client types are included. -7. **Optionally creates a tarball** — if `--tarball` is passed, runs `npm pack` to create a `.tgz` file ready for distribution. - -The build output in `.twenty/output/` contains: - -```text -.twenty/output/ -├── manifest.json # Manifest with checksums for all built files -├── package.json # Copied from app root -├── yarn.lock # Copied from app root -├── src/ -│ ├── logic-functions/ # Compiled .mjs logic function files -│ └── front-components/ # Compiled .mjs front component files -├── public/ # Static assets (if any) -└── my-app-1.0.0.tgz # Only with --tarball flag -``` - -| Option | Description | -|--------|-------------| -| `[appPath]` | Path to the app directory (defaults to current directory) | -| `--tarball` | Also pack the output into a `.tgz` tarball | - -## Publishing your app - -Use `app:publish` to distribute your app — either to the npm registry or directly to a Twenty server. - -### Publish to npm (default) - -```bash filename="Terminal" -# Publish to npm (requires npm login) -yarn twenty publish - -# Publish with a dist-tag (e.g. beta, next) -yarn twenty publish --tag beta -``` - -This builds the app and runs `npm publish` from the `.twenty/output/` directory. The published package can then be installed from the Twenty marketplace by any workspace. - -### Publish to a Twenty server - -```bash filename="Terminal" -# Publish directly to a Twenty server -yarn twenty publish --server https://app.twenty.com -``` - -This builds the app with a tarball, uploads it to the server via the `uploadAppTarball` GraphQL mutation, and triggers installation in one step. This is useful for private deployments or testing against a specific server. - -| Option | Description | -|--------|-------------| -| `[appPath]` | Path to the app directory (defaults to current directory) | -| `--server ` | Publish to a Twenty server instead of npm | -| `--token ` | Authentication token for the target server | -| `--tag ` | npm dist-tag (e.g. `beta`, `next`) — only for npm publish | - -## Application registration - -Before an app can be installed in a workspace, it must be **registered**. A registration is a metadata record that describes where the app comes from and how to authenticate it. This is handled automatically by the CLI in most cases. - -### Source types - -Each registration has a **source type** that determines how the app's files are resolved during installation: - -| Source type | How files are resolved | Typical use case | -|-------------|----------------------|------------------| -| `LOCAL` | Files are synced in real-time by the CLI watcher — installation is skipped | Development with `app:dev` | -| `NPM` | Fetched from the npm registry via the `sourcePackage` field | Published apps on npm | -| `TARBALL` | Extracted from an uploaded `.tgz` file stored on the server | Private apps published with `--server` | - -### How registration happens - -- **`app:dev`** — automatically creates a `LOCAL` registration the first time you run dev mode against a workspace. -- **`app:publish --server`** — uploads a tarball and creates (or updates) a `TARBALL` registration, then installs the app. -- **npm marketplace** — `NPM` registrations are created when apps are synced from the npm registry into the Twenty marketplace catalog. -- **GraphQL API** — you can also create registrations programmatically via the `createApplicationRegistration` mutation. - -### Registration vs installation - -**Registration** and **installation** are separate concepts: - -- A **registration** (`ApplicationRegistration`) is a global metadata record describing the app: its name, source type, OAuth credentials, and marketplace listing status. It exists independently of any workspace. -- An **installation** (`Application`) is a per-workspace instance. When a user installs an app, Twenty resolves the package from the registration's source, writes the built files to storage, and synchronizes the manifest (creating objects, fields, logic functions, etc.) in that workspace. - -One registration can be installed in many workspaces. Each workspace gets its own copy of the app's files and data model. - -### OAuth credentials - -Each registration includes OAuth credentials (`oAuthClientId` and `oAuthClientSecret`) generated at creation time. These are used by the app to authenticate API requests on behalf of users. The client secret is returned **once** at creation — store it securely. You can rotate it later via the `rotateApplicationRegistrationClientSecret` mutation. - -## Manual setup (without the scaffolder) - -While we recommend using `create-twenty-app` for the best getting-started experience, you can also set up a project manually. Do not install the CLI globally. Instead, add `twenty-sdk` as a local dependency and wire a single script in your package.json: - -```bash filename="Terminal" -yarn add -D twenty-sdk -``` - -Then add a `twenty` script: - -```json filename="package.json" -{ - "scripts": { - "twenty": "twenty" - } -} -``` - -Now you can run all commands via `yarn twenty `, e.g. `yarn twenty dev`, `yarn twenty help`, etc. - -## Troubleshooting - -- Authentication errors: run `yarn twenty auth:login` and ensure your API key has the required permissions. -- Cannot connect to server: verify the API URL and that the Twenty server is reachable. -- Types or client missing/outdated: restart `yarn twenty dev` — it auto-generates the typed client. -- Dev mode not syncing: ensure `yarn twenty dev` is running and that changes are not ignored by your environment. - -Discord Help Channel: https://discord.com/channels/1130383047699738754/1130386664812982322 +See the [Getting Started](/developers/extend/apps/getting-started) guide for the full CLI reference. diff --git a/packages/twenty-docs/images/docs/developers/extends/apps/app-in-ui-1.png b/packages/twenty-docs/images/docs/developers/extends/apps/app-in-ui-1.png new file mode 100644 index 0000000000000000000000000000000000000000..2eb251185f44fe1a567ed09b29ff90fed4f56a04 GIT binary patch literal 1298023 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

tt1d1_Xzg?}fHCg{)R+`Vnv&q=J<6urmxJ%nxV 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

Ik*Rv>MWK?sR}f(8gfL=rMkrHaT@MHyq# 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