Uygulamalar Nedir?
Uygulamalar, Twenty özelleştirmelerini kod olarak oluşturup yönetmenizi sağlar. Her şeyi UI üzerinden yapılandırmak yerine, veri modelinizi ve mantık fonksiyonlarınızı kodla tanımlarsınız — bu da oluşturmayı, bakımı ve birden çok çalışma alanına dağıtmayı hızlandırır. Bugün Yapabilecekleriniz:- Özel nesneleri ve alanları kod olarak tanımlayın (yönetilen veri modeli)
- Özel tetikleyicilerle mantık fonksiyonları oluşturun
- Aynı uygulamayı birden çok çalışma alanına dağıtın
Ön Gereksinimler
- Node.js 24+ ve Yarn 4
- Bir Twenty çalışma alanı ve bir API anahtarı (https://app.twenty.com/settings/api-webhooks adresinde oluşturun)
Başlarken
Resmi scaffolder aracını kullanarak yeni bir uygulama oluşturun, ardından kimlik doğrulaması yapıp geliştirmeye başlayın:Proje yapısı (şablondan oluşturulmuş)
npx create-twenty-app@latest my-twenty-app komutunu çalıştırdığınızda scaffolder şunları yapar:
- Minimal bir temel uygulamayı
my-twenty-app/içine kopyalar - Yerel bir
twenty-sdkbağımlılığı ve Yarn 4 yapılandırması ekler twentyCLI ile bağlantılı yapılandırma dosyaları ve betikler oluşturur- Varsayılan bir uygulama yapılandırması ve varsayılan bir fonksiyon rolü üretir
- package.json: Declares the app name, version, engines (Node 24+, Yarn 4), and adds
twenty-sdkplus atwentyscript that delegates to the localtwentyCLI. Runyarn twenty helpto list all available commands. - .gitignore:
node_modules,.yarn,generated/(türlendirilmiş istemci),dist/,build/, kapsam klasörleri, günlük dosyaları ve.env*dosyaları gibi yaygın artifaktları yok sayar. - yarn.lock, .yarnrc.yml, .yarn/: Proje tarafından kullanılan Yarn 4 araç zincirini kilitler ve yapılandırır.
- .nvmrc: Projenin beklediği Node.js sürümünü sabitler.
- eslint.config.mjs ve tsconfig.json: Uygulamanızın TypeScript kaynakları için linting ve TypeScript yapılandırması sağlar.
- README.md: Uygulama kökünde temel talimatların yer aldığı kısa bir README.
- public/: Uygulamanızla birlikte sunulacak genel varlıkları (görseller, yazı tipleri, statik dosyalar) depolamak için bir klasör. Buraya yerleştirilen dosyalar senkronizasyon sırasında yüklenir ve çalışma zamanında erişilebilir olur.
- src/: Uygulamanızı kod olarak tanımladığınız ana yer
Varlık algılama
SDK, TypeScript dosyalarınızıexport default define<Entity>({...}) çağrılarını arayarak ayrıştırıp varlıkları algılar. Her varlık türünün, twenty-sdk tarafından dışa aktarılan karşılık gelen bir yardımcı fonksiyonu vardır:
| Yardımcı fonksiyon | Varlık türü |
|---|---|
defineObject() | Özel nesne tanımları |
defineLogicFunction() | Mantık fonksiyon tanımları |
defineFrontComponent() | Front component definitions |
defineRole() | Rol tanımları |
defineField() | Mevcut nesneler için alan genişletmeleri |
Dosya adlandırma esnektir. Varlık algılama AST tabanlıdır — SDK, kaynak dosyalarınızı
export default define<Entity>({...}) desenini bulmak için tarar. Dosyalarınızı ve klasörlerinizi dilediğiniz gibi düzenleyebilirsiniz. Varlık türüne göre gruplama (örn. logic-functions/, roles/) bir gereklilik değil, yalnızca kod organizasyonu için bir gelenektir.yarn twenty app:generatewill create agenerated/folder (typed Twenty client + workspace types).yarn twenty entity:addwill add entity definition files undersrc/for your custom objects, functions, front components, or roles.
Kimlik Doğrulama
The first time you runyarn twenty auth:login, you’ll be prompted for:
- API URL’si (varsayılan: http://localhost:3000 veya mevcut çalışma alanı profiliniz)
- API anahtarı
~/.twenty/config.json içinde saklanır. You can maintain multiple profiles and switch between them.
Managing workspaces
yarn twenty auth:switch, all subsequent commands will use that workspace by default. You can still override it temporarily with --workspace <name>.
SDK kaynaklarını kullanın (türler ve yapılandırma)
twenty-sdk, uygulamanız içinde kullandığınız türlendirilmiş yapı taşları ve yardımcı fonksiyonlar sağlar. Aşağıda en sık dokunacağınız başlıca parçalar yer alıyor.Yardımcı fonksiyonlar
SDK, uygulama varlıklarınızı tanımlamak için yardımcı fonksiyonlar sağlar. Varlık algılama bölümünde açıklandığı gibi, varlıklarınızın algılanması içinexport default define<Entity>({...}) kullanmalısınız:
| Fonksiyon | Amaç |
|---|---|
defineApplication() | Uygulama meta verilerini yapılandırın (zorunlu, uygulama başına bir adet) |
defineObject() | Alanlara sahip özel nesneler tanımlayın |
defineLogicFunction() | İşleyicilerle mantık fonksiyonları tanımlayın |
defineFrontComponent() | Özel kullanıcı arayüzü için ön uç bileşenlerini tanımlayın |
defineRole() | Rol izinlerini ve nesne erişimini yapılandırın |
defineField() | Mevcut nesneleri ek alanlarla genişletin |
Nesnelerin tanımlanması
Özel nesneler, çalışma alanınızdaki kayıtlar için hem şemayı hem de davranışı tanımlar. Yerleşik doğrulamayla nesneler tanımlamak içindefineObject() kullanın:
- Yerleşik doğrulama ve daha iyi IDE desteği için
defineObject()kullanın. universalIdentifierdağıtımlar arasında benzersiz ve kararlı olmalıdır.- Her alan bir
name,type,labelve kendi kararlıuniversalIdentifierdeğerini gerektirir. fieldsdizisi isteğe bağlıdır — özel alanlar olmadan da nesneler tanımlayabilirsiniz.- You can scaffold new objects using
yarn twenty entity:add, which guides you through naming, fields, and relationships.
Temel alanlar otomatik olarak oluşturulur. Özel bir nesne tanımladığınızda Twenty,
name, createdAt, updatedAt, createdBy, position ve deletedAt gibi standart alanları otomatik olarak ekler. Bunları fields dizinizde tanımlamanız gerekmez — yalnızca özel alanlarınızı ekleyin.Uygulama yapılandırması (application-config.ts)
Her uygulamanın aşağıdakileri açıklayan tek birapplication-config.ts dosyası vardır:
- Uygulamanın kim olduğu: tanımlayıcılar, görünen ad ve açıklama.
- Fonksiyonlarının nasıl çalıştığı: izinler için hangi rolü kullandıkları.
- (İsteğe bağlı) değişkenler: fonksiyonlarınıza ortam değişkenleri olarak sunulan anahtar–değer çiftleri.
defineApplication() kullanın:
universalIdentifieralanları size ait belirleyici kimliklerdir; bunları bir kez oluşturun ve eşitlemeler boyunca kararlı tutun.applicationVariables, fonksiyonlarınız için ortam değişkenlerine dönüşür (örneğin,DEFAULT_RECIPIENT_NAMEdeğeriprocess.env.DEFAULT_RECIPIENT_NAMEolarak kullanılabilir).defaultRoleUniversalIdentifier, rol dosyasıyla eşleşmelidir (aşağıya bakın).
Roller ve izinler
Uygulamalar, çalışma alanınızdaki nesneler ve eylemler üzerindeki izinleri kapsülleyen roller tanımlayabilir.application-config.ts içindeki defaultRoleUniversalIdentifier alanı, uygulamanızın mantık fonksiyonlarının kullandığı varsayılan rolü belirtir.
TWENTY_API_KEYolarak enjekte edilen çalışma zamanı API anahtarı bu varsayılan fonksiyon rolünden türetilir.- Türlendirilmiş istemci, o role tanınan izinlerle sınırlandırılır.
- En az ayrıcalık ilkesini izleyin: Yalnızca fonksiyonlarınızın ihtiyaç duyduğu izinlere sahip özel bir rol oluşturun ve ardından evrensel tanımlayıcısına referans verin.
Varsayılan fonksiyon rolü (*.role.ts)
Yeni bir uygulama oluşturduğunuzda CLI ayrıca varsayılan bir rol dosyası da oluşturur. Yerleşik doğrulamayla roller tanımlamak içindefineRole() kullanın:
universalIdentifier değeri daha sonra application-config.ts içinde defaultRoleUniversalIdentifier olarak referans verilir. Başka bir deyişle:
- *.role.ts, varsayılan fonksiyon rolünün neler yapabileceğini tanımlar.
- application-config.ts, fonksiyonlarınızın izinlerini devralması için bu role işaret eder.
- Oluşturulan rol ile başlayın ve en az ayrıcalık ilkesini izleyerek aşamalı olarak kısıtlayın.
objectPermissionsvefieldPermissionsdeğerlerini, fonksiyonlarınızın ihtiyaç duyduğu nesneler/alanlarla değiştirin.permissionFlags, platform düzeyindeki yeteneklere erişimi kontrol eder. Minimumda tutun; yalnızca ihtiyacınız olanları ekleyin.- Çalışan bir örneği Hello World uygulamasında görün:
packages/twenty-apps/hello-world/src/roles/function-role.ts.
Mantık fonksiyon yapılandırması ve giriş noktası
Her fonksiyon dosyası, bir işleyici ve isteğe bağlı tetikleyiciler içeren bir yapılandırmayı dışa aktarmak içindefineLogicFunction() kullanır.
- route: Fonksiyonunuzu bir HTTP yolu ve yöntemiyle
/s/uç noktası altında sunar:
örn.path: '/post-card/create',-><APP_URL>/s/post-card/createüzerinden çağırın
- cron: Bir CRON ifadesi kullanarak fonksiyonunuzu bir zamanlamayla çalıştırır.
- databaseEvent: Çalışma alanı nesnesi yaşam döngüsü olaylarında çalışır. Olay işlemi
updatedolduğunda, dinlenecek belirli alanlarupdatedFieldsdizisinde belirtilebilir. Tanımsız veya boş bırakılırsa, herhangi bir güncelleme fonksiyonu tetikler.
örn. person.updated
Notlar:
triggersdizisi isteğe bağlıdır. Tetikleyicisi olmayan fonksiyonlar, diğer fonksiyonlar tarafından çağrılan yardımcı fonksiyonlar olarak kullanılabilir.- Tek bir fonksiyonda birden çok tetikleyici türünü birleştirebilirsiniz.
Rota tetikleyicisi yükü
Bir rota tetikleyicisi mantık fonksiyonunuzu çağırdığında, AWS HTTP API v2 formatını izleyen birRoutePayload nesnesi alır. Türü twenty-sdk içinden içe aktarın:
RoutePayload türünün yapısı şu şekildedir:
| Özellik | Tür | Açıklama |
|---|---|---|
headers | Record<string, string | undefined> | HTTP başlıkları (forwardedRequestHeaders içinde listelenenlerle sınırlı) |
queryStringParameters | Record<string, string | undefined> | Sorgu dizesi parametreleri (birden çok değer virgülle birleştirilir) |
pathParameters | Record<string, string | undefined> | Rota deseninden çıkarılan yol parametreleri (örn., /users/:id → { id: '123' }) |
gövde | object | null | Ayrıştırılmış istek gövdesi (JSON) |
isBase64Encoded | boolean | Gövdenin base64 ile kodlanıp kodlanmadığı |
requestContext.http.method | string | HTTP yöntemi (GET, POST, PUT, PATCH, DELETE) |
requestContext.http.path | string | Ham istek yolu |
HTTP başlıklarını iletme
Varsayılan olarak, güvenlik nedenleriyle gelen isteklerden HTTP başlıkları mantık fonksiyonunuza aktarılmaz. Belirli başlıklara erişmek için bunları açıkçaforwardedRequestHeaders dizisinde listeleyin:
Başlık adları küçük harfe normalize edilir. Onlara küçük harfli anahtarlarla erişin (örneğin,
event.headers['content-type']).- Scaffolded: Run
yarn twenty entity:addand choose the option to add a new logic function. Bu, bir işleyici ve yapılandırma içeren bir başlangıç dosyası oluşturur. - Manuel: Yeni bir
*.logic-function.tsdosyası oluşturun ve aynı deseni izleyerekdefineLogicFunction()kullanın.
Ön uç bileşenleri
Ön uç bileşenleri, Twenty’nin kullanıcı arayüzünde görüntülenen özel React bileşenleri oluşturmanıza olanak tanır. Yerleşik doğrulamayla bileşenleri tanımlamak içindefineFrontComponent() kullanın:
- Ön uç bileşenleri, Twenty içinde yalıtılmış bağlamlarda görüntülenen React bileşenleridir.
- Otomatik algılama için
*.front-component.tsxdosya soneğini kullanın. componentalanı, React bileşeninize referans verir.- Components are built and synced automatically during
yarn twenty app:dev.
- Scaffolded: Run
yarn twenty entity:addand choose the option to add a new front component. - Manuel: Yeni bir
*.front-component.tsxdosyası oluşturun vedefineFrontComponent()kullanın.
Oluşturulmuş türlendirilmiş istemci
Runyarn twenty app:generate to create a local typed client in generated/ based on your workspace schema. Fonksiyonlarınızda kullanın:
yarn twenty app:generate. Nesnelerinizi değiştirdikten sonra veya yeni bir çalışma alanına katılırken yeniden çalıştırın.
Mantık fonksiyonlarında çalışma zamanı kimlik bilgileri
Fonksiyonunuz Twenty üzerinde çalıştığında, platform kodunuz yürütülmeden önce kimlik bilgilerini ortam değişkenleri olarak enjekte eder:TWENTY_API_URL: Uygulamanızın hedeflediği Twenty API’nin temel URL’si.TWENTY_API_KEY: Uygulamanızın varsayılan fonksiyon rolü kapsamına sahip kısa ömürlü anahtar.
- Oluşturulan istemciye URL veya API anahtarı geçirmeniz gerekmez. Çalışma zamanında
TWENTY_API_URLveTWENTY_API_KEYdeğerlerini process.env üzerinden okur. - API anahtarının izinleri,
application-config.tsiçindedefaultRoleUniversalIdentifieraracılığıyla referans verilen role göre belirlenir. Bu, uygulamanızın mantık fonksiyonları tarafından kullanılan varsayılan roldür. - Uygulamalar, en az ayrıcalık ilkesini izlemek için roller tanımlayabilir. Yalnızca fonksiyonlarınızın ihtiyaç duyduğu izinleri verin ve ardından
defaultRoleUniversalIdentifierdeğerini o rolün evrensel tanımlayıcısına yönlendirin.
Hello World örneği
Nesneleri, mantık fonksiyonlarını, ön uç bileşenlerini ve birden çok tetikleyiciyi gösteren minimal, uçtan uca bir örneği buradan inceleyin:Manuel kurulum (scaffolder olmadan)
En iyi başlangıç deneyimi içincreate-twenty-app kullanmanızı önersek de, bir projeyi manuel olarak da kurabilirsiniz. CLI’yi global olarak kurmayın. Instead, add twenty-sdk as a local dependency and wire a single script in your package.json:
twenty script:
yarn twenty <command>, e.g. yarn twenty app:dev, yarn twenty app:generate, yarn twenty help, etc.
Sorun Giderme
- Authentication errors: run
yarn twenty auth:loginand ensure your API key has the required permissions. - Sunucuya bağlanılamıyor: API URL’sini ve Twenty sunucusunun erişilebilir olduğunu doğrulayın.
- Types or client missing/outdated: run
yarn twenty app:generate. - Dev mode not syncing: ensure
yarn twenty app:devis running and that changes are not ignored by your environment.