Inspiration
Each project has its own graveyard: WhatsApp thread, meeting transcriptions, voice notes, PDFs, screenshots, Git commits, Jira tickets etc. If someone joins a project after it has been going on, or if someone joins mid-project, the only way to find out what's really happening is to re-read the entire project to answer this question: What is the current actual state of the project? That's when Threadline came from — not when all the projects were like that, but when one of you gave up half way through re-reading a 400-message WhatsApp thread because of this.
What it does
Threadline reads a disorganized collection of project artifacts and acts like a detective, rather than a search index. It:
- Routes and categorizes all artifacts (documents, conversations, media) to a special agent
- Is able to summarize events, decisions, persons and tasks in the form of structured, source-referenced statements
- Uses multiple sources to create a project sequence
- Finds inconsistencies between artifacts (JWT in architecture document, latest commit says firebase)
- Preserves a Truth State for each fact (current / superseded / conflicting / unverified / and confidence score and supporting evidence).
- Uses only the highest value clarification questions and recalls the answer for a lifetime
- Adjusts knowledge when evidence is presented, without the need for the user to re-explain anything
How we built it
- Backend: Docker, Dockerized API, NextJS API, TypeScript, NextJS
- Backend: Python, FastAPI
- Agent orchestration: Google Agent Development Kit (ADK) routes artifacts to Document/Chat/Multimodal agents, feeds an Evidence Extraction stage into Timeline, Decision and Contradiction agents, which converge on a deterministic Truth Engine
- Different AI models: Gemini 3.5 Flash for classification, extraction, summarization (and cost-conscious default); Gemini 3.5 Pro for complexity contradiction analysis for final reasoning
- Infrastructure: Cloud Run for backend, Firestore for persistent project state (artifacts, events, decisions, contradictions, memory, agent runs), Cloud Storage for uploaded artifacts
A conscious design decision: The Truth Engine itself doesn't call LLM. It's a deterministic state machine that determines if the evidence adds to the confidence about an existing claim, whether it supersedes an old claim, or whether it's a conflict — the project's source of truth isn't up to a model's fancy. We experimented with letting Gemini decide the claim status outright, and on a single test run, it changed the claim status of a fact twice when we gave it two messages of similar wording, so we extracted the decision logic and implemented it as a plain state-machine.
Issues that arose during the challenges:
To be replaced with one actual incident. Suggested shape, delete if not applicable: "The first version of the contradiction detector had a false positive rate that we had not anticipated: Three different messages that paraphrased the same decision were treated as three different, conflicting decisions. We [fixed it by / worked around it by / didn't finish solving it by submission, but /...]".
Confidence is not 100% confident; the Truth Engine gives the content a number, but by the time it was submitted, it was still partly a matter of judgement where "unverified" was deemed to have become "current.
Things we did well we're proud of:
For example, one moment, not a list of categories. Suggested shape: "When it correctly reported the JWT-vs-Firebase paradox, on the first actual use, without me having to tune that example in, it really became a script that works.
What we learned
Still not certain of the line between what the LLM is doing and what the state machine is doing — we've drawn it one way for this build, and it has worked, but we've seen arguments for drawing it differently.
What's next
- Improve the understanding of audio/visual content beyond the "modes" of a single media type (e.g., richer understanding of video and audio content).
- Multiple team corrections for the same row, each with a different true value, but we're not sure that should be automatically done at a team level — maybe it should be at a row level, and then some sort of "consensus" reached by the team;
- A feature that provides a summary of the changes that occurred on the site since the last visit.
Built With
- cloud-run
- cloudstorage
- fastapi
- firestore
- framer-motion
- gemini-3.5-flash
- gemini-3.5-pro
- google-adk
- next.js
- python
- shadcn/ui
- tailwind-css
- typescript
Log in or sign up for Devpost to join the conversation.