crowne

Changelog

What changed in crowne, newest first.

sdk @ 0.4.0

This release changes how crowne/server finds the visitor address outside Cloudflare Workers.

  • Outside Workers, the package no longer reads X-Forwarded-For, because visitors can set it to change their own id. Use the new ip option to give the address from a source you trust. If you do not set it, the visits count as anonymous and the package shows one warning.
  • The country now comes only from request.cf. The package no longer reads the cf-ipcountry header.

sdk @ 0.3.0

This release ships the npm package as built JavaScript.

  • crowne now ships built JavaScript and type declarations, so you can install it outside of Bun. TypeScript now finds the types for crowne/browser and crowne/server.

Dark theme and passkey names

This release makes dark the default theme and lets you rename passkeys.

  • The site and the app are now dark unless you choose light, or choose the system setting on a light system. The iOS launch screens are dark too.
  • You can now rename each passkey on the account page. When you remove a passkey, your browser's password manager also forgets it.

Proxy and page view fixes

This release improves the proxy and counts more page views.

  • proxy() now forwards the browser's events unchanged and sends the visitor in a new Crowne-Visitor header. Any proxy can use this header with an events:write key. Proxied events now drop bots and check the site's domains, as browser events do.
  • Before, all proxied traffic for a site shared one limit of 600 requests a minute. Now each visitor gets 6,000 a minute, and each key gets at most 10,000 a minute.
  • Add data-manual to the script tag to stop automatic page views. Then send page views yourself with window.crowne.pageview().
  • Page views from client routers that use the Navigation API now count. Before, these pages were lost.

Pull to refresh

This release lets you reload the installed app with a pull.

  • In the installed app, pull down at the top of a site page or the Sites page to reload it. If you release the pull early, nothing happens.

Proxy without site id

This release makes proxy setups simpler and lets you install the app.

  • Behind a first-party proxy, you can now leave out the site id. Use crowne({ endpoint: "/api/event" }) or a script tag with only data-endpoint. The proxy adds the site id, so filter lists find it harder to match the requests.
  • You can now install the app on your phone or computer as a standalone web app. On iPhone and iPad, it opens with a light or dark splash screen.

API fix and copyable codes

This release fixes the REST API in production and makes email codes easy to copy.

  • Calls to api.crowne.io/v1 got a 404 error, so the Stats API, POST /v1/signup, and site changes did not work. They work again.
  • When you copy the code from a sign-in, confirm, reset, or invite email, you now get only the digits, with no spaces, tabs, or line breaks.

Custom dashboards and agent sign-up

This release adds custom dashboards and lets agents sign up without an account.

  • You can make custom dashboards beside the Overview. Build each widget with a live preview, then drag, resize, copy, or remove it. Shared links and public sites show these dashboards read-only.
  • An agent can call POST /v1/signup with an email and a domain to get a site and a key. The person then claims the site from the emailed link. curl crowne.io shows how.
  • Key scopes have new names: ingest is now events:write and stats is now sites:read. Your existing keys were changed for you. A new sites:write scope lets a key set up sites, goals, funnels, and shared links.
  • A trial now ends after 30 days or 100,000 events, and each person gets one. Past the events, the dashboard locks until you pick a plan; no events are lost. A site's first goal now becomes its dashboard goal.

REST API reference docs

This release adds a full reference for the REST API.

  • The Stats API page is now the REST API page. It shows how to send events over plain HTTP from any language, with no package, and gives the event fields, error codes, and rate limits.