Skip to main content
A new app generated by npx create-twenty-app looks like this:
my-twenty-app/
  package.json
  src/
    application-config.ts                   # Required — your app's entry point
    default-role.ts                         # Permissions for logic functions
    constants/
      universal-identifiers.ts              # Auto-generated UUIDs and metadata
    __tests__/
      setup-test.ts
      app-install.integration-test.ts
  .github/workflows/ci.yml                  # GitHub Actions
  public/                                   # Static assets
  vitest.config.ts                          # Test runner config
  tsconfig.json, tsconfig.spec.json
  .nvmrc, .yarnrc.yml, .oxlintrc.json
  README.md, LLMS.md

Key files

File / FolderPurpose
src/application-config.tsRequired. The main configuration file for your app.
src/default-role.tsDefault role controlling what your logic functions can access.
src/constants/universal-identifiers.tsAuto-generated UUIDs and metadata (display name, description).
src/__tests__/Integration tests (setup + example test).
public/Static assets (images, fonts) served with your app.
File organization is up to you. The folders above are conventions — the SDK detects entities via AST analysis on export default defineEntity(...) calls regardless of where the file lives.

Dependencies

Both Twenty SDK packages belong under devDependencies, not dependencies:
{
  "dependencies": {},
  "devDependencies": {
    "twenty-client-sdk": "^2.13.0",
    "twenty-sdk": "^2.13.0"
  }
}
  • twenty-sdk ships the twenty CLI and the build/scaffolding tooling. It only runs at development and build time and is never imported by your published app’s runtime.
  • twenty-client-sdk is imported by your app code (CoreApiClient, MetadataApiClient, RestApiClient), but Twenty provides it at runtime — logic functions get it from a generated SDK layer, and front components resolve it from server-served modules. Your installed copy is only used for typechecking and the deploy-time build, so it never needs to ship in the deployed bundle.
Keeping either package under dependencies pulls it into the installed app’s runtime bundle, where it is dead weight. twenty build emits a warning when either is still listed under dependencies. Add your app’s own runtime dependencies (libraries your logic functions actually import at runtime) under dependencies as usual.