bugra akdemir
yazılar

memo: tamamen yerel çalışan bir AI asistanı inşa etmek

20 Temmuz 2026

2026'nın başında kendime bir soru sordum: "AI'ın bütün verilerim hakkında bilmesi için bulutta hesap açmak şart mı?" Cevabım memo oldu — 1200'den fazla commit ile bugüne kadar yaptığım en büyük proje.

Mimari karar

memo'nun omurgası iki parça:

  • Go backend — sesi işle, agent'ları çalıştır, dosyalarla konuş.
  • Flutter frontend — masaüstü arayüz, sesli sohbet, hafıza görünümü.

İnference tarafında llama.cpp kullanıyorum. Yani model, aynı diziboardda, internet olmadan çalışıyor. RAG tarafında sqlite-vec ile cümle benzerliği araması yapıyorum — belgelerim ve geçmiş mesajlarım tamamen yerelde.

// Go tarafında örnek: yerel modeli başlatmak
lm := llama.New("models/qwen-3b-q4.gguf")
reply, err := lm.Chat("Bugün bana ne yaptıracağız?")

Voice tarafı

Projenin en zor kısmı sesli sohbet oldu:

  • VAD — sessizliği tespit et, konuşma bitince cevap ver.
  • Barge-in — konuşurken seni kesip üstte senin sesinin daha mı kısa dinlemesi gerektiğini anla.
  • AEC (akustik echo iptali) — hoparlörden çıkan sesin mikrofona geri dönmesini matematikle temizle.

Bu üçü birleşince "canlı bir konuşma" hissi ortaya çıkıyor. Arka planda Piper (yerel TTS) ile konuşma üretiyor.

Ne öğretti?

  1. Local-first bir felsefe değil, teknik karar. Veri yönetimi, model boyutu ve gecikme — hepsi bulutsuz çalışmanın baskısıyla şekilleniyor.
  2. Conventional commits gerçekten işe yarıyor. feat(voice): barge-in gibi mesajlar 1203 commit'lik geçmişi gezilebilir tutuyor.
  3. Test kültürü: 114+ Flutter test ve Go suite — voice gibi zaman odaklı işlerin test package bazında koşulması şart.

memo'nun her şey açık kaynak: github.com/BugraAkdemir/memo. Kurup sormak isterseniz bağlantı orada.