diff --git a/packages/create-react-native-library/src/index.ts b/packages/create-react-native-library/src/index.ts
index 322d910a..cbe91209 100644
--- a/packages/create-react-native-library/src/index.ts
+++ b/packages/create-react-native-library/src/index.ts
@@ -20,7 +20,7 @@ import { createInitialGitCommit } from './utils/initialCommit';
 import { prompt } from './utils/prompt';
 import { resolveNpmPackageVersion } from './utils/resolveNpmPackageVersion';
 
-const FALLBACK_BOB_VERSION = '0.40.4';
+const FALLBACK_BOB_VERSION = '0.40.5';
 const FALLBACK_NITRO_MODULES_VERSION = '0.22.1';
 const SUPPORTED_REACT_NATIVE_VERSION = '0.78.2';
 
diff --git a/packages/react-native-builder-bob/src/targets/codegen/index.ts b/packages/react-native-builder-bob/src/targets/codegen/index.ts
index 31542473..88dd2f6d 100644
--- a/packages/react-native-builder-bob/src/targets/codegen/index.ts
+++ b/packages/react-native-builder-bob/src/targets/codegen/index.ts
@@ -4,7 +4,10 @@ import { patchCodegenAndroidPackage } from './patches/patchCodegenAndroidPackage
 import fs from 'fs-extra';
 import path from 'path';
 import del from 'del';
-import { removeCodegenAppLevelCode } from './patches/removeCodegenAppLevelCode';
+import {
+  getCodegenCLISourceSupport,
+  removeCodegenAppLevelCode,
+} from './patches/removeCodegenAppLevelCode';
 import { spawn } from '../../utils/spawn';
 
 type Options = Omit<Input, 'output'>;
@@ -42,12 +45,21 @@ export default async function build({ root, report }: Options) {
   }
 
   try {
-    await spawn('npx', ['@react-native-community/cli', 'codegen']);
+    const codegenCLISupportsSource = await getCodegenCLISourceSupport();
+
+    await spawn('npx', [
+      '@react-native-community/cli',
+      'codegen',
+      ...(codegenCLISupportsSource ? ['--source', 'library'] : []),
+    ]);
 
     if (codegenType === 'modules' || codegenType === 'all') {
       await patchCodegenAndroidPackage(root, packageJson, report);
     }
-    await removeCodegenAppLevelCode(root, packageJson);
+
+    if (!codegenCLISupportsSource) {
+      await removeCodegenAppLevelCode(root, packageJson);
+    }
 
     report.success('Generated native code with codegen');
   } catch (e: unknown) {
diff --git a/packages/react-native-builder-bob/src/targets/codegen/patches/removeCodegenAppLevelCode.ts b/packages/react-native-builder-bob/src/targets/codegen/patches/removeCodegenAppLevelCode.ts
index cf2f1594..1154496a 100644
--- a/packages/react-native-builder-bob/src/targets/codegen/patches/removeCodegenAppLevelCode.ts
+++ b/packages/react-native-builder-bob/src/targets/codegen/patches/removeCodegenAppLevelCode.ts
@@ -1,6 +1,7 @@
 import fs from 'fs-extra';
 import path from 'path';
 import { CODEGEN_DOCS } from './patchCodegenAndroidPackage';
+import { spawn } from '../../../utils/spawn';
 
 const FILES_TO_REMOVE = [
   'RCTAppDependencyProvider.h',
@@ -68,3 +69,18 @@ export async function removeCodegenAppLevelCode(
 
   await Promise.allSettled([...androidPromises, ...iosPromises]);
 }
+
+/**
+ * Codegen generates a different set of files if the target is an app instead.
+ * The following commit adds support for a --source argument to support calling codegen as a library:
+ * https://github.com/facebook/react-native/commit/98b8f178110472e5fed97de80766c03b0b5e988c
+ * Here we just check if the --source argument is supported.
+ */
+export async function getCodegenCLISourceSupport(): Promise<boolean> {
+  const codegenCLIHelpOutput = await spawn('npx', [
+    '@react-native-community/cli',
+    'codegen',
+    '--help',
+  ]);
+  return codegenCLIHelpOutput.includes('--source');
+}