{"record":{"id":"c0d1696e6a3382da","repo":"tauri-apps/tauri","slug":"you-must-change-the-bundle-identifier-in-bundle","errorCode":null,"errorMessage":"You must change the bundle identifier in `{bundle_identifier_source} identifier`. The default value `com.tauri.dev` is not allowed as it must be unique across applications.","messagePattern":"You must change the bundle identifier in `(.+?) identifier`\\. The default value `com\\.tauri\\.dev` is not allowed as it must be unique across applications\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tauri-cli/src/build.rs","lineNumber":173,"sourceCode":"  // TODO: Maybe optimize this to run in parallel in the future\n  // see https://github.com/tauri-apps/tauri/pull/13993#discussion_r2280697117\n  log::info!(\"Looking up installed tauri packages to check mismatched versions...\");\n  if let Err(error) = check_mismatched_packages(dirs.frontend, dirs.tauri) {\n    if options.ignore_version_mismatches {\n      log::error!(\"{error}\");\n    } else {\n      return Err(error);\n    }\n  }\n\n  set_current_dir(dirs.tauri).context(\"failed to set current directory\")?;\n\n  let bundle_identifier_source = config\n    .find_bundle_identifier_overwriter()\n    .unwrap_or_else(|| \"tauri.conf.json\".into());\n\n  if config.identifier == \"com.tauri.dev\" {\n    crate::error::bail!(\n      \"You must change the bundle identifier in `{bundle_identifier_source} identifier`. The default value `com.tauri.dev` is not allowed as it must be unique across applications.\",\n    );\n  }\n\n  if config\n    .identifier\n    .chars()\n    .any(|ch| !(ch.is_alphanumeric() || ch == '-' || ch == '.'))\n  {\n    crate::error::bail!(\n      \"The bundle identifier \\\"{}\\\" set in `{bundle_identifier_source:?} identifier`. The bundle identifier string must contain only alphanumeric characters (A-Z, a-z, and 0-9), hyphens (-), and periods (.).\",\n      config.identifier,\n    );\n  }\n\n  if config.identifier.ends_with(\".app\") {\n    log::warn!(\n      \"The bundle identifier \\\"{}\\\" set in `{bundle_identifier_source:?} identifier` ends with `.app`. This is not recommended because it conflicts with the application bundle extension on macOS.\",","sourceCodeStart":155,"sourceCodeEnd":191,"githubUrl":"https://github.com/tauri-apps/tauri/blob/52e4b6e71d8632a7e648f866c442e287ecddee34/crates/tauri-cli/src/build.rs#L155-L191","documentation":"Before building or devving, the CLI validates `config.identifier` and rejects the scaffold default `com.tauri.dev`, because bundle identifiers must be unique across applications (it is used for app IDs, macOS bundle IDs, and Android application IDs). The message names the config file that actually supplies the identifier (`find_bundle_identifier_overwriter`, e.g. a platform-specific `tauri.conf.json` override).","triggerScenarios":"Running `tauri build`/`tauri dev` on a freshly scaffolded project (or one copied from a template) whose `identifier` was never changed from `com.tauri.dev`.","commonSituations":"First build after `tauri init`; duplicating a template project and forgetting the identifier; the identifier being set only in a platform override file such as `tauri.macos.conf.json` while the base config still carries the default.","solutions":["Edit the file named in the error and set a unique reverse-DNS identifier, e.g. `\"identifier\": \"com.mycompany.myapp\"`","If a platform-specific config (e.g. `tauri.windows.conf.json`) overwrites `identifier`, change it there — that is the file the error points to","Use your domain reversed plus the app name; any alphanumeric/hyphen/period string that is not `com.tauri.dev` passes this check"],"exampleFix":"// before (tauri.conf.json)\n{ \"identifier\": \"com.tauri.dev\" }\n\n// after\n{ \"identifier\": \"com.mycompany.myapp\" }","handlingStrategy":"validation","validationCode":"#!/usr/bin/env bash\n# fail fast on the scaffold default before building\nid=$(jq -r '.identifier' src-tauri/tauri.conf.json)\n[ \"$id\" = \"com.tauri.dev\" ] && { echo 'identifier is still com.tauri.dev' >&2; exit 1; }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Change the identifier immediately after scaffolding, before the first build","Add a lint step (jq/yq check) in CI that rejects `com.tauri.dev`","Remember platform-specific config files can override the identifier — set it in the file the build actually reads"],"tags":["tauri-cli","config","bundle-identifier","validation","packaging"],"backgroundTag":"invalid-bundle-identifier","analyzedSha":"52e4b6e71d8632a7e648f866c442e287ecddee34","analyzedAt":"2026-08-20T13:59:20.734Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}