Skip to content

fairley46/Legibly

Legibly

CI License: MIT Node.js >=20

Reads every merge and generates audience-specific plain language notes automatically, committed back to your repo on every push. Works on GitHub Actions, GitLab CI, Bitbucket Pipelines, and any other CI system.


Table of Contents


See It in Action

What the engineer committed:

"Resolve race condition in payment processor. Lock TTL extended from 3.0s to 8.0s. Async validation pipeline reduces p99 checkout from 4.1s to 0.8s. Export jobs backgrounded to worker queue."

What Legibly generated for the VP:

"Checkout reliability incident resolved. p99 latency down 80% to under a second. A potential double-charge bug was caught and fixed before customer impact."

What Legibly generated for the customer:

"Checkout is fast now — under a second. Exports no longer block your browser. We fixed a bug that could charge you twice. Nothing you need to do."

What Legibly generated for the technical user:

"Payment lock TTL extended 3s → 8s (resolves race under high concurrency). Async validation pipeline: p99 4.1s → 0.8s. Export jobs moved to worker queue — no longer blocking the request thread. No API or schema changes."

Same commit. Three different notes. Each one says exactly what that audience needs to hear, and nothing they don't. Committed to your repo automatically on every merge.


The Problem

Engineers are shipping at a pace that didn't exist two years ago. A single agentic session can produce what used to take a sprint. But the communication layer hasn't kept up. Product owners still spend hours manually reading PRs, decoding commit messages, and translating technical changes into language that customers can understand. That's not a scalable job. The result: enormous engineering value that never gets communicated. Customers don't know what changed. Stakeholders can't see the progress.

Legibly closes that gap. It automates the translation from technical work to customer value, so the communication layer moves at the speed of code.

The data behind this problem


What Legibly Does

On every merge or push, Legibly:

  1. Reads the git diff, commit messages, and PR description
  2. Pulls linked Jira ticket context (optional, works without Jira)
  3. Uses AI to extract the value signal: metrics, improvements, fixes, new capabilities
  4. Generates a separate release note for each configured persona (a named audience like vp, customer, or technical-user, each with its own framing and structure)
  5. Commits the notes to your repo as markdown files automatically, then prunes to keep the most recent files per persona (configurable, default 50)

That's the automatic path. It always runs, no action needed. A second path exists for teams that want to push notes further: once the markdown is committed, an engineer reads it and manually triggers the notification workflow to send to Slack, Teams, Confluence, or a webhook. AI-generated content is never sent automatically.

A third path is the MCP skill, which exposes the same translation pipeline conversationally inside any MCP-compatible client. Useful for on-demand use before a merge, mid-review, or during standup prep.

Note on output quality: Legibly translates what it's given. The quality of generated notes is directly proportional to the quality of PR descriptions and commit messages. See Engineering Process for what to write and why it matters.

The product owner's job shifts from writing to talking to customers. The communication still happens. It just doesn't require a human to produce it.


How It Works

merge / push to configured branch
        ↓
CI pipeline fires (GitHub Actions, GitLab CI, Bitbucket, or any CI)
        ↓
reads: git diff + commits + PR/MR description + Jira tickets (optional)
        ↓
AI extracts value signals (metrics, changes, fixes, improvements)
        ↓
generates notes per persona (vp, customer, partner, etc.)
        ↓
commits markdown files to release-notes/{environment}/    ← always, no action needed

        ── if notify is configured ──────────────────────────────
        ↓
engineer reads the committed markdown files
        ↓
trigger "Send Notifications" manually → pick environment + persona
        ↓
hooks fire: Slack / Teams / Confluence / webhook
        ─────────────────────────────────────────────────────────

