
Branded, animated in-app About screen with etch/flood entrance, tilt-responsive gleam and survey grid; includes sound/haptics, install-source-aware store routing, offline zero-dependency implementation.
A cairn is the stack of rocks that marks the trail and tells you other travelers came this way. Every Dark Rock Studios app carries one; it points to the rest of the family.
Cairn is the shared "About" screen for Dark Rock Studios apps, as a Compose Multiplatform library: the studio identity, the current app, the family of sibling apps, and support links — wearing the darkrockstudios.com design language. The survey grid glows under your finger, seams ignite as they scroll into view, the horizon foil gleams as you tilt the phone, and opening it etches the grid over your app's screen before the basalt floods in.
You almost certainly don't want this library. It exists for Dark Rock Studios applications: the app catalog, branding, and links are baked in. The code is Apache-2.0 and you're welcome to learn from or fork it for your own studio's about screen — but the Dark Rock Studios name, logo, and app icons are not openly licensed (see NOTICE).
dependencies {
implementation("com.darkrockstudios:cairn:<version>")
}Overlay presentation (recommended — the entrance plays over your app's own screen). Place it as the last child of a full-screen container:
var aboutVisible by remember { mutableStateOf(false) }
Box(Modifier.fillMaxSize()) {
MyAppContent(onAboutClick = { aboutVisible = true })
CairnAboutOverlay(
visible = aboutVisible,
config = CairnConfig(
currentAppId = CairnAppId.FastTrack, // YOUR app
versionName = BuildConfig.VERSION_NAME,
),
onDismissed = { aboutVisible = false },
)
}Or as a standalone destination: CairnAboutScreen(config, onClose = { ... }).
| Parameter | Default | Notes |
|---|---|---|
currentAppId |
— |
CairnAppId: FastTrack, Hammer, SnapSafe, Fugitive, C2paVerify, CleanCopy
|
versionName |
— | shown in the version stamp |
entrance |
Full |
Full (~1.1s etch/flood/ignite) · Quick (~0.7s) · None (fade). Reduced-motion settings force None. |
soundDefault |
true |
initial sound state; the user's mute toggle persists and wins |
hapticsDefault |
true |
haptic feedback on/off |
storeOverride |
null |
force GET buttons to Play/FDroid/AppStore instead of runtime install-source detection |
extraLinks |
empty | extra chips in the identity block |
extraDebugInfo |
empty | appended to the tap-to-copy debug info |
onDismissed.<queries>
entries; your app inherits them via manifest merge. Nothing to add.LSApplicationQueriesSchemes in your Info.plist if/when catalog apps
declare schemes; without it detection degrades gracefully to "not
installed"../gradlew :sampleApp:run # desktop sample (fake Fast Track host)
./gradlew :sampleApp:wasmJsBrowserDevelopmentRun # browser sample
./gradlew :androidApp:installDebug # Android sample
./gradlew :cairn:desktopTest # tests + render previews (build/preview/*.png)
./gradlew :sampleApp:updateDemo # rebuild the GitHub Pages demo in docs/In the desktop sample: arrow keys simulate device tilt (R resets), mouse hover drives the flashlight/gleam/sheen, and the render-preview tests write deterministic PNGs of every effect for visual regression.
The app catalog is hand-written in CairnCatalog.kt for now, with field
names mirroring the website's project frontmatter so a
website→Kotlin generator can replace it mechanically.
Code: Apache-2.0. Brand assets (Dark Rock Studios name, summit logo, app icons): not openly licensed — see NOTICE. Bundled fonts: OFL-1.1 — see NOTICE-FONTS.md.
A cairn is the stack of rocks that marks the trail and tells you other travelers came this way. Every Dark Rock Studios app carries one; it points to the rest of the family.
Cairn is the shared "About" screen for Dark Rock Studios apps, as a Compose Multiplatform library: the studio identity, the current app, the family of sibling apps, and support links — wearing the darkrockstudios.com design language. The survey grid glows under your finger, seams ignite as they scroll into view, the horizon foil gleams as you tilt the phone, and opening it etches the grid over your app's screen before the basalt floods in.
You almost certainly don't want this library. It exists for Dark Rock Studios applications: the app catalog, branding, and links are baked in. The code is Apache-2.0 and you're welcome to learn from or fork it for your own studio's about screen — but the Dark Rock Studios name, logo, and app icons are not openly licensed (see NOTICE).
dependencies {
implementation("com.darkrockstudios:cairn:<version>")
}Overlay presentation (recommended — the entrance plays over your app's own screen). Place it as the last child of a full-screen container:
var aboutVisible by remember { mutableStateOf(false) }
Box(Modifier.fillMaxSize()) {
MyAppContent(onAboutClick = { aboutVisible = true })
CairnAboutOverlay(
visible = aboutVisible,
config = CairnConfig(
currentAppId = CairnAppId.FastTrack, // YOUR app
versionName = BuildConfig.VERSION_NAME,
),
onDismissed = { aboutVisible = false },
)
}Or as a standalone destination: CairnAboutScreen(config, onClose = { ... }).
| Parameter | Default | Notes |
|---|---|---|
currentAppId |
— |
CairnAppId: FastTrack, Hammer, SnapSafe, Fugitive, C2paVerify, CleanCopy
|
versionName |
— | shown in the version stamp |
entrance |
Full |
Full (~1.1s etch/flood/ignite) · Quick (~0.7s) · None (fade). Reduced-motion settings force None. |
soundDefault |
true |
initial sound state; the user's mute toggle persists and wins |
hapticsDefault |
true |
haptic feedback on/off |
storeOverride |
null |
force GET buttons to Play/FDroid/AppStore instead of runtime install-source detection |
extraLinks |
empty | extra chips in the identity block |
extraDebugInfo |
empty | appended to the tap-to-copy debug info |
onDismissed.<queries>
entries; your app inherits them via manifest merge. Nothing to add.LSApplicationQueriesSchemes in your Info.plist if/when catalog apps
declare schemes; without it detection degrades gracefully to "not
installed"../gradlew :sampleApp:run # desktop sample (fake Fast Track host)
./gradlew :sampleApp:wasmJsBrowserDevelopmentRun # browser sample
./gradlew :androidApp:installDebug # Android sample
./gradlew :cairn:desktopTest # tests + render previews (build/preview/*.png)
./gradlew :sampleApp:updateDemo # rebuild the GitHub Pages demo in docs/In the desktop sample: arrow keys simulate device tilt (R resets), mouse hover drives the flashlight/gleam/sheen, and the render-preview tests write deterministic PNGs of every effect for visual regression.
The app catalog is hand-written in CairnCatalog.kt for now, with field
names mirroring the website's project frontmatter so a
website→Kotlin generator can replace it mechanically.
Code: Apache-2.0. Brand assets (Dark Rock Studios name, summit logo, app icons): not openly licensed — see NOTICE. Bundled fonts: OFL-1.1 — see NOTICE-FONTS.md.