Repository navigation
Releases
Infans v2.5.0-rc1 (TEST — Summary UI refresh + timer sync fix)
TEST BUILD for the v2.5.0 release. Delete after testing.
Summary UI refresh (approved mock direction):
- Live session card on the home screen (never stops the timer itself — one stop path)
- Status strip: last feed / last diaper / sleep today
- Quick log: 5 one-tap tiles with undo snackbar; diaper opens a bottom sheet
- Plain-language sleep insight vs 7-day average (hides without data)
- All new strings in English + Spanish
Ghost timer sync fix (c946428):
- Timers resurrected after an app restart now force-stop properly when the partner ends the session
- session_ended publish retries once on failure
NOT published to Zapstore. In-app auto-update ignores prereleases — v2.4.3 phones will not see this. Sideload the arm64 APK (Pixel 7 Pro / 10 Pro XL); universal APK for anything else.
Infans v2.4.3
Fixes
- Timers: live sleep/feeding timers no longer vanish when a relay reconnect replays a stale stop event (starter sees the timer die while the partner still sees it running). 60 s clock-skew tolerance + event dedupe.
New
- Spanish localization — full UI translation (505 strings, neutral Latin American Spanish). Android picks the language from system settings; sync keys stay language-stable so mixed-language phones keep syncing.
Improvements
- ~36% smaller download — APKs are now split per CPU architecture; phones get the arm64 build (7.2 MB vs 11.8 MB).
- Room 2.6.1 → 2.8.5, KSP2 build.
Same signing key as always — no re-login or migration needed.
v2.4.2
- QR scanner is fully Google-free: ZXing decodes CameraX YUV directly, ML Kit removed
- Screenshot protection (FLAG_SECURE) on by default, with a Settings toggle — blocks screenshots, screen recording, and recents preview
- Key storage migrated off deprecated EncryptedSharedPreferences to direct AndroidKeyStore AES-256-GCM (one-time automatic migration)
- TLS-only networking: LAN cleartext exception removed
- Target/compile SDK 35 (Android 15)
- Dependency refresh: AGP 8.7.3, Kotlin 2.1.0, Compose BOM 2025.01.00, CameraX 1.4.1, WorkManager 2.10.0
v2.4.1 — Timer & Sync Stability Fixes
Two bug fixes since v2.4.0:
- Fix: sleep timer dying on tab switch — a stale
forceStopTickwas firing on recomposition, stopping running timers when you switched tabs. Timers now survive navigation. - Fix: reconnect after server-initiated websocket close — relays that drop the connection (idle timeout, restart) now trigger a clean reconnect instead of a dead sync until app restart.
No new features. No schema changes. Safe to update in place from v2.4.0.
Infans is a privacy-first baby tracking app with Nostr-based encrypted storage and parent-to-parent sync. No telemetry, no analytics, no tracking.
v2.4.0 - Vaccine Tracker, QR Pairing, Onboarding Wizard
What's New
Features
- Vaccine tracker - Track vaccinations with type, date, next-due date, dose number, notes. New Vaccines tab in Health screen.
- QR code partner pairing - Scan QR to link with other parent. Show My QR displays your code.
- Partner pairing options - Three ways: QR scan, npub paste, NIP-05 paste.
- Frictionless onboarding - Plain-English, one-tap key generation, QR-first pairing.
- Onboarding wizard - 7-page guided flow with progress dots.
- Sleep start/stop times - Cards show start-end range.
- Export npub - Copy npub/NIP-05 to clipboard from Settings.
- Default relay swap - nostr.oxtr.dev replaces relay.primal.net for new users.
- Author tracking - Every entry shows which parent logged it.
- Haptic feedback - Vibration on log buttons, toggle in Settings.
- Key safety warning - Warns that losing key means data loss.
Bug Fixes
- Cross-device timer sync - no more duplicate records
- Sleep trend double-counting - dedup fix
Technical
- DB migrations v4-v5 (authorPubkey) + v5-v6 (vaccines)
- BackupPayload v3-v4 (vaccines)
- New deps: ZXing, CameraX, ML Kit
- CAMERA permission added
v2.3.1 — NIP-44 v2 Spec Compliance
NIP-44 v2 Spec Compliance + Disclaimers
Crypto Fixes (Nip44.kt)
- AES-256-GCM to ChaCha20 + HMAC-SHA256 (RFC 8439)
- Correct 2-phase HKDF: extract salt="nip44-v2", per-message expand info=nonce
- Chunk-based padding with calcPaddedLen
- MAC verification on decrypt with constant-time comparison
- Minimum payload validation (99 bytes / 132 base64 chars)
- ECDH uses raw x-coordinate via BouncyCastle
Tags/Docs
- encrypted tag: "nip44" to "nip44v2"
- README: Medical Disclaimer + Security Notice
- zapstore.yaml: Medical Disclaimer + Security Notice
Tests
- Nip44Test.kt: 19 tests including official spec test vector
Breaking Change
Old backups encrypted with AES-GCM (tag "nip44") will not decrypt with the new NIP-44 v2 implementation. Local Room database is unaffected. A fresh backup will be created on the next export.
v2.3.0 — Cross-Device Live Timer Sync
Live Timer Sync
Start a nap timer on one phone, stop it on the other. Both parents see the running timer in real time.
How it works
- When you start a Sleep or Breast timer, an encrypted ActiveSession event is published to your partner via Nostr (kind 30078, NIP-44 encrypted)
- Your partner phone receives it and shows the timer as running with a Started by partner badge
- Either parent can stop the timer — the stopper creates the record and publishes a session-ended event
- The other parent phone clears the timer automatically
Edge cases handled
- Partner offline at start: timer appears with correct elapsed time on reconnect
- App killed on starter phone: timer still displays on partner phone until stopped
- Simultaneous stop: first event wins, deduped by sessionId
Technical
- New ActiveSession data model (sessionId, label, childId, startTime, startedBy, alarmMinutes)
- BackupService: publishSession/decryptSession/endSession
- NostrManager: StateFlows for remote sessions, relay subscriptions, echo dedup
- LiveTimer: accepts remoteSession, shows partner badge, either-side stop
- No new dependencies, no new permissions, all on existing NIP-44 encryption infrastructure
Version: 2.3.0 (code 51)
v2.2.1 — Release signing for Zapstore
Signed with new release keystore (old one was rotated after accidental commit).
- APK signed with RSA 4096 release key
- Certificate SHA-256: f1b7cbc149675677f527837375b24b8283e8e944ef0bec46c10992b80f32ce90
- versionCode: 50, versionName: 2.2.1
v2.2.0 — Custom relays, bath tracking, activity charts & security fixes
What's New
Custom Relays
- Added a relay editor in Settings — users can now manually set their own relay list instead of relying solely on NIP-65 auto-discovery
- One URL per line, with automatic normalization (bare domain → wss://, https:// → wss://, http:// → ws://)
- Deduplication and validation on apply
- Custom relays are saved and loaded on next launch without needing a NIP-65 fetch
Bath Tracking
- Replaced the redundant Weight quick action on the home screen with a Bath quick action (Weight is still accessible via its bottom-nav tab)
- New Bath screen with three bath types: Full Bath, Sponge Bath, Tub Bath
- Optional note field, today's bath history with edit-time and delete per entry
- Full sync pipeline: baths are included in the encrypted NIP-44 backup payload and restored on partner sync
- Database migration 3→4 (adds baths table, all existing data preserved)
Activity Trend Charts
- Charts screen now has two tabs: Growth and Activity
- Growth tab: the existing WHO weight-for-age chart (unchanged)
- Activity tab: new bar charts with period and metric selectors
- Period options: Daily (7 days), Weekly (8 weeks), Monthly (6 months), Yearly (5 years)
- Metric options: Feedings (count), Sleep (hours), Diapers (count), Baths (count), Pumping (ml total), Weight (entries), Milestones (count), Health Records (count)
- Current period bar is highlighted; empty data shows a placeholder message
- BarChart component extracted to a shared file for reuse
Baby Bottle App Icon
- Replaced the crescent moon icon with a solid baby bottle silhouette (the moon was hard to make out at launcher size)
- Icon background still follows the selected color theme
Bug Fixes
NIP-65 Relay Regression
- Fixed a regression where users could only see hardcoded default relays instead of their NIP-65 relays
- Root cause: the RelayPool always started with hardcoded defaults and relied on a background NIP-65 fetch to reconfigure. The applyIcon() call from the themed-icon feature could cause a process restart, killing the fetch coroutine before it completed
- Fix: relays are now loaded from storage on startup so the pool starts with the correct relays immediately. applyIcon() now runs after initialization completes
Security Fixes
NIP-05 Identifier Leak in logcat
- 5 Log.d/Log.e/Log.w calls were writing full NIP-05 identifiers to Android's system logcat, which can be captured in bug reports or read by apps with READ_LOGS permission
- All 5 now truncate identifiers to 20 characters
- The in-app debug log was already clean (uses truncated identifiers throughout)
JSON Backup Export Warning
- Tapping "Export JSON Backup" now shows a confirmation dialog warning that the file is not encrypted
- Dialog explains the file contains all tracking data in plaintext (child's name, feeding times, sleep logs, notes) but does NOT include the Nostr private key
- Nothing exports until the user explicitly acknowledges
Notes
- APK size: 28 MB (debug, unchanged)
- Zero new dependencies added
- Database version bumped to 4 (migration included)
v2.1.0 — Theme packs, UI polish & themed app icons
What's New
Theme Packs (7 color schemes)
- Material You (system dynamic color, Android 12+)
- Purple (default)
- Ocean Blue
- Forest Green
- Rose Pink
- Sunset Orange
- Teal Mist
Settings → Appearance → Color Theme. Each option shows live color preview swatches.
Themed App Icons
The home-screen icon background now matches your selected theme color. The moon + star foreground stays the same; the background changes. The app restarts when you switch themes (expected — Android requires this to swap launcher icons).
UI Polish
- Gradient hero card on the summary screen
- Color-coded icons: feeding=primary, sleep=tertiary, diaper=secondary
- Card elevation throughout for visual depth
- Gradient bar chart fills
- Icon circles with tinted backgrounds
App Icon
Replaced the default Android Studio smiley face with a crescent moon + star on a night-sky gradient. Clean, minimal, nighttime/calm theme.
Technical
- Zero new dependencies — all theming uses existing Compose Material 3 APIs
- All icons are vector XML (no PNG bloat)
- APK size: 27MB (down from 28MB)
- minSdk 26 (Android 8.0+)