Flitzdocs
Loader plugins

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.

LevelYou configureWhat the host does
Links onlyNothing — the defaultOpens flitz://download links. flitz://flitz-panel links do nothing.
Sign-inA client idSigns the user in before every load. A flitz://flitz-panel link opens the panel on the apps list.
Sign-in and panelA client id and the panel settingCan 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:

android/app/build.gradle.kts
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
}
  • openingApp is an app key, as flitz apps list shows 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 flitz or 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:

ScreenMeaning
Can't reach FlitzNo network, or Flitz did not answer.
Flitz is unavailable for your organizationYour organization's license is not active. The Owner reactivates it under Billing.
Can't open builds with this accountFlitz 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 errorAny 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) or Launch panel (iOS). Tapping the icon while the app is still running resumes what it showed, a running bundle included.
  • A flitz://flitz-panel link 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:

android/app/src/main/res/xml/shortcuts.xml
<?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>
android/app/src/main/res/values/strings.xml
<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:

android/app/src/main/AndroidManifest.xml
<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>
  • targetPackage is your build's applicationId, written out: resource files take no placeholders. A flavor or build type with its own application id needs its own shortcuts.xml.
  • With enabledFlavors, put the shortcut in the loader flavor's source set (for example src/withLoader/): builds without the loader have no PanelActivity, 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-panel link, 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:

ScreenShown whenButtons
Members onlyThe download carried no sign-in: the host has no sign-in.Back
Can't open builds with this accountThe 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.

Next steps

On this page