App variants in Expo let you install development, preview, and production builds side by side on one device by giving each build its own bundle identifier and package name. The setup involves switching from a static app.json to a dynamic app.config.ts that reads an APP_VARIANT environment variable to set per-variant identifiers, names, and icons. EAS Build profiles pass the variable at build time, while EAS environment variables let you sync the same values locally via eas env:pull. Additional steps cover fixing QR code routing so only the dev build answers the generated scheme, keeping EAS Update channels aligned with environments, and registering each variant separately with third-party services like Firebase to avoid polluting production data.