█████╗ ██╗ ████████╗███████╗██████╗
██╔══██╗██║ ╚══██╔══╝██╔════╝██╔══██╗
███████║██║ ██║ █████╗ ██████╔╝
██╔══██║██║ ██║ ██╔══╝ ██╔══██╗
██║ ██║███████╗██║ ███████╗██║ ██║
No server. No trace. Just you and who you trust.
Windows — satu baris, selesai:
irm https://raw.githubusercontent.com/0xAre/alter/main/install.ps1 | iexLinux / macOS:
curl -fsSL https://raw.githubusercontent.com/0xAre/alter/main/install.sh | bashCargo (jika Rust sudah ada):
cargo install --git https://github.com/0xAre/alterTidak butuh OpenSSL. Tidak butuh daemon Tor terpisah. Satu binary, langsung jalan.
Terminal chat yang bekerja tanpa server.
Dua orang terhubung langsung — via LAN di satu jaringan, atau via Tor di mana saja di dunia. Setiap sesi dienkripsi end-to-end menggunakan Noise Protocol (IK pattern). Saat salah satu keluar dari room, kunci sesi dibuang — tidak ada yang bisa membaca percakapan itu lagi, bahkan pengirimnya sendiri.
|
Tanpa server Tidak ada backend yang bisa diretas, disita, atau tumbang. Koneksi langsung peer-to-peer, selalu. |
Ephemeral Pesan hanya ada di RAM. Kunci sesi dibuang saat room ditutup — riwayat tidak bisa dibaca ulang. |
Deniable Passphrase berbeda membuka Password Manager biasa. Tidak ada cara membuktikan ALTER ada di vault yang sama. |
Noise_IK End-to-End — mutual authentication + forward secrecy dalam satu handshake. Tidak bisa di-MITM tanpa private key peer.
Tor built-in — ALTER menjalankan onion service sendiri. Tidak perlu install atau konfigurasi Tor terpisah.
Tor-first, LAN opt-in — default lewat Tor (tanpa jejak di LAN). Aktifkan --lan untuk koneksi langsung TCP via mDNS di jaringan yang sama (LAN menyiarkan kehadiran, jadi opt-in demi privasi).
Transfer file terenkripsi — kirim file hingga 4 GB langsung lewat sesi. SHA-256 end-to-end. Gambar bisa dilihat inline. Tidak ada relay, tidak ada upload ke cloud.
Password Manager decoy — satu vault, banyak slot (v3). Setiap passphrase — termasuk yang "salah" — membuka Password Manager fungsional; tidak ada sinyal yang membedakan mana yang membuka chat. Plausible deniability tanpa oracle.
Reply & scroll history — balas pesan spesifik dengan kutipan. Scroll riwayat chat dengan PageUp/PageDown.
Panic wipe — Ctrl+Shift+X dua kali dalam 3 detik: zeroize semua secret di RAM, exit seketika.
Selengkapnya: arsitektur kriptografi
NOISE TRANSPORT
Noise_IK_25519_ChaChaPoly_BLAKE2s
├─ Mutual authentication — kedua static key diverifikasi
├─ Forward secrecy — ephemeral X25519 DH per sesi, dibuang setelah handshake
└─ Identity hiding — static key initiator dienkripsi dalam message pertama
TRANSPORT
├─ LAN : TCP direct via mDNS discovery
└─ Tor : onion service via arti-client (embedded, tanpa daemon)
VAULT v3 multi-slot (~129 KB)
Argon2id KDF + ChaCha20-Poly1305 · 32 slot independen
Tanpa oracle: SETIAP passphrase (benar/salah) membuka Password Manager
fungsional & persisten — tidak ada sinyal "passphrase salah"
Tanpa header / magic bytes — indistinguishable from random data
Setiap penulisan me-re-randomize seluruh vault, bukan hanya slot berubah
Properti keamanan:
| Property | Status |
|---|---|
| Mutual authentication | ✓ Noise_IK — kedua pihak memverifikasi static key lawan |
| Forward secrecy | ✓ Ephemeral X25519 DH per sesi |
| Identity hiding | ✓ Static key initiator dienkripsi di message pertama |
| Zero memory leak | ✓ ZeroizeOnDrop semua struct yang menyimpan secret |
| Plausible deniability | ✓ Vault tanpa magic bytes, passphrase decoy membuka PM |
| Encrypted contact list | ✓ Social graph dienkripsi di disk |
Sudah lewat audit keamanan internal menyeluruh (Juli 2026, per v0.5.3 — lihat LAPORAN-AUDIT-KEAMANAN.md); rilis setelahnya menjaga temuan tetap tertutup lewat CI (clippy+test+audit). Belum diaudit pihak ketiga independen — gunakan dengan pertimbangan risiko yang sesuai. Model ancaman lengkap: THREAT-MODEL.md.
⚠ Batas model ancaman (baca sebelum mengandalkan deniability):
- Deniability mensyaratkan volume terenkripsi. Vault memang tampak acak, tetapi
ALTER menyisakan artefak lain di disk: state Tor berisi kunci privat onion service,
cache Tor, daftar kontak terenkripsi, dan file yang kamu pilih simpan. Artefak-artefak
ini membuktikan ALTER dipakai. Agar deniability benar-benar berlaku, simpan seluruh
direktori data di volume/partisi terenkripsi (LUKS, VeraCrypt hidden volume, FileVault,
BitLocker). Arahkan lokasinya via
--data-dir(atau--vault). - Snapshot berulang. Musuh yang punya >1 salinan vault dari waktu berbeda (backup, sync cloud, Volume Shadow Copy) dapat menyimpulkan adanya slot tersembunyi — keterbatasan fundamental hidden-volume (setara VeraCrypt). Full-disk encryption memitigasi ini.
- Anti-forensik ≠ anti-malware. ALTER tidak melindungi dari keylogger, screen capture, atau perangkat yang sudah dikompromikan saat aplikasi berjalan.
1. alter # jalankan — Tor di background (LAN off; +--lan utk LAN)
2. Tekan [i] # tampilkan invite code kamu
3. Bagikan ke peer # via Signal, kertas, atau channel aman lainnya
4. Tekan [a] → paste invite # tambah kontak peer (+ spasi + nickname opsional)
5. Pilih kontak → [Enter] # buka room terenkripsi
Kedua pihak perlu menekan
Enterke kontak yang sama. Role (Initiator/Responder) ditentukan otomatis dari fingerprint — tidak perlu koordinasi manual.
Penanda daftar kontak: ● sedang sesi denganmu · ◎ kontak Tor · ○ kontak LAN-only · · N mnt terakhir sesi dalam run ini · · on N mnt perangkatnya terlihat aktif saat percobaan connect terakhir (dial Tor sukses, belum tentu dia di room). Semua indikator presence bersifat pasif: hanya dari koneksi yang benar-benar kamu coba, tidak ada polling, tidak ada probe berkala — ALTER tidak pernah mengklaim kontak "offline".
| Tombol | Konteks | Aksi |
|---|---|---|
↑ / ↓ |
Main | Pilih kontak |
Enter |
Main | Buka sesi ke kontak terpilih |
a |
Main | Tambah kontak baru (paste invite code) |
r |
Main | Ganti nama kontak |
d |
Main | Hapus kontak (minta konfirmasi) |
i |
Mana saja | Tampil / tutup invite code |
c |
Mana saja | Salin invite code ke clipboard |
PageUp / PageDown |
Room | Scroll riwayat chat |
End / Home |
Room | Lompat ke pesan terbaru / teratas |
Ctrl+R |
Room | Reply — pilih pesan mana pun dengan ↑/↓, Enter konfirmasi |
Ctrl+S |
Room | Cari pesan — ketik query, ↑/↓ lompat antar match |
Ctrl+B |
Room | Mode buram — redupkan semua pesan kecuali 3 terbaru ([L] lokal / [B] kedua sisi). Catatan: Ctrl+B adalah prefix tmux — lepas prefix dulu bila di dalam tmux |
Tab |
Room | Halaman 2 (ruang tunggu netral) — Tab/Esc kembali ke chat |
Ctrl+F |
Room | Kirim file |
[S] / [L] / [T] |
File diterima | Simpan / Lihat inline / Tolak |
Esc |
Room | Keluar room (riwayat dibuang) |
Ctrl+Shift+X × 2 |
Mana saja | Panic wipe — zeroize semua secret, exit |
Opsi CLI lengkap
alter Jalankan TUI (mode default: online)
alter id Cetak invite code lalu keluar
--vault <path> Lokasi vault (default: ~/.alter/id.key)
--offline LAN saja — matikan Tor
--add <invite> Pra-muat kontak saat startup
--name <nickname> Nickname untuk --add
--listen <port> Force responder di port ini (untuk testing)
--dial <ip:port> Force dial langsung (untuk testing)
--process-name <n> Ubah nama proses terlihat (lihat batasan di bawah)
--version, -V Cetak versi lalu keluar
-h, --help Tampilkan bantuan
Passphrase via environment (untuk skrip/automasi):
ALTER_PASSPHRASE="passphraseku" alter id
⚠️ Dihapus dari environment proses ini segera setelah dibaca, tapi tetap bisa terbaca proses lain via/proc/<pid>/environdan terwariskan ke child process selama proses berjalan. Pakai hanya di mesin/skrip tepercaya.
Batasan --process-name: hanya mengubah nama yang terlihat di top/
htop/Activity Monitor (Linux: comm via prctl; macOS: thread name) atau
judul jendela konsol (Windows). Tidak menimpa /proc/<pid>/cmdline —
ps aux/ps -ef tetap menampilkan baris perintah asli termasuk flag ini
sendiri — dan tidak mengubah nama image di kolom Task Manager Windows.
Jangan mengandalkan fitur ini untuk bersembunyi dari ps/Task Manager pihak
lain di mesin yang sama.
M0 Fondasi: identity, vault, Noise_IK handshake ✓
M1 LAN MVP: mDNS, TCP, TUI, chat 1-on-1 ✓
M2 Internet: Tor onion service + LAN fallback ✓
M3 Hardening: padding, panic-wipe, mlock ✓
M4 Polish & audit ✓
M5 Presence privacy: Restricted Discovery (SEC-13) ✓
M6 Password Manager decoy front (vault v2 dual-slot) ✓
FT File transfer terenkripsi — hingga 4 GB (v0.5.1) ✓
M7 Versioning: --version, versi di TUI (v0.7.0) ✓
M8 Transparansi koneksi: fase granular + badge jujur ✓
M9 Presence pasif terbatas (RAM-only, tanpa kanal baru) ✓
M10 Presence derivat dial-vs-handshake + drain stream basi ✓
Changelog lengkap
v0.7.1 — M10: Presence Derivat & Drain Stream Basi
- Daftar kontak menampilkan
· on N mntsaat dial Tor ke kontak itu terakhir kali sukses — bukti aplikasinya sedang berjalan, tanpa perlu polling atau probe berkala apa pun. Sinyal ini murni dibaca dari percobaan koneksi yang memang kamu lakukan sendiri saat menekan Enter - Bila transport tersambung tapi peer tidak pernah membalas handshake, ALTER sekarang membedakan dua kasus: "perangkatnya online, dia belum membuka room" (kalau dial Tor-nya sukses) vs pesan generik lama (kalau tidak ada bukti). Sebelumnya keduanya tampil sebagai error yang sama
- Riset eksplisit: arti-client tidak mengekspos API untuk mengecek onion service kontak tanpa benar-benar connect ke sana — jadi fitur "cek kontak ini" on-demand yang sempat dipertimbangkan dibatalkan permanen (akan meninggalkan jejak connect nyata di peer setiap kali dipakai)
- Hardening: stream Tor masuk yang basi (dari percobaan connect yang batal/menyerah) tidak lagi bisa "meracuni" antrian dan menggagalkan sesi berikutnya — accept loop kini memvalidasi setiap stream hidup sebelum diserahkan ke handshake (padanan mitigasi NET-6 yang sudah ada di jalur LAN)
v0.7.0 — Transparansi Koneksi, Versioning, & Presence Terbatas
- Koneksi: status "Menghubungkan…" kini granular — fase nyata (mencari via LAN /
menghubungi via Tor percobaan ke-N / menunggu peer) + elapsed detik berjalan,
plus hint jujur bahwa koneksi pertama via Tor butuh 1-2 menit (publikasi
descriptor onion). Pola yang sama dengan fix
LINKING Nsdi v0.5.7 - Koneksi: badge Tor kini tiga-fase
LINKING → PUBLISHING → ONLINE— ONLINE hanya menyala setelah descriptor onion diyakini ter-publish (status nyata dari artistatus_events), bukan begitu service launch. Sebelumnya user melihat ONLINE, menekan Enter, dan dial pertama pasti gagal tanpa penjelasan - Koneksi: cap backoff retry dial Tor dirapatkan 30s → 15s — deteksi kesiapan peer lebih cepat setelah descriptor ter-publish. Deadline total 5 menit, timeout handshake, dan seluruh jaminan keamanan TIDAK berubah
- Versi: flag
--version/-V, versi di--help, outputalter id, layar splash & onboarding (angka polos tanpa wordmark — penyamaran v0.6.0 terjaga). Sumber tunggalCARGO_PKG_VERSION; versi rilis tidak pernah dikirim ke peer - Presence pasif per kontak:
●sedang sesi dengan kamu,· N mntterakhir sesi dalam run ini, polos = tidak diketahui (tanpa klaim "offline"). Murni derivat sesi yang terjadi — RAM-only, hilang saat tutup aplikasi, disapu panic-wipe, nol koneksi jaringan baru, nol polling. Presence broadcast dan status "sedang di room lain" ditolak permanen (bocor pola komunikasi) — lihat PRD-alter-v0.7.md Bagian 6 dan THREAT-MODEL.md
v0.6.1 — Optimasi Koneksi & Transfer File
- Perf: koneksi LAN dan Tor kini di-race paralel (dulu selalu tunggu 3s coba LAN dulu sebelum jatuh ke Tor); dialing Tor pakai exponential backoff
- Perf:
TCP_NODELAYuntuk koneksi LAN; hapus flush per-frame di jalur Tor yang sebelumnya memperbesar overhead tulis-kecil (write amplification) - Perf: transfer file kini di-batch per chunk dengan yield point supaya UI TUI tidak macet saat transfer besar berjalan
- Build:
opt-levelrilis diganti ke"s"— inlining kode kripto lebih cepat - UI: modal "add contact" dan "rename" dipoles
- Fix: dua peringatan clippy (collapsible-if, unused assignment) dibersihkan
v0.6.0 — Perbaikan UX Chat
- Fix: pesan baru tidak muncul saat layar penuh — perhitungan scroll kini
wrap-aware (pesan panjang yang ter-wrap tidak lagi mendorong pesan terbaru
keluar area terlihat). Tambahan: indikator
↓ N pesan barusaat scroll ke atas, tombolEnd/Homeuntuk lompat ke bawah/atas - Reply: binding
rpolos dihapus (menelan huruf pertama saat mengetik pesan berawalan "r");Ctrl+R(pilih pesan mana pun) jadi satu-satunya jalur reply - Cari pesan:
Ctrl+S— ketik query, sorot semua kemunculan,↑/↓lompat antar match,Enter/Esctutup - Mode buram:
Ctrl+B— redupkan semua pesan kecuali 3 terbaru (anti shoulder-surf); pilihan cakupan[L]lokal atau[B]kedua sisi (sinkron antar-peer via frame protokol baru, backward-compatible dengan versi lama) - Ruang tunggu:
Tabdi dalam room membuka halaman 2 netral (tanpa nama peer / isi pesan) selagi menunggu balasan; indikator kecil menandai pesan masuk - Penyamaran tampilan: wordmark "ALTER" dihilangkan dari seluruh layar, diganti ornamen belah ketupat (◆) — nama env var & opsi CLI tidak berubah
v0.5.8 — Dokumentasi Keamanan Publik + Installer Resmi Linux/macOS
- Fitur baru:
Ctrl+Rdi dalam sesi chat membuka mode "pilih pesan untuk dibalas" — navigasi ↑/↓ menyorot pesan mana pun di riwayat (beda darirbiasa yang hanya mengutip pesan terakhir dari peer),Enterkonfirmasi jadi balasan,Escbatal install.sh— installer resmi Linux/macOS. README sudah merujuk skrip ini sejak awal, tapi filenya belum pernah dibuat sampai sekarang; deteksi platform (Linux x86_64 / macOS Apple Silicon, fallback jelas kecargo build --releaseuntuk platform lain), tidak auto-edit dotfile shell (.bashrc/.zshrc) — hanya cetak instruksi manual, konsisten polarustup-init- Perbaikan command instalasi Linux/macOS di README:
| sh→| bash— skrip pakaiset -o pipefailyang tidak dikenaldash/ash(default/bin/shdi mayoritas distro Linux), sebelumnya akan gagal instan di baris pertama kalau dipipe kesh SECURITY.md+THREAT-MODEL.md— kebijakan pelaporan kerentanan (kanal utama: GitHub Private Security Advisory, bukan email pribadi) dan dokumen konsolidasi jujur soal apa yang dilindungi ALTER dan apa yang tidak (traffic correlation Tor, presence leak, batasan--process-name, dsb). Section "Security Policy" lama diCONTRIBUTING.md(basi, masih menyebut milestone "M3") sekarang menunjuk balik keSECURITY.mdsebagai satu-satunya sumber acuan- Release CI: setiap rilis kini menyertakan
SHA256SUMSgabungan untuk verifikasi integritas binary yang diunduh
v0.5.7 — Fix: "LINKING" Tor Terlihat Macet Tanpa Progres
- Bootstrap TorClient + launch onion service normalnya butuh 30-60 detik (proses jaringan Tor asli, bukan komputasi lokal) — tapi UI cuma tampilkan teks statis "Sedang LINKING…" tanpa indikasi progres, jadi di jaringan lambat/dibatasi terlihat identik dengan aplikasi macet
- Pill status dan popup invite sekarang tampilkan elapsed time berjalan
(
LINKING 47s); popup juga munculkan hint setelah 75 detik untuk cek koneksi internet, firewall/antivirus yang mungkin blokir Tor, dan jam sistem (Tor menolak konsensus bila clock skew) — murni transparansi, tidak mengubah cara bootstrap Tor bekerja
v0.5.6 — Fix: Layar "Buat Identitas Baru" Membingungkan (terkesan stuck)
- Bukan bug hang (KDF sudah non-blocking sejak v0.5.5) — ini masalah kejelasan UI: layar registrasi menampilkan 4 field (ALTER + PM, masing-masing + konfirmasi) sekaligus padahal diisi berurutan, field aktif nyaris tak terlihat, dan field yang sudah selesai kembali kosong tanpa penanda apa pun sehingga user baru mengira input hilang / aplikasi diam
- Tambah indikator "Langkah N dari 4", status per-field (✓ selesai / ▸ aktif / redup belum) dan instruksi spesifik tiap langkah
- Field yang sudah selesai tidak lagi menampilkan panjang passphrase (kurangi shoulder-surfing); alur validasi, dua-passphrase, dan zeroize tidak berubah
v0.5.5 — Fix: Registrasi & Migrasi Vault Terasa "Stuck"
- Bug nyata (bukan cuma hardware lambat): registrasi vault baru dan migrasi vault v1/v2->v3 menjalankan 2x Argon2id (m=64MB) langsung di key handler, menahan render loop TANPA spinner sampai KDF selesai — beda dari jalur unlock yang sudah benar. Di hardware lambat/dibawah beban, ini kelihatan seperti aplikasi freeze total setelah passphrase dimasukkan
- Fix: kedua jalur (registrasi & migrasi) sekarang pakai
spawn_blocking+ screen spinner baru (Screen::Creating/Screen::Migrating) — sama pola dengan unlock vault yang sudah benar sejak v0.5.0 - Migrasi vault lama dijamin tetap pertahankan identitas/fingerprint (bukan generate keypair baru) — dikunci via test eksplisit
v0.5.4 — Verifikasi Acceptance Criteria FT-01 + Fuzzing
- Verifikasi 14 acceptance criteria PRD FT-01 terhadap kode nyata: 4 bug protokol nyata ditutup (FileHeader kedua diam-diam menimpa transfer aktif, reject file tak memberi tahu pengirim, file nama-sama saling menimpa diam-diam, jalur gagal tak tercatat di riwayat chat)
- Modal konfirmasi eksplisit [Y/N] untuk file > 100 MB sebelum terkirim (warning, bukan hard block)
- Room ditutup lokal mid-transfer kini kirim
TYPE_CANCELeksplisit ke peer (bukan cuma sinyal generik disconnect) — perbaikanleave_room()yang sebelumnya abort task sebelum jalur graceful-close sempat jalan - Timeout negosiasi Capability 5 detik: peer protokol lama dapat notifikasi eksplisit "file transfer tidak didukung" di chat, bukan diam di default
- Fuzz targets (
fuzz/):decode_invite,deserialize_contacts,padding::unpad,PmStore::from_plaintext— proyek dipecah jadi lib+bin (src/lib.rs) supaya fuzz crate bisa memanggil parser internal langsung
v0.5.3 — Audit Keamanan (LAPORAN-AUDIT-KEAMANAN.md, tuntas Critical→Info)
- Vault v3 multi-slot: setiap passphrase (dikenal/tak-dikenal) buka PM fungsional & persisten — tidak ada oracle deniability, tiap tulis re-randomize seluruh vault
- Fix DoS file transfer: validasi
total_bytes/chunk_count/idxsisi-terima, clamp timeout, timeout handshake 120s - Render gambar preview in-memory (tanpa file temp di disk), clipboard auto-clear + exclude history/cloud
mlockdiperbaiki ke alamat memori final;fs-mistrustdisable dibatasi Windows-only- LAN discovery (mDNS) jadi opt-in (
--lan), default OFF — identitas tak lagi disiarkan otomatis - Restricted discovery Tor: peringatan descriptor publik, accept loop dibatasi (anti-DoS), bind IP LAN spesifik + accept-loop-until-live (anti "koneksi pertama menang")
- Zeroize & panic-wipe menyeluruh (passphrase, PM key, plaintext sesi, chat/input saat panic)
- File kontak: migrasi KDF ke HKDF-SHA256 + tulis atomik & permission 0600
- CI:
cargo test+clippy -D warnings+cargo auditotomatis tiap push/PR
v0.5.1 — File Transfer + UX
- Transfer file terenkripsi (FT-01): SHA-256 end-to-end, chunked streaming, hingga 4 GB
- Image preview inline via viuer (setelah terima file gambar, pilih [L])
- Reply dengan kutipan:
rdi room untuk balas pesan spesifik - Scroll riwayat chat: PageUp/PageDown dengan 5-pesan per langkah
- Warning auto-dismiss (8 detik), input length limit per konteks
v0.5.0 — Password Manager Decoy Front
- Vault v2 (4096 B): dual-slot independen — slot A (PM decoy) + slot B (ALTER keys)
- Password Manager TUI: tambah / lihat / hapus / cari entries
- Backup codes per entry (maks 10, mark-as-used)
- Async unlock dengan spinner (Argon2id ~500ms di background thread)
v0.4.0 — Presence Privacy
- Restricted Discovery (SEC-13): onion service hanya accessible ke kontak dengan client auth
- Tor client auth x25519 terintegrasi ke invite code v2
- Fork → buat branch dari
main - Buat perubahan, pastikan
cargo testhijau dancargo clippybersih - Commit dengan format Conventional Commits
- Buka Pull Request