{"_id":"@drakkar.software/expo-conductor","_rev":"5-4475d8b3a39b435f080a6b56f8cf4210","name":"@drakkar.software/expo-conductor","dist-tags":{"latest":"0.4.1"},"versions":{"0.1.0":{"name":"@drakkar.software/expo-conductor","version":"0.1.0","keywords":["expo","react-native","expo-modules","task","scheduler","background-task","notifications","fcm","alarm","cron","recurrence"],"license":"MIT","_id":"@drakkar.software/expo-conductor@0.1.0","maintainers":[{"name":"drakkarsoftware","email":"drakkar.software@protonmail.com"}],"homepage":"https://github.com/herklos/expo-conductor","bugs":{"url":"https://github.com/herklos/expo-conductor/issues"},"dist":{"shasum":"8c51ad433eab6c7a04cd33aa5554230f73ad7d3f","tarball":"https://registry.npmjs.org/@drakkar.software/expo-conductor/-/expo-conductor-0.1.0.tgz","fileCount":111,"integrity":"sha512-H7/8R/Y0UgQuVyvoZsNpaqaaKUFo2m7Jg3aZxOZ9MnYZFFOPZbjnZXiIwmSGj7UjlMpoVoA6zg2VId+xE/9g3w==","signatures":[{"sig":"MEQCICisGAk6ez3YrMmGv3tKk9YRaGDdh5hsbQOZqutfhEjFAiAtNOO8Dxn8NfZYD1gN9Mqvq+Hew0kdzk2//e3Fh/oOTQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":248878},"main":"build/index.js","_from":"file:drakkar.software-expo-conductor-0.1.0.tgz","types":"build/index.d.ts","exports":{".":{"types":"./build/index.d.ts","default":"./build/index.js"},"./package.json":"./package.json","./task-manager":{"types":"./build/integrations/expoBackgroundTask.d.ts","default":"./build/integrations/expoBackgroundTask.js"},"./app.plugin.js":"./app.plugin.js","./notifications":{"types":"./build/integrations/expoNotifications.d.ts","default":"./build/integrations/expoNotifications.js"}},"scripts":{"test":"jest","build":"tsc -p tsconfig.json && tsc -p plugin/tsconfig.json","clean":"rm -rf build plugin/build","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p plugin/tsconfig.json --noEmit","build:plugin":"tsc -p plugin/tsconfig.json","publish:public":"pnpm publish --access public"},"_npmUser":{"name":"drakkarsoftware","email":"drakkar.software@protonmail.com"},"_resolved":"/private/var/folders/p3/00tjd9p12zvdhhq9w1ph2l6h0000gn/T/ba44aa5920dada0951f86e80a0a69c9c/drakkar.software-expo-conductor-0.1.0.tgz","_integrity":"sha512-H7/8R/Y0UgQuVyvoZsNpaqaaKUFo2m7Jg3aZxOZ9MnYZFFOPZbjnZXiIwmSGj7UjlMpoVoA6zg2VId+xE/9g3w==","repository":{"url":"git+https://github.com/herklos/expo-conductor.git","type":"git"},"_npmVersion":"11.6.4","description":"Define tasks in an Expo app with rich execution policies (time, notifications, FCM/push, alarms, background) — priority, resource weight, recurrence and constraints. Native-first engine on Android (Kotlin) and iOS (Swift) with a Web implementation.","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.2.5","typescript":"~5.8.3","@types/jest":"^29.5.12","@types/react":"~19.2.0","expo-modules-core":"*","expo-task-manager":"*","expo-notifications":"*","expo-background-task":"*"},"peerDependencies":{"expo":"*","react":"*","react-native":"*","expo-task-manager":"*","expo-notifications":"*","expo-background-task":"*"},"peerDependenciesMeta":{"expo-task-manager":{"optional":true},"expo-notifications":{"optional":true},"expo-background-task":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-conductor_0.1.0_1780864413387_0.3775199056452232","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@drakkar.software/expo-conductor","version":"0.2.0","keywords":["expo","react-native","expo-modules","task","scheduler","background-task","notifications","fcm","alarm","cron","recurrence"],"license":"MIT","_id":"@drakkar.software/expo-conductor@0.2.0","maintainers":[{"name":"drakkarsoftware","email":"drakkar.software@protonmail.com"}],"homepage":"https://github.com/herklos/expo-conductor","bugs":{"url":"https://github.com/herklos/expo-conductor/issues"},"dist":{"shasum":"3f03f6ab0fd197f889d68d538bc379c465f45972","tarball":"https://registry.npmjs.org/@drakkar.software/expo-conductor/-/expo-conductor-0.2.0.tgz","fileCount":112,"integrity":"sha512-N6YDP2CEDeiC44Ara0JHn7lTb36o2pyFcVnnvxD8ht5tDpsvaeCsk4iJ2nt2BT+0o7eRE0fvO7LZJFPRS2SG4w==","signatures":[{"sig":"MEQCIFNoXwhDvgSsbpUCn+1Rh7Oc7pHXzXmg/CTSHwCkbFQ/AiBNsWjP435aOHllu5eSHGCxMy0wlLMWflxWYpXkABOy+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":292523},"main":"build/index.js","_from":"file:drakkar.software-expo-conductor-0.2.0.tgz","types":"build/index.d.ts","exports":{".":{"types":"./build/index.d.ts","default":"./build/index.js"},"./package.json":"./package.json","./task-manager":{"types":"./build/integrations/expoBackgroundTask.d.ts","default":"./build/integrations/expoBackgroundTask.js"},"./app.plugin.js":"./app.plugin.js","./notifications":{"types":"./build/integrations/expoNotifications.d.ts","default":"./build/integrations/expoNotifications.js"}},"scripts":{"test":"jest","build":"tsc -p tsconfig.json && tsc -p plugin/tsconfig.json","clean":"rm -rf build plugin/build","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p plugin/tsconfig.json --noEmit","build:plugin":"tsc -p plugin/tsconfig.json","publish:public":"pnpm publish --access public"},"_npmUser":{"name":"drakkarsoftware","email":"drakkar.software@protonmail.com"},"_resolved":"/private/var/folders/fh/gdlxlc450tv5gmfshth92tn00000gn/T/6c9e11dac125af3fd352e449896ebbaa/drakkar.software-expo-conductor-0.2.0.tgz","_integrity":"sha512-N6YDP2CEDeiC44Ara0JHn7lTb36o2pyFcVnnvxD8ht5tDpsvaeCsk4iJ2nt2BT+0o7eRE0fvO7LZJFPRS2SG4w==","repository":{"url":"git+https://github.com/herklos/expo-conductor.git","type":"git"},"_npmVersion":"11.8.0","description":"Define tasks in an Expo app with rich execution policies (time, notifications, FCM/push, alarms, background) — priority, resource weight, recurrence and constraints. Native-first engine on Android (Kotlin) and iOS (Swift) with a Web implementation.","directories":{},"_nodeVersion":"24.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.2.5","typescript":"~5.8.3","@types/jest":"^29.5.12","@types/react":"~19.2.0","expo-modules-core":"*","expo-task-manager":"*","expo-notifications":"*","expo-background-task":"*"},"peerDependencies":{"expo":"*","react":"*","react-native":"*","expo-task-manager":"*","expo-notifications":"*","expo-background-task":"*"},"peerDependenciesMeta":{"expo-task-manager":{"optional":true},"expo-notifications":{"optional":true},"expo-background-task":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-conductor_0.2.0_1780910025491_0.2724743851587772","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@drakkar.software/expo-conductor","version":"0.2.1","keywords":["expo","react-native","expo-modules","task","scheduler","background-task","notifications","fcm","alarm","cron","recurrence"],"license":"MIT","_id":"@drakkar.software/expo-conductor@0.2.1","maintainers":[{"name":"drakkarsoftware","email":"drakkar.software@protonmail.com"}],"homepage":"https://github.com/herklos/expo-conductor","bugs":{"url":"https://github.com/herklos/expo-conductor/issues"},"dist":{"shasum":"ec8e71e01670606cd8c4c7c8b541efd988eca9ff","tarball":"https://registry.npmjs.org/@drakkar.software/expo-conductor/-/expo-conductor-0.2.1.tgz","fileCount":113,"integrity":"sha512-GQY7NQjwtqjSvT6KO1gaE5nxcyXFJXTh6SkXngPVE0QduuAe3RX/5KfCahn31wac3fWXtoOTFn0Ff1yaspapgw==","signatures":[{"sig":"MEQCIGXQEH/rTdvYtMwTd68zkddblgylazbgH76ZvT8zJYdLAiAf8qqUnYF4glxjNHQPN3bBOuNfcR4mG0Iv+P4sMhy/sg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":297403},"main":"build/index.js","_from":"file:drakkar.software-expo-conductor-0.2.1.tgz","types":"build/index.d.ts","exports":{".":{"types":"./build/index.d.ts","default":"./build/index.js"},"./package.json":"./package.json","./task-manager":{"types":"./build/integrations/expoBackgroundTask.d.ts","default":"./build/integrations/expoBackgroundTask.js"},"./app.plugin.js":"./app.plugin.js","./notifications":{"types":"./build/integrations/expoNotifications.d.ts","default":"./build/integrations/expoNotifications.js"}},"scripts":{"test":"jest","build":"tsc -p tsconfig.json && tsc -p plugin/tsconfig.json","clean":"rm -rf build plugin/build","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p plugin/tsconfig.json --noEmit","build:plugin":"tsc -p plugin/tsconfig.json","publish:public":"pnpm publish --access public"},"_npmUser":{"name":"drakkarsoftware","email":"drakkar.software@protonmail.com"},"_resolved":"/private/var/folders/fh/gdlxlc450tv5gmfshth92tn00000gn/T/e6d538577e8228a8d59ef8a57fdc0b94/drakkar.software-expo-conductor-0.2.1.tgz","_integrity":"sha512-GQY7NQjwtqjSvT6KO1gaE5nxcyXFJXTh6SkXngPVE0QduuAe3RX/5KfCahn31wac3fWXtoOTFn0Ff1yaspapgw==","repository":{"url":"git+https://github.com/herklos/expo-conductor.git","type":"git"},"_npmVersion":"11.8.0","description":"Define tasks in an Expo app with rich execution policies (time, notifications, FCM/push, alarms, background) — priority, resource weight, recurrence and constraints. Native-first engine on Android (Kotlin) and iOS (Swift) with a Web implementation.","directories":{},"_nodeVersion":"24.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.2.5","typescript":"~5.8.3","@types/jest":"^29.5.12","@types/react":"~19.2.0","expo-modules-core":"*","expo-task-manager":"*","expo-notifications":"*","expo-background-task":"*"},"peerDependencies":{"expo":"*","react":"*","react-native":"*","expo-task-manager":"*","expo-notifications":"*","expo-background-task":"*"},"peerDependenciesMeta":{"expo-task-manager":{"optional":true},"expo-notifications":{"optional":true},"expo-background-task":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-conductor_0.2.1_1780994681667_0.4319948943431211","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@drakkar.software/expo-conductor","version":"0.2.2","keywords":["expo","react-native","expo-modules","task","scheduler","background-task","notifications","fcm","alarm","cron","recurrence"],"license":"MIT","_id":"@drakkar.software/expo-conductor@0.2.2","maintainers":[{"name":"drakkarsoftware","email":"drakkar.software@protonmail.com"}],"homepage":"https://github.com/herklos/expo-conductor","bugs":{"url":"https://github.com/herklos/expo-conductor/issues"},"dist":{"shasum":"8aca2d351e625a41b6797b0bd1f1d2c1d778a566","tarball":"https://registry.npmjs.org/@drakkar.software/expo-conductor/-/expo-conductor-0.2.2.tgz","fileCount":113,"integrity":"sha512-GU53C1YzgeLE6UQjAphhtCOx2q/36RfT4Oak8oWBxXbhLFZcoVo51iMHv360HeAD1d+qojojVzOZbBqfT8deUw==","signatures":[{"sig":"MEYCIQDYMmSlQwB+bBPIOnqmrZ7iS8bwVkzlRXCAWxd0LvqIxgIhAIVRyRvtcWh9iVgUGRoDfjXycgV+JhjLLkSQxftZnUYW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":298957},"main":"build/index.js","_from":"file:drakkar.software-expo-conductor-0.2.2.tgz","types":"build/index.d.ts","exports":{".":{"types":"./build/index.d.ts","default":"./build/index.js"},"./package.json":"./package.json","./task-manager":{"types":"./build/integrations/expoBackgroundTask.d.ts","default":"./build/integrations/expoBackgroundTask.js"},"./app.plugin.js":"./app.plugin.js","./notifications":{"types":"./build/integrations/expoNotifications.d.ts","default":"./build/integrations/expoNotifications.js"}},"scripts":{"test":"jest","build":"tsc -p tsconfig.json && tsc -p plugin/tsconfig.json","clean":"rm -rf build plugin/build","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p plugin/tsconfig.json --noEmit","build:plugin":"tsc -p plugin/tsconfig.json","publish:public":"pnpm publish --access public"},"_npmUser":{"name":"drakkarsoftware","email":"drakkar.software@protonmail.com"},"_resolved":"/private/var/folders/fh/gdlxlc450tv5gmfshth92tn00000gn/T/64939007880a75ed8d29a7c8bef5c9fd/drakkar.software-expo-conductor-0.2.2.tgz","_integrity":"sha512-GU53C1YzgeLE6UQjAphhtCOx2q/36RfT4Oak8oWBxXbhLFZcoVo51iMHv360HeAD1d+qojojVzOZbBqfT8deUw==","repository":{"url":"git+https://github.com/herklos/expo-conductor.git","type":"git"},"_npmVersion":"11.8.0","description":"Define tasks in an Expo app with rich execution policies (time, notifications, FCM/push, alarms, background) — priority, resource weight, recurrence and constraints. Native-first engine on Android (Kotlin) and iOS (Swift) with a Web implementation.","directories":{},"_nodeVersion":"24.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.2.5","typescript":"~5.8.3","@types/jest":"^29.5.12","@types/react":"~19.2.0","expo-modules-core":"*","expo-task-manager":"*","expo-notifications":"*","expo-background-task":"*"},"peerDependencies":{"expo":"*","react":"*","react-native":"*","expo-task-manager":"*","expo-notifications":"*","expo-background-task":"*"},"peerDependenciesMeta":{"expo-task-manager":{"optional":true},"expo-notifications":{"optional":true},"expo-background-task":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-conductor_0.2.2_1780995245193_0.24142608300263357","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@drakkar.software/expo-conductor","version":"0.4.1","description":"Define tasks in an Expo app with rich execution policies (time, notifications, FCM/push, alarms, background) — priority, resource weight, recurrence and constraints. Native-first engine on Android (Kotlin) and iOS (Swift) with a Web implementation.","main":"build/index.js","types":"build/index.d.ts","exports":{".":{"types":"./build/index.d.ts","default":"./build/index.js"},"./task-manager":{"types":"./build/integrations/expoBackgroundTask.d.ts","default":"./build/integrations/expoBackgroundTask.js"},"./notifications":{"types":"./build/integrations/expoNotifications.d.ts","default":"./build/integrations/expoNotifications.js"},"./app.plugin.js":"./app.plugin.js","./package.json":"./package.json"},"keywords":["expo","react-native","expo-modules","task","scheduler","background-task","notifications","fcm","alarm","cron","recurrence"],"license":"MIT","homepage":"https://github.com/herklos/expo-conductor","repository":{"type":"git","url":"git+https://github.com/herklos/expo-conductor.git"},"publishConfig":{"access":"public"},"peerDependencies":{"expo":"*","expo-background-task":"*","expo-notifications":"*","expo-task-manager":"*","react":"*","react-native":"*"},"peerDependenciesMeta":{"expo-background-task":{"optional":true},"expo-notifications":{"optional":true},"expo-task-manager":{"optional":true}},"devDependencies":{"@types/jest":"^29.5.12","@types/react":"~19.2.0","expo-background-task":"*","expo-modules-core":"*","expo-notifications":"*","expo-task-manager":"*","jest":"^29.7.0","ts-jest":"^29.2.5","typescript":"~5.8.3"},"scripts":{"build":"tsc -p tsconfig.json && tsc -p plugin/tsconfig.json","build:plugin":"tsc -p plugin/tsconfig.json","clean":"rm -rf build plugin/build","test":"jest","test:rust":"cargo test --manifest-path rust/Cargo.toml","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p plugin/tsconfig.json --noEmit","publish:public":"pnpm publish --access public"},"_id":"@drakkar.software/expo-conductor@0.4.1","bugs":{"url":"https://github.com/herklos/expo-conductor/issues"},"_integrity":"sha512-qoz61NEL26GZxB4zZ/G1KiQ+plL9ObHXMYclNeS0oj4PkTYuPwGKTdQO7XdcQtaapeYvefBQ5TDSCdt1L4EkeQ==","_resolved":"/private/var/folders/fh/gdlxlc450tv5gmfshth92tn00000gn/T/a4d55a989c62b2bb6d873951a98acabc/drakkar.software-expo-conductor-0.4.1.tgz","_from":"file:drakkar.software-expo-conductor-0.4.1.tgz","_nodeVersion":"24.12.0","_npmVersion":"11.8.0","dist":{"integrity":"sha512-qoz61NEL26GZxB4zZ/G1KiQ+plL9ObHXMYclNeS0oj4PkTYuPwGKTdQO7XdcQtaapeYvefBQ5TDSCdt1L4EkeQ==","shasum":"16ab62fe3084151e43296a119dae52f26632135e","tarball":"https://registry.npmjs.org/@drakkar.software/expo-conductor/-/expo-conductor-0.4.1.tgz","fileCount":133,"unpackedSize":404790,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHBpPUwr0VZtZK4ECtv7M6WduitWvLHg4woPDSClYS0OAiBFVtIUHHOFNKsH4W+7An0Ix/mmU99AKbdG9vY1YJFUVw=="}]},"_npmUser":{"name":"drakkarsoftware","email":"drakkar.software@protonmail.com"},"directories":{},"maintainers":[{"name":"drakkarsoftware","email":"drakkar.software@protonmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/expo-conductor_0.4.1_1781086125909_0.738368617367344"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-07T20:33:33.191Z","modified":"2026-06-10T10:08:46.166Z","0.1.0":"2026-06-07T20:33:33.542Z","0.2.0":"2026-06-08T09:13:45.636Z","0.2.1":"2026-06-09T08:44:41.804Z","0.2.2":"2026-06-09T08:54:05.364Z","0.4.1":"2026-06-10T10:08:46.052Z"},"bugs":{"url":"https://github.com/herklos/expo-conductor/issues"},"license":"MIT","homepage":"https://github.com/herklos/expo-conductor","keywords":["expo","react-native","expo-modules","task","scheduler","background-task","notifications","fcm","alarm","cron","recurrence"],"repository":{"type":"git","url":"git+https://github.com/herklos/expo-conductor.git"},"description":"Define tasks in an Expo app with rich execution policies (time, notifications, FCM/push, alarms, background) — priority, resource weight, recurrence and constraints. Native-first engine on Android (Kotlin) and iOS (Swift) with a Web implementation.","maintainers":[{"name":"drakkarsoftware","email":"drakkar.software@protonmail.com"}],"readme":"# expo-conductor\n\nDefine tasks in an Expo app with rich execution policies and many triggers — priority,\nresource weight, recurrence and constraints — backed by a native-first engine on Android\n(Kotlin) and iOS (Swift), with a Web implementation.\n\nSee the [full documentation and architecture overview](../../README.md) at the repo root,\nand the [shared behavior contract](../../fixtures/README.md).\n\n## Quick start\n\n```ts\nimport Conductor, { Priority, TaskResult } from '@drakkar.software/expo-conductor';\n\n// Register JS handlers at MODULE scope (not inside a component) so they survive a headless\n// relaunch — same rule as expo-task-manager's defineTask.\nConductor.defineTask('refresh', async () => TaskResult.NEW_DATA);\n\nawait Conductor.schedule({\n  id: 'refresh',\n  priority: Priority.HIGH,\n  weight: 'moderate',\n  triggers: [{ type: 'recurrence', recurrence: { kind: 'interval', everyMs: 900000 } }],\n  policy: { constraints: { network: 'any' }, retry: { maxAttempts: 3, backoffMs: 30000 } },\n});\n```\n\n## Handlers, headless execution & push\n\n- **JS handler:** runs while the app is alive (foreground/background). Register it at module\n  scope. It does **not** run after the app is terminated.\n- **Native handler** (`handler.type: 'native'`, registered via\n  `ExpoConductorModule.registerHandler`): runs headless, including after termination.\n- **Rust handler** (`handler.type: 'rust'`): dispatched over C ABI FFI to a Rust function\n  registered via `conductor_register(name, handler)` in a `conductor_app_init()` call.\n  Runs wherever the native layer runs (headless included). Enable with\n  `{ \"enableRust\": true }` in the config plugin options; see [Rust handlers](#rust-handlers).\n- **Push trigger:** send a **raw FCM v1 data-only** message (Android) or a **silent APNs**\n  push with `conductorTask` as a top-level peer of `aps` (iOS) — see the\n  [push message format](../../README.md#push-message-format). Use a native handler for push\n  tasks that must run while terminated. Treat push `data` as untrusted.\n- **Notifications:** the `notification` trigger shows a notification on iOS and Android\n  (Android channel auto-created). Call `Conductor.requestPermissions()` first.\n\n## Rust handlers\n\n```toml\n# Cargo.toml — your app's crate (depends on the lib's rlib, not cdylib/staticlib)\n[package]\nname = \"my_app_rust\"              # unique package name — no naming conflict with the dep\n[lib]\nname = \"my_app_rust\"              # artifact name: set rustLibName to this value in app.json\ncrate-type = [\"rlib\", \"cdylib\", \"staticlib\"]\n\n[dependencies]\n# default-features = false disables the no-op conductor_app_init symbol so your own\n# conductor_app_init (below) is the only one compiled into the final .so.\nconductor_ffi = { path = \"path/to/packages/expo-conductor/rust\", default-features = false }\n```\n\n```rust\n// src/lib.rs\nuse conductor_ffi::{conductor_register, Handler};\nuse std::sync::Arc;\n\n#[no_mangle]\npub extern \"C\" fn conductor_app_init() {\n    conductor_register(\"my-task\", Arc::new(|_task_id, _data| \"success\"));\n}\n```\n\nOn Android the lib calls `conductor_app_init()` automatically when the `.so` is loaded\n(`RustTaskBridge.init`). On iOS call `ConductorRustBridge.appInit()` from your\nAppDelegate (or from a helper class registered via a config plugin). The demo shows a\ncomplete example in `apps/demo/rust/` and `apps/demo/native-src/DemoHandlers.swift`.\n\nEnable in `app.json` with the matching `rustLibName` (must match your crate's `[lib] name`):\n\n```json\n[\"@drakkar.software/expo-conductor\", {\n  \"enableRust\": true,\n  \"rustLibName\": \"my_app_rust\"\n}]\n```\n\n**Build steps:**\n\n```sh\n# Android (requires cargo-ndk + Android NDK):\ncargo ndk -t arm64-v8a -t x86_64 -o android/app/src/main/jniLibs \\\n  --manifest-path path/to/your/rust/Cargo.toml build --release\n\n# iOS (requires the ios targets + Xcode):\ncargo build --manifest-path path/to/your/rust/Cargo.toml \\\n  --target aarch64-apple-ios --release\ncargo build --manifest-path path/to/your/rust/Cargo.toml \\\n  --target aarch64-apple-ios-sim --release\n```\n\n## Execution history, `firedBy` & reconciliation\n\n```ts\nimport Conductor from '@drakkar.software/expo-conductor';\nimport { foldHistory, reconcile } from '@drakkar.software/expo-conductor';\n\n// Raw lifecycle events persisted by the native layer (survives headless runs).\nconst events = await Conductor.getHistory();\n\n// Fold events into paired records: { taskId, firedAt, firedBy, result, durationMs, ... }\n// `firedBy` is 'manual' for explicit runNow() calls, or a TriggerType string when\n// the scheduler fired it (e.g. 'alarm', 'recurrence', 'push').\nconst records = foldHistory(events);\n\n// Compare expected occurrences against actual records.\nconst tasks = await Conductor.getTasks();\nconst { matched, missed, unexpected, aborted } = reconcile(tasks, records, {\n  now: Date.now(),\n  windowMs: 24 * 60 * 60_000,\n});\n```\n\n`missed` = expected occurrences with no matching record (task never ran or ran outside\ntolerance). `aborted` = matched records whose `result` is `'failed'` or `'error'`.\n`unexpected` = records with no expected occurrence (e.g. a manually triggered one-shot).\n\nReconciliation is exact for `time`, `recurrence`, and `alarm` triggers. For `background`,\n`push`, and `appState` triggers it is **advisory** — the OS decides timing, not the scheduler.\n\n## v0.4.0 additions\n\n- **`firedBy`** on `onTaskExecute`, `onTaskComplete`, `onTaskError` event payloads and on `TaskExecutionRecord` — reports which trigger source caused the run (`'manual'` for `runNow()`, or a `TriggerType` string).\n- **`NotificationTrigger.recurring`** — re-arms the notification `inSeconds` after each delivery; clock drift doesn't accumulate.\n- **`AlarmTrigger.windowMs`** (Android only) — use `AlarmManager.setWindow` for battery-efficient batching instead of `setExact`.\n- **`ContinuedProcessingTrigger`** (`type: 'userInitiatedBackground'`, iOS 26+ only) — `BGContinuedProcessingTask`; must originate from a direct user interaction.\n- **Silent APNs → BGProcessingTask chain** (iOS) — a silent push matching a `push` trigger with `bgProcessing:true` on a companion `background` trigger submits a full BGProcessingTask slot.\n- **FCM Doze-bypass foreground service** (Android) — `policy.foreground: true` + FCM push starts a foreground service instead of a WorkManager job. Requires `enableForegroundService: true` in the config plugin.\n\nSee the [full documentation](../../README.md) for triggers, policy/weight/priority, the\nconfig plugin options (`enableFcm`, `enablePush`, `enableExactAlarms`, `useExactAlarmClock`,\n`backgroundTaskIdentifiers`, `enableRust`, `rustLibName`, `enableForegroundService`), platform support matrix, and the device test guide.\n\n## Scripts\n\n- `pnpm --filter expo-conductor test` — Jest (engine + orchestration + API)\n- `pnpm --filter expo-conductor typecheck`\n- `pnpm --filter expo-conductor build`\n- `pnpm test:kotlin` / `pnpm test:swift` — native engine tests against the shared fixtures\n- `pnpm test:rust` — Rust glue crate unit tests (host, no NDK needed)\n- `pnpm test:rust:demo` — demo Rust crate (5 archetype handlers)\n","readmeFilename":"README.md"}