Skip to content
Skip

Showcase

A comprehensive demonstration app for Skip, showcasing cross-platform SwiftUI development for iOS and Android. This is a combination Skip Lite and Skip Fuse app that can be condfigured to run in either transpiled or native mode.

The app contains 90+ interactive playgrounds, each demonstrating a specific SwiftUI component, layout technique, or framework integration. Every playground renders natively on both iOS and Android from the same Swift source code.

Download on the Google Play Store Download on the Apple App Store
iPhone Screenshot iPhone Screenshot iPhone Screenshot iPhone Screenshot iPhone Screenshot
Android Screenshot Android Screenshot Android Screenshot Android Screenshot Android Screenshot

The app uses a three-tab layout defined in ContentView.swift ↗:

  • About — App info and version details
  • Showcase — Searchable list of all playgrounds (PlaygroundListView.swift ↗)
  • Settings — Appearance and configuration

Each playground is registered as a case in the PlaygroundType enum, which provides the title and view. The list is searchable and navigable via NavigationStack.

The showcase integrates 10 Skip framework libraries beyond the core SkipUI, demonstrating how optional frameworks can be composed into a single app:

FrameworkRepositoryPurpose
SkipFuseUIskip-fuse-uiCore SwiftUI-to-Compose bridge for Fuse mode
SkipKitskip-kitPermissions, document/media pickers, haptics, device info
SkipAVskip-avVideo playback (AVKit on iOS, ExoPlayer on Android)
SkipWebskip-webEmbedded web views (WKWebView / android.webkit.WebView)
SkipDeviceskip-deviceSensors (accelerometer, gyroscope, magnetometer, barometer) and location
SkipMotionskip-motionLottie animations
SkipKeychainskip-keychainKeychain / EncryptedSharedPreferences
SkipSQLskip-sqlSQLite database access
SkipNotifyskip-notifyPush and local notifications
SkipAuthenticationServicesskip-authentication-servicesWeb authentication sessions (OAuth flows)

Every playground file is in Sources/Showcase/ ↗ and links to its source via the toolbar “Source” button. The entries below link to the playground source code and the relevant SkipUI documentation for each component.

Interactive input elements that accept user actions.

PlaygroundComponentsSource
ButtonButton, Label, button roles, .bordered, .borderedProminent, .plain stylesButtonPlayground.swift ↗
ToggleToggle, .labelsHidden, .tint, .disabledTogglePlayground.swift ↗
SliderSlider with ranges, steps, onEditingChangedSliderPlayground.swift ↗
StepperStepper with Int/Double values, custom boundsStepperPlayground.swift ↗
PickerPicker with .segmented, .menu stylesPickerPlayground.swift ↗
DatePickerDatePicker with date/time modesDatePickerPlayground.swift ↗
MenuMenu with primary action, sections, dividersMenuPlayground.swift ↗
ProgressViewCircular and linear progress, determinate/indeterminateProgressViewPlayground.swift ↗

Text display, input, and formatting.

PlaygroundComponentsSource
TextText with bold, italic, strikethrough, underline, markdown, all font sizes, custom fontsTextPlayground.swift ↗
TextFieldTextField with .roundedBorder, .plain, custom stylesTextFieldPlayground.swift ↗
SecureFieldSecureField with prompts, disabled statesSecureFieldPlayground.swift ↗
TextEditorMulti-line text editingTextEditorPlayground.swift ↗
LabelLabel with .titleAndIcon, .titleOnly, .iconOnly stylesLabelPlayground.swift ↗
Line Spacing.lineSpacing modifier with various valuesLineSpacingPlayground.swift ↗
Tracking.tracking modifier for letter spacingTrackingPlayground.swift ↗
MinimumScaleFactor.minimumScaleFactor for responsive text sizingMinimumScaleFactorPlayground.swift ↗

Spatial arrangement of views.

