No description
  • Dart 88.1%
  • C++ 3.9%
  • Python 3.7%
  • CMake 2.9%
  • Just 0.5%
  • Other 0.9%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-08-16 16:41:43 +02:00
android feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
assets feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
fonts feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
ios feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
lib feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
linux feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
macos feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
test feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
tool feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
web feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
windows feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
.gitignore feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
.metadata feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
analysis_options.yaml feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
firebase.json feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
justfile feat: move the justfile 2026-08-16 16:41:43 +02:00
LICENSE feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
PRIVACY_POLICY.md feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
pubspec.lock feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
pubspec.yaml feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00
README.md feat: transfer project from monorepo (loss of history) 2026-08-16 16:38:35 +02:00

SoftWakeup

A morning alarm for people who cannot wake up easily — gentle to wake to, impossible to sleep through.

Most alarms start the day with a small heart attack: a brutal ring, a rushed hand hunting the snooze button, guilt, repeat. SoftWakeup is built for heavy sleepers and serial snoozers, and takes another path: instead of dragging you out of sleep, it carries you out of it.

Screenshots

Home — your mornings at a glance Better alarm — the soft wake-up editor
Home screen Better alarm editor

The idea: a cocoon, not a siren

Well before the real alarm, SoftWakeup starts a soft wake-up: gentle audio — birdsong, breeze, soft chimes, or a sound of your own — played quietly, without repeating, requiring nothing from you. No button to press, no decision to make half-asleep. You hear it, you drift, you surface. Your body learns that morning is approaching, and when the firm alarm finally rings, you are already halfway awake.

And even your snooze is part of the plan instead of a defeat: the wake-up returns at a gentle cadence, a little firmer each time, until you are up.

A "Better alarm", at a glance

  • Wake-up time — the deadline. The firm alarm that always rings.
  • Soft wake-up — begins as many minutes before as you choose, with gentle audio that plays on its own. No user intervention needed.
  • Snooze cadence — the soft sequence repeats at that interval with a crescendo across iterations, up to the normal alarm.
  • Repeats — once, on chosen weekdays, or every day.

Everything is resolved when the alarm is armed, and the operating system itself owns every step of the morning — the sequence plays even if the app is not running.

Prefer it plain? A Simple alarm — one time, flat identical snoozes — is always available.

Your morning, your sounds

  • A bundled ringtone library for the firm alarm and the soft wake-up, with tap-to-preview.
  • Import your own audio: any sound on your device can become a wake-up voice, kept in the app's private library.
  • Per-alarm and per-step volume, gentle ramps, and a cross-iteration crescendo.
  • Labels, an on/off switch per alarm, and a "next ring" hint on every card.

Reliable by design

SoftWakeup has one rule that outranks all others: the alarm rings, always.

  • The OS schedules everything. On Android and iOS the wake-up chain is handed to the operating system's own scheduler — never to an in-app timer. Android rings with the app killed, the screen locked and under Doze, and re-arms after reboot.
  • The ring path needs nothing. Every sound, volume and step is resolved at arm time and travels with the alarm; there is nothing to look up — and therefore nothing to fail — at ring time.
  • Never silent. If an imported audio file is missing, the alarm falls back to a bundled tone. A missing file is never a silent morning.
  • Stopping is deliberate. Swiping the app away while it rings does not silence it; only a conscious action — the ring screen or the notification's Stop/Snooze — ends the ringing.
  • Self-healing. On start, SoftWakeup reconciles itself with the OS scheduler and re-arms anything the OS lost.

Platform honesty: iOS may refuse to ring a force-killed app — an OS constraint, not a bug. In that state SoftWakeup still rings with a bundled notification tone. Android has no such constraint.

Platforms

  • Android — the full experience; rings even when the app is not running.
  • iOS — full experience while the app is alive; best-effort bundled notification tone when force-killed (OS constraint).
  • Linux — a desktop companion for development; rings only while the app is open.

Under the hood

Built with Flutter and organised by domain-driven design: a pure-Dart domain (alarms, wake-up chains, repeat rules), one use case per file in the application layer, and platform adapters (OS scheduler, storage, audio) behind ports. The ring path is deliberately boring: everything an alarm needs is resolved at arm time, and the test suite doubles as the executable specification of the behaviour described above.

Build it yourself

SoftWakeup is a standard Flutter project (in soft_wakeup/):

cd soft_wakeup
flutter pub get
flutter run                # any connected device or desktop target

Release builds:

flutter build apk          # Android
flutter build ios          # iOS (requires macOS + Xcode)
flutter build linux        # Linux desktop companion

Prerequisites: the Flutter stable channel plus the usual toolchain for each target (Android SDK, Xcode, or a Linux desktop toolchain). The Linux target additionally needs the GStreamer development headers (libgstreamer1.0-dev, libgstreamer-plugins-base1.0-dev).

Quality gate: flutter test — the tests are the specification — and flutter analyze.

Contributing

Ideas and patches are welcome. Open an issue before crafting a pull request so the direction can be discussed first; reliability-affecting changes in particular must fit the "the alarm rings, always" rule.

License

GPL-3.0 — see LICENSE.