Studi Kasus

NeuroPlan — penjadwal harian

Bot Telegram yang menjadwalkan, memantau, dan mengingatkan aktivitas harian — lengkap dengan jatah waktu per kategori. Ditulis sebagai saudara Cashflow Tracker: kalau yang satu menjaga uang, yang ini menjaga waktu.

Peran
Perancang & pengembang tunggal
Status
Berjalan di produksi
Lingkup
Bot, penjadwal, basis data, sinkron kalender
Kode
Repo privat
Kenapa tidak ada tautan demo? Bot ini terikat ke satu token Telegram dan satu basis data berisi jadwal pribadi saya. Membuka aksesnya untuk umum berarti membuka agenda saya sendiri. Halaman ini menggantikannya.

Masalah yang diselesaikan

Aplikasi pengatur jadwal menuntut ritual yang sama tiap kali: buka aplikasi, tekan tambah, isi judul, pilih tanggal, pilih jam, pilih kategori, simpan. Tujuh langkah untuk satu baris niat. Akibatnya jadwal hanya rapi di minggu pertama.

Masalah keduanya lebih halus: aplikasi seperti itu mencatat rencana, tapi tidak pernah menagih realisasinya. Tidak ada yang bertanya “tadi pagi kamu janji mengerjakan ini — jadi?”

Jadi NeuroPlan dibalik arahnya. Cukup ketik rapat klien besok 14:00 #kerja !penting ke Telegram, dan bot yang menguraikannya. Lalu tiap malam ia membandingkan yang dijanjikan pagi dengan yang benar-benar terjadi.

Arsitektur

Satu bot, satu penjadwal persisten, satu basis data bersama.

  Ketikan bebas ──►  parsing.py
                       │
                       ├─ dateparser  (waktu numerik — gratis)
                       └─ Claude Haiku (frasa sehari-hari, berulang,
                          ±$0,001/panggilan   rentang tanggal)
                       │
                       ▼
     models.py ──► SQLite (WAL)  ◄── prefiks np_ , satu DB
        │            np_tasks, np_occurrences,         dengan
        │            np_apscheduler_jobs           cashflow-tracker
        ▼
   scheduler.py  APScheduler persisten
        │        rebuild_jobs_from_db() saat start
        ▼
   Telegram  ◄──►  Google Calendar (dua arah, opsional)

Parser hybrid, bukan AI untuk semua

Waktu numerik sederhana diurai gratis oleh dateparser. Hanya frasa sehari-hari, tugas berulang, dan rentang tanggal yang dikirim ke Claude Haiku. Kalau AI bermasalah, bot berterus terang dan tetap menerima format eksplisit.

Penjadwal yang tahan mati listrik

Sumber kebenaran ada di tabel sendiri, bukan di jobstore. Saat bot menyala, rebuild_jobs_from_db() memasang ulang semua pengingat yang belum terkirim — restart dan deploy tidak menghilangkan apa pun.

Satu basis data, dua bot

Semua tabelnya diberi prefiks np_ supaya bisa menumpang basis data yang sama dengan Cashflow Tracker tanpa bentrok nama — membuka jalan untuk rekap gabungan waktu dan uang lewat satu query.

Angka yang bisa diperiksa

24/7Berjalan di produksi
3Tahap pengingat per tugas
9Mode kegagalan yang ditangani
±$0,001Biaya AI per penguraian

Cara memakainya

Tidak ada formulir. Ketik seperti bicara.

N NeuroPlan bot penjadwal harian · Telegram

olahraga tiap hari jam 6 pagi

Tugas berulang dicatat. Occurrence dicetak otomatis tiap hari, pengingat dipasang H-1, 1 jam sebelum, dan saat mulai.

daftar beasiswa 10-15 agustus

Tugas bertenggat. Diingatkan tiap hari sampai tanggal 15, dan berhenti begitu ditandai selesai sekali.

Penanda #kategori dan !penting dikenali langsung dari kalimat.

Keputusan yang paling menentukan

Biaya

AI hanya untuk yang memang sulit

Mengirim tiap ketikan ke model bahasa itu boros — padahal mayoritas masukan berbentuk 14:00 atau besok jam 2, yang bisa diurai pustaka biasa tanpa biaya sepeser pun.

Parser lokal dijalankan lebih dulu; Claude Haiku hanya dipanggil untuk frasa sehari-hari, tugas berulang, dan rentang tanggal. Biayanya jadi mengikuti jumlah kalimat rumit, bukan jumlah pesan.

Ketahanan

Jobstore bukan sumber kebenaran

Menyimpan pengingat hanya di dalam penjadwal terasa praktis sampai prosesnya mati. Sekali restart, semua yang belum terkirim ikut hilang tanpa jejak — dan pengguna baru sadar ketika sudah terlewat.

Pengingat disimpan di tabel sendiri, dan penjadwal dibangun ulang dari basis data tiap kali bot menyala. Yang telat ≤30 menit tetap dikirim berlabel “(terlambat)”; yang basi diserahkan ke pendeteksi tugas terlewat.

Perilaku

Pengingat yang belajar berhenti

Pengingat yang selalu diabaikan bukan cuma tidak berguna — ia melatih pengguna mengabaikan semua notifikasi, termasuk yang penting.

Tiap minggu sistem memeriksa tahap mana yang diabaikan ≥80% (minimal 5×) lalu mematikannya sendiri. Satu pengecualian: tahap “saat mulai” tidak pernah dimatikan, karena jamnya dipilih pengguna sendiri.

Jujur soal batas

Membedakan “dilewati” dari “lalai”

Tombol Skip memutus streak, sama seperti tugas yang terlewat — tapi keduanya dicatat berbeda. Melewatkan dengan sadar bukan kegagalan yang sama dengan lupa.

Rekap malam juga memisahkan tugas dadakan dari yang dijanjikan pagi, supaya skor komitmennya tidak kabur oleh pekerjaan yang memang tidak direncanakan.

Teknologi

Bot & inti
  • Python
  • python-telegram-bot
  • SQLAlchemy
Penjadwalan
  • APScheduler
  • Jobstore persisten
  • RRULE
AI
  • Claude Haiku
  • dateparser
  • Parser hybrid
Data
  • SQLite (WAL)
  • PostgreSQL
  • Migrasi otomatis
Integrasi
  • Google Calendar API
  • OAuth
  • Sinkron dua arah

Yang saya bawa dari proyek ini

Membangun sesuatu yang menagih janji saya sendiri ternyata pelajaran desain yang keras. Sistem yang terlalu cerewet akan diabaikan, sistem yang terlalu diam akan dilupakan — dan menemukan titik di antaranya tidak bisa ditebak dari awal, hanya bisa diukur dari kebiasaan sendiri.