How it works

C0

Internal operations system. Runs Formwork day to day: clients, projects, tasks and invoices in one place, synced with the books. After each meeting, Claude drafts the follow-up tasks.

Live · runs Formwork

Fig.How Formwork runs: sales, clients, work, money and meetings in one place, with a portal for each kind of person.

Architecture

  1. APortals· 5Executive · Manager · member · Client · Prospect · Claude
    • ExecutiveportalUI

      UI · portal

      The whole firm: money, clients, people and objectives.

      Talks to

      • → Middleware (cookie)
    • Manager · memberportalsUI

      UI · portals

      Managers see their team; members see their own tasks and time.

    • ClientportalUI

      UI · portal

      Clients see their services, billing, content, outreach and tasks.

      Talks to

      • → Middleware
    • ProspectportalUI

      UI · portal

      A prospect’s own view of what Formwork offers them.

    • ClaudeMCP clientEXTERNAL

      EXTERNAL · MCP client

      Claude over MCP, with tools scoped to the person’s role.

      Talks to

      • → MCP server (MCP)
  2. BApp· 11Middleware · Prospects · Clients · Projects · tasks · Invoices · expenses · MCP server · Meetings · Task drafting · Knowledge base · Bank matching · Chat agent
    • MiddlewareJWT · role routesSERVICE

      SERVICE · JWT · role routes

      Checks the session cookie, routes each role to its portal, and catches a role that changed since sign-in.

      Talks to

      • ← Executive (cookie)
      • ← Client
      • → Clients (by role)
    • ProspectsproposalsSERVICE

      SERVICE · proposals

      Prospects and proposals, until one converts to a client.

      Talks to

      • → Clients (converts)
    • Clientsservices · healthSERVICE

      SERVICE · services · health

      Each client and the services they buy, with one health score from 0 to 100.

      Talks to

      • ← Middleware (by role)
      • ← Prospects (converts)
      • → Projects · tasks
      • → Invoices · expenses (bills)
      • → Sales & content (outreach · content)
    • Projects · taskstime logsSERVICE

      SERVICE · time logs

      The work for each service, with dependencies and time logged.

      Talks to

      • ← Clients
      • ← Task drafting (drafts)
      • → PostgreSQL (SQL)
      • → Airtable (dual write)
    • Invoices · expensespaymentsSERVICE

      SERVICE · payments

      Invoices, payments and expenses, allocated to clients and services.

      Talks to

      • ← Clients (bills)
      • ← Plaid (bank feeds)
      • ← Bank matching (matches)
    • MCP server250+ tools by roleAI

      AI · 250+ tools by role

      Tools composed by role: a client sees about ten, an executive over two hundred.

      Talks to

      • ← Claude (MCP)
      • ← Chat agent (catalogue)
      • → Knowledge base (kb tools)
    • MeetingstranscriptsSERVICE

      SERVICE · transcripts

      Each meeting and its transcript, with a badge until its drafted tasks are approved.

      Talks to

      • → Task drafting (transcript)
      • → Knowledge base (mined)
    • Task draftingClaudeAI

      AI · Claude

      Drafts follow-up tasks from a transcript, with the context around the meeting.

      Talks to

      • ← Meetings (transcript)
      • → Projects · tasks (drafts)
      • → Claude · OpenRouter
    • Knowledge basefacts · reviewAI

      AI · facts · review

      Claims mined from meetings, embedded and merged into facts. New ones are candidates until a second model verifies them.

      Talks to

      • ← Meetings (mined)
      • ← MCP server (kb tools)
    • Bank matchingconfidence tiersSERVICE

      SERVICE · confidence tiers

      Matches each cash line from the books to an invoice, a subscription or a person, with a confidence score. Only the surest can be approved in bulk.

      Talks to

      • ← QuickBooks (webhooks)
      • → Invoices · expenses (matches)
    • Chat agentsearch · describe · runAI

      AI · search · describe · run

      Above a threshold it gets a category index and three meta-tools instead of every schema, and loads only the tools it means to call.

      Talks to

      • → MCP server (catalogue)
  3. CJobs· 2Due-date checks · Scheduled email
    • Due-date checksscheduledJOB

      JOB · scheduled

      Flags tasks coming due and invoices gone overdue.

      Talks to

      • → Slack (alerts)
    • Scheduled emailscheduledJOB

      JOB · scheduled

      Sends reports and scheduled emails.

  4. DData· 2PostgreSQL · Airtable
    • PostgreSQLprimary · PrismaSTORE

      STORE · primary · Prisma

      Where every read comes from.

      Talks to

      • ← Projects · tasks (SQL)
    • Airtabledual writeSTORE

      STORE · dual write

      Writes for tasks, time and money also land here, so the rollups people already use stay right.

      Talks to

      • ← Projects · tasks (dual write)
  5. EOutside· 5QuickBooks · Plaid · Sales & content · Slack · Claude · OpenRouter
    • QuickBooksOAuth · webhooksEXTERNAL

      EXTERNAL · OAuth · webhooks

      The books. Its webhooks bring each change across.

      Talks to

      • → Bank matching (webhooks)
    • Plaidbank feeds · webhooksEXTERNAL

      EXTERNAL · bank feeds · webhooks

      Live bank balances and transactions.

      Talks to

      • → Invoices · expenses (bank feeds)
    • Sales & contentFormwork’s own appsEXTERNAL

      EXTERNAL · Formwork’s own apps

      OutreachSphere and ContentSphere, read for each client’s outreach and content.

      Talks to

      • ← Clients (outreach · content)
    • SlackalertsEXTERNAL

      EXTERNAL · alerts

      Where the due-date and overdue alerts land.

      Talks to

      • ← Due-date checks (alerts)
    • Claude · OpenRoutermodelsEXTERNAL

      EXTERNAL · models

      The models behind drafting, the knowledge base and the agent.

      Talks to

      • ← Task drafting
