Library / SDK
AppIntro/AppIntro avatar
AppIntro/AppIntro

AppIntro: An Android Library for Carousel Onboarding Screens with Permission Handling

Make a cool intro for your Android app.

10,569 stars1,761 forksKotlinApache-2.0

At a glance

What is it?
AppIntro is an Android Kotlin library that adds a swipeable carousel intro to any app, supporting runtime permission requests, slide animations, and custom layouts. It is distributed through JitPack and targets the AndroidX ecosystem, with the most recent stable release at version 6.3.1.
Who is it for?
AppIntro is suited to Android developers who need a carousel-style onboarding screen with permission handling, slide transitions, and minimal boilerplate. It is not the right choice for applications targeting non-Android platforms or requiring a completely custom onboarding flow that extends beyond slides.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 5 days ago.
What is it written in?
Mainly Kotlin, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 30, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What AppIntro Solves for Android Developers

Every Android app that introduces new features or requests permissions faces the same pattern: display a sequence of full-screen slides with titles, descriptions, and optional imagery, then request the necessary permissions at the appropriate moment and track whether the user has already seen the intro. AppIntro handles this boilerplate in one library.

The library targets Android developers who want to add a polished intro carousel without building a custom ViewPager implementation. API level 14 and higher are supported, covering virtually all active Android installations. The library is written entirely in Kotlin and is compatible with the AndroidX AppCompat library. Java users are supported as well, with example code in the repository at example/src/main/java/com/github/appintro/example/ui/java/JavaIntro.java.

Adding AppIntro to a Project

AppIntro is distributed through JitPack. Add the JitPack repository and the dependency to the module-level build.gradle file, not the root file:

groovy
repositories {
    maven { url "https://jitpack.io" }
}
groovy
dependencies {
    // AndroidX Capable version
    implementation 'com.github.AppIntro:AppIntro:6.3.1'

    // *** OR ***

    // Latest version compatible with the old Support Library
    implementation 'com.github.AppIntro:AppIntro:4.2.3'
}

AppIntro 5.x and later require AndroidX. Applications that have not migrated to AndroidX and cannot use Jetifier Reverse mode should use the 4.2.3 release, which targets the old Support Library packages.

The library's dependencies are limited to AndroidX AppCompat, AndroidX Annotations, ConstraintLayout, and the Kotlin standard library. There are no transitive dependencies on networking libraries, image loaders, or analytics SDKs.

Building a Basic Onboarding Flow

Create an Activity that extends AppIntro. In the onCreate method, call addSlide with fragment instances to build the slide sequence. The AppIntroFragment.createInstance helper constructs pre-built slides from a title and description string:

kotlin
class MyCustomAppIntro : AppIntro() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Make sure you don't call setContentView!

        // Call addSlide passing your Fragments.
        // You can use AppIntroFragment to use a pre-built fragment
        addSlide(AppIntroFragment.createInstance(
                title = "Welcome...",
                description = "This is the first slide of the example"
        ))

Do not call setContentView in the overriding activity. The AppIntro superclass handles the layout. Override onCreate with the single-Bundle parameter signature, not the two-parameter onCreate(Bundle, PersistableBundle) variant.

Declare the activity in AndroidManifest.xml:

xml
<activity android:name="com.example.MyCustomAppIntro"
    android:label="My Custom AppIntro" />

The README recommends not declaring MyCustomAppIntro as the launcher activity unless you want the intro to display on every launch. A SharedPreferences flag is the standard pattern for showing the intro only once.

Slide Types, Transformers, and Visual Customisation

AppIntro supports two slide types. AppIntroFragment is the pre-built fragment that accepts a title, description, image, and background colour. AppIntroCustomLayoutFragment accepts any layout resource, giving full control over the slide's visual structure.

Slide transformers control the animation between slides. The library includes several built-in transformer presets, and a Custom Slide Transformer interface allows teams to implement arbitrary ViewPager page transformations. The README documents the transformer configuration under the Configure section.

