Creating an app
Create an Expo Desktop app via:
npx expo-desktop@latest create-appYou can skip the questions by passing the following CLI flags:
npx expo-desktop@latest create-app MyApp \
--display-name "My App" \
--rdns com.example.my-app-123 \
--template expo-template-blank-typescript@sdk-55Specify the app template (--template <template>)
By default, Expo Desktop creates apps from expo-desktop-template-blank-typescript, but you can specify a custom template if preferred.
# Specify a custom template…
# …via URL:
npx expo-desktop@latest create-app --template https://github.com/shirakaba/expo-desktop/tree/main/templates/blank-typescript
# …via npm:
npx expo-desktop@latest create-app --template expo-desktop-template-blank-typescript@latest
# …via file system:
npx expo-desktop@latest create-app --template ./expo-desktop-template-blank-typescript-55.83.1.tgzIf this arg is omitted, you will be presented with a list of supported templates, for example:
- Expo SDK 55, React Native 0.83 (template v55.83.9)
- Expo SDK 54, React Native 0.81 (template v54.81.5)
Newer templates will of course have more features, but may be less mature, as younger React Native Desktop releases will have received less battle-testing by Microsoft.
You may notice that Expo Desktop template versions lag behind latest Expo / React Native a fair bit (say, by a whole year). This is because we need to align on the lowest common denominator between React Native macOS and React Native Windows, which both lag behind React Native. We are optimistic that they'll catch up in future, though!
Specify the filesafe name / project root (variadic arg)
This is the name used for files and folders. By default, it is MyApp, and gets used for paths such as MyApp-macOS/MyApp.entitlements. We restrict it to alphanumerics.
Pass it as follows:
npx expo-desktop@latest create-app MyAppSpecify the display name (--display-name <name>)
This is the name used for user-facing purposes. By default, it is My App, and gets used for the app's filename (e.g. My App.app and My App.exe), and as the name on app stores, etc.
If an explicit window title is not specified in your app.json, this value is used as a fallback.
The display name is an unrestricted string; it accepts any characters (e.g. CJK, spaces, and more). It's unknown whether any characters are problematic, so make sure to test.
Pass it as follows:
npx expo-desktop@latest create-app --display-name "My App"Specify the Reverse Domain Name Specifier (--rdns <rdns>)
This is a DNS in reverse. By default, it is com.example.my-app, and gets used for:
- the iOS and macOS bundle identifiers (transformed to
com.example.my-app). - the Android application ID and package namespace (transformed to
com.example.my_app). - the Windows namespaces for WinRT (transformed to
com.example.myapp) and C++ (transformed tocom::example::myapp).
You can use alphanumerics, periods (.), and hyphens or underscores (- or _). It will be transformed for use as described above.
Pass it as follows:
npx expo-desktop@latest create-app --rdns com.example.my-app-123Use the default options (--yes)
To skip prompts and just take the default options, pass this argument.
Skip generating agents files (--no-agents-md)
Skip generating the Expo AGENTS.md, CLAUDE.md, and .claude/settings.json. These files are Expo-specific and are not customised in any way for Expo Desktop.
Pass it as follows:
npx expo-desktop@latest create-app --no-agents-mdSkip installation (--no-install)
Skip installing npm packages and CocoaPods.
Pass it as follows:
npx expo-desktop@latest create-app --no-installSpecify SDK version (--version)
If this arg is omitted, you will be presented with a list of supported expo-desktop-template-blank-typescript versions, for example:
- Expo SDK 55, React Native 0.83 (template v55.83.9)
- Expo SDK 54, React Native 0.81 (template v54.81.5)
By passing it, you can select the blank-typescript template up-front by SDK version.
# Select expo-desktop-template-blank-typescript@54.31.5
npx expo-desktop@latest create-app --version 54See also the more flexible --template option.