๐ป Inspiration
Nobody lost the notes. The notes just never met.
| Call ยท Sep 15 | Contract ยท Sep 24 | Ticket ยท MH-2041 | |
|---|---|---|---|
| The line | Sandbox, this week | Mutually agreed | No owner. URL 404 |
| Filed as | ๐ฃ๏ธ a yes | ๐ a maybe | ๐ซ a waiting room |
ghostedbyourownteam.work is that gap as a domain. Your own team said it. The filing cabinet cannot prove it.
๐ฌ One promise, two weeks
Meridian Health wants payroll connected to its clinical system, so nobody retypes hours every pay period.
| When | Who | What landed |
|---|---|---|
| Sep 15 | ๐ฃ๏ธ Discovery call | "We'll get you a sandbox and an integration timeline. I'll follow up this week." |
| Sep 16 | โ๏ธ The client, again | Still asking for the sandbox and the timeline. |
| Sep 23 | ๐ Internal note | About 6 weeks once a sandbox exists. The sandbox was never stood up. |
| Sep 24 | ๐ Draft contract | "Detailed integration timeline to be mutually agreed during onboarding." |
| Sep 24 | ๐ซ Ticket MH-2041 | Unassigned. Credentials never arrived. The URL returns a 404. |
| Sep 30 | ๐ Check-in | A competitor already handed them a sandbox. The ask is the same ask. |
A notetaker saves all six. It never notices they disagree.
๐ What it does
One client. Calls, emails, notes, contracts, tickets, chats, recordings.
| It hunts | The test |
|---|---|
| ๐ป Ghosts | Said to the client. Missing from every contract, ticket, chat, and note. A call is not "written down." An email is not either. |
| โก Fights | Two sources. One promise. Two different sentences. |
The card on the first screen
| Meridian Health | health 17 / 100 |
|---|---|
| โก SOC 2 dates disagree | severity 5 |
| "Absolutely, we can commit to SOC 2 by Q2." | "best-effort basis. No specific date." |
| view evidence | review the draft |
| Five more sit on this screen. | The rest is one button away. |
| On every card | Where it comes from |
|---|---|
| The quote | Lifted. Never rewritten. |
| The reasoning | Why these lines are the same promise. |
| Severity | 1 to 5. |
| Confidence | How sure the match is. |
| The draft | The 11pm email, already written. |
๐๏ธ Drop a recording on it. Gemini hears the sentence, then points at the file already on the account that disagrees.
๐ Ask it something sharp. Azure shows the scrap it found. Gemini is not allowed to leave that scrap.
๐ The dial, out loud
Start at 100. Take the six flags on that screen. For each one, subtract penalty times severity over five. Keep what is left between 0 and 100.
$$ H = \max\left(0,\ 100 - \sum_{i} \operatorname{round}\left(p_{t_i} \cdot \frac{s_i}{5}\right)\right) $$
(p_{t_i}) is the penalty for that type. (s_i) is severity, 1 to 5. Worst first, then most confident. The account page and the triage list share this exact set.
| Sitting on the screen | Hit | |
|---|---|---|
| SOC 2 dates that disagree | contradiction | 8 |
| SOC 2 promised, never filed | ghost | 15 |
| Ticket with nobody on it | orphan | 8 |
| Rate lock promised, never filed | ghost | 15 |
| If the SOC 2 fight stays open | projection | 12 |
| They named a competitor | churn | 25 |
| 100 minus 83 | left on the dial | 17 |
| Flag | In human | Penalty |
|---|---|---|
| ๐ฅ Churn risk | They said the quiet part | 25 |
| โก Promise vs reality | Call and contract, not speaking | 20 |
| ๐ป Ghost commitment | Said. Never written. Will be denied. | 15 |
| โ๏ธ Cold signal | They asked. The thread died. | 12 |
| ๐ Forward projection | Ignore it, and here is the week it breaks | 12 |
| ๐ซฅ Orphan | Real promise. No owner. | 8 |
| โ๏ธ Contradiction | Two documents. Two realities. | 8 |
๐ ๏ธ How I built it
Next.js 14, React 18, TypeScript, Tailwind in front. FastAPI behind it. Postgres 16 under it. Docker Compose boots all three: Postgres, a Python 3.11 API, a Node 20 web app.
Gemini judges. Azure reads and retrieves. That is the whole architecture.
| Who | Job | Hard limit |
|---|---|---|
| โจ Gemini 2.5 Flash | Extract, merge nicknames, detect, project, draft, answer, hear | JSON only. Thinking off. A re-analyze can happen live. |
| ๐ข Azure OpenAI | text-embedding-3-large, 3072 numbers |
Embeddings. No opinions. |
| ๐ Azure AI Search | Words + vectors + a semantic rerank | One account. Caption on. Index parallax-evidence. |
| ๐ Document Intelligence | Read the PDF | pdfplumber if Azure shrugs. |
| ๐๏ธ Postgres 16 | Raw text, facts, flags, drafts, every snapshot | It just keeps it. |
| โ๏ธ Resend | Send the draft | No key, and the button still acts like it sent. |
| Beat | What actually happens |
|---|---|
| 1 | Paste stays raw. PDFs go to Document Intelligence. Recordings go to Gemini. |
| 2 | Chunks of about 2,000 characters, tagged with account, source, kind, title, and when. |
| 3 | Already-read sources get skipped on the next analyze. |
| 4 | Near-duplicate flags collapse. Two per type. Projections get to stay. |
| 5 | One draft each. Email, Slack, or a task. Owner. Date. No "[Name]". |
| 6 | Flags swap in one commit. The page never flashes empty. |
Framer Motion draws the ring. Recharts draws the trend. SQLAlchemy 2 and asyncpg talk to Postgres. google-genai carries the audio. httpx carries Azure, Resend, and the Whisper understudy.
๐งฑ Where it almost fell over
| Wall | What I did instead |
|---|---|
| gpt-4o never received quota | Reasoning left Azure. Gemini judges. Azure only reads and finds. |
| The first analyze would not shut up | Dozens of flags, one SOC 2 promise. Twins collapse now. |
| The dial was wearing a costume | An early number was nudged. It is the six flags on the screen now. |
| Whisper ate a tiny budget | Hearing moved to Gemini, and it compares the clip to sources already on the account. |
| Document Intelligence hated the first region | It lives in France Central, beside the other Azure resources. |
๐ Receipts
| If you ask | I can show |
|---|---|
| How do you know it was never written? | Search came back empty across contract, ticket, chat, and note. The quote on the card is the source. |
| Can a person read the first screen? | Six flags. Two sentences. A draft. One button for the rest. |
| Does the loop actually run? | Create. Delete. PDF. Recording. Re-analyze. Ask. Same pipeline. |
| Can it hear? | A clip said "we will waive the setup fee." Gemini pointed at an earlier call that waived it only for a second hospital. |
| Did Azure do three jobs? | An embedding returned. Search captioned Meridian's mail. Document Intelligence returned the PDF line. |
| Who built it? | One person. This weekend. |
๐ What stuck
Taking the notes was never the hard part. Noticing that two documents about the same promise disagree, before the client has to point at it, is the hard part.
One flag per sentence feels smart and reads as static. One issue, the quotes stapled to it, one next step.
A score you cannot say out loud is decoration. This one can: 100, minus the six flags on the screen.
Search shows the caption. Gemini stays on it. That line is the difference between an answer and a guess.
๐ What's next for Parallax
| Soon | So the demo can retire | |
|---|---|---|
| ๐ฅ | Stop pasting | Inbox, calendar recording, and the support queue show up on their own. |
| ๐จ | Send it for real | The draft lands in the client's thread. |
| ๐ | Remember the week | The dial keeps a history, not a single run. |
Built With
- azure
- azure-ai-search
- azure-open-ai
- docker
- fastapi
- framermotion
- gemini
- next.js
- postgresql
- pydantic
- python
- react
- recharts
- resend
- sqlalchemy
- tailwindcss
- typescript
Log in or sign up for Devpost to join the conversation.