PlaygroundComponentsSource
StacksHStack, VStack, fixed vs expanding, nested stacksStackPlayground.swift ↗
SpacerSpacer with minLength, variable dimensionsSpacerPlayground.swift ↗
Frame.frame with width, height, .infinity, aspect ratioFramePlayground.swift ↗
GridsLazyVGrid, LazyHGrid with .adaptive, .flexible, .fixed columnsGridPlayground.swift ↗
DividerHorizontal/vertical dividers, custom dimensionsDividerPlayground.swift ↗
GeometryReaderSize reading, safe area insets, local vs global framesGeometryReaderPlayground.swift ↗
GeometryChangeonGeometryChange for size/position trackingGeometryChangePlayground.swift ↗
SafeArea.ignoresSafeArea, edge-to-edge renderingSafeAreaPlayground.swift ↗
ViewThatFitsAdaptive layout along horizontal/vertical axesViewThatFitsPlayground.swift ↗
ContentMargins.contentMargins, scrollContentPlacementContentMarginsPlayground.swift ↗

Screen flow and modal presentation.

PlaygroundComponentsSource
NavigationStackNavigationStack, NavigationLink, path binding, navigationDestinationNavigationStackPlayground.swift ↗
SheetSheet, FullScreenCover, PresentationDetent, onDismissSheetPlayground.swift ↗
AlertAlert with text/secure field inputsAlertPlayground.swift ↗
ConfirmationDialogAction sheets with custom cancel, scrolling contentConfirmationDialogPlayground.swift ↗
ContextMenuLong-press menus with labels and destructive actionsContextMenuPlayground.swift ↗
TabViewTabs with badges, custom icons, programmatic selectionTabViewPlayground.swift ↗
ToolbarToolbarItem placement, custom bar colors, ToolbarTitleMenuToolbarPlayground.swift ↗

Lists, scroll views, and content presentation.

PlaygroundComponentsSource
ListSections, edit actions (move/delete), refresh, badges, plain styleListPlayground.swift ↗
ScrollViewScrollViewReader, LazyVStack/LazyHStack, scroll targets, anchorsScrollViewPlayground.swift ↗
FormForm with mixed control types, button styling, nested sectionsFormPlayground.swift ↗
DisclosureGroupExpandable sections, isExpanded binding, nested groupsDisclosureGroupPlayground.swift ↗
Searchable.searchable on List, Grid, LazyVStack, onSubmitSearchablePlayground.swift ↗

Visual appearance customization.

PlaygroundComponentsSource
ColorSystem colors, RGB, HSV, opacity, custom asset colorsColorPlayground.swift ↗
ColorScheme.preferredColorScheme, light/dark switchingColorSchemePlayground.swift ↗
Color Effects.brightness, .contrast, .saturation, .hueRotation, .grayscale, .colorInvertColorEffectsPlayground.swift ↗
GradientLinearGradient, RadialGradient, EllipticalGradientGradientPlayground.swift ↗
Background.background with colors, gradients, shapesBackgroundPlayground.swift ↗

Drawing, shapes, and visual modifiers.

PlaygroundComponentsSource
ShapeCircle, Capsule, Rectangle, RoundedRectangle, Ellipse, UnevenRoundedRectangleShapePlayground.swift ↗
Border.border, padding, .clipShapeBorderPlayground.swift ↗
Blur.blur(radius:) on shapes and textBlurPlayground.swift ↗
Shadow.shadow with color, radius, x/y offsetShadowPlayground.swift ↗
BlendMode.blendMode (multiply, screen, overlay, and 10+ others)BlendModePlayground.swift ↗
Mask.mask with shapes, gradients, and textMaskPlayground.swift ↗
Overlay.overlay with colors, shapes, custom contentOverlayPlayground.swift ↗
Redacted.redacted(reason: .placeholder) content maskingRedactedPlayground.swift ↗
ZIndex.zIndex for layering control in ZStackZIndexPlayground.swift ↗

Image display, remote loading, and iconography.

