# Changes

The things Clave can do that are new, and the changes that can break a
site, newest first. Each entry links to the page that tells more. To use
a new thing, ask your agent for it by name.

## 2026-11-04

- **Visitors in a month.** Each site has a number of requests in a
  month. Past it the owner gets an email. At 3 times it, visitors get a
  short check before the site, and at 10 times it the site is blocked
  until the month ends. `GET /v1/sites/{id}/usage` shows it as
  `requests_per_month`. See [Limits](/concepts/limits).
- **Try without an account.** A person can start from a chat client's
  sign-in page, and an agent with `POST /v1/auth/try`, with no email to
  wait for. A try makes drafts only, for 6 hours and 5 builds. To keep the
  work, the owner verifies an email with the tool `verify_email` or
  `POST /v1/account/verify`. See
  [Get an account](/start/account).
- **New error code:** `verify_email_required` (403) answers a change from
  an account that started without an email when its time or its builds
  are used. See [Errors](/api/errors).
- **Open signup.** Anybody who reads their own email can make an account
  at the app's `/signup` page. See [Get an account](/start/account).
- **An agent can make the account.** When `POST /v1/auth/start` names an
  address with no account, the email asks its owner to make one, and the
  grant makes it. The redeem then answers `is_new: true`. The start
  answers `status: "email_sent"` now, not
  `"email_sent_if_account_exists"`.
- **Signup has a line.** When many people sign up at once, an address
  waits in line with no mail, and Clave emails the link when there is
  room.

## 2026-11-03

- **Publishing needs approval.** The owner can turn this on for a site,
  on its Settings tab in the app. Then no agent and no API token puts the
  site live: a publish, activate or restore answers `needs_approval`
  (409), and a preview carries `review_url`, the page where a person
  publishes the draft. See
  [Drafts and slots](/concepts/drafts).
- **Changed:** the app's home page lists drafts that wait for an answer
  only for sites that need approval. A draft that went live, or one older
  than the live site, is not listed.
- **Plans for each account.** A new account gets the Trial plan: 3
  running sites, 3 archived sites, 20 builds a day, and one domain more
  than its running sites. An account made before today keeps 10 sites and
  10 domains. `GET /v1/billing` and `get_account` show the caps.
- **A full platform says so.** When Clave has no room for a new site,
  draft or domain, the call answers `platform_full` (503) and the account
  is in line. See [Errors](/api/errors).

## 2026-10-22

- **Site settings in the repository.** `clave.site.json` can now set the
  page a payer lands on, the "Made with Clave" badge,
  code refunds and the egress list. A publish reads it, and a draft keeps
  its own. Only the owner can publish a change to the badge or to code
  refunds. See [Site settings](/concepts/settings).
- **Forms in the repository.** Declare a contact form under `forms` in
  `clave.site.json`, and the publish makes it. Its address comes from the
  site and the form's name, so the page can carry it first. See
  [Forms](/concepts/forms).
- **Removed:** the API, connector and app calls that set these. Change
  them in `clave.site.json` and publish. `PATCH /v1/sites/{id}` takes
  only `title`. The calls that made, changed, turned off or removed a
  form are gone, and so is the call that set the egress list. The
  connector has no
  `create_form` and no `set_form_notify`, and `update_site` takes only
  `title`. Clave writes each site's current settings into its file, so a
  site keeps what it has.
- **Changed:** Clave now reads `clave.site.json` on a site with no code
  too. Such a site that names `events`, `schedules`, `private`, `egress`
  or `code_refunds` is refused at publish, with a message that says which.
- **Test payments on drafts, with no form.** A draft takes test payments
  with test cards, into a test account that Clave makes for you at once.
  You fill in no form, and the live site and its money do not change.
  You can choose another country or currency, or use the payment
  provider's own form and dashboard. Ask your agent to set up test
  payments. See [Payments](/concepts/payments).

## 2026-10-17

- **A short API token from the connector.** An agent on the connector
  that can also run shell commands can get a token that works for 10
  minutes, and use the JSON API with it. It does not sign in a second
  time. The connector gives a one-time code, and the agent exchanges it,
  so the token is not in the chat. See [Authentication](/api/auth).

## 2026-10-15

