{"id":30491748,"url":"https://github.com/google/automotive-design-compose","last_synced_at":"2026-04-24T01:04:26.564Z","repository":{"id":151842146,"uuid":"624923090","full_name":"google/automotive-design-compose","owner":"google","description":"Automotive Design for Compose is an extension to Jetpack Compose that allows every screen, component, and overlay of your Android App to be defined in Figma, and lets you see the latest changes to your Figma design in your app, immediately!","archived":false,"fork":false,"pushed_at":"2025-08-08T01:33:55.000Z","size":454465,"stargazers_count":151,"open_issues_count":153,"forks_count":28,"subscribers_count":15,"default_branch":"main","last_synced_at":"2025-08-12T15:28:57.390Z","etag":null,"topics":["android","compose"],"latest_commit_sha":null,"homepage":"https://google.github.io/automotive-design-compose/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/google.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":"support-figma/auto-content-preview-widget/README.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-04-07T15:43:22.000Z","updated_at":"2025-08-10T05:36:11.000Z","dependencies_parsed_at":"2023-09-26T04:19:09.321Z","dependency_job_id":"84e4aba2-25fa-4764-afae-ac8d7c3044be","html_url":"https://github.com/google/automotive-design-compose","commit_stats":{"total_commits":364,"total_committers":13,"mean_commits":28.0,"dds":0.5302197802197802,"last_synced_commit":"6ad6328d9b9d02ede25f1608c0de3603e03e2cde"},"previous_names":[],"tags_count":61,"template":false,"template_full_name":null,"purl":"pkg:github/google/automotive-design-compose","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fautomotive-design-compose","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fautomotive-design-compose/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fautomotive-design-compose/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fautomotive-design-compose/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/google","download_url":"https://codeload.github.com/google/automotive-design-compose/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fautomotive-design-compose/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270109555,"owners_count":24528834,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-12T02:00:09.011Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","compose"],"created_at":"2025-08-24T19:28:02.329Z","updated_at":"2026-04-24T01:04:26.556Z","avatar_url":"https://github.com/google.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Automotive Design for Compose\n\n- [Automotive Design for Compose](#automotive-design-for-compose)\n  - [Introduction](#introduction)\n  - [Getting Started](#getting-started)\n  - [Building your own app](#building-your-own-app)\n- [Working with the Source](#working-with-the-source)\n  - [SDK build dependencies](#sdk-build-dependencies)\n    - [Android Studio](#android-studio)\n    - [Android NDK](#android-ndk)\n    - [Rust](#rust)\n    - [Rust Toolchains](#rust-toolchains)\n  - [Source Layout](#source-layout)\n  - [Building additional resources](#building-additional-resources)\n    - [Building the Automotive Design for Compose Figma Plugin and Widget](#building-the-automotive-design-for-compose-figma-plugin-and-widget)\n  - [Get in touch](#get-in-touch)\n\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/google/automotive-design-compose/badge)](https://api.securityscorecards.dev/projects/github.com/google/automotive-design-compose)\n\n## Introduction\n\nAutomotive Design for Compose (also called DesignCompose in the source) is an extension\nto [Jetpack Compose](https://developer.android.com/jetpack/compose) that allows every screen,\ncomponent, and overlay of your Android App to be defined in [Figma](https://www.figma.com), and lets\nyou see the latest changes to your Figma design in your app, immediately!\n\nTo use Automotive Design for Compose in an app, a developer specifies the Composables that they’d\nlike to be defined by Figma, and a designer uses Figma to draw them. Most Figma features, including\nAuto Layout, Interactions, Variants, and Blend Modes are fully supported. This repo includes the\nDesignCompose library, an interactive tutorial app (in reference-apps/Tutorial), and a sample\ncustomizable Media Center for Android Automotive OS (in reference-apps/aaos-unbundled).\n\n[Click here for our documentation!](https://google.github.io/automotive-design-compose/)\n\n## Getting Started\n\nThe DesignCompose Tutorial app shows you the capabilities of DesignCompose through a series of\ninteractive examples. You will need a Figma account\nand [personal access token](https://google.github.io/automotive-design-compose/docs/live-update/setup)\nto view the Tutorial Figma file and a large-screen device to run it on.\n\nYou'll work with your own copy of\nthe [Tutorial Figma file](https://www.figma.com/community/file/1228110686419863535/Tutorial-for-Automotive-Design-for-Compose).\nCreate your own by clicking **Open in Figma**, which creates a copy of the file in your account.\nOnce open, identify the Figma Document ID from your new file's URL. It's the alphanumeric string\nbetween `design/` and the name of the document. For example:\n\n\u003cpre\u003e\u003ccode\u003efigma.com/design/\u003cb\u003eABCDEFG123\u003c/b\u003e/File-name\u003c/code\u003e\u003c/pre\u003e\n\nThe app's Gradle project is located in `reference-apps/tutorial`. Build and launch it on your\ndevice, then set your Figma Access Token on the app by running:\n\n```shell\n./gradlew setFigmaTokenDebug\n```\n\nNext, switch the app to use your copy of the Tutorial file by clicking the dropdown arrow in the\nupper right. This will open the Design Switcher.\n\n![Collapsed Design Switcher](docs/design-switcher-collapsed.png)\n\nClick the **Change** button to switch document IDs, and enter the ID of your copy of the Tutorial\nFigma File. Click **Load** and the app will start fetching your file (it'll take about a minute)\n\nWhile that's loading, open your copy of the Tutorial file on Figma and find the **Getting Started**\nbox (it's at the top with a pointer pointing to it).\n\n![Find Getting Started](docs/TutorialGettingStarted.png)\n\nZoom in on it and begin your tutorial!\n\n![Getting Started Frame](docs/GettingStartedFrame.svg)\n\n## Building your own app\n\nWe'll be adding more documentation and guides soon! For now you can look\nto `reference-apps/helloworld` for an an example of a basic app.\n\n## Figma CLI Tools\n\nThis project includes command-line tools to help interact with Figma files, built with Rust. Pre-compiled binaries for Linux (x86_64, aarch64), macOS (x86_64, aarch64), and Windows (x86_64) are available in the [GitHub Releases](https://github.com/google/automotive-design-compose/releases).\n\n### `fetch`\n\nThe `fetch` tool downloads a Figma document, extracts specified nodes, and saves the output to a `.dcf` file. This tool requires a Figma access token, which can be provided via the `FIGMA_ACCESS_TOKEN` environment variable or a file at `~/.config/figma_access_token`.\n\n**Usage:**\n\n```bash\n./fetch --doc-id \u003cDOCUMENT_ID\u003e --nodes \u003cNODE_NAME\u003e --output \u003cOUTPUT_FILE.dcf\u003e\n```\n\n**Example:**\n\n```bash\n./fetch --doc-id 2aM4SczJzWg1rov2qqBMpe --nodes \"#MainFrame\" --output output.dcf\n```\n\n### `dcf_info`\n\nThe `dcf_info` tool inspects a `.dcf` file and prints its contents, including header information and variable data.\n\n**Usage:**\n\n```bash\n./dcf_info \u003cINPUT_FILE.dcf\u003e --varinfo\n```\n\n**Example:**\n\n```bash\n./dcf_info output.dcf --varinfo\n```\n\n# Working with the Source\n\n## Proto Submodule\n\nDesignCompose's proto files are hosted in a separate Git repository:\n[automotive-design-compose-protos](https://github.com/google/automotive-design-compose-protos)\nand are included here as a Git submodule located at `crates/dc_bundle/src/proto`.\n\nWhen you first clone this repository, or when the submodule reference is updated\n(e.g., after a `git pull` in this main repository),\nyou'll need to ensure the submodule content is downloaded and at the correct version.\n\n### 1. Cloning the Repository for the First Time (Recommended)\n\nThe easiest way to ensure submodules are handled correctly from the start is to use\nthe `--recurse-submodules` flag when cloning:\n\n```bash\ngit clone --recurse-submodules git@github.com:google/automotive-design-compose.git\n\n## 2. Initializing or Updating Submodules in an Already Cloned Repository\nIf you have already cloned the repository without the --recurse-submodules flag,\nor if you've pulled changes that updated the submodule reference\n(i.e., this main repository now points to a different commit of the submodule),\nthe proto submodule directory (crates/dc_bundle/src/proto) might be empty or outdated.\n\nTo initialize and/or update the submodule to the version specified by this repository,\nrun the following command from the root directory of this repository:\n\n```bash\ngit submodule update --init --recursive\n\n## SDK build dependencies\n\nDesignCompose's Live Update system uses a native library built in Rust to fetch and serialize your\nFigma Documents. You'll need the following to build it and the rest of the SDK.\n\n### Android Studio\n\nCurrently testing with [Android Studio Meerkat | 2024.3.1](https://developer.android.com/studio/releases)\n\n### Android NDK\n\nVersion `27.0.12077973` is required. It can be installed\nvia [Android Studio's SDK Manager](https://developer.android.com/studio/projects/install-ndk#specific-version)\nor on the command line using the `sdkmanager` binary.\n\n```shell\n\"${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager\" --install \"ndk;27.0.12077973\"\n```\n\n### Rust\n\nRust 1.68.0 is required to compile DesignCompose's Live Update service. Install\nat [rustup.rs](https://rustup.rs/). For working with the code, we recommend the `rust-analyzer`\nplugins for VS Code and Android Studio / IntelliJ.\n\nAndroid Studio will not pick up on a new Rust install without restarting the IDE. In addition, if\nyou launch Android Studio via desktop shortcut or similar (i.e. not from the command line), then it\nstill may not detect the install. In this case you can log out of your computer and back in, or\nsimply restart your computer.\n\n### Rust Toolchains\n\nThe DesignCompose library includes a Rust JNI library, which requires Rust build target toolchains.\nInstall them by running the following from the root of the repository\n\n```shell\n./install-rust-toolchains.sh\n```\n\n### Protobuf compiler\n\nThe Rust source depends on the protobuf messages which must be compiled with the protobuffer\ncompiler. Compilation will happen automatically for the packages that need it, but the\ncompiler must be available. It can be installed using `apt install protobuf-compiler`\nor `brew install protobuf`\n\n### Formatters\n\n- Yaml: [`yamlfmt`](https://github.com/google/yamlfmt)\n- Kotlin: [`ktfmt`](https://github.com/facebook/ktfmt)\n- Rust: [`rustfmt`](https://github.com/rust-lang/rustfmt)\n- Markdown: [`markdownlint-cli2`](https://github.com/DavidAnson/markdownlint-cli2)\n- Protobuf: [`protolint`](https://github.com/yoheimuta/protolint)\n- Licenses: [`addlicense`](https://github.com/google/addlicense)\n\n## Install all of the dependencies at once please\n\nFirst, please follow your organization's policies for installing packages.\n\nIf you have the ability to do so, you can use [Homebrew](https://brew.sh/) to install almost\neverything, for both MacOS and Linux. (Install Homebrew with the command listed on their homepage)\n\nTo install the essentials:\n\n```bash\n# Make sure you have at least Java 17 available\nJAVA_VER=$( java -version 2\u003e\u00261 | awk -F '\"' '/version/ {print $2}' | cut -d . -f 1)\n[ \"$JAVA_VER\" -lt 17 ] \u0026\u0026 brew install openjdk@17\n\n# Install Rust, initialize it and install the toolchains we need\nbrew install rustup-init\nrustup-init -y\n. \"$HOME/.cargo/env\"\n./install-rust-toolchains.sh\n\n# Install the protobuf compiler\nbrew install protobuf\n```\n\nInstall Android studio and install ndk `27.0.12077973` (Sorry, no easy way to automate that part!)\n\nFinally, if needed, install the below\n\n```bash\n# Formatters\nbrew install \\\n  yamlfmt \\\n  protolint \\\n  ktfmt \\\n  markdownlint-cli2\n\n# To build the Figma plugins:\nbrew install npm\n```\n\n## Build optimizations and Gradle properties\n\n### Controlling the architectures to build the Rust libraries for\n\nRelease builds of DesignCompose need to include versions of the Rust libraries compiled for all four\ncurrent Android ABIs - `x86`, `x86_64`, `armeabi-v7a` and `arm64-v8a`. However local development\ntypically only needs a single ABI, corresponding to their test device / AVD.\nCargo can (unfortunately) only build a single ABI at a time, so building all four ABIs adds\nsignificant time to a build (at least a minute). .\n\nThe `designcompose.cargoPlugin.allowAbiOverride` Gradle property enables the ability to override the\nlist of ABIs to build. If set to `true` then the `designcompose.cargoPlugin.abiOverride` property\nwill be read (if set) and used to filter the configured list of ABIs that is configured in the\nGradle project. It takes a comma seperated list of ABIs.\n\nWhen building in Android Studio, the `allowAbiOverride` property will allow the build to check the\nABI of the device that you are building for (when installing the app or running an instrumented test\nor similar) and only build the ABI needed for the device. This has priority over the `abiOverride`\nlist that may be provided.\n\nNote: The abi overrides are ignored when building for release.\n\n### Gradle optimizations\n\nThe properties file that is committed already includes the following optimizations:\n\n- Parallel builds\n- Build caching\n- Configuration caching\n- Increased the JVM memory allotment to 4GB\n\nYou can optionally add these to your personal gradle.properties:\n\n    - `org.gradle.configureondemand`: Incubating feature feature that attempts to configure only\n    the projects that are required for a build.\n    - `android.experimental.androidTest.numManagedDeviceShards`: When running Gradle Managed Device\n    tests, starts up additional VMs to execute the tests on in parallel\n\n## Source Layout\n\nAutomotive Design for Compose consists of several components:\n\n- The Jetpack Compose renderer of Automotive Design for Compose documents consists of several\n  modules:\n\n  - `annotation` contains the Kotlin annotation definitions like `@DesignDoc`\n      and `@DesignComponent`.\n\n  - `codegen` contains the Kotlin compiler plugin that processes the annotations and generates\n      stub Composables that use the Automotive Design for Compose runtime.\n\n  - `designcompose` contains the code that interprets Automotive Design for Compose documents and\n      renders them using Jetpack Compose. It also contains the code that uses the Figma Import JNI\n      library to fetch documents from the Figma webservice.\n\n- Figma Import, in `crates/dc_figma_import`, is a library implemented in Rust that fetches documents\n  and resources from the Figma API and generates a serialized document containing only the\n  information that Automotive Design for Compose needs. The JNI interface used by the Android\n  runtime is in `crates/live_update`.\n\n- Figma plugins that give designers more control and a better experience using Figma with Automotive\n  Design for Compose:\n\n  - The Extended Layout Plugin, in `support-figma/extended-layout-plugin` , provides a panel for\n      formatting text, a panel to provide a Customization Interface file with keyword details, a panel to validate\n      keyword usages against the provided Customization Interface file, and a command to sync Figma's prototype\n      settings to the main document.\n\n  - Auto Content Preview Widget, in `support-figma/auto-content-preview-widget` provides a Figma\n      widget that uses the Customization Interface file and allows designers to create and preview complex list\n      layouts.\n\n- A Validation app in `integration-tests/validation` is used for visually validating changes\n\n- The Tutorial app in `reference-apps/tutorial` provides an overview of DesignCompose\n\n- The `reference-apps/aaos-unbundled` directory contains a separate Gradle project that includes\n  demonstrations of DesignCompose with Android Automotive OS Apps, such as a MediaCenter app.\n\n## Building additional resources\n\n### Building the Automotive Design for Compose Figma Plugin and Widget\n\nThe DesignCompose Plugin and Auto Content Preview widget are needed to enable additional layout\noptions and features. The latest releases are available in the Figma Community and on\nour [Figma Community profile](https://www.figma.com/@designcompose). To build and install an older\nor customized version, follow these instructions:\n\nYou can build on any system, but Figma only supports plugin installation via\nthe [Figma Desktop App](https://www.figma.com/downloads/), which only runs on macOS and Windows.\n\nThere are two packages that are needed, the Extended Layout plugin and Auto Content Preview widget.\nBoth are located in the `support-figma` directory. Build each by running the following: (you'll\nneed `nodejs` and `npm` installed on your system)\n\n```shell\nnpm install\nnpm run build\n```\n\nThen open the Figma Desktop app, go to **Plugins** -\u003e **Development** -\u003e **Import plugin from\nManifest** and select the `manifest.json` file to import.\n\n# Development process\n\n## Updating serialized Figma files\n\nAny changes that include an update to the Figma serialized file version (set in\ncrates/dc_figma_import/src/serialized_document.rs) will require the committed serialized files to be\nupdated with new versions that have been fetched with the updated version. At a minimum this\nincludes any files that are being tested with AndroidIntegratedTests, and most especially the Design\nSwitcher and the Tutorial's welcome screen, which are special cases.\n\nTo update the Design Switcher, temporarily set the `DISABLE_LIVE_MODE` flag in `DesignSwitcher.kt`\nto false, then launch any app. If the app did not already have a Figma Token set then you may need\nto re-launch it after setting the token. The app will fetch the latest version of the DesignSwitcher\ninto it's on-device app storage. Replace the current committed DesignSwitcher\nfile (`designcompose/src/main/assets/figma/DesignSwitcherDoc_Ljph4e3sC0lHcynfXpoh9f.dcf`) with the\nnew one.\n\nThe Tutorial's DesignDoc is set to the main development Figma file, to assist in development of the\napp, but the committed serialized file is a separate file that presents a \"welcome\" page. This\nfile's ID is `BX9UyUa5lkuSP3dEnqBdJf`. To update the file, fetch the `BX9UyUa5lkuSP3dEnqBdJf` file,\nthen replace `reference-apps/tutorial/app/src/main/assets/figma/TutorialDoc_3z4xExq0INrL9vxPhj9tl7`\nwith the serialized file. **The file name will remain the same**,\nthe `TutorialDoc_3z4xExq0INrL9vxPhj9tl7` fill will contain the serialized `BX9UyUa5lkuSP3dEnqBdJf`\nfile. The Tutorial app project has an AndroidIntegratedTest to ensure that the correct file is set,\nand it will be run as part of running the `./dev-scripts/test-all.sh` script.\n\n## Running Instrumented Tests\n\nAll instrumented tests can be run on a running emulator by running \"./gradlew connectedCheck\".\nAdditionally they can be run\non [Gradle Managed Devices](https://developer.android.com/studio/test/gradle-managed-devices). These\ndevices are the standard test targets and all tests must pass on them prior to a release. They are\ncollected into three gradle tasks:\n\n- `gmdTestQuick` run the tests on\n  an [ATD image](https://developer.android.com/studio/test/gradle-managed-devices#gmd-atd), which is\n  optimized for instrumented tests.\n- `gmdTestStandard` runs the tests on both the ATD and the most current Android image\n- `gmdTestAll` runs the tests on all configured Gradle Managed devices,including the above and any\n  additional APIs that have been chosen to be tested against.\n\nNote: The first run will have some significant first-time setup as the GMDs are created.\n\nThese tests can be accelerated on a sufficiently powerful workstation by enabling test sharding in\nyour gradle.properties. This will launch multiple instances of the GMDs, allowing the tests to run\nin parallel.\n\n```bash\n#Up to 4 are supported, though more than 3 may not provide much benefit\nandroid.experimental.androidTest.numManagedDeviceShards=3\n```\n\nThis can provide significant speedup for instrumented tests. Having shards set to 4 can reduce the\ntime to run instrumented tests by 75% (Sample test run: `g connectedCheck` ran in\n4m24s, `g gmdTestsQuick` with 3 shards ran in 1m10s)\n\n## Roborazzi screenshot tests\n\n[Roborazzi](https://github.com/takahirom/roborazzi) is a new framework that allows for screenshot\ntesting of Android Apps on your local system. It\nuses [Robolectric](https://github.com/robolectric/robolectric), the standard unit testing framework\nfor Android, to render DesignCompose locally, allowing screenshots to be generated. The screenshots\nwon't be one-to-one with actual Android devices, but they'll be very close and stable enough for\nchanges to be detected. The comparison is run using `./gradlew verifyRoborazziDebug`.\nSee [our documentation](https://google.github.io/automotive-design-compose/docs/working-with-source/writing-tests)\nfor more information.\n\n## Testing the standalone version of the Tutorial app\n\nThe Tutorial app is currently part of two projects: The root project in the root of the repository,\nand the tutorial project in `reference-apps/tutorial`. The root project is the one that contains the\nentire SDK and our apps and is where you typically develop. The second project is the one that users\nfollowing the Tutorial are directed to use. It fetches DesignCompose from gMaven, which means that\nit builds much faster and doesn't compile rust code (and doesn't require the rust SDK to be\ninstalled). This means that the standalone Tutorial needs some extra configuration if you want the\nstandalone Tutorial project to use any unpublished changes to the libraries and plugin.\n\nFirst, set `$ORG_GRADLE_PROJECT_DesignComposeMavenRepo` to a location such as ~\n/.m2repo/designComposeRepo. This will set the location for the SDK and Plugin to be built to and\nwhere the Tutorial all will read them from.\nRun  `./gradlew publishAllPublicationsToLocalDirRepository` to build the SDK and plugin to that\nlocation.\n\nNow you can use the `reference-apps/local-design-compose-repo.init.gradle.kts` init script to tell\nthe Tutorial app where to find the libraries that you built. The script\nreads `ORG_GRADLE_PROJECT_DesignComposeMavenRepo` and uses it to configure Gradle to look for the\nlibraries and plugin from there. You run init scripts by adding `--init-script \u003cpath to script\u003e` to\nyour Gradle command. For\nexample, `./gradlew --init-script ../local-design-compose-repo.init.gradle.kts assembleDebug`.\n\nNOTE: Android Studio doesn't have a great way to use init scripts. You'll have to build and use the\nTutorial app using the command line. That's fine for quick tests. Any actual development should be\ndone with the proper root Gradle project, which doesn't need the init script.\n\n## Running all tests\n\nThe `./dev-scripts/test-all.sh` script will trigger all tests in the repo. This script must pass\nbefore a release candidate can be cut.\n\n### Prerequisites\n\n- Make sure your system can run Android AVDs\n- Have the build dependencies below installed\n- Check out the current supported branch of the AAOS Unbundled repo (see the \"Check out the\n  Unbundled AAOS Repo\" job in `.github/workflows/main` for the correct branch)\n- Set `$FIGMA_ACCESS_TOKEN` to your Figma token\n\nThe test-all script takes an optional `-s` flag to skip all emulator tests. It's intended for\nsituations where emulators can't be started or when running tests before updating serialized files.\n\n## Formatting\n\nThe default files should configure Android Studio properly to format everything correctly.\n\n## Before you submit for review\n\nTo check that you can pass presubmits and emulator tests before pushing to PR you can do the\nfollowing:\n\n  ```shell\n  ./dev-scripts/clean-all.sh #Optional, but will ensure you're testing a clean environment.\n  ./dev-scripts/format-all.sh\n  ./dev-scripts/test-all.sh\n  ```\n\n## Release Process\n\n### Release Strategy\n\nOur release strategy is based on a `main` branch that always contains the latest-and-greatest,\nand `stable/` branches for releases.\n\n1.  **Branching:** When it's time to release, a `stable/` branch is created from `main`. For\n    example, for a `v0.38.0` release, a `stable/0.38.x` branch is created. The `x` is a\n    literal, not a placeholder.\n2.  **Automatic Version Bumping:** Creating a `stable/` branch triggers a GitHub Action that\n    automatically creates a pull request to bump the version on the `main` branch to the next\n    development version (e.g., `0.39.0-SNAPSHOT`). This PR must be reviewed and merged\n    manually.\n3.  **Cherry-picking:** If a bug fix is needed on a stable branch, it should be cherry-picked\n    from `main`. Since the stable branch is protected, you must create a new branch from the\n    stable branch, cherry-pick the commit(s), and then open a pull request to merge your\n    cherry-pick branch into the stable branch.\n\n    ```bash\n    # Example of cherry-picking a commit from main to a stable branch\n    git checkout stable/0.38.x\n    git pull\n    git checkout -b cherry-pick-my-fix\n    git cherry-pick \u003ccommit-hash-from-main\u003e\n    git push --set-upstream origin cherry-pick-my-fix\n    # Then open a PR in GitHub\n    ```\n\n### Publishing a Release\n\n1.  **Release Candidate (RC):** The first release from a stable branch must be an RC.\n    1.  Create a new **pre-release** in GitHub from the `stable/` branch.\n    2.  The tag should be in the format `v\u003cversion\u003e-rc0\u003cnumber\u003e` (e.g., `v0.38.0-rc01`).\n    3.  This triggers a release build. You can monitor its progress\n        [here](https://github.com/google/automotive-design-compose/actions/workflows/release.yml).\n    4.  Once the build is complete, the artifacts are uploaded to the GitHub pre-release.\n    5.  Publish the RC using the `dev-scripts/publish_designcompose.sh` script:\n        ```bash\n        ./dev-scripts/publish_designcompose.sh 0.38.0-rc01\n        ```\n2.  **Stable Release:** After the RC is validated, create the stable release.\n    1.  Create a new **stable release** in GitHub from the *same commit* as the RC.\n    2.  The tag should be `v\u003cversion\u003e` (e.g., `v0.38.0`).\n    3.  This triggers another release build.\n    4.  Once complete, publish the final release with the script:\n        ```bash\n        ./dev-scripts/publish_designcompose.sh 0.38.0\n        ```\n3.  **Update Figma Artifacts:**\n    1.  Download the widget and plugin artifacts from the final GitHub release onto a system\n        with the Figma Desktop app and unzip them.\n    2.  Open the Figma Desktop app and open any document.\n    3.  Update the Plugin:\n        1.  Open the **Resources** menu (right of the `T` text menu) and switch to the\n            **Plugins** tab.\n        2.  Change the dropdown under the search bar to **Development**.\n        3.  If you already have an entry for the plugin, hover over it, click the `...` menu,\n            and click **Remove local version**.\n        4.  The plugin will now have a **Locate local version** option. Click it, then\n            navigate to the `manifest.json` of the plugin artifact you downloaded from\n            GitHub.\n        5.  Click the `...` menu again and click **Publish**. Add any release notes and click\n            **Publish new version**.\n    4.  Do the same for the widget (using the widget menu).\n    5.  Update the Tutorial Figma file:\n        1.  Open the [Tutorial Figma File](https://www.figma.com/community/file/1228110686419863535/Tutorial-for-Automotive-Design-for-Compose)\n            and create a new branch.\n        2.  Find each instance of the widget and replace it with the newly published version,\n            matching the settings to the current one.\n        3.  Merge the Tutorial branch into the main branch.\n        4.  Create a new branch of the Tutorial file named after the version you're releasing.\n        5.  From the original file, click the **Share** button in the upper right, switch to the\n            **Publish** tab of the window that pops up, and **Publish update**.\n        6.  Make any changes necessary, then click **Save**.\n\n# Get in touch\n\n- Report a bug: \u003chttps://github.com/google/automotive-design-compose/issues\u003e\n- Say hello:\n  [aae-design-compose@google.com](mailto:aae-design-compose@google.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogle%2Fautomotive-design-compose","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgoogle%2Fautomotive-design-compose","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogle%2Fautomotive-design-compose/lists"}