Skip to main content

A thread-safe, persistent, dual-mode CLI Alarm Clock

Project description

⏰ Command-Line Interface (CLI) Alarm Clock

A professional, robust, and zero-dependency Command-Line Interface (CLI) Alarm Clock written in Python. It runs natively and works seamlessly on both Windows and Linux.

Designed with Clean Architecture and Unix-style CLI daemon patterns, the application supports:

  1. Interactive Shell Mode: A fully interactive console screen with a live ticking clock header and dynamic command prompt.
  2. Daemon Mode: Run the background sound and time monitor (alarm-clock daemon).
  3. OS-Native Task Mode (Zero Manual Daemon): Alarms automatically register with the operating system scheduler (Windows Task Scheduler via schtasks or Linux via crontab). When the time is reached, the OS automatically pops up a terminal instance to play sound and accept user inputs.

✨ Features

  • Global CLI command integration: Can be installed and executed globally as alarm-clock in the system shell.
  • Dual Sound Alert Modes:
    • Background Python daemon checks system time and plays sound.
    • OS-native schedulers trigger short-lived processes to ring.
  • OS-Native Task Automation:
    • Windows: Creates user-level tasks using schtasks with automatic date fallback mechanisms for locale compatibility (dd/mm/yyyy vs mm/dd/yyyy).
    • Linux: Appends entries programmatically to the user's crontab.
  • Atomic File Writing: Prevents state corruption by writing changes to a temporary file before atomically swapping it with the target database file (~/.cli_alarms.json).
  • Thread-Safe Memory Lock: Synchronizes all database reads and writes under a shared mutex lock to isolate background checks from user adjustments.
  • Automatic Encoding Fallback: Prevents crashes on legacy Windows cmd consoles that default to non-Unicode codepages (e.g., CP1252) by automatically replacing emojis with safe fallback indicators.
  • Cross-Platform Audio alerts:
    • Windows: Uses native winsound.Beep.
    • Linux/macOS: Uses terminal buzzer beeps (\a).
  • Flexible Alarm Operations: add, list, remove, snooze, and dismiss.
    • Supports setting an alarm-specific default snooze limit (--snooze-minutes) which is automatically respected if no snooze duration is entered during rings.

🛠️ Architecture & Design Decisions

               ┌───────────────────────┐
               │    Local CLI Shell    │
               │ (Direct Single-Cmds)  │
               └───────────┬───────────┘
                           │ Writes/Reads
                           ▼
               ┌───────────────────────┐
               │  ~/.cli_alarms.json   │◄─── (Atomic State DB)
               └───────────────────────┘
                           ▲
                           │ Reads/Updates State
                           ▼
 ┌───────────────────────────────────────────────────────────┐
 │                   Background Daemon Mode                  │
 │                                                           │
 │  ┌───────────────────────┐       ┌─────────────────────┐  │
 │  │   Scheduler Thread    ├──────►│ Sound Loop Thread   │  │
 │  │ (Monitors System Time)│       │ (Non-blocking Beep) │  │
 │  └───────────────────────┘       └─────────────────────┘  │
 └───────────────────────────────────────────────────────────┘
                           ▲
                           │ Triggers Subprocess Ring Command
                           ▼
 ┌───────────────────────────────────────────────────────────┐
 │                  OS-Scheduled Task Mode                   │
 │                                                           │
 │  ┌────────────────────────┐       ┌────────────────────┐  │
 │  │ Windows Task Scheduler ├──────►│ alarm-clock ring   │  │
 │  │       / Linux Cron     │       │ (Terminal Pop-Up)  │  │
 │  └────────────────────────┘       └────────────────────┘  │
 └───────────────────────────────────────────────────────────┘

🚀 Getting Started

1. Installation

To register the alarm-clock terminal command, install the package locally from the root workspace directory.

On Windows (without requiring admin privileges):

pip install --user -e .

Note: Make sure your user script folder (e.g. C:\Users\<username>\AppData\Roaming\Python\Python312\Scripts) is in your system's PATH. If it's not, you can run the executable directly by targeting its path, or use python -m alarm_clock.cli.

On Linux / macOS:

pip install -e .

2. Running Unit Tests

A comprehensive test suite is included in /tests covering the parser, models, scheduler, serialization, persistence, and OS scheduler triggers. Run it with:

python -m unittest discover -s tests

🕹️ Command Reference

Option A: OS-Native Mode (Recommended - Zero Manual Daemon)

When you add an alarm, it is registered automatically with the operating system.

  1. Add an alarm:
    alarm-clock add 07:30 "Wake Up" --snooze-minutes 8 --auto-dismiss 30
    
  2. List alarms:
    alarm-clock list
    
  3. When the time is reached, the operating system launches a terminal window automatically, starts beep-beeping, and prompts you:
    Press Enter to dismiss, or type 'snooze' to snooze:
    
    If you type snooze, it automatically snoozes for 8 minutes (respecting the custom snooze parameter).
  4. Remove an alarm (cleans it up from both disk and OS task registries):
    alarm-clock remove 1
    

Option B: Daemon Mode (Manual Persistent Process)

  1. Start the monitor daemon (run this in a separate terminal window or pane to play sound when alarms go off):
    alarm-clock daemon
    
  2. Snooze/Dismiss from your main terminal:
    alarm-clock snooze 1 10
    alarm-clock dismiss 1
    

Option C: Interactive Shell Mode

If you run alarm-clock without any arguments, it launches a persistent, interactive console session. It manages its own background timing thread and audio loops automatically in a single terminal.

alarm-clock

Inside the interactive session, the prompt updates live and you can type sub-commands like add, list, snooze, dismiss, and exit directly:

(22:15:30) alarm-clock > add 07:30 Morning Workout
Success: Created Alarm 1 for 07:30 ('Morning Workout')

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

alarmy_cli-1.0.2.tar.gz (23.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

alarmy_cli-1.0.2-py3-none-any.whl (24.8 kB view details)

Uploaded Python 3

File details

Details for the file alarmy_cli-1.0.2.tar.gz.

File metadata

  • Download URL: alarmy_cli-1.0.2.tar.gz
  • Upload date:
  • Size: 23.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for alarmy_cli-1.0.2.tar.gz
Algorithm Hash digest
SHA256 fe0c67e64014813a4d8548571cd8e7d4cd31fd4c0f9c69435c29dd2632e1325a
MD5 1c6ac343fd3c83d308108e6d5a6b5c60
BLAKE2b-256 b2b73d516e6166cb5f58c2bfa1bd295a03fa76d9fd860ca7265aba67053bddca

See more details on using hashes here.

Provenance

The following attestation bundles were made for alarmy_cli-1.0.2.tar.gz:

Publisher: publish.yml on Ramanshu-1216/alarmy-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alarmy_cli-1.0.2-py3-none-any.whl.

File metadata

  • Download URL: alarmy_cli-1.0.2-py3-none-any.whl
  • Upload date:
  • Size: 24.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for alarmy_cli-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 9ef07c77b2be66b11f5a3cad691d697a4bb8b37420af3d0464dbd0514d677f65
MD5 59133fb1bff8aa9a21a064b1f1c91333
BLAKE2b-256 4e156c3581ea933862cc6412367be1c03a99d459594bf9e4c9146e3d86e80e3c

See more details on using hashes here.

Provenance

The following attestation bundles were made for alarmy_cli-1.0.2-py3-none-any.whl:

Publisher: publish.yml on Ramanshu-1216/alarmy-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page