Side by side:
| Turbo Native Module | Expo Module | |
|---|---|---|
| Contract | TypeScript spec, Codegen | Kotlin/Swift DSL, TS declaration by hand |
| Files for one Android module | Spec, module, package, MainApplication edit | Module class, config JSON |
| Registration | Manual, or a library's autolinking | Autolinked from modules/ or node_modules |
| Survives expo prebuild | Only with a config plugin (Config Plugins) | Yes |
| C++ cross-platform modules | Yes (C++ Turbo Modules) | No |
Choose an Expo Module for app-specific native code in an Expo project: less boilerplate, one DSL for Kotlin and Swift, nothing to redo after prebuild. Choose a Turbo Native Module when you publish a library for projects that do not use Expo, when you want Codegen's compile-time checking of the JavaScript contract, or when the logic should be written once in C++ and shared by both platforms. Both call through JSI, so performance does not decide it.