Studio represents the intersection of the Workshop and the Lab.
The name was chosen deliberately: a studio is where the process of learning meets the result of shipping. This Gradle monorepo serves two primary purposes:
- The Sandbox (The Lab): A high-velocity environment for breaking things, mastering new tech (Kotlin, Compose, KSP), and technical R&D.
- The Foundry (The Workshop): A reliable pipeline for crafting and maintaining functional, high-quality apps for myself and my inner circle.
One roof, many experiments, and a few finished pieces.
/apps: Contains the main applications. Each app has its own feature and shared modules./build-logic: Contains convention plugins and build configurations to keep build scripts clean and DRY./core: Shared core utilities, domain logic, and infrastructural components used across multiple apps./icons: Vector assets and icons shared across projects.settings.*.gradle.kts: Dedicated settings files for different app targets (e.g.,settings.cops.gradle.kts,settings.grimoire.gradle.kts). These files conditionally include modules, ensuring the IDE only indexes what is necessary for the active application.
The monorepo uses Gradle properties to determine which app modules to include and build. By default, it targets the active apps defined in your properties or entry configurations.
./gradlew buildThis monorepo leverages custom generators to scaffold new code.
Generate an App:
./gradlew generateApp -PappName=<name> -Ptemplate=<template>Generate a Module:
./gradlew generateModule -PmoduleType=<type> -PmoduleName=<name> -PappName=<app>Screenshot tests are executed using Roborazzi. Note that enableScreenshots=true might be required depending on your configuration.
Record/Update baselines:
./gradlew recordScreenshots -PenableScreenshots=trueVerify screenshots against baselines:
./gradlew verifyScreenshots -PenableScreenshots=true