- **A picture of each site.** Your agent can make `public/og.jpg`, a
  picture of the top of your home page. Chat apps and social networks
  show it with a link to your site, and the Clave app shows it on the
  site's card. Ask your agent for a social preview. See
  [Source](/concepts/source).
- **Import pictures from the web.** When you move a site from WordPress,
  Wix or Webflow, your agent can bring its pictures and PDFs across from
  their URLs. You do not download and upload them again. An account can
  add 1,000 files a day, up from 100. See [Source](/concepts/source).
- **Fonts, short videos and SVG.** A site can hold `.woff2` and `.woff`
  fonts, and `.mp4` and `.webm` videos in `public/`. An import from a URL
  also takes `.svg`. Load your own font with Astro's fonts API. See
  [Source](/concepts/source).
- **A deleted site can come back for 30 days.** A delete takes the site
  offline and out of every list at once, and Clave keeps it for 30 days.
  Ask Clave in that time to restore it. It comes back archived. After 30
  days it is gone for good. See [Sites](/api/sites).
- **Changed:** when the DKIM records of a site's mail domain go from its
  DNS, Clave stops the site's mail until they are back. Clave checks
  each hour. Removing a domain now also turns its mail off. See
  [Domains](/api/domains).

## 2026-10-11

- **Upload a favicon.ico.** The upload link takes `.ico` files. An icon
  goes to `public/`, so `public/favicon.ico` is served at `/favicon.ico`.
  See [Source](/concepts/source).
- **Redirect old WordPress URLs.** Requests for `/wp-content/uploads/…`
  and `/wp-sitemap…` now reach the site, so its redirect rules can send
  them to the new pages and images. Search engines keep the images they
  found before. Other `/wp-` paths and `.php` files are still refused.

## 2026-10-10

- **See the health of a site's mail.** The domain shows the mail the site
  sent in the last 7 days, how much bounced, and how much readers marked
  as spam. When the mail is stopped, it says who stopped it. The **Mail**
  tab marks each mail that bounced or was marked as spam. See
  [Domains](/api/domains).

## 2026-10-09

- **Changed:** the mail that a site's code sends has a limit for the
  account too: 200 mails in 24 hours, for all its sites and drafts
  together. Over it the answer is `429 account_mail_limit`. See
  [Runtime](/api/runtime).
- **Changed:** Clave stops a site's mail when too much of it bounces or is
  marked as spam, also when the site sends little. The limits are on
  [Domains](/api/domains). Runtime mail then answers `409 mail_paused`.

## 2026-10-07

- **Give a site to another account.** The owner offers a site to the
  address of another Clave account, and that account accepts in the app
  or with its own agent. The domain and the collaborators go with the
  site, and the owner can stay on as a collaborator. A site that takes
  money cannot move yet. Ask your agent to transfer the site. See
  [Give a site to another account](/concepts/transfers).
- **Changed:** after a site changes owner, the new owner cannot refund a
  payment from before the move into a payout account it does not hold.
  The answer is `403 refund_needs_payout_owner`. See
  [Payments](/api/payments).
- **The app keeps up on its own.** An open page shows a publish, a new
  draft or a new message within half a minute, without a reload. If you
  are typing, it offers to show it instead.
- **Search the enquiries.** The inbox finds the messages that hold your
  words, in anything a visitor typed. Press `/` to reach the search box.
- **Light or dark.** Choose it under **Profile** on your account page, or
  keep it as your system's.
- **Changed:** the account page has tabs: Profile, Sign-in and agents,
  Getting paid, and Plan.
- **The app is quicker to use.** A page changes without a full reload.
  A link to a site opens in a new tab. The app asks in a dialog before
  it deletes, removes or revokes something, and says when a save worked.
  Forms you use rarely are behind a button. On a phone, the menu is
  behind a button at the top.