PlaygroundComponentsSource
ImageAsset images (JPEG, SVG), system images, AsyncImage (remote URLs), .aspectRatio, .clipShapeImagePlayground.swift ↗
IconsCustom asset icons with various colorsIconPlayground.swift ↗
SymbolImage(systemName:) with font sizing, multiple variationsSymbolPlayground.swift ↗
Graphics.grayscale, image composition, rotation effectsGraphicsPlayground.swift ↗

Touch handling and user input.

PlaygroundComponentsSource
GestureTapGesture, LongPressGesture, DragGesture, MagnificationGesture, RotationGesture, @GestureStateGesturePlayground.swift ↗
Offset/Position.offset(x:y:), .position, coordinate visualizationOffsetPositionPlayground.swift ↗
Transform.rotation3DEffect, .scaleEffect with anchorsTransformPlayground.swift ↗
Haptic FeedbackSensoryFeedback types (success, warning, error, impact, selection)HapticFeedbackPlayground.swift ↗

Animated property changes and view transitions.

PlaygroundComponentsSource
Animation.animation modifier for opacity, blur, brightness, saturation, scale, border, corner radiusAnimationPlayground.swift ↗
Transition.transition, withAnimation, .id(), combined scale/opacityTransitionPlayground.swift ↗

State management, observation, and persistence.

PlaygroundComponentsSource
State@State, @Binding, struct mutations, optional stateStatePlayground.swift ↗
Observable@Observable (Observation framework), @EnvironmentObservablePlayground.swift ↗
EnvironmentCustom EnvironmentKey, @Environment, @BindableEnvironmentPlayground.swift ↗
PreferencesCustom PreferenceKey, onPreferenceChangePreferencePlayground.swift ↗
Storage@AppStorage for Bool, Double, and Enum typesStoragePlayground.swift ↗
OnSubmit.onSubmit with nested form submission handlersOnSubmitPlayground.swift ↗

Input method customization.

PlaygroundComponentsSource
Keyboard.keyboardType, .autocorrectionDisabled, .scrollDismissesKeyboard, .submitLabel, .textInputAutocapitalizationKeyboardPlayground.swift ↗
FocusState@FocusState with boolean and enum bindings, programmatic focusFocusStatePlayground.swift ↗

Platform features accessible through SwiftUI.

PlaygroundComponentsSource
ScenePhase@Environment(\.scenePhase) monitoring (active, background, inactive)ScenePhasePlayground.swift ↗
LocalizationBundle localizations, LocalizedStringResource, locale-aware date formattingLocalizationPlayground.swift ↗
Accessibility.accessibilityLabel, .accessibilityValue, .accessibilityAddTraits, .accessibilityHiddenAccessibilityPlayground.swift ↗
LinkLink, @Environment(\.openURL), OpenURLActionLinkPlayground.swift ↗
ShareLinkShareLink with text and URL sharing, subject/messageShareLinkPlayground.swift ↗
PasteboardUIPasteboard.general for copy/paste operationsPasteboardPlayground.swift ↗
TimerTimer-based updates and schedulingTimerPlayground.swift ↗

Playgrounds that demonstrate optional Skip framework libraries beyond core SkipUI.

PlaygroundFrameworkWhat it demonstratesSource
Video PlayerSkipAVVideoPlayer with local, remote, and HLS sources; loopingVideoPlayerPlayground.swift ↗
Lottie AnimationSkipMotionLottie playback, speed control, loop modes, progress scrubbingLottiePlayground.swift ↗
WebViewSkipWebWebEngine, navigation, JavaScript evaluationWebViewPlayground.swift ↗
WebBrowserSkipKitEmbedded/system browser launch, custom actionsWebBrowserPlayground.swift ↗
Web Auth SessionSkipAuthenticationServicesOAuth-style web authentication, callback URL parsingWebAuthenticationSessionPlayground.swift ↗
Document/Media PickersSkipKitDocument and media picking, camera integrationDocumentPickerPlayground.swift ↗
KeychainSkipKeychainKeychain read/write, key managementKeychainPlayground.swift ↗
NotificationsSkipNotifyPush permission, local notificationsNotificationPlayground.swift ↗
SQLSkipSQLSQLite CRUD operations, observable database listSQLPlayground.swift ↗
MapMapKit (iOS) / Google Maps Compose ↗ (Android)Map display with coordinates, platform-specific renderingMapPlayground.swift ↗
SensorsSkipDeviceAccelerometer, gyroscope, magnetometer, barometer, locationSensorsPlayground.swift ↗

