SeatLayer offers public React Native, Flutter, iOS, and Android SDK source
alongside the production web SDK. React Native is available as
@seatlayer/react-native, Flutter as seatlayer, iOS through Swift Package
Manager, and native Android as a Kotlin/JitPack public preview.
Choose a mobile surface
React Native package
Install
@seatlayer/react-native
for Expo or React Native applications on iOS and Android.
Flutter package
Install seatlayer for a typed Flutter
view, controller, commands, and event streams on iOS and Android.
iOS SDK preview
Evaluate the public
seatlayer/seatlayer-ios
Swift package from main until the first production tag is documented.
Android SDK preview
Use the native Kotlin
seatlayer/seatlayer-android
package with coroutines, typed flows, and an origin-restricted WebKit bridge.
Controlled webview
Host your own page with @seatlayer/js when you need the stable web SDK
today or want to own a narrow native-to-web checkout bridge.
Mobile web
Open SeatPicker directly in the browser for its responsive bottom sheet,
touch controls, holds, checkout callback, and optional 3D.
Install a native SDK
npm install @seatlayer/react-native react-native-webviewimport {
SeatLayerView,
useSeatLayerController,
} from "@seatlayer/react-native";
export function SeatMapScreen() {
const controller = useSeatLayerController();
return (
<SeatLayerView
style={{ flex: 1 }}
controller={controller}
configuration={{
event: "ev_your_event_key",
currency: "USD",
}}
onReady={(info) => console.log("SeatLayer ready", info.mode)}
onLoadError={(error) => console.error(error.code, error.message)}
/>
);
}The package includes a typed controller, correlated errors, stale-event protection, and a vendored web runtime. See the React Native README and runnable Expo example before adopting the preview.
flutter pub add seatlayerimport "package:seatlayer/seatlayer.dart";
final controller = SeatLayerController();
SizedBox(
height: 640,
child: SeatLayerView(
controller: controller,
configuration: SeatLayerConfiguration(
event: "ev_your_event_key",
currency: "USD",
),
onReady: (info) {
debugPrint("SeatLayer ready: ${info.mode.raw}");
},
),
);Dispose the controller with the host state. See the Flutter package README for commands, event streams, the offline example, and preview constraints.
In Xcode, choose File → Add Package Dependencies and enter:
https://github.com/seatlayer/seatlayer-ios.gitSelect the main branch for evaluation until this page documents a stable
tag.
import SeatLayer
let map = SeatLayerView()
map.delegate = self
var configuration = SeatLayerConfiguration(
event: "ev_your_event_key",
currency: "USD"
)
let info = try await map.load(configuration)
let hold = try await map.hold()Read the iOS SDK README before adopting the branch dependency.
Add JitPack to dependency resolution, restricted to the SeatLayer package:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven("https://jitpack.io") {
content {
includeGroup("com.github.seatlayer")
}
}
}
}Install the exact preview tag:
dependencies {
implementation(
"com.github.seatlayer:seatlayer-android:v0.1.0",
)
}val seatMap = SeatLayerView(this)
setContentView(seatMap)
lifecycleScope.launch {
seatMap.load(
SeatLayerConfiguration(
event = "ev_your_event_key",
currency = "USD",
),
)
}Collect seatMap.controller.events, use its suspending hold and view
commands, and call seatMap.destroy() with the screen. Read the
Android SDK README
and bridge reference.
Host an immutable integration page using the current @seatlayer/js
release. Bridge only the checkout and application events your native shell
needs.
Native screen
└─ owned WebView
└─ immutable SeatLayer integration page
├─ SeatPicker
├─ event inventory over HTTPS/realtime
└─ narrow validated message bridge
└─ native checkout / navigationShared native contract
The React Native, iOS, Android, and Flutter SDKs use a versioned bridge and
intentionally mirror the web SeatingChart contract:
hold, resumeHold, extendHold, release, releaseLabels,
bestAvailable, holdGA, setSeatTier, getSelection,
getCurrentHold, getGAAreas, getFloors, setFloor,
setColorblindSafe, view and zoom methods, and destroy.
Command failures correlate to the awaited native call with structured errors. Unknown future events and enum values are retained as unknown values rather than crashing older applications.
Security boundary
Keep secret-key booking in your backend. A native binary or webview may receive
a holdId, but never the secret.
- The app selects and holds; your trusted server inspects and books.
- Calculate payment from server-inspected hold items, not app input.
- Reuse the host order id as
bookingReffor retry safety. - Validate webview bridge source/origin and message schemas.
- Treat hold expiry and inventory conflicts as recoverable buyer states.
Layout and lifecycle requirements
- Give the map a definite height or make it full-screen.
- Do not nest it inside another gesture-driven scroll or zoom surface.
- Preserve the hold id across checkout navigation and app suspension when your product promises restoration.
- Dispose or destroy the SDK with its native screen.
- Test safe areas, rotation, back navigation, keyboards, process suspension, and resume.
- Test 2D fallback when the target environment cannot support optional 3D.
Preview verification checklist
- The dependency resolves from its registry or exact documented release.
- The package version or Git revision is pinned intentionally.
- No secret key exists in the native binary, WebView, or logs.
- A test event renders and receives live inventory.
- Select, hold, checkout, expiry, release, and conflict paths work.
- Gestures do not conflict with parent scrolling.
- iOS and Android physical-device smoke tests pass.
- The backend books with a stable
bookingRef.
Explore the live buyer demo, continue with holds and checkout, or give an agent the SeatLayer AI Toolkit.