TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기AI-assisted meeting execution workspace that turns transcripts into evidence-backed, human-approved action plans.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Turn meetings into action.
Noto turns messy meeting transcripts into evidence-backed, reviewable execution plans — with humans approving what becomes authoritative. Every decision, action item, owner, deadline, open question, and risk is tied back to the exact line in the transcript it came from. I built it as an AI Product Management portfolio project, and this README is my honest writeup of what it does, how it's built, what I evaluated, and what I got wrong along the way.
🔗 Live Demo: noto-meeting-execution.vercel.app · Repo: github.com/yash7536/noto-meeting-executionREADME 전문 보기 ↗Turn meetings into action.
Noto turns messy meeting transcripts into evidence-backed, reviewable execution plans — with humans approving what becomes authoritative. Every decision, action item, owner, deadline, open question, and risk is tied back to the exact line in the transcript it came from. I built it as an AI Product Management portfolio project, and this README is my honest writeup of what it does, how it's built, what I evaluated, and what I got wrong along the way.
🔗 Live Demo: noto-meeting-execution.vercel.app · Repo: github.com/yash7536/noto-meeting-execution
Meeting transcripts already contain everything you need: decisions, tasks, owners, deadlines, unresolved questions, and sometimes outright conflicting statements. The hard part was never summarizing the meeting — any LLM can do that in one prompt. The hard part is turning a messy conversation into something you can actually act on without quietly inventing information that was never said.
That's the failure mode I kept running into with plain LLM summarization: it sounds confident and clean, but it will happily assign an owner nobody volunteered for, pick a deadline out of a vague "sometime next week," or present a proposal as if the room had actually agreed on it. None of that is obvious until someone downstream trusts it and acts on the wrong thing.
One thing I want to be upfront about: Jira and Notion are copy-ready outputs, not live integrations. Noto formats the approved items into Jira ticket markup and Notion-ready markdown you can paste in — it doesn't call the Jira or Notion APIs. That was a deliberate scope call, not an oversight.
AI proposes. The system validates. A human approves.
That principle breaks down into a few concrete rules the product actually enforces:
The Gemini call in this app is a candidate generator, not an authority. It's never allowed to decide status, ownership, or approval on its own — those get computed by deterministic code that checks the model's output against the actual transcript. I did it this way because an LLM extracting structured facts from a conversation will occasionally be wrong in ways that look completely reasonable on the surface, and the cost of a wrong "decision" or a made-up owner showing up in a real execution plan is a lot higher than the cost of asking a human to confirm it. Human review isn't a fallback for when the AI fails — it's a required step for anything that leaves this system.
Before
Meeting transcript
→ manually reread it to find decisions and tasks
→ figure out who owns what and by when
→ write a follow-up email by hand
→ create tickets one by one
→ risk missing something or misreading what was actually agreed
After
Transcript
→ AI extraction
→ evidence validation
→ ambiguity / conflict detection
→ human review
→ approved execution plan
→ email / Jira / Notion-ready output
flowchart TD
A[Messy Transcript] --> B[AI Extraction]
B --> C[Evidence / Source Quotes]
C --> D[Deterministic Validation]
D --> E[Ambiguity + Conflict Detection]
E --> F[Human Review]
F --> G[Approved Execution Items]
G --> H[Email / Jira / Notion]
The app is a Next.js 16 / TypeScript project. When you submit a transcript, it's first parsed into individual turns — each one carries the speaker, a timestamp, and the text they said. Those turns get sent to the Gemini API with a schema that forces structured JSON output: a list of candidates, each with a type (decision / action / question / risk), a title, and — critically — the evidence it's grounded in.
That's where the AI's job ends and the deterministic layer takes over. For every candidate Gemini returns:
I want to be precise about what this actually guarantees. It does not guarantee zero hallucinations, and it does not produce perfectly accurate output. What it does is: the LLM proposes candidates, and independent, non-AI code checks the specific claims that matter most (evidence, ownership, deadlines, conflicts) before anything reaches a human reviewer. If the Gemini call fails for any reason — no API key, network error, malformed response, or the model returning nothing usable — the app automatically falls back to a fully deterministic, regex-based extraction engine so the product still works without the AI path.
Every piece of the UI downstream — the review screen, the plan view, the exports — reads from the same shared ExecutionItem type. Whether an item came from the AI path or the deterministic fallback, it looks identical to everything after extraction, which is what keeps the review and export logic simple.
For the full AI/deterministic/human responsibility breakdown and every guardrail in detail, see docs/AI-SYSTEM-DESIGN.md.
Every extracted item moves through the same lifecycle:
Extracted → Needs Review → Edited / Approved / Rejected
Only items with status: approved are allowed to flow into the approved execution plan, the follow-up email, or the Jira/Notion export. If it hasn't been approved by a person, it doesn't leave the review workspace.
I ran a real evaluation against a frozen gold-set of 18 meeting transcripts with 54 hand-labeled ground-truth items — not a vibe check, an actual precision/recall pass, in two stages.
Stage 1 — controlled experiment (prompt-only, not the deployed product). Before building the product's deterministic validation layer, I ran three prompt-only conditions directly against the Gemini API — no evidence checking, no guardrails, no fallback engine — to see how much of the accuracy gain was actually coming from prompting versus from the deterministic layer:
| Version | Precision | Recall | F1 | Correct | Output | False Positives |
|---|---|---|---|---|---|---|
| C1 — Baseline prompt | 61.2% | 75.9% | 67.8% | 41 | 67 | 26 |
| C2 — + Evidence requirement | 65.1% | 75.9% | 70.1% | 41 | 63 | 22 |
| C3 — + Evidence + Guardrails | 71.9% | 85.2% | 78.0% | 46 | 64 | 18 |
C3 vs. C1: +10.4pp precision, +9.3pp recall, +10.2pp F1, 8 fewer false positives. This is what motivated moving guardrail logic out of the prompt and into deterministic code rather than trying to prompt-engineer my way to reliability — a better prompt helped, but a real validation layer helped more.
Stage 2 — production evaluation, through the actual deployed pipeline (Gemini extraction + deterministic validation + evidence verification, the real app, not a prompt-only condition), 18/18 transcripts complete:
| Metric | Result |
|---|---|
| Precision | 77.8% (49/63) |
| Recall | 90.7% (49/54) |
| F1 | 83.8% |
| Evidence grounding | 100% |
| Decision accuracy | 69.2% (9/13) |
| Owner accuracy | 79.3% (23/29) |
| Deadline accuracy | 86.2% (25/29) |
| Conflict detection | 50% (1/2) |
| Ambiguity handling | 77.8% recall (7/9), 61.5% precision (24/39) |
| Supersession handling | 0/4 |
A few honest notes on these numbers: supersession handling being 0/4 in this run is a real limitation, not a rounding artifact — reversed decisions were hard for this pipeline to catch consistently. Conflict detection on a sample of 2 isn't a number I'd stake much on statistically, but it's reported as-is rather than smoothed over. These are the baseline production metrics, from before the preference-vs-decision guardrail described below — I did not rerun the full 18-transcript evaluation after that fix, so I'm not claiming these numbers reflect the current, improved behavior.
Real user testing surfaced a genuine failure: the system could sometimes treat a preference or a proposal as if it were a finalized decision. The specific case that exposed it: in one test meeting, Sara said she preferred a 15-minute slot, Devraj said he preferred 5 minutes, and Marcus said they should test both before deciding anything — and the extraction still produced a "decision" for whichever option got mentioned most recently, instead of recognizing that nothing had actually been decided.
That's a meaningfully bad failure mode for a product whose entire pitch is "don't invent information." The underlying insight: a preference, proposal, or discussion point is not necessarily a decision — and a system that can't tell the difference will confidently fabricate consensus that never happened. I added a deterministic guardrail layer that checks decision candidates against tentative language ("I'd prefer," "maybe," "I think we should") and explicit deferral language ("let's decide after legal signs off," "before deciding") — if either shows up without a genuinely decisive statement overriding it, the item gets demoted from a decision to an open question instead of being fabricated as settled.
After that change: 41/41 regression tests passed, and the specific failure cases from user testing passed on targeted retest. I have not run a new full 18-transcript production accuracy score against this change, so I'm not claiming a new headline number here — just that the specific bug is fixed and covered by tests going forward.
When it's genuinely unclear who owns something — nobody was named, or multiple people were mentioned as possible owners — Noto is supposed to surface that uncertainty rather than guessing. This mostly works well but isn't perfect; see Limitations below.
When two people take opposing positions on the same topic and the meeting doesn't resolve it, Noto is supposed to surface both sides as an unresolved conflict rather than picking one. This works for clearly-worded disagreements but can miss more subtly phrased ones — also covered in Limitations.
I ran exploratory usability testing with 8 real people — not a statistically significant study, just real users clicking through the actual product:
Worth being precise about the methodology: this wasn't 8 independently-designed scenarios. Some testers — including within the club-coordinator group — worked from the same starting transcript rather than each bringing a fully separate real meeting. But the reactions, confusion, and the failure below all came from real people actually using the product, not from me testing my own app. Full findings, organized as observation → impact → product response, are in docs/USER-RESEARCH.md.
That testing is what surfaced the preference-vs-decision bug described above, which led to the guardrail fix, the regression test suite, and a targeted retest of the original failure cases.
Directional testing surfaced three failure modes in total — wrong owner identification, a preference treated as a decision, and conflicting options turned into a decision. Each is handled with deterministic validation and covered by the regression suite (41/41 passing, a targeted regression result rather than an F1 score).
I'm not going to invent a measured ROI number for a portfolio project tested by 8 people. What I can say honestly is where the value is supposed to come from:
I haven't measured time saved, and I'm not going to put a number on it here — I don't have data to back one up. The honest claim is the one above: less manual reconstruction work, and a record you can actually check instead of trusting someone's memory of the call.
Verified against package.json:
@google/genai ^2.21.0) for the AI extraction steppersist middlewareInteraction & motion: small, deliberate CSS-only animation system (app/globals.css) — entrance/stagger keyframes, a sliding tab indicator, a two-phase toast, a reusable count-up number component — plus a collapsible, persisted sidebar. Everything respects prefers-reduced-motion.
copilot-app/
├── app/
│ ├── api/analyze/route.ts # The one API route — runs extraction + validation
│ ├── dashboard/ # Dashboard / meeting list overview
│ ├── new-meeting/ # Transcript input screen
│ ├── meetings/[id]/
│ │ ├── processing/ # Extraction-in-progress state
│ │ ├── review/ # Human review workspace (the core screen)
│ │ ├── plan/ # Approved execution plan
│ │ ├── follow-up/ # Follow-up email draft
│ │ └── export/ # Jira / Notion copy-ready export
│ └── execution-plans/ # All approved plans
├── components/ # AppShell, ItemCard, EvidenceBlock, EditDrawer, etc.
├── lib/
│ ├── ai/
│ │ ├── extract.ts # Gemini call + deterministic validation of its output
│ │ ├── extract.test.ts # Regression tests for the AI path
│ │ └── schema.ts # Structured-output schema sent to Gemini
│ ├── extraction.ts # Fully deterministic extraction engine (the fallback)
│ ├── extraction.test.ts # Regression tests for the deterministic engine
│ ├── types.ts # The shared ExecutionItem contract
│ ├── store.ts # Zustand store (localStorage-persisted)
│ ├── email.ts # Follow-up email generation
│ └── exportFormats.ts # Jira/Notion copy-ready formatters
└── .env.example
git clone <your-repo-url>
cd copilot-app
npm install
cp .env.example .env.local
Then fill in .env.local:
GEMINI_API_KEY=your_key_here
GEMINI_MODEL=gemini-3.6-flash
Both are optional — if you skip them, the app runs entirely on the deterministic fallback engine, no API key required. Get a free Gemini API key at aistudio.google.com/apikey.
npm run dev
Open http://localhost:3000.
npm test # runs the Vitest regression suite
npx tsc --noEmit # typecheck (no dedicated script in package.json)
npm run lint # ESLint
npm run build # production build
Current verified state: 41/41 regression tests pass, typecheck passes with no errors, production build passes, and ESLint reports 0 errors (2 pre-existing warnings about font loading that I haven't turned into errors).
Full detail, including exact numbers behind each of these, is in docs/EVALUATION.md.
Things I'd build next, not things that exist today:
If I were sequencing the roadmap above (and the limitations list before it), it's by impact to trust and execution reliability — not by how interesting a feature is to build:
P0 — Core trust (the product doesn't mean anything without these): evidence grounding, no invented owners/deadlines, human approval before anything is authoritative, preference-vs-decision detection, conflict surfacing.
P1 — Accuracy improvements (make the trusted core more reliable): supersession detection, ambiguity precision (fewer over-flagged items), decision/status accuracy, sentence-fragmentation handling.
P2 — Expansion (grow scope once the core is solid): code-switched language robustness, broader risk-type evaluation coverage, live Jira/Notion integrations, a larger and more independent user study.
Deeper product/AI-PM documentation, split out so this README stays readable:
docs/PRD.md — problem, target users, requirements, success metricsdocs/AI-SYSTEM-DESIGN.md — the AI/deterministic/human boundary and every guardrail, in detaildocs/EVALUATION.md — full methodology and numbers for both evaluation stages, plus limitationsdocs/USER-RESEARCH.md — the 8-user testing round, findings, and the preference-vs-decision failure in fulldocs/PRODUCT-DECISIONS.md — the significant product decisions and why they were madeAll of these are real screenshots from the running app (seeded demo data, not fabricated).
Dashboard
New Meeting — pasting a transcript
Execution Review Workspace
Ambiguity and conflict, surfaced for human review
Follow-up email, generated from approved items only
Jira export — copy-ready, not a live integration
This was built as an AI Product Management portfolio project. The point wasn't to put an LLM behind a chat UI and call it done — it was to figure out what a genuinely reliable output looks like for this kind of problem, build a real evaluation for it, find where it actually fails, add guardrails for the failures that mattered, and then test it with real people instead of just myself. Some of it worked well. Some of it (supersession handling, conflict detection recall) is honestly still weak, and I'd rather say that here than find out someone noticed it first.