Your AI-powered daily routine voice assistant
Each block of your day gets announced via ElevenLabs TTS with custom AI motivation. Because your schedule deserves a voice.
![]() |
![]() |
![]() |
| Dashboard animated banner | Schedule editor | Language selector |
- AI Voice Announcements — each block transition triggers a unique ElevenLabs TTS message
- Visual Schedule Editor — TUI with intuitive time picker (arrow keys, Tab to cycle fields)
- 100+ Languages — extensive voice language selector for ElevenLabs
- Kurox Theme — purple (
#A78BFA) x green (#86EFAC) on dark terminal - systemd Timer Integration — runs headless via OpenCode, survives reboots
- Desktop Notifications — fallback
notify-sendwhen TTS is unavailable - TUI + Headless — configure visually or edit files directly
- Auto-resume — announces the last block on boot if you missed it
# with your favorite AUR helper
yay -S echoroutine
# or manually
git clone https://aur.archlinux.org/echoroutine.git
cd echoroutine
makepkg -siThen enable the timer:
systemctl --user daemon-reload
systemctl --user enable --now block-announcer.timer
loginctl enable-linger $USER| Dependency | Why | Install |
|---|---|---|
| OpenCode | Headless AI runner for announcements | anomalyco/opencode |
| elevenlabs-mcp-tts | ElevenLabs TTS voice engine | git clone + setup |
notify-send |
Desktop notifications (libnotify) | sudo pacman -S libnotify |
systemd |
Timer service (user mode) | Built-in on Arch |
go |
Build the TUI | sudo pacman -S go |
git clone https://github.com/kurojs/schedule-announcer
cd schedule-announcer
./install.shsystemctl --user daemon-reload
systemctl --user enable --now block-announcer.timer
loginctl enable-linger $USERRun echoroutine to launch the TUI configuration dashboard:
╔══════════════════════════════════════╗
║ EchoRoutine ║ animated color pulse
║ Your AI-powered daily voice ║
╚══════════════════════════════════════╝
● Schedule: Active (7 blocks)
○ Language: English
● Voice: Configured
◉ Next: 14:00 — Nihongo study
▸ Edit Schedule
Settings
Install / Manage
About
Exit
| Screen | What you can do |
|---|---|
| Dashboard | See status at a glance, navigate to other screens |
| Edit Schedule | Add/edit/delete blocks. Arrows change hour/minute, Tab cycles fields |
| Settings | Pick language, check ElevenLabs MCP status |
| Install / Manage | Install service, pause/resume announcements |
| About | Dependencies, version info |
Edit ~/.config/echoroutine/schedule.txt directly or use the TUI:
# EchoRoutine — Daily Schedule
# Format: HH:MM Label
07:00 Morning Routine
09:00 Deep Work
12:00 Lunch Break
14:00 Nihongo Study
16:00 Project Work
18:00 Exercise
20:00 Evening Wind-down
Times are in 24h format. Blocks are announced in order. No overlapping times.
Pick from 100+ ElevenLabs-supported languages in the TUI Settings, or:
echo "Japanese - ja-JP" > ~/.config/echoroutine/language.txtAny language string ElevenLabs supports works — English, Japanese, Korean, French, and more.
+------------------+
| systemd timer | runs every minute
| (headless mode) |
+--------+---------+
|
+--------v---------+
| block-announcer | bash trigger script
| (Bash + flock) |
+--------+---------+
|
+-------------+-------------+
| | |
+--------v---+ +------v------+ |
| OpenCode | | notify-send | |
| + MCP | | (fallback) | |
+--------+---+ +-------------+ |
| |
+--------v---+ +-------v-------+
| ElevenLabs | | EchoRoutine |
| TTS Voice | | TUI (config) |
+------------+ +---------------+
The headless AI runner that generates daily motivation. EchoRoutine injects your current block into OpenCode's context and gets back a unique, contextual announcement — not the same canned message every day.
Kuro's MCP server that bridges OpenCode with ElevenLabs text-to-speech. Turns AI text into natural-sounding voice in any supported language.
- Try it: Run
block-announcermanually to hear your first announcement - Edit schedule: The TUI editor is the easiest way, but
schedule.txtis plain text - Debug timer:
systemctl --user status block-announcer.timer - Logs:
journalctl --user -u block-announcer.service -f
MIT (c) kurojs