Content customization happens in two places:

  • config/voice.md: your brand voice, writing rules, banned phrases. Owned by product.
  • personas/*.md: one file per audience. Add, edit, or remove. No code changes needed.

The automatic path (merge → generate → commit) runs on every push with no action needed. The notification path is always manual: an engineer reads the committed notes first, then decides to send.


Repo layout

Folder / file What it is
docs/ Problem overview, setup guide, customization, notifications, and troubleshooting.
personas/ One markdown file per audience. Add, edit, or remove. No code changes needed.
voices/ Pre-built brand voice styles. Copy one to config/voice.md to get started.
config/ Your team-config.yml (deploy points, AI provider) and voice.md (brand voice) live here.
examples/ Sample config and a full end-to-end walkthrough. Start here.
release-notes/ Where Legibly commits generated markdown. Organised by environment.
action/ The CI action source code (TypeScript). Runs on GitHub Actions, GitLab CI, Bitbucket Pipelines, or any CI that can run Node.js. You don't need to touch this.
prompts/ The AI prompt templates Legibly uses internally.

End-to-End Example

See examples/e2e-example.md for a complete walkthrough:

  1. A team picks The Operator voice and copies it to config/voice.md
  2. They configure deploy points: which branches, which environments, which personas
  3. An engineer merges three commits to main
  4. Legibly reads the commits, PR description, and Jira tickets and extracts the value signals
  5. Three notes are generated and committed, one per configured persona

The final section shows the gap side-by-side: what the engineer wrote vs. what each audience needed to hear. Same facts. Right signal for the right person.


Quick Start

Requirements: Node.js 20+, an AI provider key or GitHub Copilot Enterprise access, and one of: GitHub, GitLab, Bitbucket, or any CI that can run Node.js.

# 1. Fork or clone this repo

# 2. Copy and configure the sample config
cp examples/sample-team-config.yml config/team-config.yml

# 3. Set your team name, AI provider, and deploy points (branches → personas)

# 4. Add your AI provider key to your CI secrets as AI_API_KEY
#    Jira secrets are optional. Legibly works without them.

# 5. Test locally before pushing (see Local Development)

# 6. Push to a configured branch. Legibly runs automatically.

See the Setup Guide for GitHub Actions setup, or the CI Platforms section below for GitLab, Bitbucket, and other CI systems.


CI Platforms

Platform Config file Setup guide
GitHub Actions .github/workflows/ (included) docs/setup.md
GitLab CI .gitlab-ci.yml (included) docs/gitlab-setup.md
Bitbucket Pipelines bitbucket-pipelines.yml (included) docs/bitbucket-setup.md
Azure DevOps, CircleCI, Jenkins Run node action/dist/index.js directly docs/other-ci-setup.md

Personas

Personas are the core of Legibly. Each persona is a plain markdown file in the personas/ folder that defines a specific audience: who they are, what they care about, how they want to be spoken to, and the exact structure of their release notes.

No code changes are needed to manage personas. Add a file, edit a file, delete a file.

Built-in Personas

File Persona Who they are Typical environments
vp.md The VP C-suite or VP exec who owns the board and customer narrative. Reads the first bullet; if it doesn't connect to a business outcome, the email closes. No technical terms, ever. Production
customer.md The Customer Power user who lives in the product daily. First question when an update lands: did this break what I depend on? Writes to felt experience, not implementation. Production
technical-user.md The Technical User Senior engineer or admin keeping their systems working with this product. Scans for Breaking: first, then endpoint names, then metrics. Vague language means an untrustworthy note. Staging, Production
partner.md The Partner Engineer at a company that has built an integration on top of this platform. A breaking change they miss becomes their customer's problem. Needs exact API surfaces and hard deprecation timelines. Production
internal.md The Internal User QA lead or PM running the staging sign-off. Reading this to build a test plan. Every change is a test scenario. Needs Jira IDs, setup steps, and edge cases, not customer-facing framing. Staging / UAT

Each file includes writing instructions, an exact output template, and a good/bad example. For instructions on adding, editing, or removing personas, see docs/customization.md.


Brand Voice

If personas answer who you're writing for, brand voice answers how you sound doing it.

Your brand voice is a single file, config/voice.md, that applies universally to every persona on every run. It's the writing personality layer: tone, rhythm, banned phrases, formatting rules, how to translate technical metrics into plain language. One file controls all of it, across every audience, on every deployment.

Pre-built voices

Legibly ships with six voices, each tuned for a different brand personality. Pick the one that sounds like you, copy it to config/voice.md, and you're set.

File Voice Style Best for Sample line
the-operator.md The Operator Direct, accountable, metrics-first Ops-heavy products, reliability platforms "Checkout errors: was 3.2%. Now 0.1%."
the-visionary.md The Visionary Minimalist, poetic, human-centered Consumer products, design-forward platforms "The wait is gone. Search is instant now."
the-storyteller.md The Storyteller Warm, authentic, failure-honest B2C, lifestyle brands, community products "We broke this last month. Here's what we learned."
the-customer-champion.md The Customer Champion Principled, clear, customer-obsessed Enterprise B2B, long-term relationships "Three enterprise teams flagged this in QBRs. It's resolved."
the-straight-shooter.md The Straight Shooter Raw, fast, zero corporate Developer tools, startup products "Search was broken for queries over 50 chars. Fixed. Go try it."
the-connector.md The Connector Empathetic, research-grounded, warm Healthcare, education, HR, community "A lot of you have been working around this for months. Here's what changed."

For instructions on building a custom voice from scratch, see docs/customization.md.


Docs


License

MIT

About

Every merge, translated. AI-generated release notes for every audience — engineers, PMs, customers — committed to your repo automatically on any CI.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors