Add YYYY-MM-DD date parameter to /set endpoint. When provided, the alarm
fires at the exact date instead of the next occurrence of hour:minute.
- AlarmEntity: add nullable date column
- AlarmDatabase: bump to version 2, add migration 1→2
- AppModule: register migration
- KtorService: parse date, validate it's not in the past
- MainViewModel: accept optional date in createAlarm()
- README: document new date parameter
Saves the last fired alarm (hour, minute, label, timestamp) to
SharedPreferences when an alarm fires. New GET /last-alarm endpoint
returns the last alarm info or 404 if none has fired yet.
- Enable R8 minification and resource shrinking for release builds
- Add ProGuard keep rules for Ktor, kotlinx.serialization, Room
- Validate hour/minute range in POST /set endpoint
- Guard wake lock release on server start failure
- Remove unused template colors from colors.xml
- Rewrite README with curl examples, security note, troubleshooting
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
AlarmReceiver was calling startActivity() directly, which Android 10+
blocks from background. Now delegates to AlarmRingService which uses a
foreground notification with full-screen intent. Removed duplicate
sound/vibration from AlarmActivity (service owns playback). Removed
all vibration code and VIBRATE permission.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Android alarm clock with embedded Ktor HTTP server for remote control.
Features in-app and HTTP API alarm management, full-screen alarm activity
with sound/vibration, DND bypass, boot persistence, and dark Material 3 UI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>