
Tüm Memo verileri diskinizde yaşar — bulut senkronizasyonunu siz etkinleştirmedikçe hiçbir şey uzaktan depolanmaz. Veri katmanı, yapılandırılmış veriler için SQLite ve yapılandırma için JSON/YAML kullanır.
data/
├── memory/
│ └── memory.db # RAG vektör deposu (SQLite + sqlite-vec + FTS5)
├── sessions/
│ └── sessions.db # Sohbet geçmişi, oturum üst verisi
├── models/
│ ├── downloaded/ # GGUF model dosyaları
│ └── model-cache.json # İndirme kataloğu önbelleği
├── providers.json # Harici sağlayıcı yapılandırmaları (API anahtarları şifreli)
├── orchestra.json # Orkestra modu rol atamaları
├── permissions.json # Ajan aracı izin politikaları
├── calendar/
│ └── calendar.db # Etkinlikler, hatırlatıcılar, tekrarlama kuralları
├── whatsapp/
│ ├── whatsapp.db # Mesajlar, kişiler, sohbet üst verisi
│ └── media/ # Önbelleğe alınmış profil fotoğrafları ve medya
├── mood/
│ └── mood.db # Duygu motoru durumu
├── proactive/
│ └── proactive.db # Niyet geçmişi, alışkanlıklar, öğrenme durumu
├── routines/ # Rutin tanımları (JSON) — zamanlama, prompt/agent yükü, saat dilimi offset'i
├── tasklists/ # Otonom görev döngüsü listeleri (JSON)
├── stats/ # Kalıcı LLM kullanım olayları (Ayarlar → İstatistikler)
├── agent-backups/ # Ajanın dosya-düzenleme güvenlik anlık görüntüleri
├── profile/ # Öğrenilen zaman örüntüleri, bekleyen proaktif öneriler
├── permissions.json # Ajan araç izin politikaları
├── skills/ # Yüklenmiş beceri SKILL.md dosyaları
│ └── <beceri-adı>/
│ └── SKILL.md
├── cloudsync/
│ └── sync-state.json # Son senkronizasyon zaman damgası, dosya hash'leri
├── config/
│ └── config.yaml # Çalışma zamanı yapılandırması (config/ kopyası)
├── identity/
│ ├── system-prompt.yaml # Aktif kişilik tanımı
│ └── incognito-prompt.yaml # Gizli mod kişiliği
├── machine.key # Donanımdan türetilmiş şifreleme anahtarı (0600)
└── backups/ # Manuel .memo arşiv dışa aktarımları
v3.3.3 öncesinde.memoyedeklemesi yalnızcasessions/,providers.json,orchestra.json,memory/,whatsapp/,mood/dizinlerini içeriyordu — takvim,profile/,routines/,tasklists/,stats/,agent-backups/,skills/,permissions.jsonve en kritik olarakmachine.key(providers.json'daki şifreli API anahtarlarını çözen anahtar) yedeğe hiç girmiyordu. Artık hepsi dahil —models/hariç, o zaten ayrı bir seçenekle isteğe bağlı. Bilinçli olarak hâlâ hariç: cihaza özel Drive senkron imleci (sync_token.json), makineye özel tsnet kimliği ve yedeklemenin kendi anlık görüntü dizini (backups/).
Tüm ilişkisel ve vektör verileri için birincil depolama motoru:
-- Hafıza deposu şeması
CREATE TABLE memories (
id TEXT PRIMARY KEY,
content TEXT NOT NULL,
timestamp DATETIME NOT NULL,
importance INTEGER DEFAULT 1,
retrieval_count INTEGER DEFAULT 0,
pinned INTEGER DEFAULT 0,
soft_deleted INTEGER DEFAULT 0,
deleted_at DATETIME
);
CREATE VIRTUAL TABLE memory_vec USING vec0(
embedding FLOAT[768],
chunk TEXT
);
CREATE VIRTUAL TABLE memory_fts USING fts5(
content,
tokenize='unicode61'
);
vec0, nicemleme ile yaklaşık en yakın komşu (ANN) araması için sqlite-vec'in sanal tablosudur. Kosinüs uzaklığı ile O(log n) vektör benzerlik sorguları sağlar.
FTS5, doğru Unicode kelime sınırı işleme için unicode61 belirteçleyicisi ile anahtar kelime düzeyinde arama sağlar.
Yapılandırma ve hafif durum:
// providers.json
{
"providers": {
"openai": {
"enabled": true,
"api_key_encrypted": "AES256:GCM:base64...",
"model": "gpt-4o",
"context_window": 128000,
"priority": 1
},
"claude": {
"enabled": true,
"api_key_encrypted": "AES256:GCM:base64...",
"model": "claude-sonnet-4-20250514",
"context_window": 200000,
"priority": 2
}
}
}
API anahtarları, data/machine.key dosyasından türetilen bir anahtar kullanılarak AES-256-GCM ile şifrelenir:
// internal/encryption/crypto.go
func Encrypt(plaintext []byte, key []byte) ([]byte, error) {
// Rastgele 12 bayt nonce ile AES-256-GCM
// Çıktı formatı: nonce || ciphertext || tag
}
func Decrypt(ciphertext []byte, key []byte) ([]byte, error) {
// Tag'i doğrula, yerinde şifre çöz
}
# config/config.yaml
user_name: "Buğra"
assistant_name: "Memo"
language: "tr"
theme: "pewter"
memory_enabled: true
web_search_mode: true
embedding_model: "nomic-embed-text-v1.5"
max_memory_results: 10
cloud_sync_interval: 50
reminder_lead_time_minutes: 15
Yapılandırma yazmaları, çökme durumunda bozulmayı önlemek için atomik geçici dosya + yeniden adlandırma kullanır.
RAG hafıza deposu tembel yükleme yaklaşımı kullanır:
10.000 girişlik bir hafıza tabanı yaklaşık olarak şunu tüketir:
Sohbet oturumları sayfalandırılmıştır. Sadece aktif oturumun son mesajları (son 100) bellekte tutulur. Eski mesajlar kaydırma sırasında SQLite'tan isteğe bağlı olarak getirilir.
GGUF model dosyaları diskte normal dosyalar olarak saklanır. Çıkarım sırasında llama.cpp tarafından bellek eşlemeli olarak kullanılırlar — yalnızca aktif olarak hesaplanan katmanlar RAM'i işgal eder. GPU'ya yüklenen katmanlar VRAM'de bulunur.
Tüm yapılandırma ve veri dosyaları atomik yazma işlemleri kullanır:
// Kod tabanında kullanılan desen
func AtomicWrite(path string, data []byte) error {
tmp := path + ".tmp"
if err := os.WriteFile(tmp, data, 0600); err != nil {
return err
}
return os.Rename(tmp, path)
}
Dışa aktarmalar ve bulut senkronizasyonundan önce, bir WAL checkpoint bekleyen yazmaları temizler:
db.Exec("PRAGMA wal_checkpoint(TRUNCATE)")
Hafıza içe aktarmaları geçici dosya + atomik yeniden adlandırma kullanır. İçe aktarma sırasında orijinal veritabanı asla yerinde değiştirilmez. Bu, içe aktarma kesintiye uğrarsa bozulmayı önler.
data/machine.key, veri silme yolunun dışında saklanır. Fabrika ayarlarına döndürme tüm kullanıcı verilerini temizler ancak şifreleme anahtarını korur — bulut yedekleme erişiminin kalıcı olarak kaybedilmesini önler.
SQLite yazmaları kanal tabanlı bir kuyruk aracılığıyla serileştirilir:
// internal/database/db.go
type DB struct {
Write chan func(*sql.DB) // Serileştirilmiş yazma kuyruğu
Read *sql.DB // Eşzamanlı okumalar
}
func (db *DB) Init(path string) error {
db.Read, _ = sql.Open("sqlite3", path)
db.Read.Exec("PRAGMA journal_mode=WAL")
db.Write = make(chan func(*sql.DB), 100)
go func() {
for fn := range db.Write {
fn(db.Read)
}
}()
}
Bu, hiçbir iki goroutine'in aynı anda yazma yapmamasını sağlar, eşzamanlı okumalara izin verirken database is locked hatalarını önler.
.memo dışa aktarımı şunları içeren bir ZIP dosyasıdır:
export.memo
├── memory.db # RAG vektör deposu
├── sessions.db # Sohbet geçmişi
├── calendar.db # Etkinlikler ve hatırlatıcılar
├── whatsapp.db # Mesajlar ve kişiler
├── mood.db # Duygu motoru durumu
├── proactive.db # Öğrenme geçmişi
├── profile/ # Öğrenilen zaman örüntüleri, bekleyen öneriler
├── routines/ # Rutin tanımları
├── tasklists/ # Görev döngüsü listeleri
├── stats/ # Kullanım istatistikleri
├── agent-backups/ # Ajan dosya-düzenleme güvenlik anlık görüntüleri
├── skills/ # Yüklenmiş beceriler
├── providers.json.enc # Şifreli sağlayıcı yapılandırmaları
├── orchestra.json # Orkestra yapılandırması
├── permissions.json # Ajan izinleri
├── config.yaml # Uygulama yapılandırması
├── system-prompt.yaml # Kimlik tanımı
└── machine.key # Şifreleme anahtarı — v3.3.3'ten itibaren her zaman dahil
Bulut yedeklemeleri, kullanıcı parolasından PBKDF2 (600.000 yineleme) anahtar türetme kullanarak her dosyayı AES-256-GCM ile ayrı ayrı şifreler. Parola olmadan, anahtarsız otomatik şifreleme için makine anahtarı kullanılır.
Şifreli bloklar Google Drive'da gizli bir memo-backup klasörüne yüklenir. Senkronizasyon durum dosyası (sync-state.json), hangi dosyaların senkronize edildiğini ve gereksiz yüklemeleri önlemek için sağlama toplamlarını takip eder.