Serein
Rust로 만든 가볍고 성능 좋은 Discord 전용 네이티브 클라이언트
Wuzz Chat은 대화를 검색 가능하고 이해하기 쉬운 지식으로 전환해 개인·팀·커뮤니티가 활용하도록 돕습니다
Wuzz Chat membantu individu, tim, dan komunitas mengubah percakapan menjadi pengetahuan yang dapat dicari, dipahami, dan diingat kembali.
소셜TypeScript · GoGitHub @mhdarifsetiawan01온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
💬 Wuzz Chat — Actionable Knowledge Messaging Engine Wuzz Chat adalah platform perpesanan real-time modern yang menggabungkan komunikasi instan 1-on-1 terenkripsi ujung-ke-ujung (E2EE P-256), obrolan grup terstruktur, forum topik efemeral, serta AI Memory Engine terkurasi dengan filosofi "AI captures. Humans validate. Wuzz remembers."README 전문 보기 ↗
Wuzz Chat adalah platform perpesanan real-time modern yang menggabungkan komunikasi instan 1-on-1 terenkripsi ujung-ke-ujung (E2EE P-256), obrolan grup terstruktur, forum topik efemeral, serta AI Memory Engine terkurasi dengan filosofi "AI captures. Humans validate. Wuzz remembers."
wuzz-chat/
├── backend/ # Modular Monolith Golang Backend (Go 1.26)
│ ├── cmd/ # E2E simulation & load test entrypoints
│ ├── internal/
│ │ ├── ai/ # LLM Provider (Gemini 2.5 Flash, Groq), Processor & Prompts
│ │ ├── api/ # Thin HTTP REST Handlers (auth, chat, group, memory, media)
│ │ ├── app/ # Dependency injection container & bootstrap wire (wire.go)
│ │ ├── auth/ # JWT token utilities, CORS, & RequireJWT middleware
│ │ ├── authz/ # Identity & Auth domain service, sessions, devices, & repo
│ │ ├── broker/ # Pub/Sub broker (Upstash Redis & In-Memory fallback)
│ │ ├── group/ # Persistent group & ephemeral forum topic domain services
│ │ ├── memory/ # AI Memory Engine (ContextSource, jobs, drafts, review approval)
│ │ ├── messaging/ # Core chat messaging, search, edit, delete, pin, & receipts
│ │ ├── push/ # Multi-Platform Push Gateway (VAPID RFC 8292 & FCM v1 provider)
│ │ ├── shared/ # Shared cross-domain config, errors, validator, rate limiter
│ │ ├── storage/ # Media store-and-forward driver (Supabase, local) & purge worker
│ │ ├── store/ # Data layer (PostgreSQL Supabase, SQLite, In-Memory)
│ │ ├── worker/ # Background workers (memory job queue worker)
│ │ └── ws/ # WebSocket Hub, Client read/write pump, & message routing
│ ├── go.mod
│ ├── go.sum
│ └── main.go # Slim bootstrap entrypoint & graceful shutdown
│
├── frontend/ # Web Interface (Next.js 16 Turbopack + React 19 + TypeScript)
│ ├── app/
│ │ ├── chat/ # Dual-platform chat UI (desktop split 2-col & mobile single-screen)
│ │ ├── login/ # Halaman Login
│ │ ├── register/ # Halaman Registrasi
│ │ ├── transfer/ # Halaman deep link pemindahan kunci E2EE via QR code
│ │ ├── globals.css # Soft tri-color glassmorphism design system & CSS tokens
│ │ └── layout.tsx
│ ├── lib/ # WebSocket client, API helper, IndexedDB caches, Web Crypto E2EE
│ ├── server.js # Custom server proxy untuk WebSocket upgrade & /api/ isolation
│ └── package.json
│
├── docs/ # Dokumentasi Resmi & Source of Truth
├── .agents/ # Workspace configuration & AI lifecycle rules
└── README.md
Untuk memahami arah, tujuan, dan detail teknis proyek, silakan baca dokumentasi kanonikal:
server.js) (Fase 1): Menangani WebSocket upgrade event pada custom server dan me-reverse proxy /api/* serta /uploads/*, mengisolasi URL backend dari browser.🕒 Pending ➔ ✓ Sent (centang 1 abu) ➔ ✓✓ Delivered (centang 2 abu saat lawan online) ➔ ✓✓ Read (centang 2 biru saat dibaca).👍 ❤️ 😂 😮 😢 🙏), badge interaktif, dan balasan kutipan pesan dengan fitur ke pesan asli.| Layer | Teknologi | Keterangan |
|---|---|---|
| Backend | Go (Golang) 1.24+ | Gorilla WebSocket, Lib/PQ, Go-Redis v9, Modernc SQLite |
| Frontend | Next.js 16 (App Router) + React 19 + TypeScript | Vanilla CSS Design System, Responsive Dark Mode |
| Database | PostgreSQL (Supabase) / SQLite | Relational schema, auto-migrations, indexing |
| Pub/Sub & Cache | Redis (Upstash) / In-Memory Fallback | Multi-node WebSocket sync & link preview cache |
| Storage | Supabase Storage (S3 API) / Local Disk | Media transit buffer with Store-and-Forward |
| Hosting | VPS (Backend, nginx) & Vercel (Frontend) | Backend self-hosted di VPS |
| Testing | Go Testing Suite + TypeScript Check | 100% test passing & zero linter errors |
https://chat.wuzzhub.id (Mirror: https://wuzz-chat.vercel.app)https://chat-api.wuzzhub.idwss://chat-api.wuzzhub.id/wshttps://chat-api.wuzzhub.id/healthcd backend
go run main.go
Server backend berjalan di
ws://localhost:8080/ws(Health check:http://localhost:8080/health).
cd frontend
npm install
npm run dev
Aplikasi web berjalan di
http://localhost:3047(Otomatis membaca.env.local).
Unit Test Backend (Go):
cd backend
go test -v ./...
Type Check Frontend (TypeScript):
cd frontend
npx tsc --noEmit
deploy-chat.sh).BACKEND_API_URL dan NEXT_PUBLIC_WS_URL.Ctrl+V), drag-and-drop file ke layar chat, dan modal Lightbox preview interaktif dengan keyboard navigation (Esc).MediaRecorder API dengan timer live, animasi gelombang suara, dan pemutar audio kustom bergaya WhatsApp/Telegram (dynamic waveform scrubber, Play/Pause, speed toggle 1x/1.5x/2x, single-active player).POST /api/media/ack).MEDIA_RETENTION_DAYS (default 7 hari).IndexedDB) (Fase 5): Berkas media tersimpan di IndexedDB browser klien sehingga pengguna tetap bisa membuka media secara offline meskipun file di server telah dihapus.rediss://...) dengan anti-echo loop UUID & deduplikasi database write.*, exact domain, dan wildcard subdomains seperti https://*.vercel.app) untuk REST API dan WebSocket handshake.← Back), Dynamic Viewport 100dvh, sticky header, safe area padding env(safe-area-inset-bottom), dan sinkronisasi tanda terima ✓✓ biru serta unread counter instan 0ms.IndexedDB (wuzz_crypto_db), verifikasi nomor keamanan 30-digit (Safety Number Fingerprint), auto-decryption reaktif pada timeline obrolan dan cuplikan pesan di sidebar, serta zero-knowledge storage pada server database.active_device_id & key_version di database, proteksi HTTP 409 Conflict rejection, rotasi kunci resmi /api/users/public-key/reset, Hard Blocker UI yang mengunci layar chat secara total saat terjadi konflik, tombol back HP auto-logout, Single-Session WebSocket Kick pada backend Go (SESSION_REPLACED), dan Fail-Closed E2EE Guard untuk menjamin 0% kebocoran plaintext pada direct chat.POST /api/users/transfer/create & POST /api/users/transfer/consume), enkripsi AES-256-GCM berdasar 256-bit entropy PBKDF2, retrieval atomik 1x pakai di database, komponen DeviceTransferModal.tsx dengan In-App Camera Scanner (html5-qrcode) langsung dari web app, smart tab filtering (hideGenerate=true) di perangkat baru, fallback kode manual, serta halaman deep link /transfer?token=....sw.js) dengan Zero-Knowledge Client-Side Background Decryption (Web Crypto API + IndexedDB) sehingga teks pesan E2EE tampil terdekripsi di notifikasi OS, toggle notifikasi di modal profil, tombol Header "📲 Instal App" dengan auto-hide di mode Standalone, dan arsitektur Multi-Platform Gateway (Web, PWA & Android FCM ready).wuzzchat_msg_db), arsitektur Cache-First Load (0ms saat membuka room), Write-Through Cache di 6 titik mutasi, perlindungan status tanda terima anti-downgrade, kontinuitas pembacaan pesan lama saat lawan bicara me-reset perangkat & mengganti pasangan kunci kriptografi, serta notifikasi visual pergantian kode keamanan E2EE (security-notice amber bubble).<input capture="environment">) sebagai fallback solid untuk scan QR Code di Android PWA, Pre-Warm getUserMedia Permission Strategy, dan deklarasi "permissions": ["camera"] di manifest.json untuk instalasi WebAPK..chat-app-container pada mobile dengan position: fixed dan overscroll-behavior: none, mengganti scrollIntoView dengan containerRef.scrollTo di ChatWindow, serta reset window.scrollTo(0,0) saat transisi room agar tampilan chat tidak naik ke atas setelah penutupan modal transfer.interactiveWidget: 'resizes-content' memastikan layout di-resize (bukan di-pan) saat keyboard virtual muncul. Listener visualViewport di page.tsx mengunci window.scrollY ke 0 agar header chat tidak pernah tergeser keluar viewport.#3b82f6 utama, Soft Lavender #818cf8 sekunder, Soft Coral #f472b6 tersier), utilitas avatar modular deterministik (avatarColor.ts) dengan 8 variasi warna pastel bergradien, Slate Frosted Glass pada bubble pesan masuk, penajaman kontras timestamp putih terang & read receipts Electric Cyan, dan ambient depth pada linimasa chat.frontend/lib/emojis.ts dengan 5 kategori Unicode native, Frosted Glass Emoji Picker Tray popover, kapsul pil input presisi (border-radius: 24px, tinggi 48px) dengan tombol aksi rekam suara / kirim melayang independen (floating circular button 48x48px) mandiri standar WhatsApp & Telegram.ReceiptIcon.tsx): Komponen vektor SVG standar WhatsApp/Telegram (stroke-width: 2, sudut paralel 45°) menggantikan karakter teks unicode tipis, dipadukan dengan warna Electric Neon Cyan (#00f2fe) dan dual-filter dark drop shadow (rgba(0, 0, 0, 0.95)) + pendaran neon untuk kontras tajam di atas bubble pesan keluar biru.window.history.pushState ganda) pada navigasi room di Next.js App Router, menerapkan transisi router.replace('/chat') saat kembali ke home, dan memastikan tombol Back pada browser HP/Desktop keluar dari linimasa dengan bersih tanpa berputar-putar dalam history loop.auth/validator.go) dengan filter kata terlarang hybrid 3 lapis (substring, brand-prefix/suffix, exact match), batasan karakter regex ^[a-zA-Z0-9_.-]+$, body cap 64 KB Anti-DoS (MaxBytesReader), Fail-Closed BOLA guard pada isAuthorizedForRoom, dan JWT runtime warning via sync.Once. Frontend client-side validation real-time di halaman Register.peer_avatar_url dan kolom is_verified / peer_is_verified dengan auto-migration skema database.users.id (UUID) sebagai pembanding/patokan utama tunggal di seluruh alur aplikasi (Backend MessageStore, validasi kepemilikan pesan Delete for Everyone, penyimpanan reaksi emoji, filter query SQL unread/delivered receipts, otorisasi broadcast WebSocket, dan penentuan pesan lawan bicara di linimasa). Menjamin integritas data dan hak akses tetap konsisten 100% meskipun pengguna mengganti display_name atau username.grp_<UUIDv4>), dukungan visibilitas 🔒 Privat (Wuzz Cloud) vs 🌐 Publik (dengan handle unik @group_username dan pencarian global), wizard 2 langkah pembuatan grup (CreateGroupModal.tsx), modal pratinjau & konfirmasi gabung grup publik (GroupPreviewModal.tsx) standar Telegram/WhatsApp untuk mencegah accidental auto-join (DEC-012), gerbang proteksi otorisasi tautan grup privat (privateGroupDenied & Aurora Glassmorphism Shield, DEC-013) yang memblokir akses direct link non-anggota, drawer manajemen grup (GroupInfoDrawer.tsx) dengan hierarki peran RBAC (creator, admin, member), promosi/demosi admin, kick anggota, edit info grup, leave group konfirmasi modal, header status bar grup Induk dinamis (StatusBar.tsx), linimasa pesan grup dengan warna nickname deterministik unik per pengirim (MessageBubble.tsx), model retensi media grup berbasis Shared Media Hub TTL 7 hari di server dan client auto-caching di IndexedDB wuzzchat_media_db, semantik tanda terima room (sent/delivered), bypass E2EE fail-closed untuk room grup (siap di-upgrade ke Signal Sender Keys di masa depan), serta kesiapan fondasi database untuk sub-grup & TTL kedaluwarsa (parent_id, expires_at).sub_<UUIDv4> dan TTL otomatis. Dilengkapi dengan:
🏛️ Forum, breadcrumb interaktif subtitle obrolan (↖ [Grup Induk] • Forum • X anggota), dan collapsible action menu (⋮) di mobile yang menjaga header obrolan 3x lebih lega dan bebas tumpang tindih.creator) dan admin (admin) yang dapat membuat topik forum baru, sementara seluruh anggota aktif grup induk dapat melihat daftar topik, bergabung, dan berpartisipasi di forum. Tombol pembuatan forum di-hidden otomatis bagi anggota biasa.conversation_join_requests): Pengguna mengajukan izin via POST /api/groups/{id}/join-request, admin meninjau via GET /api/groups/{id}/join-requests dan menyetujui/menolak via POST /api/groups/{id}/join-requests/{requestId}/action.conversation_join_requests otomatis dihapus tuntas oleh ExpireSubGroupsBatch.7_days), dengan opsi terbatas 1 minggu dan 1 bulan (30_days).ExpireSubGroupsBatch tanpa memblokir socket.SubGroupListDrawer.tsx (panel Forum & Topik Diskusi dengan badge sisa waktu real-time, lencana 🌐 Terbuka / 🔒 Privat, tombol Minta Izin, dan Panel Review Izin bagi Admin); CreateSubGroupModal.tsx; serta navigasi kembali ← [Nama Grup Induk]."type": "for_everyone") vs backend Go struct (delete_for_everyone: bool). Backend kini menerima format dual fleksibel; frontend mengirim payload redundan ganda. Test suite 4 skenario chat_handler_delete_test.go ditambahkan — 100% lulus.grp_...) dan Forum Topics (sub_...). Konfirmasi unduhan (POST /api/media/ack) dari satu anggota tidak lagi menghapus berkas fisik dari Supabase Storage dan tidak menandai media_status = 'expired', sehingga seluruh anggota grup dapat melihat dan mengunduh berkas kapan saja selama masa retensi TTL (default 7 hari). Direct Message 1-on-1 tetap mempertahankan arsitektur Store-and-Forward instan ($0 server storage cost).@username) (Fase 8 Milestone 8.5): Pemanggilan terarah anggota percakapan di obrolan grup dan forum/subgrup dengan isolasi keanggotaan ketat (hanya anggota ruang aktif yang dapat di-tag), dukungan multi-mention dalam 1 pesan, penegakan arsitektur kekal murni UUID (mentions: ["UUID", ...]), popover autocomplete mengambang Aurora Glassmorphic (navigasi keyboard ↑/↓/Enter/Tab & sentuhan mobile min 44px), rendering tag @username di linimasa pesan, highlight khusus self-mention (.mention-tag-self dan border pendaran cyan), validasi keanggotaan fail-closed di backend Go WebSocket Hub, dan pengiriman notifikasi Web Push prioritas bertag chat-mention-[room].since (GetRoomHistorySince) yang memangkas beban query riwayat hingga 90%, serta Client-Side Outbound Queue (FIFO maks 100 pesan) di WsClient yang menahan pesan saat socket disconnected dan melakukan auto-flush seketika saat terhubung kembali.request_id dan paket balasan type: "ack", eliminasi blind pop pada outboundQueue klien (pesan hanya dihapus setelah konfirmasi ACK server diterima sehingga bebas phantom message loss saat koneksi seluler labil), serta proteksi Server-Side Idempotency Guard (DEC-015) di Hub Go berbasis in-memory cache berpresisi tinggi UnixNano() (TTL 2 menit) yang mencegah pesan duplikat di-broadcast atau di-publish ulang saat klien mobile melakukan reconnect/resend.message_edited, inline input UI, label (diedit), dan pembaharuan cache lokal IndexedDB.ForwardMessageModal.tsx, verifikasi keanggotaan penerima, dan lencana ↪ Diteruskan.conversation_members (is_pinned), indikator pin 📌, dan prioritas sorting percakapan tersemat di sidebar.pinned_messages, sistem rotasi FIFO otomatis, proteksi anti-pinning pesan terhapus, dan auto-unpin saat pesan ditarik), banner glassmorphic PinnedMessageBanner.tsx, serta navigasi melompat ke pesan dengan efek animasi glow emas.StatusBar.tsx, penghitung kecocokan real-time, navigasi tombol ▲/▼, scroll-to-message dengan highlight pendaran biru, dan proteksi batasan waktu privasi cleared_at.POST /api/auth/logout): Penambahan endpoint logout resmi di backend Go yang mengosongkan kolom users.active_device_id = '' di database secara kondisional (device-aware) saat logout sukarela (mengeliminasi false conflict HTTP 409 saat login di device baru). Dilengkapi proteksi pembatalan konflik (local-only cancellation): jika perangkat penantang/baru memilih "Batalkan & Keluar" di modal konflik, frontend hanya mengeksekusi pembersihan lokal tanpa memanggil server sehingga sesi perangkat aktif utama tetap aman terlindungi.🔒 [Pesan Terenkripsi] yang mengotori layar dengan 1 buah banner sistem ringkas di linimasa chat (ChatWindow.tsx), dipadukan dengan optimasi performa $O(N)$ single-pass loop menggunakan useMemo untuk mencegah re-filtering overhead saat rendering./login?logout=1 memblokir auto-redirect ke linimasa obrolan, dan pengguna diwajibkan memasukkan password baru.sendRoomHistory) langsung ke channel soket perangkat pemohon (c.send), mengeliminasi bug riwayat kosong di HP saat login bersamaan dengan Laptop di sesi multi-perangkat.clearSession), sehingga login ulang di perangkat yang sama langsung masuk ke linimasa chat tanpa modal scan QR / reset berulang kali.userId (wuzz_e2ee_priv_${userId}), memungkinkan banyak user bergantian memakai 1 perangkat fisik tanpa tumpang tindih atau konflik kunci.PUT /api/users/public-key memvalidasi integritas kunci: kunci yang identik diizinkan tanpa batas (Trusted Device & QR Sync), namun kunci yang berbeda ditolak tegas (HTTP 409 Conflict) jika akun memiliki sesi perangkat aktif, mencegah penimpaan kunci sepihak.