New features, improvements, and fixes, newest first
Pro now includes 5 environments per project and 100 flags per project, up from 3 and 30. The price stays a flat $29: an environment is one more static file on the CDN and a flag is a few hundred bytes of JSON, so there was no honest reason to keep the ceilings that low. Existing Pro teams get the new limits automatically, nothing to do.
The SDKs now make conditional requests: they tell the edge which version they already hold, and a poll that finds nothing changed comes back empty instead of fetching the whole config again. Steady-state polling costs your users almost no bandwidth, which matters most in the browser and on mobile, and a larger flag config no longer makes every poll heavier. Ships in switchbox-flags 0.9.0 and switchbox-js 0.8.0, automatic, with nothing to configure.
The SDKs now poll the edge every 10 seconds instead of 30, and the CDN cache window dropped to match. A toggle you save in the dashboard reaches every running client in about ten seconds, twenty in the worst case. Ships in switchbox-flags 0.8.0 and switchbox-js 0.7.0.
Every environment now has a flag usage panel: per-flag evaluation counts, the share of evaluations serving each value, a stale-flag hint when something has not been checked in a while, and which SDK versions are reporting. It runs on anonymous usage telemetry in the new SDK releases: aggregate counts only, no identity, no user context, and one option turns it off.
A new docs recipe wires the onEvaluation hook into PostHog, Amplitude, Segment, or GA4 with copy-paste handlers, exposure dedup included, plus the rules for keeping assignment stable while a test runs. Your analytics tool already has your conversions and your identity graph; Switchbox supplies which variant each user saw.
The AND, OR, and OTHERWISE labels in the targeting editor are now clickable: they open a walkthrough of the exact boolean grammar you are looking at, drawn with the editor's own components. Each environment card in the flag editor also shows its SDK key with inline copy, and the Playground was reworked so the user context is a live JSON object you type into.
The whole first-run experience got a redesign: a clearer step-by-step setup guide that walks a new team from an empty project to a live flag, and a projects-first overview where your projects, flags, and environments are one click away. At the SDK step, copy a Python, JavaScript, or React snippet, or paste a ready-made prompt into your AI coding agent to wire the flag in for you.
The whole product now has a proper dark theme: the dashboard, the docs, the blog, and the marketing pages. It follows your operating system by default and remembers the toggle in the account menu or the top nav if you set one. Every screen was rebuilt on named colour tokens so the contrast holds up in both themes, and the landing page even has its own dark screenshots.
Every docs page now has a plain-markdown twin: append .md to any docs URL. There is also an llms.txt index and the whole documentation in a single llms-full.txt, so LLMs and AI agents can read Switchbox docs without scraping HTML. The blog got an RSS feed at /rss.xml while we were at it.
Official OpenFeature providers for JavaScript, React, and Python. Your app codes against the vendor-neutral CNCF API and Switchbox plugs in as one constructor line, with evaluation still happening locally in your app. Adopting Switchbox is one line, and so is leaving it. That is the point.
This page. Every user-visible change lands here, newest first, and the landing page shows the latest four. A product built by one person should make it easy to check that it is alive and moving.
A new architecture page walks through the whole trick: the API writes static JSON to the CDN, and your apps read from the edge and evaluate locally. It shows the literal flags.json your SDK fetches, the few lines that read it, and the honest tradeoff: changes propagate in about 30 seconds.
The landing page got a full rework: a cleaner hero with a 3D switch panel you can actually flip, a short note from the founder on why Switchbox exists and why a one-person company is safe here, and a calmer, more consistent look across the site.
New teams now land on a four-step guide: create a project, create a flag, install the SDK, watch it connect. The last step flips to a live Connected state on screen the moment your app fetches its first config.
Switchbox now has a paid tier. Upgrade from the Billing tab in Settings, with checkout and invoices handled by Polar. Plans map to honest limits: Free covers a side project, Pro covers a team, and flag reads stay unlimited on every plan.
switchbox-flags 0.7.0 for Python, switchbox-js and @switchbox/react 0.6.0 for JavaScript. Evaluation can no longer throw: malformed configs and hostile user contexts degrade to your default value, fetches carry timeouts, and one bad flag no longer poisons the rest of the config.
Quickstarts for Python, JavaScript, and React, a full SDK reference, concept guides, and a dashboard tour. Twenty-two searchable pages at /docs.
Team settings now live in the nav rail and scope to the team you are working in: members, invitations, billing, and the danger zone in one place. Your account, data export, and deletion moved to a dedicated profile page.
Team invitations are now delivered by email automatically, and accounts get the receipts you would expect: a welcome note, a confirmation when an account is deleted, and a notice to admins when an SDK key is revoked. Copyable invite links still work.
Routine key rotation keeps a 24-hour grace period so running clients migrate cleanly. If a key leaks, Revoke now skips the grace period and purges it from the edge immediately: the old key 404s within seconds.
A full mobile pass across the app: the sidebar collapses to a drawer, tables become card lists, and the flag and segment editors are usable on a small screen.
Invite teammates with single-use links and give them Admin, Editor, or Viewer roles. Sign in with GitHub or Google: accounts are keyed on your verified email, so the same person resolves to one account across both.
String, number, and JSON flags now serve real values: an enabled value for matched and in-rollout users, a default for everyone else. Author the pair once at the flag level, override it per environment when needed.
Define an audience once, say beta users in the EU, and attach it to any number of flags. Segments are expanded into the published config at save time, so the SDKs stay simple and evaluation stays local.