Additional visual and behavioural controls include color transitions between consecutive slide backgrounds, a multiple-windows layout mode, configurable page indicators, optional vibration on slide change, and Wizard Mode (which adds a back button on the first slide and a done button only on the last, blocking forward progress until the user taps the button). Immersive Mode hides the status bar and navigation bar. RTL (right-to-left) layout is fully supported, which matters for Arabic and Hebrew markets.

The status bar and navigation bar appearance can be controlled programmatically. A bottom bar margin option adjusts the layout when a system navigation bar overlaps the slide content.

Runtime Permission Integration

AppIntro provides a Slide Policy mechanism for attaching a permission request to a specific slide. A slide with a policy will not allow forward navigation until the policy condition is satisfied. This makes it possible to request a permission (such as location access or camera access) as part of the intro flow and block progress until the user grants it or confirm that the denial is understood.

The README documents this under the Permission section. Combining Slide Policy with the built-in permission request flow means developers do not need to write a separate permission request activity or overlay the intro with a separate dialog.

Limitations and Alternatives

AppIntro is specific to Android. Teams building cross-platform apps or working in Compose Multiplatform do not have a direct equivalent; a Compose-based introscreen would require building from Compose primitives rather than adopting AppIntro.

The most recent stable release, 6.3.1, was published 2023-07-24. The beta release 7.0.0-beta02 was also published 2023-07-24. Three years without a stable release is a meaningful gap for an Android library, given the changes to Android's permission model, large-screen support, and predictive back gesture handling in that period. The repository's last push was on 2026-09-25, indicating that maintenance continues, but without a formal release the beta is the only path to newer fixes.

FancyShowCaseView and TapTargetView are alternative Android libraries that serve a different onboarding pattern: feature spotlight flows that highlight specific UI elements with an overlay rather than full-screen slides. If the requirement is a step-by-step feature tour of an existing screen, those libraries are better suited. AppIntro's carousel model fits an introduction presented before the user reaches the app's main content.

Maintenance and License

The last push to the repository was on 2026-09-25. The last stable release was 6.3.1 on 2023-07-24; the last release of any kind was 7.0.0-beta02, also on 2023-07-24. The CHANGELOG.md in the repository documents changes per version.

AppIntro is licensed under the Apache-2.0 license, which permits commercial use, modification, and distribution without requiring source disclosure. The dependency on AndroidX AppCompat and ConstraintLayout means the effective licence set also includes the Apache-2.0 licences of those AndroidX libraries.

Editorial conclusion

AppIntro is suited to Android developers who need a carousel-style onboarding screen with permission handling, slide transitions, and minimal boilerplate. It is not the right choice for applications targeting non-Android platforms or requiring a completely custom onboarding flow that extends beyond slides. Before adopting the beta 7.0.0-beta02, test against the migration guide in docs/migrating-from-5.0.md to understand what changed from 6.x. The stable 6.3.1 release is available through JitPack and depends only on AndroidX AppCompat, ConstraintLayout, and the Kotlin standard library.

Frequently asked questions

How do I add AppIntro to an Android Studio project?

Add the JitPack repository to the module-level build.gradle repositories block and add implementation 'com.github.AppIntro:AppIntro:6.3.1' to the dependencies block. The JitPack repository URL is https://jitpack.io. Do not add the dependency to the root build.gradle.

How do I show the AppIntro only once at first launch?

The README recommends using a SharedPreferences flag. Check the flag at app startup; if it has not been set, launch the AppIntro Activity. Set the flag when the user completes or skips the intro. AppIntro does not manage this tracking itself.

Does AppIntro support runtime permission requests?

AppIntro includes a Slide Policy mechanism that blocks forward navigation on a slide until a condition is satisfied. This is the supported way to attach a runtime permission request to a specific intro slide. The README documents it under the Permission section.

Official sources

  1. AppIntro/AppIntro on GitHub
  2. Issues
  3. License: Apache-2.0
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/appintro-appintro.svg)](https://hysenlabs.com/projects/appintro-appintro)