Connections · 20

→ request · ⇢ webhook, queue or schedule

  1. Executive → Middleware · cookie
  2. Client → Middleware
  3. Middleware → Clients · by role
  4. Prospects → Clients · converts
  5. Clients → Projects · tasks
  6. Clients → Invoices · expenses · bills
  7. Meetings → Task drafting · transcript
  8. Task drafting → Projects · tasks · drafts
  9. Meetings → Knowledge base · mined
  10. Task drafting → Claude · OpenRouter
  11. QuickBooks ⇢ Bank matching · webhooks
  12. Plaid ⇢ Invoices · expenses · bank feeds
  13. Bank matching → Invoices · expenses · matches
  14. Claude → MCP server · MCP
  15. Chat agent → MCP server · catalogue
  16. MCP server → Knowledge base · kb tools
  17. Projects · tasks → PostgreSQL · SQL
  18. Projects · tasks ⇢ Airtable · dual write
  19. Due-date checks ⇢ Slack · alerts
  20. Clients → Sales & content · outreach · content

Inside: meetings, tasks and what Formwork knows

A meeting does two jobs. It becomes tasks people approve, and it teaches the firm something: claims are pulled out, matched to the people and companies they’re about, deduplicated, checked by a second model, and fed back into the next meeting about that client.

  1. AIn· 3Transcript · Meeting context · Account memory
    • Transcriptper meetingUI

      UI · per meeting

      The meeting’s transcript, internal or with a client.

      Talks to

      • → Meeting context
    • Meeting contextpeople · services · goalsSERVICE

      SERVICE · people · services · goals

      Who was there, the client and their active services, and the firm’s current objectives and projects, so tasks land in the right place.

      Talks to

      • ← Transcript
      • → Tasks + summary
    • Account memorywhat we already knowAI

      AI · what we already know

      What the firm already knows about this client, injected before analysis. A knowledge-base failure never blocks the meeting.

      Talks to

      • → Tasks + summary (injected)
      • → Search (account spine)
  2. BAnalysis· 3Tasks + summary · Approval · Slack
    • Tasks + summaryClaude · in parallelAI

      AI · Claude · in parallel

      Writes the meeting summary and the follow-up tasks at the same time, each with an assignee, a service, a project and a due date.

      Talks to

      • ← Meeting context
      • ← Account memory (injected)
      • → Approval (drafts)
      • → Slack
      • → Claim extraction (transcript)
    • Approvalbadge until approvedUI

      UI · badge until approved

      Drafted tasks wait for a person. Until they are approved the meeting shows a badge.

      Talks to

      • ← Tasks + summary (drafts)
    • Slacksummary · tasksEXTERNAL

      EXTERNAL · summary · tasks

      The summary and the drafted tasks are posted to Slack.

      Talks to

      • ← Tasks + summary
  3. CLearn· 5Claim extraction · Entity resolution · Dedup · Auto-review · Latest wins
    • Claim extractionHaiku · Sonnet if unsureAI

      AI · Haiku · Sonnet if unsure

      Picks out claims worth keeping about the industry, the client or the business, tagged from a fixed vocabulary of 22 topics. Internal meetings need more confidence to count.

      Talks to

      • ← Tasks + summary (transcript)
      • → Entity resolution (mentions)
      • → Dedup (claims)
    • Entity resolutionnames · aliasesSERVICE

      SERVICE · names · aliases

      Maps “Logan”, “Logan Smith” and “chief estimator” to the same person, following merges; a new name starts as a candidate for review.

      Talks to

      • ← Claim extraction (mentions)
      • → Entity graph
    • Deduphash · cosine 0.92SERVICE

      SERVICE · hash · cosine 0.92

      An exact restatement or a near-duplicate becomes a new citation on the existing fact instead of a new row.

      Talks to

      • ← Claim extraction (claims)
      • → Facts
    • Auto-reviewsecond modelAI

      AI · second model

      Verifies or rejects new facts. Nothing is verified on the way in; borderline ones stay for a person to spot-check.

      Talks to

      • → Facts (verify)
    • Latest winssupersededSERVICE

      SERVICE · superseded

      When a newer claim replaces an old one, the old one is marked superseded rather than deleted.

      Talks to

      • → Facts
  4. DRecall· 4Facts · Entity graph · Search · kb tools
    • Factspgvector · 1024-dSTORE

      STORE · pgvector · 1024-d

      Canonical facts with their citations, embedded with one locked model whose name is stored beside each vector for future migrations.

      Talks to

      • ← Dedup
      • ← Auto-review (verify)
      • ← Latest wins
      • ← Search
    • Entity graphtyped edgesSTORE

      STORE · typed edges

      People, companies and projects, linked to the account they belong to.

      Talks to

      • ← Entity resolution
    • Searchverified-onlySERVICE

      SERVICE · verified-only

      Semantic search with metadata filters, verified facts only by default so agents don’t retrieve noise, plus a keyed account spine, newest first.

      Talks to

      • → Facts
      • ← kb tools
      • ← Account memory (account spine)
    • kb toolsMCPAI

      AI · MCP

      Search, expand an entity, add or verify a fact, and the review queue, for any agent.

      Talks to

      • → Search
