---
title: Changelog
description: What's changed in CoDuck — platform and CLI releases, newest first.
category: changelog
order: 1
agent: "What changed in CoDuck recently — platform (hosting/deploy) and CLI releases, newest first. Check here before assuming old behavior: if a deploy or CLI behavior seems different from what you expect, a recent change probably explains it."
---

# Changelog

What's new in CoDuck, newest first. **Platform** changes (hosting, deploy, the
API, the web app) are live on `coduck.ai` / `api.coduck.ai` as soon as they
land. **CLI** changes ship in an `@coduckai/cli` release — run
`npm i -g @coduckai/cli@latest` to get them, and `coduck --version` to check
what you have. **SDK** changes ship in an `@coduck/auth` release — run
`npm i @coduck/auth@latest` in your project to upgrade.

> **Agents:** if a deploy behaves differently than you expect, scan the Platform
> section first — behavior may have changed. The machine-readable copy of this
> page is at [`/docs/raw/changelog.md`](https://coduck.ai/docs/raw/changelog.md),
> and it's indexed in [`/llms.txt`](https://coduck.ai/llms.txt).

## Platform — 2026-07-04

- **Form submissions no longer store visitors' raw IP addresses.** Submissions
  to your hosted forms now record a daily-rotating anonymized visitor ID
  instead of an IP — the same visitor gets the same ID within a day, so you can
  still spot spam bursts in the Forms tab (shown as `visitor <id>`), but no raw
  end-user IP sits at rest. Previously stored IPs were scrubbed.
  **Heads-up for deployed apps:** the `submitterIp` field returned by
  `@coduck/sdk/forms` `list()` is renamed `submitterIpHash` — a site generated
  earlier that displays that field will show it blank until you regenerate it
  (the raw value no longer exists to serve).
- **Old raw data now expires automatically.** Raw analytics pageviews and
  individual error occurrences are kept for 90 days (your charts and error
  groups keep their history — those are built from aggregates that stay),
  generation replay logs for 90 days (cost and usage stats stay forever), and
  email send records for a year. Less stale personal data at rest by default.
- **Environment variables got a defense-in-depth upgrade.** Each stored env
  var's ciphertext is now cryptographically bound to its exact project and key
  — a ciphertext can never be replayed into another slot — and every decrypted
  read is audit-logged (key names only, never values). Nothing to do on your
  end; existing variables keep working.
- **Invite and transfer emails always link to the real app.** A server
  misconfiguration could previously produce team-invite or project-transfer
  accept links pointing to `localhost`; those links are now guaranteed to point
  at `app.coduck.ai`.

## Platform — 2026-07-03

- **Transfer a project to another account.** You can now hand a whole project —
  the live site, its database, custom domains, settings, and chat history — to
  another CoDuck account. In the project's Cloud panel, open **Settings →
  Danger Zone → Transfer project**, enter the recipient's email, and they get a
  link to review and accept (they can also decline, and you can cancel any time
  before they act). The site keeps running through the whole handoff — nothing
  restarts. A project with a live deployment needs the recipient to be on a
  paid plan; if the project has a connected Stripe account, it moves with it,
  so disconnect first if it shouldn't. Perfect for handing a finished build to
  a client or moving work between your own accounts.
- **`www.` works on your custom domain.** Adding an apex domain like
  `example.com` now covers `www.example.com` too — the SSL certificate includes
  the www variant and www visitors are redirected to your apex, once the `www`
  DNS record shown in the add-domain panel is in place. Domains added earlier
  get an **Enable www** button (or run `coduck domains verify`) to switch it on.
- **Team activity is visible.** Invites, joins, role and spend-limit changes,
  and team renames/deletes now show up in the project's Activity tab, so you
  can see who did what on a shared project.
- **Opening a project is fast now.** The editor used to freeze for 30–90
  seconds on open while your preview environment booted. It now loads in
  about a second — your chat, files, and Cloud panel appear immediately, and
  only the preview pane shows a brief "Starting…" while the environment spins
  up in the background. Already-published projects show their live site
  instantly, as before.
- **Teammates can now open and edit shared projects.** The full collaboration
  release: invite someone to your team and — depending on their role — they can
  open the project, follow logs and analytics, generate and edit alongside you,
  and (for admins) publish and manage settings. **The team owner pays**: all
  generation by teammates draws from the owner's credits, never the member's,
  and owners can set a **monthly spend limit per member** from the Team tab.
  Owners can also **delete a team** (Danger zone) — members lose access and the
  project goes back to personal. This completes the rollout previewed in the
  2026-07-02 entry below.

## Platform — 2026-07-02

- **Teams — invite people to your project.** Every project's Cloud panel now has
  a **Team** tab: create a team, invite teammates by email, and manage who's on
  the project with roles — Owner / Admin / Editor / Viewer, or **custom roles**
  with exactly the permissions you pick. Invitees get an email with an accept
  link: log in (or sign up) with the invited address and you're on the team.
  Pending invites show right in the member list, with one-click resend or
  cancel. Team seats are included with your plan (Pro 3 · Plus 10 · Studio 25).
  *This release ships team setup and membership — teammates opening and editing
  the project is rolling out next, so hold off on inviting collaborators who
  need editor access today.*

## CLI 0.1.13

- **`coduck push` now updates your draft instantly.** If your project has a draft,
  `push` uploads your files and hot-reloads them into the running draft in about a
  second (it auto-wakes the draft if it's asleep) — your live site stays untouched.
  Copy tweaks and code changes feel like a local dev server. Use `coduck push --prod`
  to go straight to live, and the new `coduck wake` to pre-warm your draft so the first
  push is instant too. Update with `npm i -g @coduckai/cli@latest`.

## CLI 0.1.12

- **Draft → publish, from the command line.** New `coduck draft` commands drive a
  private draft (dev environment): `create`, `update` (build & run your current
  code), `status`, `promote` (publish to live), and `delete`. And `coduck changes`
  shows exactly what a publish will change — the per-file diff and any database
  schema additions or removals — before you run it.
- **`coduck deploy` is draft-aware.** If your project has a draft, `deploy` updates
  it by default (your live site is untouched — run `coduck draft promote` when
  you're ready); with no draft it publishes live, as before. Control it per run with
  `--live` / `--draft`, or set `"defaultEnv"` in `coduck.json`. Drafts are a
  Plus/Studio feature. Update with `npm i -g @coduckai/cli@latest`.

## Platform — 2026-06-21

- **Dev environments are here (Plus & Studio).** Your project can now have a
  private development environment — a test copy of your site with its own
  database and its own live preview, completely separate from production. In the
  editor, switch from "Production" to "Development", try changes against the dev
  copy (its data never touches your live site), and publish when you're happy.
  The dev preview is private — only you can open it, through a secure link in the
  editor. Free and Pro projects are unaffected.

## Platform — 2026-05-26

- **Settings → Billing shows your plan + credit burn rate.** The top of
  the billing panel now displays "Your plan: Pro / Plus / Studio" (or
  "Free — not subscribed"), and the credits line shows "$5.00 / $20.00
  this month" so you can see how much of your monthly allowance is
  left. Top-up balance is shown separately because it doesn't have a
  monthly cap and never expires.
- **The pricing page now knows what plan you're on.** When you're signed
  in and subscribed, your plan card shows a "Current" badge and its
  button is disabled with "Current plan" text. The other paid cards
  relabel as "Upgrade to X" or "Downgrade to X" so the action you're
  about to take is obvious before you click.
- **Pricing page layout cleanup.** Pro / Plus / Studio now sit in their
  own three-column row as the self-serve options, with Enterprise
  broken out as a slim "Contact sales" row beneath. Each of the three
  main plan cards has more room to breathe, and Enterprise no longer
  looks like a fourth equal-weight option.
- **Switching plans now actually works for existing subscribers.**
  Previously, clicking any plan card on the pricing page or in Settings →
  Billing while you were already subscribed silently failed (the request
  came back as "Already subscribed"). The buttons now route you to the
  Stripe customer portal — the right place to switch up or down, change
  your card, or cancel — and the click goes through immediately.
- **Settings → Billing buttons now say "Upgrade ↑" or "Downgrade ↓"**
  depending on whether the plan you're clicking is above or below your
  current one. Previously they all said "Upgrade" regardless, so a
  Studio user looking at the Plus card was told to "upgrade" to a
  cheaper plan.
- **Settings → Billing no longer shows a "Free" plan card.** CoDuck's
  hosting is paid-only — a free account can't deploy a project at all
  — so listing Free as a "plan" next to Pro/Plus/Studio was misleading.
  The billing page now shows just the three real plans you can
  subscribe to. If you're not subscribed, no plan card is highlighted
  as your current one (the Credits remaining panel above still shows
  your true balance).
- **New Plus plan ($100/mo or $1,000/yr).** A middle tier between Pro and
  Studio for builders shipping more than they thought. Plus gets $100 of
  AI credits per month, Lake hosting (1 GB database), and a 15,000-emails-
  per-month send limit — slotting cleanly between Pro (Pond / 100 MB / 5k
  emails) and Studio (Ocean / 5 GB / 50k emails). Annual billing saves
  $200/year (2 months free).
- **Pricing cards now list what you actually get.** Every plan card on the
  pricing page and in Settings → Billing now shows credits, hosting tier
  name, database size, monthly email-send cap, and key features — instead
  of a one-line tagline. The numbers are the same values the platform
  enforces, so what you see on the card is what you get.
- **Settings → Billing "Top up credits" section refreshed.** Clearer
  heading and description so it's obvious that top-up credits stack on
  top of your monthly subscription and are spent first. Each amount
  button now shows the credit value ("$20 credits") rather than the
  generic "one-time" caption. Plus subscribers can top up too, not just
  Pro and Studio.
- **Billing page in Settings now lets you upgrade to Studio.** The Studio
  plan ($200/mo — same product as Pro, 10× the runway) is now visible
  alongside Free and Pro under Settings → Billing. Clicking **Upgrade →** on
  either Pro or Studio goes straight to a Stripe Checkout for that plan.
- **Add Credits buttons in Settings → Billing fixed.** The top-up grid now
  shows **$5 / $20 / $50 / $100** and each one works — previously the
  buttons offered amounts CoDuck didn't accept, so clicks failed silently.
  Studio subscribers can now top up too (it used to be Pro-only).
- **Out-of-credits modal: top-up buttons fixed.** When you run out of
  credits mid-build, the four quick-top-up buttons inside the paywall
  modal ($5 / $20 / $50 / $100) now correctly open Stripe Checkout — they
  were previously hitting a route that didn't exist and 404'ing. The
  "Subscribe to CoDuck Pro" button next to them was unaffected.
- **`DATABASE_URL` now works for every Postgres client, not just Prisma.**
  Before today, apps using `node-postgres`, `pg`, `drizzle-orm`, `knex`, or
  `sequelize` would hit `bouncer config error` when trying to query through
  `DATABASE_URL` (the pooled path at `127.0.0.1:6432`) and had to fall back to
  `DIRECT_URL` — which has no server-side pool, so bursty traffic could
  exhaust it. PgBouncer is now configured with server-side prepared statements
  enabled, so prepared-statement-using clients work on the pooled path
  alongside Prisma. **Use `DATABASE_URL` for runtime queries regardless of
  stack;** `DIRECT_URL` is only for `prisma db push` / `prisma migrate deploy`.
- **New runtime docs page:** [Runtime architecture](/docs/reference/runtime)
  documents the container model, `--network=host` networking, exactly what
  host:port `DATABASE_URL` and `DIRECT_URL` point at, and a `[!WARNING]`
  about a footgun — **don't run `DROP SCHEMA public CASCADE` on your project
  DB.** That command destroys the `public.user_lookup()` function PgBouncer
  needs for connection auth (and the `USAGE` grant on the schema). If you've
  already done it and you're seeing `bouncer config error`, contact support to
  restore it.

## Platform — 2026-05-25

- **`coduck.json` is honored on every deploy.** Your `install`, `build`,
  `preStart`, and `start` commands are re-read from `coduck.json` on each deploy
  and run as declared — previously the container always ran a hardcoded
  `npm install` → `npm run build` → `npm start`. Notes:
  - `preStart` runs after build, before start — the right place for DB migrations
    (e.g. `prisma migrate deploy`). Declaring it also disables CoDuck's automatic
    `prisma db push`, so you own schema setup.
  - Set any command to `""` to skip that step (e.g. `build: ""` for a no-build app).
  - Monorepo note: this only takes effect once your CLI delivers `coduck.json` to
    the server — see the CLI 0.1.11 entry. Older CLIs pushing a subdirectory did
    not upload the repo-root `coduck.json`.
- **Specific deploy-failure messages.** A failed deploy now tells you the cause
  instead of one generic "crashed before becoming healthy":
  - out of memory → "retry on a bigger instance: `coduck deploy --size large`"
  - build failed → fix the error and redeploy
  - wrong port → "bind the port CoDuck assigns — use `process.env.PORT`"
  - crashed after start → check `coduck logs`
- **Faster reinstalls for imported apps.** Projects with no `@coduck/*`
  dependency now reuse the cached `node_modules` across deploys instead of a full
  reinstall every time (the cache-bust only runs for projects that use the CoDuck
  SDK).
- **Instance sizes.** `coduck deploy --size small|medium|large` (or
  `instanceSize` in `coduck.json`) selects more build/runtime RAM + CPU;
  medium/large require a Pro/Studio plan. The Node build-heap ceiling now uses the
  container's full RAM, fixing out-of-memory builds for heavy client bundles
  (three.js, remotion, recharts, …).
- **Reserved env keys.** The set of keys CoDuck manages (`DATABASE_URL`, `PORT`,
  `NODE_ENV`, `CODUCK_*`, …) is complete and rejected clearly on write. List them
  with `coduck env reserved`. The managed Postgres starts empty — reach it at
  `DATABASE_URL`/`DIRECT_URL` and bootstrap your schema in `build` or `preStart`.

## CLI — Unreleased (0.1.11)

Merged; ships on the next `@coduckai/cli` publish.

- **Monorepo `coduck.json` delivery.** A subdirectory push (`dir: "./web"`) now
  uploads the repo-root `coduck.json` to the server, so the platform's
  deploy-config honoring (above) actually applies to monorepo layouts. Repo-root
  `.gitignore`/`.coduckignore` are honored for subdir pushes too.
- **`coduck env import` no longer aborts on the first reserved key** — it skips
  reserved/invalid keys with a warning and imports the rest. New `coduck env
  reserved` lists managed keys.
- **`push` honors `.gitignore`** (plus sensible defaults: `node_modules`,
  `.venv`, build output, caches). `push --dry-run` prints a size summary +
  biggest dirs instead of a full file manifest.
- **Resilient push.** `push` auto-retries transient network errors; `deploy`
  warns when your last push failed or local files changed since it.
- **Logs filters.** `coduck logs --since <30m|1h|…>` and `--grep <pattern>`.
- **`coduck --version`** reads the installed package version correctly (no longer
  under-reports).

## CLI 0.1.10

- `coduck deploy --size` and `coduck.json` `instanceSize` for instance-tier
  selection.

## CLI 0.1.9

- Chunked `push` for large projects (no more 413s) and `.coduckignore` support.

## CLI 0.1.8

- `coduck db import <file>` — upload a SQL dump to the project database.

## CLI 0.1.7

- Real `coduck push` and `create-existing --push --deploy`; fixed `coduck logs`.
- Browser-based device login (`coduck login`) — the CLI never sees your password.