- **The return from a pay link says which payment it was.** The address
  the payer comes back to has `payment` (the payment's id) and
  `reference` (your own id) after `clave_payment`. See
  [Runtime](/api/runtime).
- **Changed:** on a deployment that charges nothing, an account has at
  most 10 running sites and 10 archived sites. Before this, the number
  was not capped. `GET /v1/account` reports both as `max_sites` and
  `max_archived_sites`. See [Limits](/concepts/limits).
- **Changed:** on a deployment that charges nothing, an account has at
  most 10 domains. `GET /v1/account` reports it as `max_domains`.
- **Changed:** a token cannot change the account's email. Change it on
  the account page of the app. The app sends a link to the new address,
  and the address changes when you open it. See [Account](/api/account).

## 2026-10-06

- **Any Google or Fontsource font.** A build can get fonts with Astro's
  fonts API (`experimental.fonts` in `astro.config.mjs`, with
  `fontProviders.google()` or `fontProviders.fontsource()`). The site
  serves the files from its own address. Any other request from a build
  fails, and the build log names the address. See
  [Publishing](/concepts/publishing).
- **Changed:** the spam check on a form is hidden. It shows only when
  the visitor must click. This is in the `embed` of a form from today.
  A published page does not change until you take the embed again. For
  a check that always shows, set `appearance=always` in the frame
  address. See [Check a visitor is a person](/api/runtime).
- **Changed:** a draft has lower limits than the live site. It takes 3
  form messages a minute and 50 a day, sends 20 mails a day, and keeps
  100 MiB in at most 500 files, with 50 uploads a day. The limits on one
  item are the live site's. `GET /v1/account` reports them as
  `draft_limits`. See [Limits](/concepts/limits).
- **The app shows a draft's data.** The Enquiries, Mail and Files tabs of
  a site have a **Live | Draft** control. The counts and the account's
  inbox stay live only. The site's page can reset the draft's data and
  give the draft a new address. `GET /v1/forms/{id}/submissions` and
  `list_submissions` take `slot` 1 for the draft's messages. A new
  **Secrets** tab shows which names the live site and the draft have. See
  [Drafts and slots](/concepts/drafts) and [Forms](/api/forms).
- **Changed:** approving a draft builds its source again for the live
  site, with the live posts and the live address. Before this, the
  draft's files went live as they were. See [Drafts and slots](/concepts/drafts).
- **Posts have a draft line.** A write to the posts with `slot` 1 goes to
  the draft only. The draft shows those posts and the live site does not.
  Before this, the call was refused, and a draft showed the live posts.
  See [Drafts and slots](/concepts/drafts).
- **Forms work on a draft.** A message sent on a draft is a draft
  message: it is mailed to the site's owner only, with `[Draft]` in the
  subject, it is not in the live site's list, and it uses none of the
  live form's limits. Before this, a message sent on a draft arrived as a
  live one. See [Drafts and slots](/concepts/drafts).
- **Changed:** a site has one draft slot. Slots 2 and 3 are removed, with
  their addresses and their branches. A call with `slot` 2 or 3 answers
  `400 invalid_slot`. See [Drafts and slots](/concepts/drafts).
- **Changed:** a draft no longer goes away after a week. Its address
  lives as long as the site, and previews no longer report `expires_at`.
  See [Previews](/api/previews).
- **A draft can get a new address.** `POST /v1/previews/{id}/address`
  moves the draft and turns the old address off, for a link that went
  where it should not. See [Previews](/api/previews).
- **A draft keeps its own `clave.site.json`.** Its private paths are
  guarded on the draft's address, its staff sign in there, and its
  timers go to the draft. Before this, a draft's private paths were
  open. See [Code in a site](/concepts/code).
- **Site code knows if it is a draft.** `env.CLAVE_ENV` is `live` or
  `draft`. A draft gets a runtime key of its own: `GET /v1/runtime/site`
  answers the draft's address, and the other calls answer
  `403 not_on_a_draft` until each opens. See [Runtime](/api/runtime).
- **Changed:** the draft's store keeps its data from draft to draft. A
  migration changed after it ran empties the draft's store, and stops a
  live publish. See [Store](/api/store).
- **Seeds.** `seeds/draft/` fills the draft's store with test rows, and
  `seeds/live/` gives the live store its first rows. Each seed runs one
  time for each store. `POST /v1/previews/{id}/reset-store` starts the
  draft's store again from its seeds. See [Store](/api/store).
- **A draft's code can send mail, to the site's own people.** The owner,
  a collaborator or staff get it from Clave's sender, with `[Draft]` in
  the subject. Anyone else answers `403 draft_mail_recipient`. A draft's
  mail has its own daily count. See [Runtime](/api/runtime).
- **A draft's code can keep files.** They are the draft's own, with their
  own limits. An upload needs a person signed in on the draft. See
  [Runtime](/api/runtime).
- **A draft has secrets of its own.** `PUT
  /v1/sites/{id}/secrets/{name}?slot=1` sets the draft's value; the
  draft never gets the live one. See [Secrets](/api/secrets).
- **Changed:** a `Clave-Identity` works only on the address it was made
  for. A sign-in on the live site does not reach the draft, nor the other
  way.
- **The app shows what a site spends of each limit.** The overview shows
  publishes, builds, drafts, pictures, comments, mail and payments for the
  last 24 hours, and the size of the site's source. Each tab shows the
  count its actions spend, such as publishes on **Versions**.
  `GET /v1/sites/{id}/usage` and the chat connector's `get_account` give
  the same counts. See [Limits](/concepts/limits).

## 2026-10-05

- **The app shows a site's pictures in a tab.** The **Pictures** tab
  shows each picture and document, opens a picture larger, and copies a
  file's path to give to the agent. **Add pictures** opens an upload link,
  so the owner can add files without asking the agent first. See
  [Site source](/concepts/source).
- **The Files tab shows what site code keeps.** A picture shows small and
  opens larger, also when it is private. Any other file downloads. See
  [Runtime](/api/runtime).
- **Changed:** a site has one domain. Attaching a second answers
  `409 site_has_domain`. See [Domains](/concepts/domains).
- **Site code can get the site's address.** `GET /v1/runtime/site` gives
  the address the site answers at now, for a mail sent with no request
  behind it. A site build also takes this address as its `site` value. See
  [Runtime](/api/runtime).
- **The chat connector can use what a site built.** It calls the site's
  own actions, reads the store and reads the logs. The owner can also
  repair the store and undo a repair. See
  [The chat connector](/agents/connector).
- **Changed:** site calls and store writes are capped at 60 and 20 a
  minute for each account. More answers `429 rate_limited`. See
  [Call the site](/api/call).
- **Private paths can name roles and labels.** A path in `private` can
  open only for people with one of the given roles (`owner`,
  `collaborator`, `staff`) or one of the given staff labels. See
  [Code in a site](/concepts/code) and [Staff](/api/staff).

## 2026-10-04

- **Site code can keep files.** A photo that staff add, or a document
  that a visitor sends, stays in the site's store. A public file must be
  an image. See [Runtime](/api/runtime).
- **Site mail can be HTML.** A mail from site code can send HTML next to
  its plain text. See [Runtime](/api/runtime).
- **Changed:** a checkout on a hold that ran out, or on a payment that is
  paid, now answers `409 hold_expired` or `409 already_paid`. Before, it
  answered `502`, and the site tried again. See [Errors](/api/errors).

## 2026-10-03

- **Changed:** a site sends mail to visitors only from its own verified
  domain. Without one, `POST /v1/runtime/mail` answers
  `409 mail_needs_domain`. See [Domains](/concepts/domains).
- **The publishable key of your own Stripe account.** Give it in the app
  or through the chat connector, and the card form works on the site's
  own page. See [Payments](/concepts/payments).
- **Site code can give money back** with the site's key. See
  [Runtime](/api/runtime).

## 2026-10-01

- **Mail from your domain.** Turn it on for a domain in the app or
  through the chat connector. See [Domains](/concepts/domains).

## 2026-09-30

- **Code in a site.** On a plan that runs code, a site can run its own
  code. It can send mail, take money and check that a visitor is a
  person. See [Code in a site](/concepts/code) and
  [Runtime](/api/runtime).
- **Staff sign in with Clave** to a site's private paths. See
  [Staff](/api/staff).
- **Secrets** for a site's live code. Only the provider keeps the value.
  See [Secrets](/api/secrets).
- **The agent can call the site's code** as the person it acts for, so it
  uses the same actions as staff. See [Call the site](/api/call).

---

## Where this page sits

This is one page of the Clave documentation.
Read it as a web page at https://docs.heyclave.com/changes/log.
Every page has a `.md` address, and https://docs.heyclave.com/llms.txt lists them all.

- Previous: [Secrets](https://docs.heyclave.com/api/secrets.md)
- Index: [Overview](https://docs.heyclave.com/index.md)
