Launchpad
Overview
Launchpad is an application gateway for the Apolo MLOps platform that enables Apolo users to securely expose platform applications to end-users through customizable authentication powered by Keycloak integration.
With Launchpad, you can share access to applications deployed on Apolo—including pre-built apps like OpenWebUI (a user-friendly interface for interacting with LLMs)—without requiring end-users to have full Apolo accounts. Additionally, Launchpad allows you to deploy custom applications using Apolo's Service Deployment feature and expose them to your users with personalized branding, including custom names, descriptions, and logos.
Key capabilities include:
Bring Your Own Authentication: Deploy and manage a dedicated Keycloak instance for user authentication, with support for user management, role-based access control, groups, and integration with external identity providers (OIDC, OAuth2)
Flexible App Deployment Models:
Shared Applications: Deploy a single app instance accessible to all users, with the application leveraging user identity information provided by Keycloak (ideal for apps like OpenWebUI that support multi-user collaboration)
Per-User Applications: Automatically provision isolated app instances for each user, ensuring complete data separation and personalized environments
Custom Branding: Import custom applications or existing app instances with tailored metadata—display names, descriptions, and visual identities—to create a polished experience for your end-users
Flexible App Exposure: Share both platform-native Apolo applications and custom-deployed services through a unified, user-friendly interface
Quickstart Presets: Deploy pre-configured application stacks like OpenWebUI with all dependencies in minutes
External User Access: Provide seamless application access to clients, stakeholders, or team members outside your Apolo organization through Keycloak-managed authentication
Installing Launchpad
Launchpad can be installed from the Apolo Console interface or using the Apolo CLI.
Installation via Apolo Console
Navigate to the Apps page in the Apolo Console.
Find the Launchpad App and click Install.
Configure Launchpad Preset:
Choose a suitable Resource Preset for the Launchpad application itself (e.g.,
cpu-mediumor higher).
Choose Quickstart Apps:
No Startup Apps: Installs only Launchpad, allowing you to add applications later.
OpenWebUI: Installs OpenWebUI and its dependencies upon Launchpad startup, providing a pre-configured LLM chat interface.
OpenWebUI Configuration (Optional)
If you select the OpenWebUI, you need to configure the following dependencies:
LLM Configuration:
Pre-configured HuggingFace LLM Model: Select the desired LLM model (e.g.,
meta-llama/Llama-3.1-8B-Instruct).Hugging Face Token (Optional): If using gated or private models, provide a Hugging Face API token stored as an Apolo Secret (
HF_TOKEN).LLM Preset: Choose a resource preset for the LLM model (typically a GPU-enabled preset, e.g.,
gpu-a100-x1).
Postgres Configuration:
Postgres Preset: Choose a resource preset for the Postgres database (e.g.,
cpu-medium).Postgres Replicas: Set the number of replicas (e.g.,
1).
Text Embeddings Configuration:
Text Embeddings Preset: Choose a resource preset for the embeddings service (e.g.,
gpu-l4-x1).Embeddings Model: Select a pre-configured Hugging Face model for text embeddings (e.g.,
BAAI/bge-m3).
Metadata (Optional): You can customize the app display name.
Click Install.
Be aware that when choosing the OpenWebUI Quick Start App option, Apolo will also install vLLM, Text Embeddings and Postgresql apps, which will consume credits as well.
Installation via Apolo CLI
Currently, due to a known bug in the UI, if you choose the OpenWebUI Quick Start App, it's recommended to export the configuration and install it using the Apolo CLI:
In the Launchpad App installation page, select the OpenWebUI Quick Start App and configure your options.
Scroll to the bottom and click Export App Configuration (download icon).
Open your terminal and install the app using the downloaded configuration file:
Refer to Launchpad CLI page to learn more about installing and managing Launchpad using the CLI.
Managing Launchpad and Keycloak Users
Once Launchpad is installed, you can access the installed app on the Installed Apps page. Click Open to access various Launchpad URLs.
Accessing the Launchpad Interface
Click Open on the Launchpad app card.
Select App URL.
The Launchpad interface loads, requiring a login.\

Launchpad comes with a default admin user that can manage what apps are available through Launchpad UI. You can find this admin user's credentials by scrolling down the Launchpad instance details page in Apolo and copying the Password field in Launchpad Default Admin User\

Use these credentials to login to Launchpad. You should see a list of available apps - only OpenWebUI for now

Managing Users via Keycloak
Launchpad uses Keycloak for authentication and user management.
Access Keycloak:
On the Launchpad app card (in Apolo), click Open.
Select Keycloak Config > Web App URL.
Retrieve Admin Credentials:
Go to the Launchpad Details page in the Apolo Console.
Under the Output section, find Launchpad Default Admin User to retrieve the default username (
admin) and Password.Scroll down to KeycloakConfig to find the Keycloak Admin Password (used for the Keycloak administrative interface).
Log into Keycloak:
Use the Keycloak Admin Password and the username
adminto sign in to the Keycloak Administration page.Click Manage Realms
Click Launchpad. This will ensure that any settings you change are applied to the correct realm used by Launchpad.

Manage Users and Groups:
Add User: Navigate to Users and click Add user to create new users.
Manage Roles and Groups: Navigate to Groups to create groups and assign roles/permissions to users.
Enable New Sign-Ups (for OpenWebUI):
If you deployed OpenWebUI, ensure users can sign up:
Navigate to OpenWebUI in the Installed Apps list.
Open the Admin Panel (available to the admin user).
Go to Settings > Authentication.
Toggle Enable New Sign Ups to
On.Save settings.
Adding an External Identity Provider (OIDC/Social Login)
Launchpad allows you to integrate external Identity Providers (IdP), such as Google or Microsoft, so users can sign in using their existing accounts instead of manually created Keycloak credentials.
Access the Launchpad Realm in Keycloak
Log into the Keycloak Administration console.
In the top-left dropdown (or via the Manage Realms menu), ensure you have selected the Launchpad realm.
Note: Do not perform these configurations in the "Master" realm.
Add the Provider
Navigate to Identity Providers in the left-hand sidebar.
Select your desired provider from the list (e.g., Google).
Enter Credentials: You will need the Client ID and Client Secret obtained from your provider's developer console (e.g., Google Cloud Console).
Configuration Settings:
Request refresh token: Toggle this to
Onto ensure users stay logged in.Trust Email: Under the Advanced settings at the bottom, it is recommended to toggle Trust Email to
Onif you want Keycloak to verify users based on their provider email.
Click Add.
Configure Redirect URIs
To avoid a redirect_uri_mismatch error, you must whitelist the Keycloak callback URL in your Identity Provider's settings.
In the Keycloak Identity Provider settings for the provider you just added, find and copy the Redirect URI. It usually looks like this:
https://<launchpad-url>/auth/realms/launchpad/broker/google/endpointGo to your Provider’s Developer Console (e.g., Google Cloud Console -> APIs & Services -> Credentials).
Under Authorized redirect URIs, paste the URI you copied from Keycloak.
(Optional) Under Authorized JavaScript origins, add the base URL of your Launchpad Keycloak instance:
https://<launchpad-url>Save the changes in the provider’s console.
Verify the Integration
Open your Launchpad App URL.
Click Log In.
You should now see an option to Sign in with [Provider Name] (e.g., Google) below the standard login fields.