These playgrounds demonstrate Skip’s escape hatches for accessing native Android APIs from SwiftUI.

PlaygroundTechniqueSource
ComposeComposeView with custom ContentComposer for direct Jetpack Compose renderingComposePlayground.swift ↗
Modifiers.composeModifier() for applying native Compose modifiers, custom ViewModifierModifierPlayground.swift ↗
PlaygroundDescriptionSource
Easter EggA complete Block Blast game with drag-and-drop piece placement, line clearing, combos, scoring, and haptic feedback. Demonstrates complex state management with @Observable, GeometryReader for board sizing, and DragGesture with global coordinate space.GamePlayground.swift ↗

Several playgrounds demonstrate how to provide platform-specific implementations when SwiftUI alone is insufficient. The MapPlayground ↗ is the clearest example: it uses SwiftUI Map on iOS and ComposeView with Google Maps Compose on Android, sharing the same coordinate data.

The ComposePlayground ↗ shows how to embed raw Jetpack Compose code within a SwiftUI hierarchy using ComposeView and a custom ContentComposer. This is Skip’s escape hatch for rendering Android-native UI that has no SwiftUI equivalent. The MapPlayground ↗ uses this technique in production to embed Google Maps.

The ModifierPlayground ↗ demonstrates reusable ViewModifier implementations (like DismissModifier) and the .composeModifier() API for applying native Compose modifiers on Android. This is useful for Material 3 theming or Android-specific visual effects.

The GamePlayground ↗ demonstrates managing complex interactive state across a game board, piece tray, and score system using @Observable and multiple @State variables. It shows how DragGesture with .global coordinate space, GeometryReader for layout measurement, and DispatchQueue.main.asyncAfter for timed effects all work cross-platform.

The SensorsPlayground ↗ demonstrates AsyncThrowingStream consumption from device sensors using the .task(id:) modifier pattern. Each sensor card starts/stops monitoring based on a boolean toggle, and the task automatically cancels when the toggle changes. Location monitoring includes runtime permission handling via PermissionManager.

The Map playground requires an Android Gradle dependency for Google Maps Compose. This is configured in Sources/Showcase/Skip/skip.yml ↗:

build:
contents:
- block: 'dependencies'
contents:
- 'implementation("com.google.maps.android:maps-compose:6.4.1")'

This project is both a stand-alone Swift Package Manager module, as well as an Xcode project that builds and transpiles the project into a Kotlin Gradle project for Android using the Skip plugin.

The module can be tested using the standard swift test command or by running the test target for the macOS destination in Xcode, which will run the Swift tests as well as the transpiled Kotlin JUnit tests in the Robolectric Android simulation environment.

Parity testing can be performed with skip test, which will output a table of the test results for both platforms.

Xcode and Android Studio must be downloaded and installed in order to run the app in the iOS simulator / Android emulator. An Android emulator must already be running, which can be launched from Android Studio’s Device Manager.

To run both the Swift and Kotlin apps simultaneously, launch the Showcase target from Xcode. A build phases runs the “Launch Android APK” script that will deploy the transpiled app a running Android emulator or connected device. Logging output for the iOS app can be viewed in the Xcode console, and in Android Studio’s logcat tab for the transpiled Kotlin app.

The 10 most recent releases of skiptools/skipapp-showcase ↗:

Full history: github.com/skiptools/skipapp-showcase/releases ↗ — .atom feed ↗