Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Drop a transcript. Get a summary, action items, and Slack push — all powered by AI.


What's this?

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.


How it works

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.


Tech

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

Project layout

├── 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

Get it running

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 dev

Open http://localhost:5173, drop a .txt file, and you're off.


Config

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

API

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.


Running tests

cd backend
npm run test        # unit tests
npm run test:e2e    # e2e tests

Made with ☕ and LangGraph

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages