# Changelog

> Part of the Cowliss docs. Markdown for every page: append `index.md` to its URL. Site map: /llms.txt

<!-- GENERATED by apps/docs/scripts/generate.ts. Do not edit. Regenerate with `pnpm -F cowliss-docs generate`. -->

To upgrade a project: `npm install --save-dev @cowliss/cli@latest`.

What changed in each version of `@cowliss/cli` after 0.16.0, newest first. Earlier versions are listed on [npm](https://www.npmjs.com/package/@cowliss/cli?activeTab=versions).

## 0.39.0 (2026-11-08)

### Features

- One MCP client table, and the marketing site readable by agents

## 0.38.0 (2026-11-07)

### Features

- Use with your agent on every entity page, MCP setup per client

## 0.37.0 (2026-11-06)

### Features

- A sendWebhook step names its webhook with `webhook`

## 0.36.0 (2026-11-06)

### Features

- A refused call keeps its validation issues
- emailTrait names the trait-only email reader
- A cow test scenario names its trigger's properties
- A refused push names each failing resource and field

### Fixes

- cow init's example sends from the org's verified domain
- A confirmed event-list conflict survives other app edits
- Enrollment status answers none before any enrollment has run
- Validation issues name resources on the push routes only

## 0.35.0 (2026-11-02)

### Features

- **Apps:** An app may name the trait that holds an external unsubscribe URL

### Fixes

- An external unsubscribe URL rides normalized and within a header

## 0.34.0 (2026-11-02)

### Features

- Write the email footer in the Brand's language, with room under it

## 0.33.0 (2026-10-27)

### Features

- **Domains:** Exact-string claims and DNS takeover of a held domain

## 0.32.1 (2026-10-26)

### Fixes

- Every command's help lists --org and the other global flags

## 0.32.0 (2026-10-26)

### Features

- One login covers several organizations

## 0.31.1 (2026-10-26)

### Fixes

- The OpenAPI document carries the lockstep package version

## 0.31.0 (2026-10-26)

### Breaking changes

- A confirmed conflict names what it accepts
- Validate Liquid templates at read and drop the guest layer
- A push is one transaction over inline resources
- A source flag on every resource and the Liquid template version

### Features

- Dashboard writes events, purposes and segments; Liquid templates read-only
- Blueprints ship Liquid HTML emails
- events, purposes and segments writable over the API
- Render Liquid templates

### Fixes

- A Liquid body is stored without its edge newlines
- The code-pushed prompt stops naming cow build
- A Liquid or doc template gets the leave links it mentions

## 0.30.0 (2026-10-21)

### Features

- Partner API, plan override, suspend and purgeOrg (ADR 0039)

### Fixes

- Close the partner API review findings (ADR 0039)
- cow status says an automation, not a automation

## 0.29.0 (2026-10-20)

### Breaking changes

- Automations are JSON definitions
- Rename journeys to automations

### Features

- Agent prompts write automations as JSON definitions
- emails/*.md and *.maily.json doc templates
- Doc templates beside module templates
- Automation steps and run mapping
- automations.create and definition updates
- Automation definitions and a pure interpreter

### Fixes

- A run's profile read belongs to the step that names the profile
- Cap what a stored source may unpack to
- Cap automation rule size and depth, drop json-logic's log
- cow pull restores the newest push alone

## 0.28.1 (2026-10-19)

### Features

- Accept a Clerk OAuth access token as a third credential
- The contract-driven MCP server as a published @cowliss/mcp

### Fixes

- Review fixes: standards docs, generated MCP changelog, constants in the route

## 0.28.0 (2026-10-19)

### Breaking changes

- A journey key is unique per app, and every key read names its app

### Fixes

- Review fixes and close effort 45
- cow plan refuses --prune for a caller who may not prune

## 0.27.0 (2026-10-19)

### Features

- **Broadcasts:** A doc preview takes a header
- **Journeys:** Last run and emails sent in 30 days on journey stats
- **Broadcasts:** Markdown out and in, and a design prompt for an agent
- **Broadcasts:** A header per broadcast, logo and name, name, logo or none
- **Broadcasts:** One starter email with demo blocks, no template select
- **Overview:** The org's last 30 days on one route, in the CLI, MCP and Home
- A Broadcasts card on Home, one row per list across apps
- cow init writes an example journey and an AGENTS.md
- Agent prompts ask for a journey, and a journey task prompt
- **Broadcasts:** Subject optional until send, every test send says [test]
- Tool titles, read-only and destructive hints, server instructions

### Fixes

- Editor commands reach the live editor, and Edit source replaces the paste menu
- **Journeys:** Journey stats say lastStartedAt, not lastRunAt
- **Lists:** Subscribers show the address a send would use
- Sends fall back to the newest email identifier

## 0.26.0 (2026-10-16)

### Features

- **Dashboard:** Signup form prompt and preview, how to send with a new key
- **Domains:** Download the DNS records as a zone file or CSV, copy relative names

### Fixes

- **Domains:** Make DNS names relative to the zone, keep the DMARC row out of imports

## 0.25.0 (2026-10-15)

### Features

- **Apps:** A Brand tab for the business, look, sender and language
- **Subscribe:** Brand and translate the confirm email and hosted pages
- **Brand:** Fit the logo into a 200x64 box from its measured size
- **Broadcasts:** Email branding label, editor R2 image upload, footer tooltip and template picker

### Fixes

- **Brand:** Apply the review of the Brand effort

## 0.24.0 (2026-10-14)

### Features

- cow apps logo upload reads --file and checks it before sending
- **Broadcasts:** Announcement starter template, clearer unset colour swatches
- **Apps:** Upload a broadcast logo from the look dialog
- **Journeys:** Throttle and meter api.restart, cap journeys per org

### Fixes

- **Broadcasts:** Fresh blank template doc, https-only logo url, announcement button

## 0.23.0 (2026-10-13)

### Features

- Spam strikes pause an org on one 1h/4h/16h/64h ladder
- Score every email with Rspamd after render, skip on reject
- Send a multipart form body as FormData
- **Broadcasts:** Open tracking and real broadcast stats
- **Broadcasts:** Stats contract with the row's counts
- **Broadcasts:** Fan-out workflow, schedule, cancel and credit pre-flight
- markdownToMaily emits Maily 2 docs
- Broadcasts from markdown, preview, show, and MCP tools
- Markdown to Maily, docHashOf, composer url, apps look
- **Broadcasts:** Render with Maily 2.0.0-beta.7
- **Broadcasts:** drafts, Maily render, app look and default sender
- **Subscribe:** Hosted signup page, snippet and double opt-in
- **Lists:** Csv import into a list
- **Lists:** Dashboard-created lists and the subscriber read model

### Fixes

- **Broadcasts:** Reserve credit across sends, claim recipients, tidy stats
- **Lists:** A CSV import never re-subscribes someone who unsubscribed
- **Subscribe:** One confirm email per address, none while sending is paused
- **Broadcasts:** Review fixes from the effort 38 review

## 0.22.0 (2026-10-12)

### Breaking changes

- Delete the catalog, violations, strict mode and the held queue

### Features

- App setup prompt, cow.json and named .env builders
- App health names its .env source, deliveries stats narrow to one app
- The user page's identify call and debug prompt builders
- A user's timeline, and executions follow a merge
- **Deliveries:** Daily outcome split on deliveries stats, per-app split on event stats
- The event page's debug prompt builder
- What an event caused and the user's events around it
- cow status prints the app's health checks first
- **Apps:** App health endpoints with six checks and agent prompts
- **Events:** Event names per app against the cow.json list
- Record each key's use per app and the calling client on events
- Events in cow.json, stored per app on push
- **Users:** List rows carry last event, live journeys and last delivery

### Fixes

- The event page names a key past the first page of keys
- cow status prints the cow.json lines for new unlisted event names
- Keep the key secret out of the Generate key agent prompt
- **Events:** System names count as listed in cow.json
- Spend past the allowance draws the wallet down for good

## 0.21.0 (2026-10-02)

### Features

- App and sending-domain limits, and the root-domain warning
- Subscribe to Plus, mirror the subscription, and meter by plan
- Plan constants, plan_limit, meta warnings and root-domain helper
- **Emails:** Test sends with `test: true` and reserved test addresses

### Fixes

- A half-typed domain is not taken for a root

## 0.20.0 (2026-10-02)

### Features

- cow.templates.preview renders a template with your own props

## 0.19.0 (2026-10-02)

### Features

- emails.send takes an idempotencyKey and creates the person it emails
- cow.preferences.get and set, the hosted preferences page as data

## 0.18.1 (2026-10-01)

No user-facing changes.

## 0.18.0 (2026-10-01)

### Features

- A hosted email preferences page, linked from every footer and from the app
- Code an older CLI pushed says when it stops running
- /v1/protocols says whether each guest protocol has drained
- The page after an unsubscribe asks, optionally, why
- An app can carry a public name and a return URL for its unsubscribe pages
- The unsubscribe page leads with Keep me subscribed, and the page after it can undo

### Fixes

- cow test passes a project with no journeys
- The API URL examples name no localhost origin, so the bundle passes check:packages

## 0.17.0 (2026-10-01)

### Breaking changes

- An email declares its purpose in place of a send class
- **Consent:** A declared purpose belongs to the app that declares it
- Build the domain prompt as a task with a DNS provider
- Build app prompts as tasks with a plain-language summary

### Features

- **Emails:** cow.emails.send can address a profile instead of an address
- **Emails:** Footer offers leaving one purpose or everything, and templates get unsubscribeAllUrl
- **Consent:** A granted purpose turns its root on, and a revoked root turns off its names
- cow login keeps one session per API URL instead of replacing the last one
- Two apps can each push a template with the same key
- An outdated cow says so, with the upgrade command
- A changelog in each package and on the docs site
- cow test runs every scenario when no journey is named
- Search executions, the review queue and the credential keys with ?q
- Add failures.stats and a failures card on the overview
- Search the delivery log and fold its rarer filters into a popover
- Search the delivery log by recipient
- List only a family's working keys with status=active
- Add per-app delivery stats
- Count an app's journeys and templates

### Fixes

- cow push links each template to its page under the app that pushed it
- **Consent:** Read a developer's platform profile in the app the platform writes to
- Store nothing when cow push is handed the tree the app last pushed
- Cancel a pruned journey's runs even when none were live at the prompt
- Refuse cow push --prune unless an admin is signed in
- Accept a backfill older than the retention window
- Require a key name of at least 3 characters
