Platforms
One codebase, six build targets. What differs on each.
CI builds all six on every push, so a break shows up before a user finds it.
flutter build web --wasm --release
flutter build web --release # JS fallback
flutter build apk --release
flutter build ios --release
flutter build macos --release
flutter build windows --release
Web
Two renderers. --wasm compiles to WebAssembly and uses skwasm;
browsers without WasmGC fall back to the JS build automatically. WasmGC
covers roughly 92% of traffic — Chrome 119+, Firefox 120+, Edge 119+, Safari
18.2+.
Around 1.6 MB gzipped of app payload, plus
skwasm.wasm served from Google's CDN and cached across every
Flutter site a visitor has used. See Deploying for
the font tools that get it there.
Kite uses path URLs, so the host must serve index.html for
unknown paths — otherwise refreshing /orders/10004 is a 404.
Core Web Vitals cannot score a Flutter app. It renders to a canvas, so
there is no LCP-eligible element and PerformanceObserver reports
zero. Use FCP and time-to-interactive. Irrelevant behind a login, but do not
let anyone quote you a CWV number.
Mobile
The layouts are genuinely different, not reflowed: the shell swaps its sidebar for a bottom bar and drawer, the inbox pushes a full-screen detail rather than squeezing a second column, and the board scrolls horizontally.
Flutter 3.38+ requires the Apple UIScene lifecycle; the generated iOS project already has it. If you regenerate platform folders from an older template, follow Flutter's UIScene migration guide.
| Task | Where |
|---|---|
| App icon | ios/Runner/Assets.xcassets, android/app/src/main/res/mipmap-* |
| Display name | ios/Runner/Info.plist, android/app/src/main/AndroidManifest.xml |
| Bundle id | Xcode target settings, android/app/build.gradle |
| Signing | Xcode; android/key.properties |
Kite ships no network permissions of its own — the mock provider makes no
requests. Add INTERNET to the Android manifest and any ATS
exceptions to Info.plist when you point it at a real backend.
Desktop
macOS and Windows build unchanged. On macOS, network access needs the entitlement — again, only once you have a real backend:
<!-- macos/Runner/DebugProfile.entitlements and Release.entitlements -->
<key>com.apple.security.network.client</key>
<true/>
Window title and minimum size are in macos/Runner/MainFlutterWindow.swift
and windows/runner/main.cpp. The desktop layout is the desktop web
layout; nothing branches on platform.
Keyboard
⌘K on macOS and Ctrl+K elsewhere opens the command
palette; both are bound, so no platform check is needed. Bindings live on the
shell in app_shell.dart, which means they work from any screen
behind the guard.