Click the button and complete the OAuth flow to verify that you are successfully redirected back to the Launchpad interface.
Integration Tip:
If you are using OpenWebUI with an external IdP, ensure that Enable New Sign Ups is toggled to On in the OpenWebUI Admin Panel (Settings > Authentication) so that users logging in via the IdP for the first time can have their accounts automatically created.
Accessing App Endpoints via API (Bearer Token)
Launchpad allows you to interact with your deployed applications programmatically. By leveraging the integrated Keycloak instance, you can generate a Bearer Token to securely access your application's API endpoints (such as a vLLM inference server) without using the browser interface.
Enable Direct Access Grants in Keycloak
To fetch tokens using user credentials via the API, you must first enable the correct capability in the Keycloak configuration:
Log into the Keycloak Administration console.
Ensure you have selected the Launchpad realm.
Navigate to Clients in the left-hand sidebar and select the frontend client.
Scroll down to the Capability config section.
Ensure the Direct access grants toggle is set to On.
Click Save.
Obtaining an Access Token
You can obtain an access token by sending a POST request to the Launchpad authentication endpoint.
Use the Admin API URL: When performing API authentication, you must use the Admin API URL provided in the Apolo Console, not the standard App URL. You can distinguish the API URL by the
-apisuffix in the subdomain (e.g.,https://launchpad-xxx-api.apps...).
Example using curl and jq:
Authenticating API Requests
Once you have the ACCESS_TOKEN, you can include it in the Authorization header of your requests to any application managed by Launchpad. Use the specific App URL of the service you are trying to reach (e.g., your vLLM or custom service).
Example: Accessing vLLM Models Endpoint
Follow the instructions in Importing Apps using the Admin Panelto import a running vLLM instance to run this example.
If you attempt to access these endpoints without the
Authorizationheader or with an invalid token, Launchpad will deny the request, ensuring your services remain secure.
Importing Apps
Importing Apps using the Admin Panel
Launchpad comes with a Admin Panel that allows you to manage app templates and running app instances directly through the Launchpad Admin Panel.
To Access the Admin Panel: Log into Launchpad using the default admin credentials (available in app outputs) and click Admin Panel (top right).

This is what the Admin Panel looks like when there are no templates or instances imported.

Import a New Template:
Obtain an App Template by following this guide.
Click Import Template.

Click Upload File and select the
.yamlconfiguration file you prepared in the previous step.The fields will automatically populate with information from the Apolo Apps API. You can manually edit the:
Display Name
Logo URL (as demonstrated in the video)
Short/Long Description
Tags
Input (JSON): Modify default configuration values.
Check or uncheck Shared based on whether you want a single instance for all users (Shared) or a new instance provisioned for each user (Not Shared).
Click Import Template. The new template will appear under App Templates.

After importing, the app will be visible in the main Launchpad interface, ready for users to click Open and launch their instance.

After installing the app by clicking "Open", the new app instance will also appear in the list of App Instances on the Admin Page

Using the App Templates list, you can:
View: Displays all metadata and configuration associated with the template.
Edit: Allows modification of the display name, logo, descriptions, tags, and sharing settings.
Delete: Removes the template. Warning: Deleting a template will uninstall all associated running instances.
Importing a Running App Instance
You can also import apps that are already running in Apolo into Launchpad.
Install a Service Deployment app by following this guide.
Click Import App Instance.
The panel will load all running apps in your current Apolo project.

Select the desired running app instance (e.g., a Service Deployment).
Configure the display details (Name, Logo URL, Description).
You can customize the app's name, description, logo and etc. For the purposes of this tutorial, we will rename this app to My Custom App
Click Import App.
The running app instance will now be visible in the main Launchpad interface under its new name and accessible to authenticated Keycloak users.
Starting from the
v26.7.1Laucnhpad, the application ingress authentication will be automatically reconfigured to use this launchpad. Meaning, after the app is imported, the users targeting the app will be forced to authorize via this launchpad. If the app was previously imported in other Launchpad instance, this import process will delete it from old Launchpad if it of versionv26.7.1or later, otherwise — user must do the cleanup manually.
Using the App Instances list you can:
Open: Directly navigates to the running application URL.
Delete: Uninstalls the specific app instance from Apolo.
Importing Apps using Admin API
Refer to Launchpad CLI page to learn more about installing and managing Launchpad using the CLI.
Misc features
Logout
The application developers can redirect their users from the apps under Launchpad to the /logout path in Launchpad web UI. It will cleanup a browser session for both accessing the launchpad landing page and underlying applications.
Example logout URL: https://launchpad-123abc123abc.apps.my-cluster.org.apolo.us/logout
Customizing Launchpad appearance
Launchpad can load a custom CSS stylesheet at runtime. Use it to adapt the Launchpad interface to your organization without rebuilding the application. For example, you can change colors, fonts, borders, spacing, alignment, app card layout, dialogs, forms, tables, and the admin panel.
The custom stylesheet is applied on top of the built-in Launchpad styles. It affects the Launchpad interface only; it does not change the appearance of applications opened from Launchpad.
Use the standard branding settings for the Launchpad title, logo, favicon, and background. Use the custom stylesheet when you need more detailed control over components, layout, typography, or interactive states.
Only use a stylesheet that you control and trust. A stylesheet can change the entire interface and can request additional fonts, images, and other external resources.
Add a custom stylesheet
Create and host the CSS file
Create a plain .css file. Start with a visible test rule so that you can confirm that the file is loaded:
Host the file at a URL that is accessible from your users' browsers, for example:
The URL does not have to end in .css; the returned content type determines whether the browser treats the response as a stylesheet.
The URL must meet the following requirements:
It is publicly reachable without cookies or authentication.
It uses HTTPS when Launchpad uses HTTPS.
It returns
200 OKand a CSS content type such astext/css.Any fonts or images referenced by the file are also browser-accessible.
Cross-origin font responses include the required CORS headers.
If a Content Security Policy is configured, the stylesheet origin is allowed by
style-src, and referenced assets are allowed by directives such asfont-srcandimg-src.
Use HTTPS directly: Do not configure an
http://URL that redirects to HTTPS. Browsers can block the HTTP request as mixed content before following the redirect.
Configure Launchpad
In the Apolo Console, open Installed Apps.
Select your Launchpad instance and open its configuration for editing.
In the branding settings, set the custom stylesheet URL to the absolute URL of your CSS file. This value is stored as
branding.css_url.Apply the configuration and wait until the Launchpad instance is healthy.
Open the Launchpad App URL and perform a full browser refresh.
The configuration is exposed by the Launchpad Admin API as branding.css_url:
An empty or missing css_url disables custom CSS.
To verify the configured value, request /config from the Launchpad Admin API URL (the URL with the -api suffix):
Verify that the stylesheet is loaded
Open the Launchpad interface.
Open the browser developer tools.
On the Network tab, filter requests by
CSSand reload the page.Confirm that the configured stylesheet returns
200and has thetext/csscontent type.On the Elements tab, find the following element:
Launchpad loads this stylesheet after its built-in styles. In most cases, a custom rule that uses a documented launchpad-* selector overrides the default rule without !important.
Select the element you want to customize
Launchpad exposes stable CSS hooks for customization:
IDs such as
#launchpad-headeridentify unique page landmarks.Classes beginning with
.launchpad-identify components and their parts.Attributes such as
[data-action],[data-section], and[data-state]identify a component's purpose or state.
Use these hooks instead of Tailwind utility classes, element positions, or generated IDs. Utility classes and third-party component classes are internal implementation details and can change between releases.
For example, the following selector targets every app card:
The following selector targets only one app. Replace my-app with the value of the card's data-app-name attribute:
The following selector targets only the Open action inside app cards:
Use the browser's element inspector to see the hooks available on a specific element.
CSS selector reference
Page layout and background
HTML document
#launchpad-root
The root <html> element
Page body
#launchpad-body
The complete Launchpad page
Layout
.launchpad-layout
The standard Launchpad layout
Scrollable wrapper
.launchpad-layout-wrapper
The wrapper around page content
Main content
#launchpad-main
The main page region
Content width
.launchpad-container
Shared centered content containers
Image background state
.launchpad-background--image
Root elements when a branding background image is configured
Custom stylesheet link
#launchpad-custom-stylesheet
The injected external stylesheet link
Launchpad also exposes the following background custom properties:
--launchpad-background
Global background color
--launchpad-background-image
Global background image
--launchpad-background-size
Background sizing, such as cover
--launchpad-background-position
Background alignment
--launchpad-background-repeat
Background repeat behavior
The configured branding values are stored in these properties. To replace the rendered background from custom CSS, set the final background properties on the root and body elements:
Header and user menu
Header
#launchpad-header or .launchpad-header
The complete page header
Header content
.launchpad-header__container
Header width, spacing, and alignment
Branding
.launchpad-header__brand
Logo and title group
Logo wrapper
.launchpad-header__logo-wrapper
Logo container
Logo
.launchpad-header__logo
Custom or default logo
Default logo
.launchpad-header__logo--default
Default Launchpad logo only
Title
.launchpad-header__title
Configured Launchpad title
User menu trigger
.launchpad-user-panel
User avatar/menu button
Avatar
.launchpad-user-panel__avatar
Avatar circle
Initials
.launchpad-user-panel__initials
User initials inside the avatar
Menu
.launchpad-user-panel__popover
Open user menu
User name
.launchpad-user-panel__name
User display name
User email
.launchpad-user-panel__email
User email address
Admin link
.launchpad-user-panel__admin-link
Admin Panel action
Logout action
.launchpad-user-panel__logout
Log out action
Use [data-logo='custom'] or [data-logo='default'] on the branding element when the rule must depend on which logo is displayed.
Authentication page
Authentication page
#launchpad-auth-page
The complete login page
Login content
.launchpad-auth-page__content
Login content width and position
Login card
.launchpad-auth-page__card
Login card surface
Login title
.launchpad-auth-page__title
Welcome/title text
Login actions
.launchpad-auth-page__actions
Login button group
Main login button
.launchpad-auth-page__login-button
Main Log in button
App catalog and app cards
App catalog
#launchpad-apps-page
The complete app catalog
App grid
.launchpad-app-grid
Grid columns, gaps, and alignment
App card
.launchpad-app-card
Every app card, including list states
Loading card
.launchpad-app-card--loading
App loading skeletons
Card header
.launchpad-app-card__header
Logo and heading region
Logo wrapper
.launchpad-app-card__logo-wrapper
App logo surface
Logo
.launchpad-app-card__logo
App logo image
Logo fallback
.launchpad-app-card__logo-fallback
Default logo when no image is configured
Card title
.launchpad-app-card__title
App display name
Description
.launchpad-app-card__description
Short app description
Tags
.launchpad-app-card__tags
Complete tag list
Tag
.launchpad-app-card__tag
Individual visible tag
Extra tag count
.launchpad-app-card__tag-overflow
The +N tag badge
Actions
.launchpad-app-card__actions
Explore and Open action group
Explore action
.launchpad-app-card__explore
Explore button
Open action
.launchpad-app-card__open
Open link
Loading state
.launchpad-app-card[data-state='loading']
Loading cards
Error state
.launchpad-app-grid__error
App catalog error message
Retry action
.launchpad-app-grid__retry
Error retry button
Empty state
.launchpad-app-grid__empty
Empty app catalog
Each real app card exposes [data-app-name]. This is the safest way to style a specific app independently from the rest of the catalog.
The computed branding color of app cards is available as --launchpad-app-card-background for derived rules. Its configured value is set inline. To replace the card surface, set background or background-color on .launchpad-app-card, as shown in the examples below.
App details dialog and startup page
App details
.launchpad-app-modal
Complete app details content
Hero region
.launchpad-app-modal__hero
Logo, title, and primary action
App logo
.launchpad-app-modal__logo
Logo image in app details
Title
.launchpad-app-modal__title
App title
Short description
.launchpad-app-modal__short-description
App summary
Long description
.launchpad-app-modal__long-description
Detailed description
Actions
.launchpad-app-modal__actions
App details actions
Open action
.launchpad-app-modal__open
Open action
Content section
.launchpad-app-modal__section
Documentation or references group
Section title
.launchpad-app-modal__section-title
Group heading
Section link
.launchpad-app-modal__link
Documentation/reference link
Link label
.launchpad-app-link__label
Visible link text
Startup page
#launchpad-app-loading-page
Page shown while an app starts
Startup content
.launchpad-app-loading-page__content
Centered startup content
Startup logo
.launchpad-app-loading-page__logo
Startup page logo
Startup brand
.launchpad-app-loading-page__brand
Launchpad brand text
Startup message
.launchpad-app-loading-page__message
Startup status text
Animated dots
.launchpad-app-loading-page__dots
Startup loading animation
The app details element and startup page also expose [data-app-name]. App details sections use [data-section='documentation'] and [data-section='references'].
Buttons, links, badges, and visual elements
Button
.launchpad-button
[data-variant], [data-status], [data-with-icon]
Button icon
.launchpad-button__icon
Icon inside a button
Button spinner
.launchpad-button__spinner
Loading spinner inside a button
Link
.launchpad-link
[data-variant], [data-disabled], [data-external]
Link icon
.launchpad-link__icon
Icon inside a link
Badge
.launchpad-badge
[data-variant]
Image
.launchpad-image
Shared images
Icon
.launchpad-icon
Shared icons
Spinner
.launchpad-spinner
[data-color] and .launchpad-spinner__dot
Logo
.launchpad-logo
[data-variant='full'] or [data-variant='icon']
Button statuses are idle, loading, and disabled. Common button variants include primary, secondary, ghost, ghost-primary, ghost-error, error, error-outline, and primary-outline.
Forms
Field wrapper
.launchpad-field
Complete form field
Input field
.launchpad-field--input
Input wrapper
Text input
.launchpad-input
<input> control
Textarea
.launchpad-textarea
<textarea> control
Select
.launchpad-select
Native or custom select control
Field control
.launchpad-field__control
Any text/select control
Label
.launchpad-field__label
Field label
Note
.launchpad-field__note
Supporting text
Error
.launchpad-field__error
Validation message
Checkbox
.launchpad-checkbox
Checkbox control and label
Checkbox indicator
.launchpad-checkbox__indicator
Visible checkbox square
Radio
.launchpad-radio
Radio control and label
Radio indicator
.launchpad-radio__indicator
Visible radio circle
Select dropdown
.launchpad-select__dropdown
Open custom-select menu
Select item
.launchpad-select__item
Custom-select option
Most fields expose [data-field='<field-name>'] on the wrapper and [data-invalid='true'] when validation fails. Labels can expose [data-required='true'] and [data-disabled='true'].
Dialogs, popovers, tooltips, and notifications
Dialog overlay
.launchpad-modal__overlay
Page overlay behind a dialog
Dialog position
.launchpad-modal__dialog
Positioned dialog wrapper
Dialog surface
.launchpad-modal__content
Visible dialog card
Dialog header
.launchpad-modal__header
Dialog header
Dialog title
.launchpad-modal__title
Dialog title
Dialog body
.launchpad-modal__body
Dialog content
Dialog footer
.launchpad-modal__footer
Dialog actions
Close action
.launchpad-modal__close
Dialog close button
Popover trigger
.launchpad-popover__trigger
Element that opens a popover
Popover surface
.launchpad-popover__content
Open popover
Popover arrow
.launchpad-popover__arrow
Popover arrow
Tooltip surface
.launchpad-tooltip__content
Open tooltip
Tooltip arrow
.launchpad-tooltip__arrow
Tooltip arrow
Toast region
.launchpad-toast-container
Notification container
Toast
.launchpad-toast
Individual notification
Toast content
.launchpad-toast__content
Notification message
Dialogs, popovers, tooltips, and custom-select menus are rendered in portals under the document body. Target them directly instead of nesting their selector under the component that opened them. Their open/closed state is available through [data-state].
Tables
Table
.launchpad-table
Complete shared table
Header
.launchpad-table__header
Header group
Body
.launchpad-table__body
Body group
Row
.launchpad-table__row
Logical row
Header cell
.launchpad-table__head
Column heading
Body cell
.launchpad-table__cell
Data cell
Table rows use display: contents, so backgrounds and borders must be applied to their cells instead of the row wrapper.
Admin panel
Admin page
#launchpad-admin-page
Complete admin panel
Admin title
#launchpad-admin-title
Admin Panel heading
Header
.launchpad-admin-header
Admin title and refresh action
Templates
#launchpad-admin-templates-section
App Templates section
Instances
#launchpad-admin-instances-section
App Instances section
Section
.launchpad-admin-section
Any major admin section
Section title
.launchpad-admin-section-title
Major section heading
Form
.launchpad-admin-form
Any admin form
Form field
.launchpad-admin-form-field
A field group in an admin form
Form actions
.launchpad-admin-form-actions
Form action row
Admin dialog
.launchpad-admin-modal
Any admin dialog
Table
.launchpad-admin-table
Any admin table
Table row
.launchpad-admin-table-row
Any admin record row
Table cell
.launchpad-admin-table-cell
Any admin table cell
Record action
.launchpad-admin-record-action
View, edit, open, or delete action
File upload
.launchpad-admin-file-upload
Template upload control
Confirmation
.launchpad-admin-confirmation-modal
Delete confirmation dialog
Loading
.launchpad-admin-loading-state
Admin loading state
Error
.launchpad-admin-error-state
Admin error state
Use semantic attributes to target one admin element without depending on its position:
[data-section]
templates, instances, file-upload, confirmation
Select a page or dialog section
[data-action]
open-import-template, edit-template, delete-instance
Select a specific action
[data-field-slot]
logo, display-name, tags, internal, shared
Select a logical form field
[data-column]
name, template, state, flags, actions
Select a table column
[data-record-type]
template, instance, unimported-instance
Select a record type
[data-record-id]
Dynamic record ID
Select one record
[data-record-name]
Dynamic record name
Select one named record
[data-row-variant]
primary, alternate
Select alternating rows
[data-flag]
internal, shared
Select an app/template flag
[data-state]
loading, error, empty, open, closed
Select UI state
Customization examples
The following examples can be copied independently or combined into one stylesheet.
Change the global font, text color, and background
Some headings and controls have their own built-in colors. Target their public hooks when they must inherit the global color:
Restyle the header and logo
Restyle the login page
Change the app grid and cards
Restyle one app only
Inspect the card to find its data-app-name, then use it in the selector:
Restyle buttons and their states
Restyle app details and dialogs
Restyle form fields and validation
Restyle the admin panel and tables
Restyle popovers, tooltips, and notifications
Troubleshooting
The stylesheet does not appear in the Network tab
Confirm that
branding.css_urlis present in the Admin API/configresponse.Confirm that the URL is absolute and starts with
https://on an HTTPS Launchpad deployment.Apply the Launchpad reconfiguration and wait until the instance becomes healthy.
Open a new browser tab or perform a full refresh instead of relying on client-side navigation.
The request is blocked or returns an error
Open the stylesheet URL directly in the browser.
Confirm that it returns
200 OKandContent-Type: text/css.Check the browser console for mixed-content or Content Security Policy errors.
If the CSS imports fonts, confirm that the font server allows cross-origin requests.
The file loads, but a rule has no visible effect
Inspect the target element and confirm that the selector matches it.
Use a
launchpad-*class, ID, or semanticdata-*attribute from this reference.Check the browser's Styles panel to see whether a more specific rule wins.
Add page or component context instead of immediately using
!important:For table row backgrounds, apply the rule to cells because table rows use
display: contents.
Changes appear only after clearing the cache
Browsers and CDNs can cache CSS. Prefer versioned filenames or update a query parameter whenever the file changes:
Update the custom stylesheet URL during Launchpad reconfiguration, then perform a full refresh.
Compatibility recommendations
Treat documented
launchpad-*selectors and semanticdata-*attributes as the customization contract.Do not depend on Tailwind utility classes, DOM child positions, generated React IDs, or third-party library classes.
Keep selectors scoped to the smallest relevant Launchpad component.
Test the stylesheet on desktop and mobile widths.
Test login, app catalog, app details, app startup, and admin workflows after major CSS changes.
Keep text contrast, focus indicators, and disabled states accessible.
Pin or version your stylesheet so that changes can be rolled back quickly.
Summary
The Launchpad app transforms the Apolo MLOps platform into a user-friendly deployment environment, simplifying application access and user authentication for internal and external users via Keycloak integration. By enabling the import of custom app templates and existing app instances, Launchpad offers a versatile solution for showcasing and managing applications within your ecosystem.
Quick Guides
Obtaining and Preparing App Templates for Launchpad
Before importing a custom application template into Launchpad using the API, you must first obtain the application's configuration file from the Apolo Console and convert it to the required JSON format.
Downloading the App Configuration File
This process generates a YAML configuration file based on the app's standard installation page, pre-filled with the Launchpad authentication settings.
Navigate to the App Installation Page: In the Apolo Console, go to the All Apps page and select the application you wish to import (e.g., Visual Studio Code). Click Install.
Configure Resource Presets: Select the necessary resource presets for the application.
Configure Authentication: Scroll down to the Networking Settings section and configure the HTTP Ingress:
Change the Authentication dropdown to Custom Authentication.
In the Custom Authentication section, click Choose App next to the
AuthIngressMiddlewareto integrate Launchpad.Select the installed
Launchpadinstance and click Apply.
Download Configuration: Scroll to the bottom of the installation page. Click the Export App Configuration download icon (a down arrow pointing into a cloud or similar icon, typically next to the "Install" button) to download the
.yamlconfiguration file. The following yaml file is an example Downloaded from the VSCode App installation page.
Converting the YAML Configuration to JSON
If you are using Launchpad API to import templates, follow the instructions below to convert the exported yaml file into json
The Launchpad API requires the app configuration payload to be in JSON format. Use a command-line tool like yq or a combination of cat and python to perform this conversion.
Method A: Using python
If you don't have yq, you can use Python's built-in YAML and JSON libraries:
Install PyYAML: If you haven't already, install the necessary library:
Run the Conversion Script:
Method B: Using yq
If you have yq installed, this is the simplest method:
The output will be the single-line JSON string containing the app template data, which is ready to be used in the API call to import the template into Launchpad.
Here is the resulting json file.
Deploying a Service Deployment App that uses Launchpad authentication
After installing Launchpad, you will be able to deploy Apps that require Launchpad authentication. This small guide will walk you through how you can deploy your custom application using the Service Deployment App.
Navigate to Apolo Console's Home Page, find the Service Deployment app and click Install
Choose a Resource Preset (e.g.,
cpu-small).Container Image: Provide a container image (e.g.,
nginx).Network Configuration:
Enable HTTP Ingress.
Change Authentication to Custom Authentication.
In Authentication Middleware, click Choose App and select Launchpad with the path
Install the application.
Import this App Instance into Launchpad so that it enables authentication
Follow this guide for Admin Panel usage
Follow this guide for API usage
References
Last updated
Was this helpful?