Drop a transcript. Get a summary, action items, and Slack push — all powered by AI.
Ever had a meeting recording but no time to go through the whole thing? Actionify takes a .txt meeting transcript and runs it through a 5-stage AI pipeline to give you:
- Speaker-labeled transcript — who said what
- TL;DR + key points + decisions — one-line summary at a glance
- Action items — who needs to do what by when, in a neat table
- Slack push — all of the above posted straight to your channel
All in a few seconds.
You drop a .txt file
│
▼
┌─ Extract Text ──┐ ← reads your file from disk
└────────┬────────┘
▼
┌── Diarize ──────┐ ← AI labels speakers (Speaker A, Speaker B...)
└────────┬────────┘
▼
┌── Summarize ────┐ ← AI writes TL;DR, key points, decisions
└────────┬────────┘
▼
┌ Extract Actions ┐ ← AI pulls out assignee/task/deadline
└────────┬────────┘
▼
┌── Push to Slack ┐ ← formatted Block Kit message
└─────────────────┘
Built with LangGraph — each stage is a node in a state graph that passes data to the next. If you don't set up Slack, it just skips that step.
| What | What we used |
|---|---|
| Backend | NestJS 11, TypeScript |
| Frontend | React 19, Vite 8, Tailwind CSS 4 |
| AI pipeline | LangChain.js, LangGraph 1.3 |
| LLM | Google Gemini 2.0 Flash or local LM Studio — your call |
| Validation | Zod for AI output, class-validator for API |
| Slack | @slack/web-api with Block Kit |
| Uploads | Multer 2 (.txt only, 10MB max) |
| State/HTTP | TanStack React Query 5, Axios |
├── backend/
│ ├── src/
│ │ ├── langgraph/
│ │ │ ├── state.ts ← what flows through the pipeline
│ │ │ ├── meeting.graph.ts ← stitches the 5 nodes together
│ │ │ └── nodes/
│ │ │ ├── extract-text.node.ts
│ │ │ ├── diarize.node.ts
│ │ │ ├── summarize.node.ts
│ │ │ ├── extract-actions.node.ts
│ │ │ └── slack-push.node.ts
│ │ ├── modules/
│ │ │ ├── upload/ ← file upload endpoint
│ │ │ ├── meeting/ ← process endpoint + orchestrator
│ │ │ ├── slack/ ← Slack message builder
│ │ │ └── llm/ ← picks Gemini or LM Studio
│ │ ├── app.module.ts
│ │ └── main.ts
│ └── .env.example
│
├── frontend/
│ ├── src/
│ │ ├── components/
│ │ │ ├── UploadForm.tsx ← drag & drop area
│ │ │ ├── SummaryCard.tsx ← shows TL;DR, points, decisions
│ │ │ └── ActionItemList.tsx ← table with checkboxes
│ │ ├── api.ts ← talks to the backend
│ │ ├── App.tsx
│ │ └── main.tsx
│ └── vite.config.ts
│
└── sample-transcript.txt
You'll need Node.js 18+ and optionally a Slack bot token + Gemini API key.
# backend
cd backend
npm install
cp .env.example .env # then edit .env with your keys
npm run start:dev
# frontend (new terminal)
cd frontend
npm install
npm run devOpen http://localhost:5173, drop a .txt file, and you're off.
| Variable | Default | What it does |
|---|---|---|
LLM_PROVIDER |
lm-studio |
lm-studio or gemini |
LM_STUDIO_URL |
http://localhost:1234/v1 |
your local LLM endpoint |
GEMINI_API_KEY |
— | key for Gemini |
SLACK_BOT_TOKEN |
— | your Slack bot token |
SLACK_CHANNEL |
#meeting-notes |
where to post results |
PORT |
3000 |
backend port |
POST /upload — upload a .txt file (field name: file)
POST /meeting/process
{ "filePath": "/path/to/file.txt", "slackChannel": "#meeting-notes" }Returns the full pipeline output: raw + diarized transcript, summary, and action items.
cd backend
npm run test # unit tests
npm run test:e2e # e2e testsMade with ☕ and LangGraph