Back to docs

Projects

A Project is a folder that organizes meetings by initiative, client, or program. Every meeting belongs to at most one project (or none — those land in "Unfiled").

What's in a project

Each project has a name, an optional client name, a color stripe, and a default namespace. The namespace is the memory bucket that new transcripts and extractions land in by default — useful when you want all "Claims 8.0" memories searchable under one tag.

Org-wide access

For now, every member of your org sees every project. We don't have per-project member permissions in v1. If you need to keep client A's project hidden from client B's team, tell us — we'll add Project Members in a follow-up phase.

How auto-assignment works

The classifier runs at the tail of every meeting ingestion, with two stages:

  1. Rules first. Your pinned rules (created by clicking "Always for this pattern" on the confirmation banner) match by title keyword, attendee domain, attendee email, or source kind. A match is authoritative — no LLM call.
  2. LLM fallback. If no rule matches, a single small call (gpt-4o-mini or Claude Haiku) picks the most likely project from your list, with a confidence score. Below 0.6 confidence, the meeting lands as Unfiled — better safe than sticky.

Hard timeout: 1.5 seconds. If the model is slow or unavailable, the meeting still ingests; it just won't be auto-filed.

The confirmation banner

Auto-assigned meetings show an amber banner: "Auto-assigned to X — confirm?" with three buttons.

  • Keep — accept the assignment, dismiss the banner.
  • Move — file elsewhere via the Move-to dropdown.
  • Always for this pattern — accept AND pin a rule so similar meetings skip the LLM next time. Today we infer the strongest signal from the meeting title automatically. A future polish pass will let you pick the dimension explicitly (title vs attendee domain vs source) from a confirm modal.

Archive

Archiving a project sets its archived = true flag and unsets project_id on every meeting that belonged to it. The project row stays in the database for audit; the meetings reappear under "Unfiled" where you can re-file them.

If you archived by mistake, the project row stays in the DB with archived = true. An admin can flip it back via a one-line SQL update. A future polish pass adds an Archived tab + restore button so you don't need SQL.

Moving meetings manually

Every meeting card on the cross-project list has a Move to ▾ dropdown. Picking a destination is instant (optimistic update) and persists via PATCH /api/meetings/[id] with body { project_id: "<uuid|null>" }.