Connections · 15

→ request · ⇢ webhook, queue or schedule

  1. Transcript → Meeting context
  2. Meeting context → Tasks + summary
  3. Account memory → Tasks + summary · injected
  4. Tasks + summary → Approval · drafts
  5. Tasks + summary ⇢ Slack
  6. Tasks + summary → Claim extraction · transcript
  7. Claim extraction → Entity resolution · mentions
  8. Claim extraction → Dedup · claims
  9. Entity resolution → Entity graph
  10. Dedup → Facts
  11. Auto-review ⇢ Facts · verify
  12. Latest wins → Facts
  13. Search → Facts
  14. kb tools → Search
  15. Account memory → Search · account spine

Two flows

A meeting becomes work

Walk through it and each step lights the parts it runs through in the drawings above.

By count

portals: executive, manager, member, client, prospect
5
actions Claude can take in it
250+

Notes

  1. N.1Client health is one number from 0 to 100, computed in one place, so the members list, the invoice header and the exec dashboard never disagree.
  2. N.2Clients get their own portal with their services, billing, content, outreach and tasks.
  3. N.3Bank lines are matched to invoices and people with a confidence score. Only the surest matches can be approved in bulk.

Built by

I design, architect and build software products like this one.

naram@hey.com·See the rest of my work

More systems