# Changelog

What changed in Apparent, its SDKs and these docs. Newest first. Follow it with the [RSS feed](https://apparent.fyi/docs/changelog.xml).

## 2026-10-24 · All four SDKs are out (0.2.1)
Tags: SDKs

- **Expo and React Native:** `npx expo install apparent-expo` ([npm](https://www.npmjs.com/package/apparent-expo)).
- **Swift:** add `https://github.com/AhmedAshour/apparent-swift` in Xcode, from `0.2.1`.
- **Kotlin:** `implementation("fyi.apparent:apparent-android:0.2.1")`, plus `apparent-compose` for Compose screens (Maven Central).
- **Flutter:** `flutter pub add apparent` ([pub.dev](https://pub.dev/packages/apparent)).

The code is open in [apparent-sdks](https://github.com/AhmedAshour/apparent-sdks) and [apparent-swift](https://github.com/AhmedAshour/apparent-swift).

## 2026-10-24 · Swift, Kotlin and Flutter: links, notifications, consent, sturdier
Tags: SDKs

- **Same features as Expo:** `beforeSend`, `optOutByDefault` (consent remembered), `deep_link_opened` and `push_opened` (only the campaign and title from the data, never the text). Kotlin picks up the launch link and Firebase taps on its own (`Apparent.handleIntent(intent)` for `onNewIntent`); Swift (`Apparent.handleDeepLink`, `handleNotificationResponse`, `.apparentDeepLinks()`) and Flutter (`Apparent.trackDeepLink`, `trackPushOpened`) give you one call to make.
- **`Retry-After` waited exactly**, never sooner; a clock change never stretches a wait.
- **Sign-in, logout and opt-out saved at once**, so a kill right after keeps them.
- **Broken saved state, a stuck disk, odd property values or a bad `start`** never stop the SDK or throw into your app.

## 2026-10-24 · React Native and Expo: links, notifications, consent
Tags: SDKs

- **Links that open the app** are sent as `deep_link_opened`, secrets redacted. A campaign link (`utm_source`) that opens the app on its first day counts as where that person came from.
- **Tapped notifications** are sent as `push_opened` (with `expo-notifications`), with only the campaign and title you put in the data.
- **`beforeSend`** lets you change or drop any event before it is saved.
- **`optOutByDefault`** collects nothing until `optIn()`, for apps that ask for consent first.

## 2026-10-24 · Send events from your server
Tags: Docs

A new guide: [send events from your server](https://apparent.fyi/docs/server) with curl, Node and Python. People are now counted by account: the same signed-in person on two phones, or after a reinstall, is one person, and only a visit with the app open makes someone active.

## 2026-10-23 · SDKs: Macs, simulators, a wrong key
Tags: SDKs

- **Macs** count as their own platform, `macos` (Swift, and iPhone apps running on a Mac).
- **Simulators and emulators** say so in every batch, so they stay out of your numbers even without a device model.
- **A wrong app id or key** prints one line in debug builds instead of losing events quietly.
- **Early events** (tracked in the first milliseconds after start) keep their user and properties. Fixed in all four SDKs.
- Flutter passes the same conformance rules as the others.

## 2026-10-23 · Docs
Tags: Docs

These docs, at apparent.fyi/docs. A quick start that begins with one prompt for your AI, a page per SDK, the privacy answers for both stores, and the intake API. Every page is also Markdown (add `.md`), and all of it is in [llms-full.txt](https://apparent.fyi/docs/llms-full.txt) for agents.

## 2026-10-23 · SDKs for every platform
Tags: SDKs

One contract for every SDK, checked by the same 25 rules:

- **React Native and Expo**: `apparent-expo` 0.2 now works in bare React Native too. Not released yet.
- **Swift**: iOS and macOS, SwiftUI screens, StoreKit 2, privacy manifest. Not released yet.
- **Kotlin**: Android, Compose screens, Play Billing, install links. Not released yet.
- **Flutter**: navigator observer, errors, offline queue. Not released yet.
- **Website**: one script tag. Live.

Until each is published, its install line is what it will be. This page says when each ships.

## 2026-10-23 · Set up with your AI
Tags: App

**Add your app** gives you one prompt for Claude Code, Cursor or Codex with your app's id and key in it, then turns green with "First event from your app ✓". Personal tokens let your own AI [ask your numbers](https://apparent.fyi/docs/ask) through MCP, read-only.
