To offer a better and more integrated development experience, apps created using Shopify CLI 3.x follow a conventional directory structure. This structure allows you to serve and deploy your web app, [app configuration](/docs/apps/build/cli-for-apps/app-configuration), and [app extensions](/docs/apps/build/app-extensions) at the same time. It also allows you to generate new app extensions easily. > Tip: > If you have an app that was created using a previous version of Shopify CLI, or without Shopify CLI, then you can migrate your app. [Learn how to update your app to follow this structure](/docs/apps/build/cli-for-apps/migrate-to-latest-cli) . ## Directory structure All apps created with Shopify CLI follow the same basic directory structure. Some elements might be included or omitted depending on your app's functionality.
File/directory | Required? | Description |
---|---|---|
shopify.app.toml | Yes | A file containing metadata and configuration for your project. This file represents the root of the app. |
shopify.app.{config-name}.toml | No | One or more files that contain configuration for your project. You can use TOML files to manage your apps' configuration locally and sync them with Shopify. |
package.json | Yes | A file containing Node-specific metadata about your project. Includes project dependencies and scripts that let you run Shopify CLI commands using your package manager. Depending on your project structure or template, you might have additional `package.json` files in your project subfolders. |
Web files directory | No | The recommended directory for the web files for your app. Use this directory if you want to build a web interface to display in the Shopify admin or Shopify POS using Shopify App Bridge. These components can be made up of one or more processes. |
app/ directory |
Yes | The directory that contains the app's entry points, routes, and webhooks. The entry.server.[jsx|tsx] file is the main application entry point. The root.[jsx|tsx] file is the root route of any Remix app. You can also use root.[jsx|tsx] to define any common UI for the app, such as a responsive layout. |
extensions/ directory |
No | Any app extensions that you've generated in your app. Each directory under extensions/ represents an extension, where the extension's local identifier is the name of the directory.Each extension's directory must contain a TOML configuration file. |
env | No | A file containing the UUIDs for your app and each extension in the app. |