058414fae5
## Summary
- Upgrade `ink` from 5.1.1 to 6.8.0 in twenty-sdk (React 19 required, no
API breaking changes)
- Upgrade `react`/`react-dom` from 18 to 19 and
`@types/react`/`@types/react-dom` to 19 in twenty-sdk
- Enable `incrementalRendering` — only redraws changed lines instead of
full output, reducing flickering
- Pause the animation timer when the pipeline is not actively building
or syncing, so Ink stops re-rendering and the terminal becomes
scrollable (fixes inability to scroll up to read errors)
- Remove `AnimationProvider` context — derive animation frames from
`Date.now()` directly in `useStatusIcon`
- Export `NavigationMenuItemType` from `twenty-sdk` (re-exported from
`twenty-shared/types`)
- Add dedicated NavigationMenuItem integration tests to postcard-app
(unique positions, unique identifiers, valid object references)
## Test plan
- [ ] Run `twenty dev` and verify the TUI renders normally during
build/sync
- [ ] Trigger an error and verify the terminal output freezes and
becomes scrollable
- [ ] Verify that after fixing the error, the TUI resumes animating on
next build cycle
- [ ] Verify `import { NavigationMenuItemType } from "twenty-sdk"` works
- [ ] Run postcard-app integration tests and verify new
NavigationMenuItem tests pass
Create Twenty App is the official scaffolding CLI for building apps on top of Twenty CRM. It sets up a ready‑to‑run project that works seamlessly with the 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
- A Twenty workspace and an API key (create one at https://app.twenty.com/settings/api-webhooks)
Quick start
npx create-twenty-app@latest my-twenty-app
cd my-twenty-app
# Get help and list all available commands
yarn twenty help
# Authenticate with your Twenty server
yarn twenty remote add --local
# Add a new entity to your application (guided)
yarn twenty add
# Start dev mode: watches, builds, and syncs local changes to your workspace
# (also auto-generates typed CoreApiClient — MetadataApiClient ships pre-built with the SDK — both available via `twenty-sdk/clients`)
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
Scaffolding modes
Control which example files are included when creating a new app:
| Flag | Behavior |
|---|---|
-e, --exhaustive |
(default) Creates all example files |
-m, --minimal |
Creates only core files (application-config.ts and default-role.ts) |
# Default: all examples included
npx create-twenty-app@latest my-app
# Minimal: only core files
npx create-twenty-app@latest my-app -m
What gets scaffolded
Core files (always created):
application-config.ts— Application metadata configurationroles/default-role.ts— Default role for logic functionslogic-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
twentyscript that delegates to thetwentyCLI from twenty-sdk
Example files (controlled by scaffolding mode):
objects/example-object.ts— Example custom object with a text fieldfields/example-field.ts— Example standalone field extending the example objectlogic-functions/hello-world.ts— Example logic function with HTTP triggerfront-components/hello-world.tsx— Example front componentviews/example-view.ts— Example saved view for the example objectnavigation-menu-items/example-navigation-menu-item.ts— Example sidebar navigation linkskills/example-skill.ts— Example AI agent skill definition__tests__/app-install.integration-test.ts— Integration test that builds, installs, and verifies the app (includesvitest.config.ts,tsconfig.spec.json, and a setup file)
Next steps
- Run
yarn twenty helpto see all available commands. - Use
yarn twenty remote add --localto authenticate with your Twenty workspace. - 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 devwhile you iterate — it watches, builds, and syncs changes to your workspace in real time. CoreApiClient(for workspace data via/graphql) is auto-generated byyarn twenty dev.MetadataApiClient(for workspace configuration and file uploads via/metadata) ships pre-built with the SDK. Both are available viaimport { CoreApiClient, MetadataApiClient } from 'twenty-sdk/clients'.
Build and publish your application
Once your app is ready, build and publish it using the CLI:
# 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:
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.
Troubleshooting
- Auth prompts not appearing: run
yarn twenty remote add --localagain and verify the API key permissions. - Types not generated: ensure
yarn twenty devis running — it auto‑generates the typed client.