Skip to content

Introduction

Notewright is a self-hostable, open-core meeting follow-up engine that runs on Cloudflare Workers. It syncs meeting notes and transcripts from a pluggable notes source (Granola is built in) into a Cloudflare D1 database, extracts follow-up action items with an LLM, and creates them in a pluggable follow-up sink (Linear is built in). It is headless and composed entirely in TypeScript.

The model is open core: you scaffold your own instance, compose exactly the providers you want, and deploy it to your own Cloudflare account. The repository itself is a library monorepo, not a turnkey app, so there is no shared hosted service and no provider keys ever leave your account.

  • Notes sources implement NotesSourceProvider; follow-up sinks implement FollowUpProvider. Providers ship as separate npm packages. Your instance composes exactly one notes provider and one follow-up provider via defineApp({ notes, followUp }). The composition is TypeScript-enforced; there are no NOTES_PROVIDER / FOLLOWUP_PROVIDER environment selectors.
  • Storage is Cloudflare D1 only. There is no Neon or external Postgres.
  • AI runs through Cloudflare AI Gateway with bring-your-own-key (BYOK), so the Worker never holds an Anthropic key directly.
  • Speaker context: a SpeakerContextAgent Durable Object resolves and caches per-meeting speaker identities. The follow-up pipeline consumes that resolution to attribute action-item excerpts to real speakers. It is invoked on demand by the pipeline (no cron of its own).

Notewright is published as five packages:

PackageWhat it is
@notewright/coreThe headless Worker: agents, sync, extraction, and store.
create-notewrightThe npm create notewright initializer that scaffolds a new instance.
@notewright/granola-notes-providerGranola notes source provider.
@notewright/linear-follow-up-providerLinear follow-up sink provider.
@notewright/noop-follow-up-providerNo-op follow-up sink (for testing or notes-only deployments).