Sign-in and the panel
Sign teammates in with their Flitz account, open Members-only builds, and let teammates browse and run your organization's builds from inside the host.
Enterprise feature
Sign-in and the panel are part of Flitz Enterprise. To have your app registered for sign-in, contact support — see Get a client id.
Sign-in and the panel are optional loader features, and both are off by default:
- Sign-in makes the host sign each teammate in with their Flitz account before every load. Only a host with sign-in opens builds of an app set to Members only — see Download access.
- The panel is the loader's own screens inside your host. A signed-in teammate browses your organization's apps, their tracks, and their builds, and runs one, with no link needed.
Without them, the host opens any flitz://download link and sends no
credentials, as set up in the Android and iOS
quickstarts.
Choose a level
You choose one level per app when you integrate the loader. It covers every flavor and build configuration, and changing it means a new host build.
| Level | You configure | What the host does |
|---|---|---|
| Links only | Nothing — the default | Opens flitz://download links. flitz://flitz-panel links do nothing. |
| Sign-in | A client id | Signs the user in before every load. A flitz://flitz-panel link opens the panel on the apps list. |
| Sign-in and panel | A client id and the panel setting | Can also launch straight into the panel and open it on one of your apps. On iOS, error screens offer Open panel. |
Get a client id
Sign-in needs a client id that Flitz registers for your app. To get one, contact support and send:
- the app's display name;
- its URL scheme — the one you publish with, see Custom schemes;
- your organization.
The client id is public: it ships inside your app. If you change the scheme later, contact support to update the registration.
Turn it on
Add the settings to the flitz { } block in android/app/build.gradle.kts.
They apply to every flavor in enabledFlavors:
flitz {
enabledFlavors = listOf("withLoader")
signIn {
clientId = "<client-id>" // from Flitz; turns sign-in on
}
panel { // optional: the panel level
openingApp = "<app-key>" // optional: open the panel on this app
}
launch = "panel" // optional: the launcher icon opens the panel
}openingAppis an app key, asflitz apps listshows it. When that app does not exist or is archived, the panel opens on the apps list.- With
launch = "panel", the home-screen icon opens the panel instead of your app, and your own UI starts only when something else opens it. - The scheme needs no change: sign-in works with the default
flitzor your own custom scheme, as long as it is the scheme you gave Flitz.
The build checks these settings even when no flavor is active, and fails on the first problem with a message naming the setting — see Troubleshooting → Gradle.
Then rebuild the host and get the new build to your team — see Get the host to your team. The full list of settings is in the API reference.
Signing in
- The first load, or the first time the panel opens, shows the sign-in page in the system browser — on iOS the system first asks to allow it. The first sign-in through your app asks the teammate to approve the app.
- Every later load renews the session without the browser. A teammate signs in again only when the session has ended.
- When sign-in does not finish, the loader shows Sign-in required, Sign-in failed, or Can't reach Flitz sign-in with a button to try again — see Troubleshooting.
The session lives in your app's private storage on the device. Teammates sign out in the panel.
The panel
The panel is a stack of three screens. Each one reads its list when it opens and when you pull to refresh, and shows times relative to now.
- Apps — your organization's apps, by key. Each row shows the app's name and when it last got a build, or No builds yet. Archived and deleted apps do not appear. This screen also shows who is signed in, with Sign out.
- Tracks — one app's tracks, the one with the newest build first. Each row shows the track's name — its branch, or Unassigned — and when it last got a build. Run latest runs the newest build on that track, and a Filter field narrows the list by name.
- Builds — one track's complete builds, newest first. Each row shows the
build's title (the
--name, else the--version-name, else the version), the version beside a title that is not the version, the comment, and when it was published. Tapping a row runs it.
A build you run from the panel goes through the same sign-in, download, and compatibility checks as a link. The panel lists every complete build of an app, so one that this host cannot run fails when it loads. Run latest opens whatever build is newest on the track when the download starts.
When a list cannot be read, the screen shows why, with Retry:
| Screen | Meaning |
|---|---|
| Can't reach Flitz | No network, or Flitz did not answer. |
| Flitz is unavailable for your organization | Your organization's license is not active. The Owner reactivates it under Billing. |
| Can't open builds with this account | Flitz refused the account, for example because it belongs to no organization. Sign out and sign in with an account in your organization. |
| Flitz answered with an error | Any other failure; the body shows the status. |
Sign out — on the apps list and on these screens — is the only place to sign out. It clears the session on this device only and shows Signed out, whose Sign in lets the teammate choose another account.
Opening the panel
- The launcher icon, at the panel level with
launch = "panel"(Android) orLaunchpanel(iOS). Tapping the icon while the app is still running resumes what it showed, a running bundle included. - A
flitz://flitz-panellink on your scheme, at either level with sign-in — see URL scheme. - A quick action on your app's icon, at either level with sign-in — see Quick actions.
- Your own native code — see the API reference for Android and iOS.
- Open panel on an iOS error screen, at the panel level.
At the panel level, the panel opens on your openingApp / OpeningApp, with
the apps list beneath it. Otherwise it opens on the apps list. Opening the
panel ends a running bundle; a panel that is already open stays as it is.
Quick actions
A quick action (an app shortcut on Android) opens the panel from a long press
on your app's icon, while a tap on the icon still opens your app. It works at
either level with sign-in; without sign-in the panel does not open. With
launch = "panel" (Android) or Launch panel (iOS) the icon already opens
the panel, so you do not need one.
Declare a static shortcut that starts the loader's PanelActivity:
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="flitz_panel"
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:shortcutShortLabel="@string/shortcut_panel_short"
android:shortcutLongLabel="@string/shortcut_panel_long">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="<your.application.id>"
android:targetClass="pl.leancode.flitz.loader.PanelActivity" />
</shortcut>
</shortcuts><resources>
<string name="shortcut_panel_short">Flitz panel</string>
<string name="shortcut_panel_long">Open the Flitz panel</string>
</resources>Then point your launcher activity at the file, next to its MAIN/LAUNCHER
intent filter:
<activity android:name=".MainActivity" ...>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>targetPackageis your build'sapplicationId, written out: resource files take no placeholders. A flavor or build type with its own application id needs its ownshortcuts.xml.- With
enabledFlavors, put the shortcut in the loader flavor's source set (for examplesrc/withLoader/): builds without the loader have noPanelActivity, and their shortcut would not open. - The panel opens in the loader's own task, as it does for a link. Back on the apps list returns to the home screen.
Leaving the panel
- Android: the panel runs in the loader's own task. A build you run from it opens on top, and Back, Cancel, or leaving the bundle returns to the panel. Back on the apps list leaves the panel for wherever it was opened from: your app, the app that opened the link, or the home screen.
- iOS: the panel takes over the app's window, as a bundle does — see
Loading a bundle takes over the app.
While a build you started from the panel loads, Back on an error screen
and Cancel on the download and sign-in screens return to the panel. Once
the bundle draws its first frame there is no way back from it: use a
quick action, open a
flitz-panellink, or relaunch an app that launches into the panel.
Members only
An Owner or Admin can set an app to Members only in the portal. Its builds then open only in a host with sign-in, for a signed-in member of the app's organization. Anyone else gets a refusal on the device:
| Screen | Shown when | Buttons |
|---|---|---|
| Members only | The download carried no sign-in: the host has no sign-in. | Back |
| Can't open builds with this account | The signed-in account belongs to another organization, or to none — for example after the teammate was removed. | Back |
- A refusal offers no Retry: the same request gets the same answer. To switch accounts, sign out in the panel.
- When Flitz rejects the session itself, the loader renews it once — through the browser if needed — and downloads again. A second rejection shows Can't open builds with this account.
What sign-in does not do
- It does not work offline. Every load renews the session first. When the sign-in service cannot be reached, the load stops on Can't reach Flitz sign-in, whichever app the build belongs to.
- It does not hide the session from bundles. A bundle runs as your app's own code and can read the stored session, the teammate's name and email included.