← Back to projects

AI Chat Summarizer

A web app that turns long meeting transcripts and uploaded documents into structured, investor-ready summaries — key decisions, action points, deadlines and a confidence assessment.

Python · Flask · OpenAI GPT-4 · PyMuPDF · python-docx View code ↗

A desk lit by a single lamp in a dark room, with a closed laptop, reading glasses and a jar of pens.
01

The problem

The context that matters most in a company is usually the hardest to retrieve: it's buried in an hour-long meeting transcript or a forty-page document, written in the shorthand of the people who were in the room. Anyone outside that room — a new hire, an investor, a stakeholder in another team — has to read all of it to find the three things they actually need.

Naïve summarization doesn't solve this. Ask a model to "summarize this transcript" and you get a shorter transcript: still narrative, still jargon-dense, and with no distinction between a decision that was made and an idea someone floated. The output has to be structured to be useful, and it has to be honest about how confident it is.

02

Approach

Pipeline: PDF, DOCX and TXT uploads are parsed to clean text, sent to GPT-4 with a schema prompt, and returned as structured fields PDF · DOCX · TXT PyMuPDF / python-docx GPT-4 decisions · actions deadlines · confidence clean text schema prompt
Parse before you prompt — the parsing layer is part of the prompt

The app is built around three ideas.

  • Parse before you prompt. Uploaded files are normalised to clean text before the model ever sees them — PyMuPDF for PDFs, python-docx for Word files, direct read for plain text. Feeding a model raw extraction artefacts (broken columns, repeated headers, page furniture) is the fastest way to get a bad summary, so the parsing layer is treated as part of the prompt.
  • Ask for a schema, not a summary. Rather than a single "summarize this" call, the prompt requests specific fields — key decisions, action points, deadlines, open questions — with a confidence assessment attached. The structure is what makes the output scannable, and the confidence field is what makes it trustworthy: a summary that flags its own uncertainty is far more useful than one that states everything with equal conviction.
  • Keep the conversation. Summaries are a starting point, not an endpoint — the follow-up question is where the value is. Chat history is persisted so a document can be interrogated across a session, and conversations can be exported so the output leaves the app.

This grew directly out of the work I did at Prodigal AI, where I built a context-aware chat and document-summarization feature into an in-house messaging app and designed the prompt pipelines that turned dense technical conversation history into investor-friendly summaries.

03

Stack

  • Flask Small enough to stay out of the way. The interesting logic here is the parsing and prompting, not the web layer — a heavier framework would have added structure the project didn't need.
  • OpenAI GPT-4 Long-context reasoning over transcripts, and reliable enough at following a requested output structure that the response can be rendered as fields rather than prose.
  • PyMuPDF Fast, accurate PDF text extraction that preserves reading order — which matters enormously when the next step is feeding it to a language model.
  • python-docx Reads Word documents at the paragraph level, so structure survives into the extracted text instead of collapsing into an undifferentiated blob.
04

Outcome

A working web app that accepts PDF, DOCX and TXT uploads alongside pasted transcripts, and returns a structured summary with decisions, action points, deadlines and a confidence assessment — with persistent chat history and conversation export on top.

The lesson I took from it: with LLM features, most of the quality is decided before the API call. Clean the input, ask for a shape, and the model does the rest. The prompt is the last mile, not the whole road.