Langsung ke konten
Karya

Produk · Asisten AI

AI Todo

Aplikasi todo & pengingat yang bisa dikelola lewat chat dengan AI maupun manual — satu binary Go dengan SQLite, PWA yang bisa di-install, dan aplikasi menu bar macOS; AI hanya mengusulkan aksi, server yang memvalidasi.

Peran
Full-stack Developer
Durasi
Okt 2026 — Nov 2026
Konteks
Proyek pribadi
Stack
  • Go
  • SQLite
  • Vue 3
  • PWA
  • Web Push
  • Swift
  • AppKit
  • Docker

Masalah

Aplikasi todo memaksa kita mengisi form; asisten chat lupa apa yang kita ceritakan kemarin dan tidak bisa dipercaya menyentuh data. Saya ingin cukup mengetik "besok jam 9 ingetin telpon bengkel, terus tandai beli galon udah" dan semuanya terjadi — di HP dan di Mac — tanpa memberi AI kebebasan penuh atas database.

Konteks

Alat pribadi yang dibuat supaya murah dijalankan di VPS sendiri: hanya model AI gratis, satu server kecil, dan notifikasi di semua perangkat yang saya pakai. Semua yang bisa dilakukan lewat chat juga harus bisa dilakukan manual, supaya aplikasi tetap berguna saat AI mati atau salah.

Solusi

  • Chat sebagai jalan pintas: tambah, ubah, selesaikan, hapus, cari, dan ringkas todo & pengingat dari satu kotak chat. Aksi tampil sebagai kartu dengan tombol Batalkan; hapus dan perubahan massal minta konfirmasi dulu. Perintah garis miring (/todo, /hari-ini, /undo) jalan tanpa AI sama sekali.
  • Manual tetap lengkap: daftar todo dengan tab Hari ini / Akan datang / Tanpa tenggat / Selesai, pencarian, daftar, prioritas, catatan, dan pengingat sekali atau berulang dengan tanggal akhir, jumlah, tunda, dan jeda.
  • Asisten yang mengingat: profil dan catatan (terinspirasi Hermes Agent) dibawa di setiap pesan dan bisa diperiksa, diubah, dan diekspor. Ingatan dipindai sebelum disimpan dan menolak password, PIN, token, nomor kartu, serta pola prompt injection.
  • Notifikasi di mana-mana: Web Push untuk PWA, notifikasi native dengan tombol Selesai / Tunda 10 mnt di Mac, plus ringkasan pagi dan dorongan todo terlambat.
  • Mode admin terpisah: katalog model AI (tes, aktifkan, urutan fallback), persona & batas asisten, AI call log, dan system log — tanpa satu pun endpoint yang bisa membaca todo, chat, atau ingatan pengguna lain.

Arsitektur

Detail lapisan

PWA & aplikasi menu bar Mac

PWA Vue 3 untuk HP, tablet, dan PC (Web Push), plus aplikasi menu bar AppKit dengan badge, centang cepat, panel chat (⌥⌘T), dan notifikasi lokal.

Arsitektur yang disederhanakan — pilih satu lapisan untuk melihatnya.

Tantangan teknis

  • Menjauhkan AI dari database. Model hanya bisa mengusulkan rencana JSON. Server mencocokkan setiap operasi dengan whitelist, memvalidasi bentuknya, menjalankannya lewat fungsi core yang sama dengan form di dalam transaksi, dan mencatat entri undo.
  • Model gratis tidak bisa diandalkan. Klien toleran terhadap balasan aneh, berpindah antar provider sesuai urutan, dan mencatat setiap panggilan keluar supaya admin bisa melihat model mana yang gagal dan kenapa.
  • Jadwal berulang gampang salah. Penjadwal — bukan AI — menghitung setiap kemunculan berikutnya di zona waktu pengguna dan menyimpan waktu dalam UTC, dengan tes untuk rentang jam, akhir bulan, tanggal akhir, dan jumlah.
  • Aplikasi Mac tanpa Mac di CI. Klien HTTP-nya hanya memakai Foundation, jadi diuji di Linux terhadap server Go asli; bagian AppKit dikompilasi dan dirilis oleh workflow GitHub Actions macOS.
  • Deploy yang tidak bisa merusak server. Setiap merge ke main mem-backup database, membangun ulang container, menjalankan health check, dan rollback otomatis kalau gagal.

Dampak

provider AI gratis dengan fallback
3provider AI gratis dengan fallback
jenis jadwal pengingat
6jenis jadwal pengingat
binary + satu berkas SQLite
1binary + satu berkas SQLite

Pelajaran

Perlakukan model bahasa sebagai pengguna dengan keyboard yang sangat cepat, bukan sebagai bagian dari backend: beri ia form yang sama dengan semua orang, buat aksi berbahaya butuh klik manusia, dan buat semuanya bisa dibatalkan. Satu aturan itu membuat sisa desainnya tetap sederhana.

Cuplikan

Aplikasi menu bar Mac, tab Todo: tambah cepat, Hari ini / Semua / Selesai, centang sekali klik. Ilustrasi berdasarkan tata letak AppKit aplikasinya.
Tab Chat (⌥⌘T) dalam mode gelap: aksi tampil sebagai kartu dengan tombol Batalkan. Ilustrasi berdasarkan tata letak AppKit aplikasinya.
Chat dengan saya