{"_id":"@asleep-ai/react-native-alarm","_rev":"19-48710e39c435b0fb0d82948480c5982f","name":"@asleep-ai/react-native-alarm","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@asleep-ai/react-native-alarm","version":"0.1.0","author":{"url":"https://github.com/Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.0","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"ff3a27c8b999c7bbbca6afd3e8c1d4499b54b1fb","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.0.tgz","fileCount":311,"integrity":"sha512-sN3NhJOUVOQH+5r0crfA91oOTZDhPw6JRnhwpHUCUhNlwyprrryTHlZAqHrKdOXUjsl8yK6uJT9ZyVe5rnXKGw==","signatures":[{"sig":"MEUCIQCTGPXLOfoHE6vtzy3gX4eZjv8NBJclSEbeExfMv3z1KAIgOHuFSqXycZ4p3+9nfu3wZAO4a44UnCRCzcg/ylAk6AU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2807688},"main":"build/index.js","types":"build/index.d.ts","source":"src/index.ts","gitHead":"8c042605e4f338efae1251417a2520ef162e3a68","scripts":{"build":"tsc -p tsconfig.json","clean":"rimraf build","prepare":"npm run build","typecheck":"tsc --noEmit","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.9.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"22.15.0","dependencies":{"expo-modules-core":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","typescript":"^5.6.3","@types/react-native":"^0.73.0"},"peerDependencies":{"expo":">=51","react":">=18","react-native":">=0.74"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.0_1763947941418_0.47364198298636473","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@asleep-ai/react-native-alarm","version":"0.1.2","author":{"url":"https://github.com/Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.2","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"7aaf3e71129bd19a1d9ce2d3c9e7a9d1d0e97962","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.2.tgz","fileCount":27,"integrity":"sha512-Ii27FYHqwNXg6x2e+3FUSaDWErwBcMPW5WW62RGZKCs1+DWNEnN2ajIZbQUmkYQge43qv4JvjlfuGAje8kZNdw==","signatures":[{"sig":"MEYCIQDOEZe0PkZ2lbdqEyA1mjlnhnvxP7atOoUkfCnvZtH8oAIhAN1gxQ5px2Jo3XoMjeXTwv3Vwpa5VRKEw/67ByV31EH7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103978},"main":"build/index.js","types":"build/index.d.ts","source":"src/index.ts","gitHead":"6406d2e092abfc58d48090a9af79d3f58b6eac48","scripts":{"build":"tsc -p tsconfig.json","clean":"rimraf build","prepare":"npm run build","typecheck":"tsc --noEmit","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.8.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"expo-modules-core":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","typescript":"^5.6.3","@types/react-native":"^0.73.0"},"peerDependencies":{"expo":">=51","react":">=18","react-native":">=0.74"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.2_1763948464604_0.5622613037821154","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@asleep-ai/react-native-alarm","version":"0.1.3","author":{"url":"https://github.com/Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.3","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"e194b928993be5be304bb7a0db31a46b79f2a2c9","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.3.tgz","fileCount":27,"integrity":"sha512-UEYsZUv4zJxlaWYal8Ki7NvUxTPYqgShgdkMLngl+i/v4QBAnbHJUYA6nUpSNiXd04e7o5EdcnSMGMjzsU9Kdw==","signatures":[{"sig":"MEYCIQCs1v5Z5aTmMaIn6FrR+XKEBf7LKwImhsbb9mxQjHBN2wIhAIyXm9rZf50OfmmzrpFJuZHeoe4fGGN6bl+yAkGCkU8a","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119361},"main":"build/index.js","types":"build/index.d.ts","source":"src/index.ts","gitHead":"c0f3e4a6f128f2f5cf81013264b479440e511c18","scripts":{"build":"tsc -p tsconfig.json","clean":"rimraf build","prepare":"npm run build","typecheck":"tsc --noEmit","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.8.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"expo-modules-core":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","typescript":"^5.6.3","@types/react-native":"^0.73.0"},"peerDependencies":{"expo":">=51","react":">=18","react-native":">=0.74"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.3_1763951116930_0.9360006525497009","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@asleep-ai/react-native-alarm","version":"0.1.4","author":{"url":"https://github.com/Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.4","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"0899fa63e65b6f4354ea6b998479839b4ad1c47c","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.4.tgz","fileCount":27,"integrity":"sha512-UpG7qOCS6l889fB6eRkCgUFiubPuJ43XK7ocPBw3O3I2hRZEOFVstkF3IQg/GkW2RGTM+X8PL6h0FfRA96uYCA==","signatures":[{"sig":"MEUCIQCRKcrkAAbp0jX6gcbFjrgyrCn2fINigl8tEDwOUKztIAIgSMdCBj8KvQj9joBsUAb0Om4ZfN+l9xYWxlOQEOP0Wgw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120176},"main":"build/index.js","types":"build/index.d.ts","source":"src/index.ts","gitHead":"839c7ccad0d1fc931d2cbef44ce5ee50cb3d08f6","scripts":{"build":"tsc -p tsconfig.json","clean":"rimraf build","prepare":"npm run build","typecheck":"tsc --noEmit","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.8.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"expo-modules-core":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","typescript":"^5.6.3","@types/react-native":"^0.73.0"},"peerDependencies":{"expo":">=51","react":">=18","react-native":">=0.74"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.4_1763954952576_0.9587659397274515","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@asleep-ai/react-native-alarm","version":"0.1.5","author":{"url":"https://github.com/Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.5","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"ecc8aa960e7e9bc3d100efe1765b9dc1da0f99af","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.5.tgz","fileCount":28,"integrity":"sha512-Bb1RMbrZT6tbqvRIVWtdS9Eicw/Gy2NNFRDit0SD7/QE7Uh1coI83dGYnp0gUiKyiZZt4e1BGta+fn/M730O9Q==","signatures":[{"sig":"MEUCIA9fmtkMrr35vSvYuF4ZPbFz5fr/wiua7mt2ffHDXVJ6AiEApI0QbYy2oDY70gh+7baDxL7241ZvyuF625jL9x/Xgq0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121418},"main":"build/index.js","types":"build/index.d.ts","source":"src/index.ts","gitHead":"50cd3aee9e266893088e989b61aa4682d7b14faa","scripts":{"build":"tsc -p tsconfig.json","clean":"rimraf build","prepare":"npm run build","typecheck":"tsc --noEmit","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.8.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"expo-modules-core":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","typescript":"^5.6.3","@types/react-native":"^0.73.0"},"peerDependencies":{"expo":">=51","react":">=18","react-native":">=0.74"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.5_1763955150383_0.34864517137147666","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@asleep-ai/react-native-alarm","version":"0.1.6","author":{"url":"https://github.com/Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.6","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"2f7980d1f899cd54d69fac9a172617bd823258fe","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.6.tgz","fileCount":28,"integrity":"sha512-SzeANiPv2RDrbezsaF3slcS0rPvYRJ52CO3/YO+qSIaOYVxqd5/CvBcRz1mDG8q6SiBkM5v4b5YslGhcGdW2jw==","signatures":[{"sig":"MEQCIB/syeqq8oP0w7fpgxpW7S2G2QCmXoHYQOiK17u8hsQ8AiB9v5BgU7abZtBxSA4DY7D9CW61jQARn5L1sj14PDP9Qw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121902},"main":"build/index.js","types":"build/index.d.ts","source":"src/index.ts","gitHead":"77e4c4be09b1b8008fe5b4f14b1017c28d8e23b2","scripts":{"build":"tsc -p tsconfig.json","clean":"rimraf build","prepare":"npm run build","typecheck":"tsc --noEmit","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.8.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"expo-modules-core":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","typescript":"^5.6.3","@types/react-native":"^0.73.0"},"peerDependencies":{"expo":">=51","react":">=18","react-native":">=0.74"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.6_1763958441399_0.3430944025153133","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@asleep-ai/react-native-alarm","version":"0.1.7","author":{"url":"https://github.com/Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.7","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"6f0f2db8c8c5fb7a0bcbd152030d522c6e8c1262","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.7.tgz","fileCount":28,"integrity":"sha512-qxL/0Milgak0KkhzGGBa8QFOLboQlJR5qOX7ZREFp8zD21Qp3FaH/94cL3+ZiHQFohuTYtut95rRL2Y7ru6I3g==","signatures":[{"sig":"MEQCIC3+ajis2OHixrWUj6OQgc2ao1Im6Su1gJxI4hx4ck+/AiBTlzctrG27Hnn37ISPKxLhXQTcJN3YZ0GvFfxOmkPxzw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119574},"main":"build/index.js","types":"build/index.d.ts","source":"src/index.ts","gitHead":"5315fccbc0f07302a79f68df26c135699414d05e","scripts":{"build":"tsc -p tsconfig.json","clean":"rimraf build","prepare":"npm run build","typecheck":"tsc --noEmit","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.8.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"expo-modules-core":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","typescript":"^5.6.3","@types/react-native":"^0.73.0"},"peerDependencies":{"expo":">=51","react":">=18","react-native":">=0.74"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.7_1763959027393_0.7081959460780818","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@asleep-ai/react-native-alarm","version":"0.1.8","author":{"url":"https://github.com/Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.8","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"97f118cbc43b45913d0c7e7d703a1de066b63017","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.8.tgz","fileCount":27,"integrity":"sha512-EvAhHol7WDY4BVOqmjFXhJe4S3E6PkymqhyQhfjrQ7STNxmOtfo4tFsy6Jh6qe7FW8y+mx6ZfE2GqATyWj1ILg==","signatures":[{"sig":"MEUCIQDhmmEV3XM0NGQnQko0b7L4naGmoB7dZYNf+B7aCTf88wIgVDMQ51NZGhFXw0qQdNlw+NyrqqDuZoqzaNfjd0hCpGw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120273},"main":"build/index.js","types":"build/index.d.ts","source":"src/index.ts","gitHead":"56cdc4ba3b595a8309e97f1ae37080472e965daf","scripts":{"build":"tsc -p tsconfig.json","clean":"rimraf build","prepare":"npm run build","typecheck":"tsc --noEmit","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.8.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"expo-modules-core":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","typescript":"^5.6.3","@types/react-native":"^0.73.0"},"peerDependencies":{"expo":">=51","react":">=18","react-native":">=0.74"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.8_1763959564428_0.19455576579560785","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@asleep-ai/react-native-alarm","version":"0.1.9","author":{"url":"https://github.com/Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.9","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"0565ac558e85836d731893a369b8e693777895de","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.9.tgz","fileCount":28,"integrity":"sha512-V7VGqWwFipGukGPUv/4+ZVvif+1sF/rExsPG8uADUNWkXb66cd4kXh+URdkjj+OYSnyxBRc5lgTE9zfm6yayCA==","signatures":[{"sig":"MEUCIG+CdD9cAMoCZj4U2TxrmPLGJL8ZXNlQVSbQBaYnJaDSAiEAnffYdtV6/jOoQVg+5769jIUWvtV0769s5slNpz4NEas=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119735},"main":"build/index.js","types":"build/index.d.ts","source":"src/index.ts","gitHead":"33beb74a421001d14e2395d71261e7220c84a9a2","scripts":{"build":"tsc -p tsconfig.json","clean":"rimraf build","prepare":"npm run build","typecheck":"tsc --noEmit","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.8.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"expo-modules-core":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","typescript":"^5.6.3","@types/react-native":"^0.73.0"},"peerDependencies":{"expo":">=51","react":">=18","react-native":">=0.74"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.9_1763959718410_0.4925059527281339","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@asleep-ai/react-native-alarm","version":"0.1.10","author":{"url":"https://github.com/Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.10","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"ae13e5f34fb52c5d6636db3bee5d83292521e5ba","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.10.tgz","fileCount":28,"integrity":"sha512-oUrr/tieizVWvCwxs3P6YzdyFEYZmaeeHudJ9Vs4D1O9T3Ge8XTx/mj9mxm3681oZ4kQ4brH7C+rDNsDoa/Njg==","signatures":[{"sig":"MEYCIQCVmSTIrSvJAPv0kezaDvPJ6zHx+JTkbirF0TKmYdZxcwIhAK/pGNEGSboYPKZoqdP+vEbRWf8NqYNLERqBeG8LhWfm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120499},"main":"build/index.js","types":"build/index.d.ts","source":"src/index.ts","gitHead":"bf30b4c5b1edd4d9334c3a12397b446e0aee0d3d","scripts":{"build":"tsc -p tsconfig.json","clean":"rimraf build","prepare":"npm run build","typecheck":"tsc --noEmit","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.8.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"expo-modules-core":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","typescript":"^5.6.3","@types/react-native":"^0.73.0"},"peerDependencies":{"expo":">=51","react":">=18","react-native":">=0.74"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.10_1763959925747_0.6867092993118149","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@asleep-ai/react-native-alarm","version":"0.1.11","author":{"url":"https://github.com/Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.11","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"747ae1d207650ae633d3abea728975f5ee4d041d","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.11.tgz","fileCount":28,"integrity":"sha512-cwxtga7n46lDYun5GkeDfRTuOgt03yGzFt5CbXPcZWKo4b/h0YN9Oj3ES6YbPF58p1tLR08v1ieQuvRvtHdgWg==","signatures":[{"sig":"MEQCIEm6pTSWr9AVXk3f8Qr4cQunIQ59t4bHCCB3rWNYEsAeAiAmurjWgI2+7y95dgQGPxtmmhCCKyelS9EJg205+QRjfA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119756},"main":"build/index.js","types":"build/index.d.ts","source":"src/index.ts","gitHead":"421877100723440c154a0019ffe8debd477faca7","scripts":{"build":"tsc -p tsconfig.json","clean":"rimraf build","prepare":"npm run build","typecheck":"tsc --noEmit","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.8.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{"expo-modules-core":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","typescript":"^5.6.3","@types/react-native":"^0.73.0"},"peerDependencies":{"expo":">=51","react":">=18","react-native":">=0.74"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.11_1763960160647_0.029291770559349173","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"@asleep-ai/react-native-alarm","version":"0.1.12","keywords":["react-native","expo","@asleep-ai/react-native-alarm","ReactNativeAlarm"],"author":{"url":"Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.12","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"50dcee8e10e54a707cc03f9625042ed76e2a8f22","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.12.tgz","fileCount":36,"integrity":"sha512-IfkfQTL97BNPiYQhukwzg3aYYxQddH5ou6H9eoORsFhu3C3v93Emc38TK/9V0CUbJy0PF5aqx9yIfosDzup43Q==","signatures":[{"sig":"MEQCICZg7jF8JeEptqkH3GG5Rg0aKGrW0BIbJddtO1/UOAyzAiB6uCJIQMIUwIZrt1B4uNTjQMRmbstORWMGI71CJEqLcw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146517},"main":"build/index.js","types":"build/index.d.ts","gitHead":"eff0bfd3149fb973ad9ce8d7f0b120741c50cd81","scripts":{"lint":"expo-module lint","test":"expo-module test","build":"expo-module build","clean":"expo-module clean","prepare":"expo-module prepare","open:ios":"xed example/ios","typecheck":"tsc --noEmit","expo-module":"expo-module","open:android":"open -a \"Android Studio\" example/android","prepublishOnly":"expo-module prepublishOnly"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.8.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"expo":"^54.0.24","typescript":"~5.9.2","@types/react":"~19.1.0","react-native":"0.81.5","expo-module-scripts":"^5.0.7"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.12_1763965150182_0.7765252718702307","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"@asleep-ai/react-native-alarm","version":"0.1.13","keywords":["react-native","expo","@asleep-ai/react-native-alarm","ReactNativeAlarm"],"author":{"url":"Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.13","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"f29a6cdb65645a2b1996c961e41911e90d4e8a90","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.13.tgz","fileCount":36,"integrity":"sha512-9RsL4tgwV20RRISSpZq8OxG93pZTNMqmWjQvE27WCWew7J4CqArhuswWoPwZ/mx5qAwOakKmXKSkqVqeGn24DQ==","signatures":[{"sig":"MEUCIHALPTQ/kjsx6nG0EHClpCnZ5R2HQkneCtJvhi8VS8ebAiEA6Z/KP9pQOX4cJm6gls0xwtcUVz907oFvt88HAy9KGbw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":233799},"main":"build/index.js","types":"build/index.d.ts","gitHead":"930893e2ea0de23e8d0ac138e2036fdae2bdd263","scripts":{"lint":"expo-module lint","test":"expo-module test","build":"expo-module build","clean":"expo-module clean","prepare":"expo-module prepare","open:ios":"xed example/ios","typecheck":"tsc --noEmit","expo-module":"expo-module","open:android":"open -a \"Android Studio\" example/android","prepublishOnly":"expo-module prepublishOnly"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.8.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"expo":"^54.0.24","typescript":"~5.9.2","@types/react":"~19.1.0","react-native":"0.81.5","expo-module-scripts":"^5.0.7"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.13_1764135182922_0.1290994364299236","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"name":"@asleep-ai/react-native-alarm","version":"0.1.14","keywords":["react-native","expo","@asleep-ai/react-native-alarm","ReactNativeAlarm"],"author":{"url":"Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.14","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"ea0573cb279ef7ff43195817a5626462ac69e2ef","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.14.tgz","fileCount":36,"integrity":"sha512-YGKRKk1FPnde3yfr1/ImRDJcFaa7DCVI24Phr2SNT+gXwgfxhinMrMk3XdUup2CS/+wQAlxCt6TCFLWj2r6juA==","signatures":[{"sig":"MEUCIG2/aj/DjTg0JoOATBwI6i9xrWt9bLdHbN5rzImy0/ZtAiEAy22gddv4Dq9HS8ugyRfOIDOeR10Ytue/2WCp69YVVp0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":234460},"main":"build/index.js","types":"build/index.d.ts","gitHead":"a3b554a64b296d036bb6d6100a306211f1ee9f2c","scripts":{"lint":"expo-module lint","test":"expo-module test","build":"expo-module build","clean":"expo-module clean","prepare":"expo-module prepare","open:ios":"xed example/ios","typecheck":"tsc --noEmit","expo-module":"expo-module","open:android":"open -a \"Android Studio\" example/android","prepublishOnly":"expo-module prepublishOnly"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.8.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"expo":"^54.0.24","typescript":"~5.9.2","@types/react":"~19.1.0","react-native":"0.81.5","expo-module-scripts":"^5.0.7"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.14_1764214363138_0.3135044044486297","host":"s3://npm-registry-packages-npm-production"}},"0.1.15":{"name":"@asleep-ai/react-native-alarm","version":"0.1.15","keywords":["react-native","expo","@asleep-ai/react-native-alarm","ReactNativeAlarm"],"author":{"url":"Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.15","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"b2f464719e87505b5162899b24d049b7d6f23c53","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.15.tgz","fileCount":36,"integrity":"sha512-UTHEduJ7CdCeog0kyLirtLSv74eIksq0g+7ui6Yq3gRLj4qam6lCYgxGSwW0++4o+Ga2VlOtQRZncJmiAsPh1A==","signatures":[{"sig":"MEYCIQChxpsi9dXZBq2sqprVR3EkFuQkxQ0sp62b4AwnQWXyHQIhAMMdBtJtJ15tpCLwpQ6vDpSD7gnKarDDdAwZjOpeW9XB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":234460},"main":"build/index.js","types":"build/index.d.ts","gitHead":"a7da68314ed7f8c3b671597b754d5bc93fb022d5","scripts":{"lint":"expo-module lint","test":"expo-module test","build":"expo-module build","clean":"expo-module clean","prepare":"expo-module prepare","open:ios":"xed example/ios","typecheck":"tsc --noEmit","expo-module":"expo-module","open:android":"open -a \"Android Studio\" example/android","prepublishOnly":"expo-module prepublishOnly"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.8.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"expo":"^54.0.24","typescript":"~5.9.2","@types/react":"~19.1.0","react-native":"0.81.5","expo-module-scripts":"^5.0.7"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.15_1764218727865_0.9961774801074617","host":"s3://npm-registry-packages-npm-production"}},"0.1.16":{"name":"@asleep-ai/react-native-alarm","version":"0.1.16","keywords":["react-native","expo","@asleep-ai/react-native-alarm","ReactNativeAlarm"],"author":{"url":"Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.16","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"},{"name":"qube_asleep","email":"qube@asleep.ai"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"8b1e1de36ee44a729c811212f71ebb58c2d8dd5f","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.16.tgz","fileCount":36,"integrity":"sha512-rO+Yt9uOkzzMmB6+AATjjKNbUd2sRXOcziatRK14GO8OtOdF4FGWBoodDm672bZdDj0IniqahnOahiHBHs6rVg==","signatures":[{"sig":"MEQCIA4X0A45i9Hx7e0x96YF2YJ3sVZlLy30p8/ovLXyW9rSAiBbEgzwNnV60IaITBqDHa0woSUHvStdKqdBkLi+yp8rQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":235491},"main":"build/index.js","types":"build/index.d.ts","gitHead":"486b93b66386b99cd9293cd4cf76052583fcf6e0","scripts":{"lint":"expo-module lint","test":"expo-module test","build":"expo-module build","clean":"expo-module clean","prepare":"expo-module prepare","open:ios":"xed example/ios","typecheck":"tsc --noEmit","expo-module":"expo-module","open:android":"open -a \"Android Studio\" example/android","prepublishOnly":"expo-module prepublishOnly"},"_npmUser":{"name":"qube_asleep","email":"qube@asleep.ai"},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"10.8.2","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"20.19.5","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"expo":"^54.0.24","typescript":"~5.9.2","@types/react":"~19.1.0","react-native":"0.81.5","expo-module-scripts":"^5.0.7"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.16_1764559785331_0.7859435261631682","host":"s3://npm-registry-packages-npm-production"}},"0.1.17":{"name":"@asleep-ai/react-native-alarm","version":"0.1.17","keywords":["@asleep-ai/react-native-alarm","ReactNativeAlarm","expo","react-native"],"author":{"url":"Sun-Woo-Kim","name":"Qube","email":"qube@asleep.ai"},"license":"MIT","_id":"@asleep-ai/react-native-alarm@0.1.17","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"}],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"dist":{"shasum":"e3de07e2027731eeab398e2786e3c58ae809686c","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.1.17.tgz","fileCount":38,"integrity":"sha512-RZG0pxil6v3AS9pvO4WoEZ7Lq4+V4aPX9sIErluTNgsN+qRhgADMkkeAtLl5a+v9u7zvoEk88AZfmdASBSfHEw==","signatures":[{"sig":"MEUCICQ/nTQVMeJDIE9z0m0FWcNv09IqQAsxuy6oHjSXycAyAiEAwJR/ka2EKgbH0e0OBCh9j7FqURqwanfaenN+WVAfD40=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@asleep-ai%2freact-native-alarm@0.1.17","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":239970},"main":"build/index.js","types":"build/index.d.ts","gitHead":"dcc9c5b7010015db8a9343764d2d322ff2323315","scripts":{"lint":"oxlint","test":"expo-module test","build":"expo-module build","clean":"expo-module clean","format":"oxfmt","prepare":"expo-module prepare","open:ios":"xed example/ios","typecheck":"tsc --noEmit","expo-module":"expo-module","format:check":"oxfmt --check","open:android":"open -a \"Android Studio\" example/android","prepublishOnly":"expo-module prepublishOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8bf49442-0026-4880-a490-430ea51f91fc"}},"repository":{"url":"git+https://github.com/asleep-ai/react-native-alarm.git","type":"git"},"_npmVersion":"11.18.0","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","directories":{},"_nodeVersion":"22.23.1","_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"expo":"^54.0.24","oxfmt":"^0.60.0","oxlint":"^1.75.0","typescript":"~5.9.2","@types/react":"~19.1.0","react-native":"0.81.5","expo-module-scripts":"^5.0.7"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/react-native-alarm_0.1.17_1784792880215_0.3418032210465307","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@asleep-ai/react-native-alarm","version":"0.2.0","description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","keywords":["@asleep-ai/react-native-alarm","ReactNativeAlarm","expo","react-native"],"homepage":"https://github.com/asleep-ai/react-native-alarm#readme","bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"license":"MIT","author":{"name":"Qube","email":"qube@asleep.ai","url":"Sun-Woo-Kim"},"repository":{"type":"git","url":"git+https://github.com/asleep-ai/react-native-alarm.git"},"main":"build/index.js","types":"build/index.d.ts","scripts":{"build":"expo-module build","clean":"expo-module clean","format":"oxfmt","format:check":"oxfmt --check","lint":"oxlint","test":"expo-module test","typecheck":"tsc --noEmit","prepare":"expo-module prepare","prepublishOnly":"expo-module prepublishOnly","expo-module":"expo-module","open:ios":"xed example/ios","open:android":"open -a \"Android Studio\" example/android"},"devDependencies":{"@types/react":"~19.1.0","expo":"^54.0.24","expo-module-scripts":"^5.0.7","oxfmt":"^0.60.0","oxlint":"^1.75.0","react-native":"0.81.5","typescript":"~5.9.2"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"packageManager":"pnpm@11.15.1","gitHead":"ff1fd5f14d0d0b21fa4b39418da3863adb094926","_id":"@asleep-ai/react-native-alarm@0.2.0","_nodeVersion":"22.23.1","_npmVersion":"11.18.0","dist":{"integrity":"sha512-Fr8embYc1qzKxZxfHSnjRr/i9gS9Mom2/yxyB1F3pcM6TRqsRcBkTaZuBnB23j3ub6E1xMmHXxSefs9FFyI4mA==","shasum":"0c9cd5ab5348506170086304bf8d2013e2f57886","tarball":"https://registry.npmjs.org/@asleep-ai/react-native-alarm/-/react-native-alarm-0.2.0.tgz","fileCount":39,"unpackedSize":247171,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@asleep-ai%2freact-native-alarm@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIH6+5+ApngeTP6HHr27Jth7GkrqxKi4LPg4qOQrpJUdOAiAI4lEnHR6HkoU627/Bbj6kLhfe3qjmooZUk5YfnH58uw=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8bf49442-0026-4880-a490-430ea51f91fc"}},"directories":{},"maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-native-alarm_0.2.0_1784870568537_0.8808024093293452"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-24T01:32:21.343Z","modified":"2026-07-24T05:22:49.052Z","0.1.0":"2025-11-24T01:32:21.701Z","0.1.2":"2025-11-24T01:41:04.786Z","0.1.3":"2025-11-24T02:25:17.132Z","0.1.4":"2025-11-24T03:29:12.779Z","0.1.5":"2025-11-24T03:32:30.564Z","0.1.6":"2025-11-24T04:27:21.578Z","0.1.7":"2025-11-24T04:37:07.590Z","0.1.8":"2025-11-24T04:46:04.619Z","0.1.9":"2025-11-24T04:48:38.639Z","0.1.10":"2025-11-24T04:52:05.948Z","0.1.11":"2025-11-24T04:56:00.843Z","0.1.12":"2025-11-24T06:19:10.360Z","0.1.13":"2025-11-26T05:33:03.112Z","0.1.14":"2025-11-27T03:32:43.344Z","0.1.15":"2025-11-27T04:45:28.044Z","0.1.16":"2025-12-01T03:29:45.503Z","0.1.17":"2026-07-23T07:48:00.361Z","0.2.0":"2026-07-24T05:22:48.724Z"},"bugs":{"url":"https://github.com/asleep-ai/react-native-alarm/issues"},"author":{"name":"Qube","email":"qube@asleep.ai","url":"Sun-Woo-Kim"},"license":"MIT","homepage":"https://github.com/asleep-ai/react-native-alarm#readme","keywords":["@asleep-ai/react-native-alarm","ReactNativeAlarm","expo","react-native"],"repository":{"type":"git","url":"git+https://github.com/asleep-ai/react-native-alarm.git"},"description":"Asleep React Native Alarm using iOS AlarmKit (iOS 26+)","maintainers":[{"name":"keenranger","email":"kghnkl0103@gmail.com"}],"readme":"# @asleep-ai/react-native-alarm\n\n[![CI](https://github.com/asleep-ai/react-native-alarm/actions/workflows/ci.yml/badge.svg)](https://github.com/asleep-ai/react-native-alarm/actions/workflows/ci.yml)\n[![npm version](https://img.shields.io/npm/v/%40asleep-ai%2Freact-native-alarm.svg)](https://www.npmjs.com/package/@asleep-ai/react-native-alarm)\n[![license](https://img.shields.io/npm/l/%40asleep-ai%2Freact-native-alarm.svg)](LICENSE)\n\nReact Native alarm utilities powered by iOS AlarmKit (iOS 26+), built with Expo Modules API.\n\n## Overview\n\nThis library provides a cross-platform API for scheduling alarms and timers in React Native applications. On iOS, it leverages the native AlarmKit framework (iOS 26+) to provide system-level alarm functionality with Live Activities and native alarm UI. On Android, it uses AlarmManager with customizable notification overlays.\n\n## Requirements\n\n- **React Native**: >= 0.74\n- **React**: >= 18\n- **Expo**: >= 51\n- **iOS**: iOS 26.0 or later (AlarmKit requirement)\n- **Android**: API level 23+ (Android 6.0+)\n\n## Installation\n\n### Step 1: Install the package\n\n```bash\nyarn add @asleep-ai/react-native-alarm\n```\n\n### Step 2: Install iOS dependencies\n\n```bash\ncd ios\nnpx pod-install\n```\n\n### Step 3: Configure iOS Info.plist\n\nAdd the `NSAlarmKitUsageDescription` key to your app's `Info.plist` file. This is required for AlarmKit to request authorization and display the permission dialog.\n\n**For Expo apps**, add to `app.json`:\n\n```json\n{\n  \"expo\": {\n    \"ios\": {\n      \"infoPlist\": {\n        \"NSAlarmKitUsageDescription\": \"We'll schedule alerts for alarms you create within our app.\"\n      }\n    }\n  }\n}\n```\n\n**For bare React Native apps**, add to `ios/YourApp/Info.plist`:\n\n```xml\n<key>NSAlarmKitUsageDescription</key>\n<string>We'll schedule alerts for alarms you create within our app.</string>\n```\n\n**Important**: If `NSAlarmKitUsageDescription` is missing or empty, AlarmKit cannot request authorization and alarms won't be scheduled.\n\n### Step 4: Configure Android (if needed)\n\nThe library automatically configures Android permissions. Ensure your `AndroidManifest.xml` includes notification permissions (usually handled by Expo).\n\n## Quick Start\n\n### Basic Usage\n\n```typescript\nimport { isAvailable, requestPermission, scheduleAlarm, getAlarms, cancelAlarm } from \"@asleep-ai/react-native-alarm\";\n\nasync function setupAlarm() {\n  // 1. Check availability (iOS 26+)\n  if (!isAvailable()) {\n    console.warn(\"AlarmKit not available on this device\");\n    return;\n  }\n\n  // 2. Request permission\n  const result = await requestPermission();\n  if (!result.granted) {\n    console.error(\"Permission denied\");\n    return;\n  }\n\n  // 3. Schedule an alarm\n  const alarm = await scheduleAlarm({\n    dateISO: new Date(Date.now() + 60_000).toISOString(), // 1 minute from now\n    label: \"Wake up\",\n  });\n\n  console.log(\"Scheduled alarm:\", alarm);\n\n  // 4. List all alarms\n  const alarms = await getAlarms();\n  console.log(\"All alarms:\", alarms);\n\n  // 5. Cancel an alarm\n  await cancelAlarm(alarm.id);\n}\n```\n\n## Complete Usage Guide\n\nThis guide is based on the actual implementation in the `example` folder. Follow these patterns to integrate alarms into your React Native app.\n\n### 1. Setting Up Permissions\n\nFirst, create a custom hook to manage permissions:\n\n```typescript\n// hooks/usePermissions.ts\nimport { useState, useEffect, useCallback } from \"react\";\nimport { Platform, Alert } from \"react-native\";\nimport {\n  requestPermission,\n  openSettings,\n  canScheduleExactAlarms,\n  openExactAlarmSettings,\n  openOverlayPermissionSettings,\n  hasOverlayPermission,\n} from \"@asleep-ai/react-native-alarm\";\n\nexport function usePermissions() {\n  const [exactAllowed, setExactAllowed] = useState<boolean>(false);\n  const [overlayAllowed, setOverlayAllowed] = useState<boolean>(false);\n\n  useEffect(() => {\n    if (Platform.OS === \"android\") {\n      try {\n        setExactAllowed(canScheduleExactAlarms());\n        setOverlayAllowed(hasOverlayPermission());\n      } catch {\n        setExactAllowed(false);\n        setOverlayAllowed(false);\n      }\n    }\n  }, []);\n\n  const onRequestPermission = useCallback(async () => {\n    try {\n      const result = await requestPermission();\n      if (result.granted) {\n        Alert.alert(\"Permission\", \"Granted\");\n      } else {\n        if (result.status === \"denied\") {\n          Alert.alert(\"Permission Denied\", \"Alarm permission has been denied. Please enable it in Settings.\", [\n            { text: \"Cancel\", style: \"cancel\" },\n            {\n              text: \"Open Settings\",\n              onPress: async () => {\n                await openSettings();\n              },\n            },\n          ]);\n        } else {\n          Alert.alert(\"Permission\", \"Denied\");\n        }\n      }\n    } catch (e: any) {\n      Alert.alert(\"Error\", String(e?.message ?? e));\n    }\n  }, []);\n\n  const onOpenExactAlarmSettings = useCallback(async () => {\n    try {\n      const ok = await openExactAlarmSettings();\n      if (!ok) {\n        Alert.alert(\"Info\", \"Unable to open settings. You can allow exact alarms in system settings.\");\n      }\n    } catch {\n      Alert.alert(\"Error\", \"Failed to open exact alarm settings.\");\n    } finally {\n      setTimeout(() => {\n        try {\n          setExactAllowed(canScheduleExactAlarms());\n          setOverlayAllowed(hasOverlayPermission());\n        } catch {\n          setExactAllowed(false);\n          setOverlayAllowed(false);\n        }\n      }, 1000);\n    }\n  }, []);\n\n  const onOpenOverlayPermissionSettings = useCallback(async () => {\n    try {\n      const ok = await openOverlayPermissionSettings();\n      if (!ok) {\n        Alert.alert(\"Info\", \"Unable to open overlay settings. You can allow overlays in system settings.\");\n      }\n    } catch {\n      Alert.alert(\"Error\", \"Failed to open overlay settings.\");\n    } finally {\n      setTimeout(() => {\n        try {\n          setOverlayAllowed(hasOverlayPermission());\n        } catch {\n          setOverlayAllowed(false);\n        }\n      }, 1000);\n    }\n  }, []);\n\n  return {\n    exactAllowed,\n    overlayAllowed,\n    onRequestPermission,\n    onOpenExactAlarmSettings,\n    onOpenOverlayPermissionSettings,\n  };\n}\n```\n\n### 2. Managing Alarm State\n\nCreate a hook to track alarm state:\n\n```typescript\n// hooks/useAlarmState.ts\nimport { useState, useEffect } from \"react\";\nimport { Platform } from \"react-native\";\nimport { isAvailable, checkAlarmStates, type AlarmState } from \"@asleep-ai/react-native-alarm\";\n\nexport function useAlarmState() {\n  const [available, setAvailable] = useState<boolean>(false);\n  const [alarmState, setAlarmState] = useState<AlarmState | null>(null);\n  const [alarmHistory, setAlarmHistory] = useState<AlarmState | null>(null);\n\n  useEffect(() => {\n    setAvailable(isAvailable());\n  }, []);\n\n  // Periodically check alarm states (especially for iOS)\n  useEffect(() => {\n    if (Platform.OS === \"ios\" && available) {\n      const id = setInterval(async () => {\n        try {\n          await checkAlarmStates();\n        } catch (e) {\n          // Ignore errors\n        }\n      }, 1000); // Check every second\n      return () => clearInterval(id);\n    }\n  }, [available]);\n\n  const saveToHistory = () => {\n    if (alarmState) {\n      setAlarmHistory(alarmState);\n    }\n  };\n\n  const clearState = () => {\n    setAlarmState(null);\n  };\n\n  return {\n    available,\n    alarmState,\n    alarmHistory,\n    setAlarmState,\n    saveToHistory,\n    clearState,\n  };\n}\n```\n\n### 3. Setting Up Event Listeners\n\nCreate a hook to handle alarm events:\n\n```typescript\n// hooks/useAlarmListeners.ts\nimport { useEffect, useState } from \"react\";\nimport {\n  addAlarmStartedListener,\n  addAlarmSnoozedListener,\n  addAlarmStoppedListener,\n  addAlarmStateChangedListener,\n  type AlarmState,\n} from \"@asleep-ai/react-native-alarm\";\n\ninterface UseAlarmListenersProps {\n  onStateChanged: (state: AlarmState) => void;\n  onStopped: () => void;\n}\n\nexport function useAlarmListeners({ onStateChanged, onStopped }: UseAlarmListenersProps) {\n  const [eventLog, setEventLog] = useState<string[]>([]);\n\n  useEffect(() => {\n    const subscriptions = [\n      addAlarmStartedListener((event) => {\n        const log = `[${new Date().toLocaleTimeString()}] Alarm Started: ${event.label || event.id} (${event.remainingSeconds}s remaining)`;\n        setEventLog((prev) => [log, ...prev].slice(0, 20)); // Keep last 20 events\n        console.log(\"onAlarmStarted\", event);\n      }),\n      addAlarmSnoozedListener((event) => {\n        const log = `[${new Date().toLocaleTimeString()}] Alarm Snoozed: ${event.label || event.id} (until ${event.snoozeUntilISO})`;\n        setEventLog((prev) => [log, ...prev].slice(0, 20));\n        console.log(\"onAlarmSnoozed\", event);\n      }),\n      addAlarmStoppedListener((event) => {\n        const log = `[${new Date().toLocaleTimeString()}] Alarm Stopped: ${event.label || event.id} (at ${event.stoppedAtISO})`;\n        setEventLog((prev) => [log, ...prev].slice(0, 20));\n        console.log(\"onAlarmStopped\", event);\n        onStopped();\n      }),\n      addAlarmStateChangedListener((state) => {\n        onStateChanged(state);\n        console.log(\"onAlarmStateChanged\", state);\n      }),\n    ];\n\n    return () => {\n      subscriptions.forEach((sub) => sub.remove());\n    };\n  }, [onStateChanged, onStopped]);\n\n  return { eventLog };\n}\n```\n\n### 4. Managing Alarms\n\nCreate a hook to handle alarm operations:\n\n```typescript\n// hooks/useAlarmActions.ts\nimport { useState, useCallback, useEffect } from \"react\";\nimport { Platform, Alert } from \"react-native\";\nimport { scheduleAlarm, getAlarms, cancelAlarm, cancelAll, type Alarm } from \"@asleep-ai/react-native-alarm\";\nimport type { AlarmConfig } from \"./useAlarmConfig\";\n\ninterface UseAlarmActionsProps {\n  config: AlarmConfig;\n}\n\nexport function useAlarmActions({ config }: UseAlarmActionsProps) {\n  const [alarms, setAlarms] = useState<Alarm[]>([]);\n  const [lastScheduled, setLastScheduled] = useState<Alarm | null>(null);\n\n  const refresh = useCallback(async () => {\n    try {\n      const list = await getAlarms();\n      setAlarms(list);\n    } catch (e: any) {\n      Alert.alert(\"Error\", String(e?.message ?? e));\n    }\n  }, []);\n\n  // Load alarms on mount\n  useEffect(() => {\n    refresh();\n  }, [refresh]);\n\n  const onScheduleIn = useCallback(\n    async (seconds: number) => {\n      try {\n        const dateISO = new Date(Date.now() + seconds * 1000).toISOString();\n        const a = await scheduleAlarm({\n          dateISO,\n          label: `Test Alarm (${seconds}s)`,\n          countdownSeconds: seconds,\n          android:\n            Platform.OS === \"android\"\n              ? {\n                  smallIconName: config.androidSmallIcon || undefined,\n                  accentColor: config.androidAccentColor,\n                  useChronometer: config.androidUseChrono,\n                  showOverlayWhenUnlocked: config.androidOverlayUnlocked,\n                  overlayBackgroundColor: config.androidOverlayBg,\n                  overlayTextColor: config.androidOverlayText,\n                  overlayButtonBackgroundColor: config.androidOverlayBtnBg,\n                  overlayButtonTextColor: config.androidOverlayBtnText,\n                  snoozeMinutes: 3,\n                }\n              : undefined,\n          ios:\n            Platform.OS === \"ios\"\n              ? {\n                  snoozeMinutes: 3,\n                }\n              : undefined,\n        });\n        setLastScheduled(a);\n        await refresh();\n      } catch (e: any) {\n        Alert.alert(\"Error\", String(e?.message ?? e));\n      }\n    },\n    [config, refresh],\n  );\n\n  const onStartTimer = useCallback(\n    async (seconds: number) => {\n      try {\n        const a = await scheduleAlarm({\n          label: `Timer (${seconds}s)`,\n          countdownSeconds: seconds,\n          android:\n            Platform.OS === \"android\"\n              ? {\n                  smallIconName: config.androidSmallIcon || undefined,\n                  accentColor: config.androidAccentColor,\n                  useChronometer: config.androidUseChrono,\n                  showOverlayWhenUnlocked: config.androidOverlayUnlocked,\n                  overlayBackgroundColor: config.androidOverlayBg,\n                  overlayTextColor: config.androidOverlayText,\n                  overlayButtonBackgroundColor: config.androidOverlayBtnBg,\n                  overlayButtonTextColor: config.androidOverlayBtnText,\n                  snoozeMinutes: 3,\n                }\n              : undefined,\n          ios:\n            Platform.OS === \"ios\"\n              ? {\n                  snoozeMinutes: 3,\n                }\n              : undefined,\n        });\n        setLastScheduled(a);\n        await refresh();\n      } catch (e: any) {\n        Alert.alert(\"Error\", String(e?.message ?? e));\n      }\n    },\n    [config, refresh],\n  );\n\n  const onCancelLast = useCallback(async () => {\n    try {\n      const target = lastScheduled ?? alarms[alarms.length - 1];\n      if (!target) {\n        Alert.alert(\"Info\", \"No alarm to cancel\");\n        return;\n      }\n      await cancelAlarm(target.id);\n      if (lastScheduled?.id === target.id) setLastScheduled(null);\n      await refresh();\n    } catch (e: any) {\n      Alert.alert(\"Error\", String(e?.message ?? e));\n    }\n  }, [alarms, lastScheduled, refresh]);\n\n  const onCancelAlarm = useCallback(\n    async (alarmId: string) => {\n      try {\n        await cancelAlarm(alarmId);\n        if (lastScheduled?.id === alarmId) setLastScheduled(null);\n        await refresh();\n      } catch (e: any) {\n        Alert.alert(\"Error\", String(e?.message ?? e));\n      }\n    },\n    [lastScheduled, refresh],\n  );\n\n  const onCancelAll = useCallback(async () => {\n    try {\n      await cancelAll();\n      setLastScheduled(null);\n      await refresh();\n    } catch (e: any) {\n      Alert.alert(\"Error\", String(e?.message ?? e));\n    }\n  }, [refresh]);\n\n  return {\n    alarms,\n    lastScheduled,\n    refreshAlarms: refresh,\n    onScheduleIn,\n    onStartTimer,\n    onCancelLast,\n    onCancelAlarm,\n    onCancelAll,\n  };\n}\n```\n\n### 5. Configuring Alarm Styles\n\nCreate a hook to manage alarm configuration:\n\n```typescript\n// hooks/useAlarmConfig.ts\nimport { useState, useCallback } from \"react\";\nimport { Alert } from \"react-native\";\nimport { configure } from \"@asleep-ai/react-native-alarm\";\n\nexport interface AlarmConfig {\n  androidSmallIcon: string;\n  androidAccentColor: string;\n  androidUseChrono: boolean;\n  androidOverlayUnlocked: boolean;\n  androidOverlayBg: string;\n  androidOverlayText: string;\n  androidOverlayBtnBg: string;\n  androidOverlayBtnText: string;\n  iosTint: string;\n  iosStopText: string;\n  iosPauseText: string;\n  iosResumeText: string;\n}\n\nexport function useAlarmConfig() {\n  const [androidSmallIcon, setAndroidSmallIcon] = useState<string>(\"\");\n  const [androidAccentColor, setAndroidAccentColor] = useState<string>(\"#4CAF50\");\n  const [androidUseChrono, setAndroidUseChrono] = useState<boolean>(true);\n  const [androidOverlayUnlocked, setAndroidOverlayUnlocked] = useState<boolean>(true);\n  const [androidOverlayBg, setAndroidOverlayBg] = useState<string>(\"#000000\");\n  const [androidOverlayText, setAndroidOverlayText] = useState<string>(\"#FFFFFF\");\n  const [androidOverlayBtnBg, setAndroidOverlayBtnBg] = useState<string>(\"#3b82f6\");\n  const [androidOverlayBtnText, setAndroidOverlayBtnText] = useState<string>(\"#FFFFFF\");\n  const [iosTint, setIosTint] = useState<string>(\"#007AFF\");\n  const [iosStopText, setIosStopText] = useState<string>(\"Done\");\n  const [iosPauseText, setIosPauseText] = useState<string>(\"Pause\");\n  const [iosResumeText, setIosResumeText] = useState<string>(\"Start\");\n\n  const config: AlarmConfig = {\n    androidSmallIcon,\n    androidAccentColor,\n    androidUseChrono,\n    androidOverlayUnlocked,\n    androidOverlayBg,\n    androidOverlayText,\n    androidOverlayBtnBg,\n    androidOverlayBtnText,\n    iosTint,\n    iosStopText,\n    iosPauseText,\n    iosResumeText,\n  };\n\n  const onApplyConfig = useCallback(async () => {\n    try {\n      await configure({\n        android: {\n          smallIconName: androidSmallIcon || undefined,\n          accentColor: androidAccentColor,\n          useChronometer: androidUseChrono,\n          showOverlayWhenUnlocked: androidOverlayUnlocked,\n          overlayBackgroundColor: androidOverlayBg,\n          overlayTextColor: androidOverlayText,\n          overlayButtonBackgroundColor: androidOverlayBtnBg,\n          overlayButtonTextColor: androidOverlayBtnText,\n        },\n        ios: {\n          tintColorHex: iosTint,\n          alertStopText: iosStopText,\n          countdownPauseText: iosPauseText,\n          pausedResumeText: iosResumeText,\n        },\n      });\n      Alert.alert(\"Config\", \"Applied\");\n    } catch (e: any) {\n      Alert.alert(\"Error\", String(e?.message ?? e));\n    }\n  }, [\n    androidSmallIcon,\n    androidAccentColor,\n    androidUseChrono,\n    androidOverlayUnlocked,\n    androidOverlayBg,\n    androidOverlayText,\n    androidOverlayBtnBg,\n    androidOverlayBtnText,\n    iosTint,\n    iosStopText,\n    iosPauseText,\n    iosResumeText,\n  ]);\n\n  return {\n    config,\n    setters: {\n      setAndroidSmallIcon,\n      setAndroidAccentColor,\n      setAndroidUseChrono,\n      setAndroidOverlayUnlocked,\n      setAndroidOverlayBg,\n      setAndroidOverlayText,\n      setAndroidOverlayBtnBg,\n      setAndroidOverlayBtnText,\n      setIosTint,\n      setIosStopText,\n      setIosPauseText,\n      setIosResumeText,\n    },\n    onApplyConfig,\n  };\n}\n```\n\n### 6. Creating UI Components\n\nCreate components to display alarm state and alarms:\n\n```typescript\n// components/AlarmStateView.tsx\nimport React from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimport type { AlarmState } from '@asleep-ai/react-native-alarm';\n\ninterface AlarmStateViewProps {\n  alarmState: AlarmState | null;\n  alarmHistory: AlarmState | null;\n}\n\nexport function AlarmStateView({\n  alarmState,\n  alarmHistory,\n}: AlarmStateViewProps) {\n  if (alarmState) {\n    return (\n      <View style={styles.container}>\n        <View style={styles.header}>\n          <View\n            style={[\n              styles.indicator,\n              {\n                backgroundColor: alarmState.isRinging\n                  ? '#ef4444'\n                  : alarmState.isSnoozed\n                    ? '#f59e0b'\n                    : '#10b981',\n              },\n            ]}\n          />\n          <Text style={styles.title}>{alarmState.label || alarmState.id}</Text>\n        </View>\n        <Text>\n          Status:{' '}\n          {alarmState.isRinging\n            ? '🔔 Ringing'\n            : alarmState.isSnoozed\n              ? '⏰ Snoozed'\n              : '⏱️ Countdown'}\n        </Text>\n        {alarmState.remainingSeconds > 0 && (\n          <Text>\n            Remaining: {Math.floor(alarmState.remainingSeconds / 60)}m{' '}\n            {alarmState.remainingSeconds % 60}s\n          </Text>\n        )}\n        {alarmState.isSnoozed && alarmState.snoozeUntilISO && (\n          <Text>\n            Snooze until: {new Date(alarmState.snoozeUntilISO).toLocaleString()}\n          </Text>\n        )}\n        {alarmState.stoppedAtISO && (\n          <Text style={styles.muted}>\n            Stopped at: {new Date(alarmState.stoppedAtISO).toLocaleString()}\n          </Text>\n        )}\n      </View>\n    );\n  }\n\n  if (alarmHistory) {\n    return (\n      <View style={styles.container}>\n        <View style={styles.header}>\n          <View style={[styles.indicator, { backgroundColor: '#9ca3af' }]} />\n          <Text style={styles.title}>\n            {alarmHistory.label || alarmHistory.id}\n          </Text>\n          <Text style={styles.historyLabel}>(History)</Text>\n        </View>\n        <Text style={styles.muted}>\n          Status:{' '}\n          {alarmHistory.isRinging\n            ? '🔔 Ringing'\n            : alarmHistory.isSnoozed\n              ? '⏰ Snoozed'\n              : '⏱️ Countdown'}\n        </Text>\n        {alarmHistory.stoppedAtISO && (\n          <Text style={styles.muted}>\n            Stopped at: {new Date(alarmHistory.stoppedAtISO).toLocaleString()}\n          </Text>\n        )}\n      </View>\n    );\n  }\n\n  return <Text style={styles.muted}>No active alarm</Text>;\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    gap: 8,\n  },\n  header: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 8,\n  },\n  indicator: {\n    width: 12,\n    height: 12,\n    borderRadius: 6,\n  },\n  title: {\n    fontWeight: '600',\n    fontSize: 16,\n  },\n  historyLabel: {\n    color: '#6b7280',\n    fontSize: 12,\n  },\n  muted: {\n    color: '#6b7280',\n  },\n});\n```\n\n```typescript\n// components/AlarmCard.tsx\nimport React from 'react';\nimport { View, Text, Button, StyleSheet } from 'react-native';\nimport type { Alarm } from '@asleep-ai/react-native-alarm';\n\ninterface AlarmCardProps {\n  alarm: Alarm;\n  onCancel: (alarmId: string) => void;\n}\n\nexport function AlarmCard({ alarm, onCancel }: AlarmCardProps) {\n  return (\n    <View style={styles.card}>\n      <View style={styles.header}>\n        <View style={styles.info}>\n          <Text style={styles.label}>{alarm.label || '(No label)'}</Text>\n          <Text style={styles.id}>ID: {alarm.id.substring(0, 8)}...</Text>\n        </View>\n        <Button title=\"Cancel\" onPress={() => onCancel(alarm.id)} />\n      </View>\n      <View style={styles.details}>\n        <Text style={styles.detailText}>\n          <Text style={styles.detailLabel}>Date: </Text>\n          {new Date(alarm.dateISO).toLocaleString()}\n        </Text>\n        <Text style={styles.detailText}>\n          <Text style={styles.detailLabel}>Status: </Text>\n          <Text\n            style={[\n              styles.statusText,\n              {\n                color: alarm.isRinging\n                  ? '#ef4444'\n                  : alarm.isSnoozed\n                    ? '#f59e0b'\n                    : alarm.enabled\n                      ? '#10b981'\n                      : '#ef4444',\n              },\n            ]}\n          >\n            {alarm.isRinging\n              ? '🔔 Ringing'\n              : alarm.isSnoozed\n                ? '⏰ Snoozed'\n                : alarm.enabled\n                  ? '⏱️ Scheduled'\n                  : '❌ Disabled'}\n          </Text>\n        </Text>\n        {alarm.isSnoozed && alarm.snoozeUntilISO && (\n          <Text style={styles.detailText}>\n            <Text style={styles.detailLabel}>Snooze until: </Text>\n            {new Date(alarm.snoozeUntilISO).toLocaleString()}\n          </Text>\n        )}\n        {alarm.remainingSeconds !== undefined && alarm.remainingSeconds > 0 && (\n          <Text style={styles.detailText}>\n            <Text style={styles.detailLabel}>Remaining: </Text>\n            {Math.floor(alarm.remainingSeconds / 60)}m{' '}\n            {alarm.remainingSeconds % 60}s\n          </Text>\n        )}\n      </View>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  card: {\n    padding: 12,\n    backgroundColor: '#f9fafb',\n    borderRadius: 8,\n    borderWidth: 1,\n    borderColor: '#e5e7eb',\n  },\n  header: {\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    alignItems: 'flex-start',\n    marginBottom: 8,\n  },\n  info: {\n    flex: 1,\n  },\n  label: {\n    fontWeight: '600',\n    fontSize: 16,\n    marginBottom: 4,\n  },\n  id: {\n    fontSize: 12,\n    color: '#6b7280',\n  },\n  details: {\n    gap: 4,\n  },\n  detailText: {\n    fontSize: 14,\n  },\n  detailLabel: {\n    fontWeight: '600',\n  },\n  statusText: {\n    fontWeight: '500',\n  },\n});\n```\n\n### 7. Putting It All Together\n\nHere's how to use all these hooks in your main App component:\n\n```typescript\n// App.tsx\nimport React, { useState, useEffect } from 'react';\nimport { StyleSheet } from 'react-native';\nimport { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';\nimport { useAlarmState } from './hooks/useAlarmState';\nimport { useAlarmListeners } from './hooks/useAlarmListeners';\nimport { useAlarmActions } from './hooks/useAlarmActions';\nimport { useAlarmConfig } from './hooks/useAlarmConfig';\nimport { usePermissions } from './hooks/usePermissions';\nimport { ActionsScreen } from './screens/ActionsScreen';\n\nexport default function App() {\n  const [nowISO, setNowISO] = useState<string>(new Date().toISOString());\n\n  const {\n    available,\n    alarmState,\n    alarmHistory,\n    setAlarmState,\n    saveToHistory,\n    clearState,\n  } = useAlarmState();\n\n  const { eventLog } = useAlarmListeners({\n    onStateChanged: setAlarmState,\n    onStopped: () => {\n      saveToHistory();\n      clearState();\n      refreshAlarmsList();\n    },\n  });\n\n  const { config } = useAlarmConfig();\n\n  const {\n    alarms,\n    lastScheduled,\n    refreshAlarms: refreshAlarmsList,\n    onScheduleIn,\n    onStartTimer,\n    onCancelLast,\n    onCancelAlarm,\n    onCancelAll,\n  } = useAlarmActions({\n    config,\n  });\n\n  const {\n    exactAllowed,\n    overlayAllowed,\n    onRequestPermission,\n    onOpenExactAlarmSettings,\n    onOpenOverlayPermissionSettings,\n  } = usePermissions();\n\n  useEffect(() => {\n    const id = setInterval(() => {\n      setNowISO(new Date().toISOString());\n    }, 1000);\n    return () => clearInterval(id);\n  }, []);\n\n  return (\n    <SafeAreaProvider>\n      <SafeAreaView style={styles.container} edges={['top']}>\n        <ActionsScreen\n          alarmState={alarmState}\n          alarmHistory={alarmHistory}\n          alarms={alarms}\n          eventLog={eventLog}\n          lastScheduled={lastScheduled}\n          nowISO={nowISO}\n          onRequestPermission={onRequestPermission}\n          exactAllowed={exactAllowed}\n          overlayAllowed={overlayAllowed}\n          onOpenExactAlarmSettings={onOpenExactAlarmSettings}\n          onOpenOverlayPermissionSettings={onOpenOverlayPermissionSettings}\n          onScheduleIn={onScheduleIn}\n          onStartTimer={onStartTimer}\n          onCancelLast={onCancelLast}\n          onCancelAlarm={onCancelAlarm}\n          onCancelAll={onCancelAll}\n          refreshAlarms={refreshAlarmsList}\n        />\n      </SafeAreaView>\n    </SafeAreaProvider>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: '#eee',\n  },\n});\n```\n\n## API Reference\n\n### Availability & Permissions\n\n#### `isAvailable(): boolean`\n\nChecks if AlarmKit is available on the current device. Returns `true` on iOS 26+ devices, `false` otherwise.\n\n```typescript\nif (isAvailable()) {\n  // Proceed with alarm operations\n}\n```\n\n#### `requestPermission(): Promise<{ granted: boolean; status: string }>`\n\nRequests alarm permission from the user. On iOS, this requests AlarmKit authorization. On Android, this requests notification permission.\n\n**Returns:** `Promise<{ granted: boolean; status: string }>` - Object with `granted` boolean and `status` string.\n\n```typescript\nconst result = await requestPermission();\nif (result.granted) {\n  // Permission granted\n} else if (result.status === \"denied\") {\n  // Permission denied, guide user to settings\n}\n```\n\n#### `canScheduleExactAlarms(): boolean` (Android only)\n\nChecks if the app can schedule exact alarms on Android. Exact alarms are required for precise timing.\n\n```typescript\nif (Platform.OS === \"android\") {\n  const canSchedule = canScheduleExactAlarms();\n  if (!canSchedule) {\n    // Guide user to enable exact alarms in settings\n  }\n}\n```\n\n#### `hasOverlayPermission(): boolean` (Android only)\n\nChecks if the app has permission to display overlay windows (for alarm UI).\n\n```typescript\nif (Platform.OS === \"android\") {\n  const hasOverlay = hasOverlayPermission();\n}\n```\n\n#### `openExactAlarmSettings(): Promise<boolean>` (Android only)\n\nOpens the system settings page for exact alarm permissions.\n\n```typescript\nconst opened = await openExactAlarmSettings();\n```\n\n#### `openOverlayPermissionSettings(): Promise<boolean>` (Android only)\n\nOpens the system settings page for overlay permissions.\n\n```typescript\nconst opened = await openOverlayPermissionSettings();\n```\n\n#### `openSettings(): Promise<void>`\n\nOpens the app's system settings page (iOS).\n\n```typescript\nawait openSettings();\n```\n\n#### `getAndroidPermissionStatus(): Promise<{...}>` (Android only)\n\nReturns the current status of all Android permissions.\n\n```typescript\nconst status = await getAndroidPermissionStatus();\n// {\n//   notifications: boolean,\n//   exactAlarmAllowed: boolean,\n//   overlayAllowed: boolean,\n//   ignoringBatteryOptimizations: boolean\n// }\n```\n\n### Alarm Management\n\n#### `scheduleAlarm(options: ScheduleAlarmOptions): Promise<Alarm>`\n\nSchedules a new alarm or timer.\n\n**Parameters:**\n\n```typescript\ntype ScheduleAlarmOptions = {\n  // ISO 8601 date string for when the alarm should fire\n  dateISO?: string;\n\n  // Label/name for the alarm\n  label?: string;\n\n  // Whether to allow snooze (iOS only)\n  allowSnooze?: boolean;\n\n  // Sound identifier (platform-specific)\n  sound?: string;\n\n  // Countdown duration in seconds (starts immediately)\n  // If both dateISO and countdownSeconds are provided,\n  // the alarm includes both a countdown and a scheduled alert\n  countdownSeconds?: number;\n\n  // Platform-specific styling (optional)\n  android?: AndroidNotificationStyle;\n  ios?: IOSAlarmStyle;\n};\n```\n\n**Returns:** `Promise<Alarm>` - The created alarm object.\n\n**Example 1: Schedule an alarm for a specific time**\n\n```typescript\nconst alarm = await scheduleAlarm({\n  dateISO: new Date(\"2024-12-25T08:00:00Z\").toISOString(),\n  label: \"Christmas Morning\",\n});\n```\n\n**Example 2: Start a countdown timer**\n\n```typescript\nconst timer = await scheduleAlarm({\n  label: \"Pomodoro Timer\",\n  countdownSeconds: 1500, // 25 minutes\n});\n```\n\n**Example 3: Schedule alarm with countdown**\n\n```typescript\n// This creates a countdown that starts immediately and fires an alert at the scheduled time\nconst alarm = await scheduleAlarm({\n  dateISO: new Date(Date.now() + 3600_000).toISOString(), // 1 hour from now\n  label: \"Meeting Reminder\",\n  countdownSeconds: 3600, // Countdown for 1 hour\n});\n```\n\n**Example 4: With Android customization**\n\n```typescript\nconst alarm = await scheduleAlarm({\n  dateISO: new Date(Date.now() + 60_000).toISOString(),\n  label: \"Wake Up\",\n  android: {\n    smallIconName: \"ic_stat_alarm\",\n    accentColor: \"#4CAF50\",\n    useChronometer: true,\n    showOverlayWhenUnlocked: true,\n    overlayBackgroundColor: \"#000000\",\n    overlayTextColor: \"#FFFFFF\",\n    overlayButtonBackgroundColor: \"#3b82f6\",\n    overlayButtonTextColor: \"#FFFFFF\",\n    snoozeMinutes: 5,\n  },\n});\n```\n\n**Example 5: With iOS customization**\n\n```typescript\nconst alarm = await scheduleAlarm({\n  dateISO: new Date(Date.now() + 60_000).toISOString(),\n  label: \"Wake Up\",\n  ios: {\n    tintColorHex: \"#007AFF\",\n    alertStopText: \"Done\",\n    countdownPauseText: \"Pause\",\n    pausedResumeText: \"Start\",\n    snoozeMinutes: 5,\n  },\n});\n```\n\n#### `getAlarms(): Promise<Alarm[]>`\n\nRetrieves all scheduled alarms.\n\n**Returns:** `Promise<Alarm[]>` - Array of alarm objects.\n\n```typescript\ntype Alarm = {\n  id: string;\n  dateISO: string; // ISO 8601 date string\n  label?: string;\n  enabled: boolean;\n  // State information (optional, may not be present in all contexts)\n  isRinging?: boolean;\n  isSnoozed?: boolean;\n  remainingSeconds?: number;\n  snoozeUntilISO?: string;\n};\n```\n\n**Example:**\n\n```typescript\nconst alarms = await getAlarms();\nalarms.forEach((alarm) => {\n  console.log(`${alarm.label}: ${alarm.dateISO}`);\n});\n```\n\n#### `cancelAlarm(id: string): Promise<void>`\n\nCancels a specific alarm by ID.\n\n**Parameters:**\n\n- `id: string` - The alarm ID returned from `scheduleAlarm()`\n\n**Example:**\n\n```typescript\nconst alarm = await scheduleAlarm({...});\n// Later...\nawait cancelAlarm(alarm.id);\n```\n\n#### `cancelAll(): Promise<void>`\n\nCancels all scheduled alarms.\n\n**Example:**\n\n```typescript\nawait cancelAll();\n```\n\n#### `checkAlarmStates(): Promise<void>`\n\nRe-checks alarm state on iOS and emits any transition events found. Since v0.2.0 it emits only on real transitions, so the recommended periodic call (below) no longer produces the old per-second event stream — it is cheap. Keep calling it periodically on iOS (or on app foreground) so snooze/stop performed from the system alarm UI are detected while your app is running.\n\n**Example:**\n\n```typescript\n// Check every second (iOS)\nuseEffect(() => {\n  if (Platform.OS === \"ios\" && available) {\n    const id = setInterval(async () => {\n      await checkAlarmStates();\n    }, 1000);\n    return () => clearInterval(id);\n  }\n}, [available]);\n```\n\n### Event Listeners\n\nThe library provides event listeners to track alarm state changes. This is useful for updating your app's UI when alarms start, stop, or are snoozed.\n\n> **Edge-triggered since v0.2.0.** Events fire only on real state transitions\n> (started, snoozed, unsnoozed, ringing, paused/resumed, stopped) — **not once\n> per second**. In particular `onAlarmStateChanged` no longer emits a per-second\n> \"remaining ticked down\" update, and its `remainingSeconds` is a snapshot taken\n> at the transition. Earlier versions emitted ~1 event/second while a timer ran.\n>\n> **Do not forward these events straight to analytics**, and do not drive a\n> per-second UI off their frequency. To show a live in-app countdown, seed a\n> local timer from the `remainingSeconds` on `onAlarmStarted` (the lock-screen /\n> Dynamic Island / notification countdown is rendered by the OS and needs\n> nothing from JS):\n>\n> ```typescript\n> import { addAlarmStartedListener } from \"@asleep-ai/react-native-alarm\";\n>\n> addAlarmStartedListener(({ remainingSeconds }) => {\n>   const firesAt = Date.now() + remainingSeconds * 1000;\n>   const timer = setInterval(() => {\n>     const left = Math.max(0, Math.ceil((firesAt - Date.now()) / 1000));\n>     setRemaining(left);\n>     if (left === 0) clearInterval(timer);\n>   }, 1000);\n> });\n> ```\n>\n> If you support pause/resume, also subscribe with `addAlarmStateChangedListener`\n> and stop the local timer while `state.isPaused` is `true`, restarting from the\n> `remainingSeconds` of the next event that arrives without it (resume clears it).\n\n#### `addAlarmStartedListener(listener): Subscription`\n\nListens for when an alarm starts (countdown begins or alarm starts ringing).\n\n```typescript\nimport { addAlarmStartedListener } from \"@asleep-ai/react-native-alarm\";\n\nconst subscription = addAlarmStartedListener((event) => {\n  console.log(\"Alarm started:\", event.id);\n  console.log(\"Label:\", event.label);\n  console.log(\"Remaining seconds:\", event.remainingSeconds);\n  // Update your UI, show modal, etc.\n});\n\n// Don't forget to remove the listener when done\nsubscription.remove();\n```\n\n#### `addAlarmSnoozedListener(listener): Subscription`\n\nListens for when an alarm is snoozed.\n\n```typescript\nimport { addAlarmSnoozedListener } from \"@asleep-ai/react-native-alarm\";\n\nconst subscription = addAlarmSnoozedListener((event) => {\n  console.log(\"Alarm snoozed:\", event.id);\n  console.log(\"Snooze until:\", event.snoozeUntilISO);\n  // Update your UI\n});\n\nsubscription.remove();\n```\n\n#### `addAlarmStoppedListener(listener): Subscription`\n\nListens for when an alarm is stopped.\n\n```typescript\nimport { addAlarmStoppedListener } from \"@asleep-ai/react-native-alarm\";\n\nconst subscription = addAlarmStoppedListener((event) => {\n  console.log(\"Alarm stopped:\", event.id);\n  console.log(\"Stopped at:\", event.stoppedAtISO);\n  // Update your UI, hide modal, etc.\n});\n\nsubscription.remove();\n```\n\n#### `addAlarmStateChangedListener(listener): Subscription`\n\nListens for any alarm state changes. This provides comprehensive state information including whether the alarm is ringing, snoozed, and remaining time.\n\n```typescript\nimport { addAlarmStateChangedListener, type AlarmState } from \"@asleep-ai/react-native-alarm\";\n\nconst subscription = addAlarmStateChangedListener((state: AlarmState) => {\n  console.log(\"Alarm state changed:\", state.id);\n  console.log(\"Is ringing:\", state.isRinging);\n  console.log(\"Is snoozed:\", state.isSnoozed);\n  console.log(\"Remaining seconds:\", state.remainingSeconds);\n  console.log(\"Stopped at:\", state.stoppedAtISO);\n  console.log(\"Snooze until:\", state.snoozeUntilISO);\n\n  // Use this to update your app's UI\n  if (state.isRinging) {\n    // Show alarm modal in your app\n  } else if (state.isSnoozed) {\n    // Show snooze status\n  }\n});\n\nsubscription.remove();\n```\n\n**Event Types:**\n\n```typescript\ntype AlarmState = {\n  id: string;\n  label?: string;\n  isRinging: boolean; // 현재 알람이 울리고 있는지\n  isSnoozed: boolean; // 현재 스누즈 중인지\n  remainingSeconds: number; // 남은 시간 (초)\n  stoppedAtISO?: string; // 알람이 정지된 시간 (ISO 8601)\n  snoozeUntilISO?: string; // 스누즈가 끝나는 시간 (ISO 8601)\n};\n```\n\n**Example: Using events with React hooks**\n\n```typescript\nimport { useEffect, useState } from 'react';\nimport {\n  addAlarmStateChangedListener,\n  type AlarmState,\n} from '@asleep-ai/react-native-alarm';\n\nfunction AlarmMonitor() {\n  const [currentAlarm, setCurrentAlarm] = useState<AlarmState | null>(null);\n\n  useEffect(() => {\n    const subscription = addAlarmStateChangedListener((state) => {\n      setCurrentAlarm(state);\n    });\n\n    return () => {\n      subscription.remove();\n    };\n  }, []);\n\n  if (!currentAlarm) {\n    return null;\n  }\n\n  return (\n    <View>\n      {currentAlarm.isRinging && (\n        <Text>Alarm is ringing: {currentAlarm.label}</Text>\n      )}\n      {currentAlarm.isSnoozed && (\n        <Text>Snoozed until: {currentAlarm.snoozeUntilISO}</Text>\n      )}\n      {currentAlarm.remainingSeconds > 0 && (\n        <Text>Time remaining: {currentAlarm.remainingSeconds}s</Text>\n      )}\n    </View>\n  );\n}\n```\n\n#### `removeAllListeners(): void`\n\nRemoves all event listeners at once.\n\n```typescript\nimport { removeAllListeners } from \"@asleep-ai/react-native-alarm\";\n\nremoveAllListeners();\n```\n\n### Configuration\n\n#### `configure(config: ReactNativeAlarmConfig): Promise<void>`\n\nSets global configuration for alarms. This configuration applies to all subsequently scheduled alarms unless overridden per-alarm.\n\n**Parameters:**\n\n```typescript\ntype ReactNativeAlarmConfig = {\n  android?: AndroidNotificationStyle;\n  ios?: IOSAlarmStyle;\n};\n\ntype AndroidNotificationStyle = {\n  timerChannelId?: string; // default: 'react_native_alarm_timers_high'\n  alertChannelId?: string; // default: 'react_native_alarm_alerts'\n  smallIconName?: string; // Android drawable name (e.g., 'ic_stat_alarm')\n  accentColor?: string; // Hex color (e.g., '#FF4081')\n  useChronometer?: boolean; // default: true\n  showOverlayWhenUnlocked?: boolean; // default: true\n  overlayBackgroundColor?: string; // Hex color for overlay background\n  overlayTextColor?: string; // Hex color for overlay text\n  overlayButtonBackgroundColor?: string; // Hex color for button background\n  overlayButtonTextColor?: string; // Hex color for button text\n  snoozeMinutes?: number; // default: 5\n};\n\ntype IOSAlarmStyle = {\n  tintColorHex?: string; // Hex color (e.g., '#007AFF')\n  alertStopText?: string; // default: 'Done'\n  countdownPauseText?: string; // default: 'Pause'\n  pausedResumeText?: string; // default: 'Start'\n  snoozeMinutes?: number; // default: 5\n};\n```\n\n**Example:**\n\n```typescript\nawait configure({\n  android: {\n    accentColor: \"#4CAF50\",\n    smallIconName: \"ic_stat_alarm\",\n    useChronometer: true,\n    showOverlayWhenUnlocked: true,\n    overlayBackgroundColor: \"#000000\",\n    overlayTextColor: \"#FFFFFF\",\n    overlayButtonBackgroundColor: \"#3b82f6\",\n    overlayButtonTextColor: \"#FFFFFF\",\n    snoozeMinutes: 5,\n  },\n  ios: {\n    tintColorHex: \"#007AFF\",\n    alertStopText: \"Done\",\n    countdownPauseText: \"Pause\",\n    pausedResumeText: \"Start\",\n    snoozeMinutes: 5,\n  },\n});\n```\n\n## Platform-Specific Features\n\n### iOS (AlarmKit)\n\n- **Live Activities**: Countdown timers appear as Live Activities on the Lock Screen and Dynamic Island\n- **Native Alarm UI**: System-level alarm interface with pause/resume/stop controls\n- **Snooze Support**: Built-in snooze functionality\n- **Dynamic Island Integration**: Timers appear in the Dynamic Island on supported devices\n\n**Important Notes:**\n\n- Requires iOS 26.0 or later\n- AlarmKit is weak-linked, so the library checks availability at runtime\n- Alarms persist across app restarts\n- System manages alarm presentation and user interactions\n- Periodic state checks may be needed using `checkAlarmStates()`\n\n### Android\n\n- **Notification Channels**: Separate channels for timers and alerts\n- **Overlay UI**: Customizable overlay window for alarm dismissal\n- **Exact Alarms**: Requires user permission for precise timing\n- **Battery Optimization**: May need to be disabled for reliable alarms\n\n**Important Notes:**\n\n- Exact alarm permission must be granted by the user\n- Overlay permission required for full-screen alarm UI\n- Battery optimization may affect alarm reliability\n- Custom notification icons can be added to `android/app/src/main/res/drawable/`\n\n## Android Customization\n\n### Adding Custom Icons\n\nTo use custom notification icons on Android:\n\n1. Add your icon drawable files to `android/app/src/main/res/drawable/`\n2. Reference them by name in your configuration:\n\n```typescript\nawait configure({\n  android: {\n    smallIconName: \"ic_stat_alarm\", // Your drawable name without extension\n  },\n});\n```\n\nCommon icon names:\n\n- `ic_stat_alarm`\n- `ic_stat_timer`\n- `ic_alarm_small`\n\n### Notification Channels\n\nThe library creates two notification channels:\n\n- **Timers**: `react_native_alarm_timers_high` (high priority)\n- **Alerts**: `react_native_alarm_alerts` (default priority)\n\nYou can customize these channel IDs in the configuration.\n\n## Troubleshooting\n\n### iOS Issues\n\n**\"AlarmKit not available\"**\n\n- Ensure you're running on iOS 26.0 or later\n- Check that AlarmKit framework is available (weak-linked)\n\n**\"Permission denied\"**\n\n- User must grant alarm permission in system settings\n- Check permission status before scheduling alarms\n- Use `openSettings()` to guide users to settings\n\n**Alarms not firing**\n\n- Verify the device is not in Do Not Disturb mode\n- Check that alarms are enabled in system settings\n- Ensure `checkAlarmStates()` is called periodically for iOS\n\n### Android Issues\n\n**Alarms not firing on time**\n\n- Ensure exact alarm permission is granted\n- Check battery optimization settings\n- Verify overlay permission if using overlay UI\n\n**Overlay not showing**\n\n- Request overlay permission: `openOverlayPermissionSettings()`\n- Check that `showOverlayWhenUnlocked` is enabled\n\n**Custom icons not showing**\n\n- Verify icon files are in `android/app/src/main/res/drawable/`\n- Check that icon names match exactly (case-sensitive)\n- Rebuild the app after adding icons\n\n## Best Practices\n\n1. **Always check availability** before using alarm features:\n\n   ```typescript\n   if (!isAvailable()) {\n     // Handle gracefully\n     return;\n   }\n   ```\n\n2. **Request permission early** in your app flow:\n\n   ```typescript\n   useEffect(() => {\n     requestPermission();\n   }, []);\n   ```\n\n3. **Handle errors gracefully**:\n\n   ```typescript\n   try {\n     await scheduleAlarm({...});\n   } catch (error) {\n     console.error('Failed to schedule alarm:', error);\n     // Show user-friendly error message\n   }\n   ```\n\n4. **Refresh alarm list** after scheduling/canceling:\n\n   ```typescript\n   await scheduleAlarm({...});\n   const updated = await getAlarms();\n   ```\n\n5. **Configure globally** at app startup for consistent styling:\n\n   ```typescript\n   useEffect(() => {\n     configure({\n       android: { accentColor: \"#4CAF50\" },\n       ios: { tintColorHex: \"#007AFF\" },\n     });\n   }, []);\n   ```\n\n6. **Use event listeners** to keep UI in sync with alarm state:\n\n   ```typescript\n   useEffect(() => {\n     const subscription = addAlarmStateChangedListener((state) => {\n       setAlarmState(state);\n     });\n     return () => subscription.remove();\n   }, []);\n   ```\n\n7. **Periodically check states on iOS**:\n   ```typescript\n   useEffect(() => {\n     if (Platform.OS === \"ios\" && available) {\n       const id = setInterval(async () => {\n         await checkAlarmStates();\n       }, 1000);\n       return () => clearInterval(id);\n     }\n   }, [available]);\n   ```\n\n## Example App\n\nA complete example app is available in the `example` folder. It demonstrates:\n\n- Permission handling for both iOS and Android\n- Alarm scheduling and cancellation\n- Timer functionality\n- Event listeners for real-time updates\n- Configuration management\n- UI components for displaying alarm state\n\nTo run the example:\n\n```bash\npnpm install\ncd example\nnpx expo start\n```\n\n## Local Development\n\n### Building the Library\n\n```bash\npnpm build\n```\n\n### Running the Example App\n\n```bash\ncd example\nnpx expo start\n```\n\n## Publishing\n\nMerging to `main` never publishes. To release:\n\n1. Bump `version` in `package.json` in a PR (e.g. `npm version patch --no-git-tag-version`) and merge it\n2. Push the matching tag (`git tag vX.Y.Z && git push origin vX.Y.Z`), or run the \"Publish to npm\" workflow from the Actions tab\n3. The workflow verifies the tag matches `package.json` and the version is not already on npm, publishes via OIDC trusted publishing, and creates the GitHub Release (and tag, when run manually)\n\n## Branch Strategy\n\nSee [BRANCH_STRATEGY.md](.github/BRANCH_STRATEGY.md) for branch workflow and release process.\n\n## Links\n\n- Expo Modules API: [Get started](https://docs.expo.dev/modules/get-started/)\n- Expo Modules API: [Native module tutorial](https://docs.expo.dev/modules/native-module-tutorial/)\n- iOS AlarmKit Documentation: [Apple Developer](https://developer.apple.com/documentation/alarmkit)\n\n## License\n\nMIT\n","readmeFilename":"README.md"}