Fixes https://github.com/twentyhq/core-team-issues/issues/1956 **Problem** Within an app, the `.yarn/releases/` folder contains executable Yarn binaries that run when executing any yarn command (`.yarnrc` file indicates yarn path to be `.yarn/releases/yarn-4.9.2.cjs `.) This is a supply chain attack vector: a malicious actor could submit a PR with a compromised `yarn-4.9.2.cjs binary`, which would execute arbitrary code on developers' machines or CI systems. **Fix** Actually, thanks to Corepack, we don't need to store and execute this binary. Corepack can be seen as the manager of a package manager: in `package.json` we indicate a packageManager version like `"packageManager": "yarn@4.9.2"`, and when executing `yarn` Corepack will securely fetch the verified version from npm, avoiding the risk of executing a compromised binary committed to the repository. This was already in our app's package.json template but we were not using it! We can now - remove the folder containing the binary from our app template base-application (that is scaffolded when creating an app through cli), `.yarn/releases/`, and remove `yarnPath: .yarn/releases/yarn-4.9.2.cjs` from its .yarnrc - remove them from the community apps that were already published in the repo - add .yarn to gitignore **Tested** This has been tested and works for app created in the repo, outside the repo, and existing apps in the repo
AI Meeting Transcript
Automatically process meeting transcripts to extract insights, action items, and follow-ups using AI.
Features
- Automatic Transcript Processing: Receives meeting transcripts via webhook from Granola or similar transcription tools
- AI-Powered Analysis: Uses OpenAI to extract:
- Meeting summary
- Key discussion points
- Action items with assignees and due dates
- Commitments made by participants
- Rich Note Creation: Creates formatted notes in Twenty with summary and key points
- Task Generation: Automatically creates tasks for action items and commitments, linked to the meeting note
Requirements
twenty-cli- Install globally:npm install -g twenty-cliapiKey- Go tohttps://twenty.com/settings/api-webhooksto generate oneOpenAI API Key- Get your API key from OpenAI
Installation
- Copy the environment file:
cp .env.example .env
-
Edit
.envand replace the placeholders:<SET_YOUR_TWENTY_API>with your Twenty API key<SET_YOUR_OPENAI_API_KEY>with your OpenAI API key
-
Install dependencies:
yarn install
- Sync the app to your Twenty workspace:
twenty auth login
twenty app sync
Configuration
After syncing, configure the environment variables in your Twenty workspace:
- Go to Settings → Apps → AI Meeting Transcript
- Set the following environment variables:
TWENTY_API_KEY- Your Twenty API keyTWENTY_API_URL- Your Twenty instance URL (e.g.,https://api.twenty.comorhttp://localhost:3000for local development)OPENAI_API_KEY- Your OpenAI API key
Important: TWENTY_API_URL is required and must be set to your Twenty instance URL. For local development, use http://localhost:3000. For production, use your actual Twenty instance URL.
Usage
Webhook Endpoint
The app exposes a public serverless route trigger.
POST /s/webhook/transcript
Examples:
- Local:
POST http://localhost:3000/s/webhook/transcript - Hosted:
POST https://your-twenty-instance.com/s/webhook/transcript
Webhook Payload Format
Send a POST request with the following JSON structure:
{
"transcript": "Full meeting transcript text here...",
"meetingTitle": "Q4 Planning Meeting",
"meetingDate": "2024-01-15",
"participants": ["John Doe", "Jane Smith"],
"metadata": {
"duration": "45 minutes",
"location": "Conference Room A"
}
}
Required Fields:
transcript(string): The full meeting transcript text
Optional Fields:
meetingTitle(string): Title of the meetingmeetingDate(string): Date of the meeting (ISO format or readable date)participants(string[]): List of meeting participantsmetadata(object): Additional metadata about the meeting
Example Webhook Call
curl -X POST https://your-twenty-instance.com/s/webhook/transcript \
-H "Content-Type: application/json" \
-d '{
"transcript": "John: Let'\''s start the meeting. Today we need to discuss Q4 goals. Jane: I agree. We should focus on customer retention. John: Great point. Can you prepare a report by Friday? Jane: Yes, I will have it ready.",
"meetingTitle": "Q4 Planning Meeting",
"meetingDate": "2024-01-15"
}'
What Happens
- Transcript Analysis: The transcript is sent to OpenAI for analysis
- Note Creation: A formatted note is created in Twenty with:
- Meeting summary
- Key discussion points
- Reference to the transcript source
- Task Creation: Tasks are automatically created for:
- Each action item identified
- Each commitment made by participants
- Tasks include a reference to the meeting note ID in their description
Development
Run dev mode to see application updates on your workspace instantly:
twenty app dev
Integration with Granola
To integrate with Granola or similar transcription tools:
- Set up a webhook in your transcription service
- Configure it to POST to:
https://your-twenty-instance.com/s/webhook/transcript - Map the transcription service's payload format to the expected format above
Granola Webhook Setup
If using Granola, configure the webhook to send:
transcriptfield with the transcript text- Optionally include meeting metadata fields
API Response
The webhook returns a JSON response:
{
"success": true,
"noteId": "uuid-of-created-note",
"taskIds": ["uuid-of-task-1", "uuid-of-task-2"],
"summary": {
"noteCreated": true,
"tasksCreated": 2,
"actionItemsProcessed": 1,
"commitmentsProcessed": 1
}
}