# Wavelength: the Gmail extension, releases and team workflow of a live AI writing coach

> Wavelength coaches people on how to write to specific teammates. I took over its Gmail extension, the release path and how the team ships.

- Client: Wavelength
- Industry: Workplace communication · AI writing coach SaaS
- Timeline: Ongoing
- Status: live (ongoing)
- Stack: Claude Code, Cursor, TypeScript, Next.js, NestJS, Supabase, Prisma, Chrome MV3, Jest, Vercel, Railway, Loops
- Live product: https://mywavelength.ai
- Author: Anish Gandhi, https://anishgandhi.com/about/
- Canonical page: https://anishgandhi.com/work/wavelength/

## Outcomes

- Extension versions: 0.2.1 to 0.2.40 (38 versions)
- Extension tests: 0 to 243 (run on 16 Gmail captures)
- Environments: 3 (local, staging, production)

## What I own.

_The role_

**The system, and which parts are mine:**
- Gmail extension (Manifest V3), mine
- Web app (Next.js), mine
- API (NestJS), mine
- Public site (metadata, 404), mine
- Environments (release path), mine
- Team workflow (branches, docs), mine
- AI pipeline (the product's), the product's
- Database and auth (Supabase, Prisma), the product's

> A bug in a dashboard costs someone a few minutes. A bug in software that edits outgoing email lands in a colleague's inbox under the user's name, and the user may never see what went out.
> (Anish Gandhi)

## Making the Gmail extension safe to use.

_Week 1 · Gmail extension_

### Sessions last through Chrome restarts (0.2.2)

The extension signed everyone out about once an hour. It now keeps a session of its own, so you stay signed in through Chrome restarts, and signing out of the website leaves Gmail alone.

![Redrawn: the coaching card saying the session has expired and asking you to sign in again](https://anishgandhi.com/images/projects/wavelength-redrawn-signin-before.jpg)

![Redrawn: the same email with the card showing a rewrite and a ready badge on the button](https://anishgandhi.com/images/projects/wavelength-redrawn-signin-now.jpg)

### The card and button left the email (0.2.3 to 0.2.5)

- The card opens toward the free space and shows one Applied banner

The coaching card and its button had been placed inside the message itself, where a draft could save or send them. They now sit on the page, outside your email.

![Redrawn: the Wavelength card and button sitting inside the body of the email](https://anishgandhi.com/images/projects/wavelength-redrawn-body-before.jpg)

![Redrawn: the card beside the email and the button next to Send](https://anishgandhi.com/images/projects/wavelength-redrawn-body-now.jpg)

### Drafts and replies get coached (0.2.6 to 0.2.12)

- Reopened drafts are coached as soon as they open
- Replies written at the bottom of a conversation find the recipient
- The card shows in full in a reply instead of a sliver

A reopened draft got no coaching, or a false "Add a recipient" though the recipient was right there.

![Redrawn: a reopened draft to Priya Nair with the card asking to add a recipient](https://anishgandhi.com/images/projects/wavelength-redrawn-drafts-before.jpg)

![Redrawn: the same draft with the card showing a rewrite for Priya Nair](https://anishgandhi.com/images/projects/wavelength-redrawn-drafts-now.jpg)

### Use this keeps your signature and the thread, with Undo (0.2.13 to 0.2.16)

Use this replaced the whole compose box, so your signature and the quoted thread went with it, and there was no undo. Now only your own words change, and Undo keeps ten steps per email.

![Redrawn: a reply after Use this with the signature and quoted thread gone](https://anishgandhi.com/images/projects/wavelength-hifi-signature-before.jpg)

![Redrawn: the same reply with signature and quoted thread kept and the card showing Applied with Undo](https://anishgandhi.com/images/projects/wavelength-hifi-signature-now.jpg)

### A redesigned coaching card (0.2.17 to 0.2.31)

- Buttons carry words, one Applied pill, and the recipient in the header
- One scroll area, and the card stays open after Use this
- When Use this cannot apply, the card says why instead of offering a button that did nothing

The old card showed no recipient, two Applied banners and unlabelled icons.

![Redrawn: the old card with no recipient, two Applied banners and unlabelled icons](https://anishgandhi.com/images/projects/wavelength-redrawn-card-before.jpg)

![Redrawn: the new card with the recipient, a suggested subject, the rewrite, an Applied pill with Undo and a tip](https://anishgandhi.com/images/projects/wavelength-redrawn-card-now.jpg)

### A test suite built from zero (Tests and data)

- 16 captured Gmail compose snapshots as fixtures, 149 tests by the end of the week
- Fictional people in all test data

The extension started with no test suite. The suite runs against captured Gmail markup, and every later fix added tests to it.

### New accounts get a real name (API)

New accounts were named by their email address, so rewrites signed off with one. New accounts now get a real name, and in week 2 a backfill, run as a dry run first, fixed the existing ones.

## First Store release, and the founder's headline.

_Week 2 · first release_

### Version 0.2.35 reaches every user (0.2.35 · Chrome Web Store)

- Use this works after you delete your signature, and on a message with no signature

Version 0.2.35 went to the Chrome Web Store and was approved the same day. Chrome updates everyone within about a day.

### The homepage headline the founder asked for (Website)

The founder chose the line, and I put it live.

## Owners get admin rights.

_Week 3 · web app and API_

### Organisation owners count as admins (API)

Organisation owners would have been refused admin actions once organisations were switched on. They now count as admins.

## A staging copy and one release path.

_Week 4 · architecture_

### Three environments (Architecture)

- Local, for building
- Staging: a branch preview of the web app and its own API service, on a separate staging database, with fictional seed data
- Production, for users
- Release path: staging, checked live, main by pull request, production, then the Chrome Web Store

Before this, a fix could only be seen working once it was live. Extension changes are now checked with a test build before release, mostly against staging.

![The Wavelength team page on the staging copy, listing fictional Acme Robotics teammates](https://anishgandhi.com/images/projects/wavelength-staging-team.jpg)

### The Coaching page shows who you are writing to (Web app)

- Plain-language labels on the Coaching page
- The profile summary's backup model was a retired one; it now uses the current one

![The Wavelength web Coaching page on the staging copy with fictional data, showing a coaching score, the recipient profile and suggested changes](https://anishgandhi.com/images/projects/wavelength-coaching-staging.jpg)

## A ready public site, and every open email coached.

_Week 5 · site, Gmail, onboarding_

### Public site metadata and a branded 404 (Public site)

- Favicon, home-screen icon and a share image
- Titles, descriptions and canonical links for every page
- Robots rules and a sitemap, indexing on production only
- A branded 404, and www redirects with no certificate warning

![The Wavelength share image used in link previews](https://anishgandhi.com/images/projects/wavelength-share-image.jpg)

![The branded Wavelength 404 page](https://anishgandhi.com/images/projects/wavelength-404.jpg)

### Every open email gets its own coach (0.2.39)

- A button in Gmail's Send row: orange for the email you are typing in, white for the others
- A red 1 when a suggestion is ready, a ! when something needs you, and a hover label that says which
- The card stays open while you edit

Only the first open email got suggestions, and its floating button could drift over another email.

![Redrawn: two open emails with one floating button drifting over the second](https://anishgandhi.com/images/projects/wavelength-hifi-composes-before.jpg)

![Redrawn: two open emails, each with its own button next to Send](https://anishgandhi.com/images/projects/wavelength-hifi-composes-now.jpg)

![Redrawn: the Wavelength button in five states with their hover labels: writing a rewrite, rewrite ready, ready in another email, add a recipient, and another open email](https://anishgandhi.com/images/projects/wavelength-hifi-button-states.jpg)

### Rewrites that stay close to your words (0.2.36 to 0.2.40)

- Regenerate always starts again from your own draft
- With a Gmail signature, the rewrite adds no second sign-off
- Adding or changing the recipient after writing coaches again
- Only the suggestion for your latest text is shown

A rewrite used to end with its own sign-off above the Gmail signature, so your name appeared twice.

![Redrawn: a rewrite ending with its own sign-off above the Gmail signature, so the name appears twice](https://anishgandhi.com/images/projects/wavelength-hifi-signoff-before.jpg)

![Redrawn: the rewrite ending without a sign-off, directly above the Gmail signature](https://anishgandhi.com/images/projects/wavelength-hifi-signoff-now.jpg)

### Onboarding events and a working Edit Profile (Web app and API)

- Onboarding events sent to the onboarding email service
- Edit Profile opens Settings

The founder asked for onboarding emails, and the code side was live within a day. The founder owns the emails and their copy.

## Second Store release, and docs checked against the code.

_Week 6 · second release_

### Version 0.2.40 reaches every user (0.2.40 · Chrome Web Store)

Version 0.2.40 went to the Chrome Web Store, with 243 extension tests green.

### Every doc checked against the code (Docs)

I cut the instruction file down to commands, rules and a docs map, and checked every committed doc against the current code.

## Rules for a team, and who decides what.

_Team and founder_

**Rules for more than one developer**

- **Branches.** Feature branches open pull requests against staging, never straight to main.
- **Docs.** Docs move with every change, and a fix record is written for each notable fix to live code.
- **One instruction file.** Claude Code and Cursor read the same rules, with one home for each fact.
- **One issue at a time.** Side findings are logged for later instead of being folded into the fix in hand.

**Working with the founder**

- **The founder decides.** Product decisions are the founder's. Problems reported from user testing go to the front of the queue.
- **Blockers only.** I ask about real blockers and settle the rest myself.

The work is ongoing. You can try [Wavelength](https://mywavelength.ai) on the web, or install the [extension from the Chrome Web Store](https://chromewebstore.google.com/detail/gjnkmhlancfomcflbfhbbpilogcnellg).

> If you are hiring someone to take over a live product, ask how they will test a fix before your users see it.
> (Anish Gandhi)

## What Wavelength runs on.

_Context · not my work_

- **Rule-based engine**: Scores each draft against the recipient's DISC and Big Five profile on five dimensions, and passes its flags to the model as hints.
- **Scoring model**: Jev, from TypeSafe, scores the draft in a pilot.
- **Writer model**: Writes the suggestions and the rewrite, using OpenAI and Claude.
- **Evals**: A promptfoo eval suite and a 40-draft comparison picked the models and their token limits.

---

Work with Anish: https://anishgandhi.com/connect/
