memahami model client-server yang menggerakkan zellij, komponen inti dalam rust, plugin system wasm, hierarki session tab pane dan floating pane, mode input, serta layout kdl yang declarative.

Di episode 1, kalian memahami mengapa Zellij lahir: evolusi dari GNU Screen dan tmux, kelahiran di tangan Aram Dreveckenius pada 2021, alasan Rust, dan tiga masalah besar yang diselesaikannya. Sekarang kita masuk satu level lebih dalam. Sebelum kalian menekan tombol apa pun dengan percaya diri, kalian perlu tahu apa yang terjadi di balik layar ketika Zellij berjalan. Episode 2 ini membedah arsitektur utama Zellij dari bawah ke atas.
Mental model yang benar akan menyelamatkan kalian dari puluhan momen kebingungan di episode-episode berikutnya. Ketika session tiba-tiba tidak ditemukan, ketika plugin tidak muncul, atau ketika detach terasa ajaib — semuanya masuk akal jika kalian memahami cara kerja client-server. Ketika kalian memahami bahwa tab-bar dan status-bar sebenarnya adalah plugin WASM, kalian akan mengerti mengapa mengubah tampilan Zellij berbeda dengan tools lain.
Kita akan membahas enam lapisan arsitektur: model client-server, komponen inti dalam Rust, plugin system berbasis WASM, hierarki session, tab, pane, dan floating pane, mode input yang mengatur seluruh interaksi, serta layout system berbasis KDL yang membuat workspace bisa didefinisikan secara declarative. Di akhir episode, arsitektur Zellij akan terasa seperti peta yang jelas — bukan kotak hitam. Mari mulai.
Konsep paling penting untuk dipahami pertama kali adalah model client-server. Ketika kalian menjalankan zellij, yang terjadi bukan satu proses besar, melainkan dua entitas yang terpisah: satu server dan satu atau lebih client.
Server adalah proses yang benar-benar menjalankan pekerjaan. Ia membuat session, menciptakan tab dan pane, menjalankan proses di dalam pane, menyimpan scrollback, dan mempertahankan semua state. Server ini tidak peduli dari mana kalian mengaksesnya — kalian bisa menutup jendela terminal, mematikan layar, atau berpindah komputer, dan server tetap berjalan selama prosesnya tidak dihentikan secara eksplisit.
Client adalah proses yang berhubungan dengan layar kalian. Setiap kali kalian menjalankan zellij attach dev, kalian membuka sebuah client yang terhubung ke server session dev. Client bertugas merender UI ke terminal kalian dan meneruskan input keyboard ke server. Jika kalian menutup client (misalnya terminal di-close), server tidak ikut mati — session tetap ada, siap di-attach lagi kapan saja.
Model ini menjelaskan banyak perilaku yang mungkin terasa ajaib di episode 0:
zellij -s dev
zellij attach dev
zellij attach -c demoPerhatikan perintah ketiga: zellij attach -c demo akan membuat session baru bernama demo jika belum ada, dan attach ke session tersebut jika sudah ada. Ini idiom yang sangat umum dalam workflow modern — satu perintah untuk "pakai atau buat".
Untuk membuktikan model ini bekerja, kalian bisa melihat langsung dari luar Zellij:
ps aux | grep zellijKetika session aktif, kalian akan melihat beberapa proses zellij — server plus client yang terhubung. Direktori di /tmp/zellij-$(id -u) menampung data per session. Setelah kalian menutup semua client (detach), server tetap ada di daftar proses. Ini bukti nyata bahwa detach tidak menghentikan pekerjaan.
Note
Istilah "detach" dan "close" sering tertukar oleh pemula. Detach berarti client terputus dari server sementara — session tetap hidup. Close berarti menghentikan session dan semua proses di dalamnya (biasanya dengan Ctrl+q atau zellij kill-session). Selalu tanyakan pada diri sendiri: apakah saya ingin meninggalkan pekerjaan ini hidup, atau menghentikannya sepenuhnya?
Zellij ditulis dalam satu binary Rust yang memuat semua komponen inti, meskipun secara konseptual komponen-komponen ini punya tanggung jawab yang terpisah. Memahami peta komponen ini membantu kalian menebak apa yang terjadi ketika sesuatu berjalan aneh.
| Komponen | Tanggung Jawab |
|---|---|
| Session manager | Membuat dan mengelola session, mencatat client yang terhubung |
| Tab manager | Mengelola tab beserta layout dan pane di dalamnya |
| Pane / PTY | Membuat pseudo-terminal dan menjalankan proses shell di dalamnya |
| Terminal emulation | Menerjemahkan output proses menjadi grid karakter yang bisa dirender |
| Grid & renderer | Merender pane, scrollback, dan UI ke layar dengan benar |
| Plugin host | Menjalankan plugin WASM dan menjembatani komunikasinya |
Ketika kalian menekan Ctrl+p lalu n untuk membuat pane, alurnya kurang lebih begini: client mengirim pesan ke server, session manager meneruskan ke tab manager, tab manager memerintahkan komponen pane untuk membuat PTY baru, shell dijalankan di dalamnya, dan renderer menggambar pane baru itu di layar. Seluruh perjalanan ini terjadi dalam hitungan milidetik — bukti bahwa desain Rust yang efisien benar-benar terasa.
Satu detail yang menarik: terminal emulation di Zellij dikerjakan sendiri, bukan mengandalkan terminal kalian. Output setiap proses di dalam pane diinterpretasikan oleh Zellij menjadi grid karakter, lalu dirender ulang. Inilah yang memungkinkan scrollback bekerja konsisten, pane bisa di-resize tanpa merusak tampilan, dan plugin bisa menimpa bagian tertentu dari layar. Terminal kalian hanya menjadi "layar tampilan", sedangkan seluruh logika terminal ada di dalam server Zellij.
Salah satu keputusan arsitektur paling berani Zellij adalah menjadikan seluruh antarmuka sebagai plugin. Tab-bar di bagian atas, status-bar di bagian bawah, dan file explorer strider — semuanya adalah plugin yang berjalan sebagai modul WASM di dalam plugin host. Bahkan welcome screen dan plugin manager adalah plugin.
Mengapa ini keputusan besar? Karena plugin Zellij tidak berjalan di dalam proses utama sebagai thread yang bisa mengganggu sesi. Setiap plugin berjalan dalam sandbox WASM: terisolasi, tidak bisa membaca memori server secara sembarangan, dan tidak bisa menghancurkan sesi jika ia crash. Jika satu plugin bermasalah, plugin tersebut dihentikan — sementara session, tab, dan pane tetap berjalan normal.
Plugin berkomunikasi dengan Zellij lewat protokol pesan yang terstruktur: plugin mengirim action (misalnya "pindahkan fokus ke pane berikutnya"), dan Zellij mengirim event kepada plugin (misalnya "mode berubah" atau "tab berganti"). Antarmuka ini didefinisikan dalam crate zellij-tile, yang menjadi jembatan bagi developer yang ingin menulis plugin sendiri dalam Rust. Model inilah yang membuat Zellij extensible dengan cara yang aman — sesuatu yang tidak dimiliki tmux yang mengandalkan script yang disuntikkan langsung.
Tip
Karena tab-bar dan status-bar hanyalah plugin, kalian bisa menggantinya, menyembunyikannya, atau menulis penggantinya sendiri. Di episode 15 dan 16 kita akan membangun plugin pertama dari nol. Untuk sekarang, cukup pahami bahwa apa yang kalian lihat di layar bukan fitur kaku — melainkan modul yang bisa dikustomisasi sesuka kalian.
Bagi pengguna harian, kalian tidak perlu berinteraksi langsung dengan plugin host. Namun mengetahui bahwa komponen UI adalah plugin membantu menjelaskan perilaku yang tampak aneh: kenapa tema harus mengikuti konvensi tertentu, kenapa plugin yang tidak kompatibel dengan versi Zellij bisa gagal dimuat, dan kenapa memuat plugin baru dari internet punya pertimbangan keamanan tersendiri. Semua itu kita bedah di fase plugin.
Inti dari cara berpikir Zellij adalah hierarki ruang kerja yang jelas: session berada di level teratas, di dalamnya ada tab, di dalam tab ada pane, dan di atas semuanya ada floating pane sebagai lapisan khusus.
| Level | Deskripsi | Analogi |
|---|---|---|
| Session | Satu ruang kerja lengkap dengan nama | Sebuah proyek atau konteks kerja |
| Tab | Sub-ruang di dalam session | Satu task atau area fokus |
| Pane | Area kerja nyata yang menjalankan proses | Satu jendela proses |
| Floating pane | Pane di lapisan terpisah di atas tab | Overlay / popup cepat |
Session adalah entitas paling besar. Kalian memberi nama session (zellij -s project-api) dan menganggapnya sebagai satu konteks kerja: semua tab dan pane yang berkaitan dengan proyek tertentu tinggal di dalam satu session. Kalian bisa membuka banyak session sekaligus — satu per proyek — dan berpindah antar mereka dengan detach lalu attach.
Tab membagi session menjadi area fokus. Misalnya dalam satu session untuk proyek web, kalian bisa punya tab code untuk editor, tab servers untuk dev server dan database, dan tab ops untuk monitoring. Tab memberi kalian cara berpindah konteks besar tanpa harus menutup apa pun — semua proses di tab lain tetap berjalan.
Pane adalah unit kerja terkecil. Setiap pane menjalankan satu proses di dalam PTY — biasanya shell, editor, atau command panjang. Pane bisa di-split ke kiri, kanan, atas, dan bawah, sehingga dalam satu layar kalian bisa melihat editor, terminal git, dan dev server secara bersamaan. Inilah tempat kalian benar-benar bekerja.
Floating pane adalah pane istimewa yang berada di lapisan terpisah di atas tab, persis seperti popup. Ia muncul di atas konten tanpa mengubah layout yang ada, dan bisa ditampilkan atau disembunyikan dengan satu toggle. Skenario klasiknya: kalian sedang membaca kode di pane editor, lalu perlu menjalankan satu command cepat — tekan tombol, floating pane muncul, jalankan command, tekan lagi untuk menyembunyikannya. Layout kalian tidak pernah berubah.
Sekarang kita sampai pada konsep yang paling menentukan pengalaman Zellij: mode input. Semua aksi di Zellij diorganisasikan ke dalam mode, dan setiap mode punya tombol pemicu sendiri. Kalian tidak menekan prefix lalu aksi; kalian masuk ke mode, melihat petunjuknya, lalu menekan aksi.
| Mode | Tombol Pemicu | Fungsi |
|---|---|---|
| Normal | - | Mode dasar; quick keys Alt+... aktif |
| Pane | Ctrl+p | Membuat, menutup, dan mengelola pane |
| Tab | Ctrl+t | Membuat, berpindah, dan mengelola tab |
| Resize | Ctrl+n | Mengubah ukuran pane |
| Move | Ctrl+h | Memindahkan posisi pane |
| Scroll | Ctrl+s | Menjelajahi scrollback dan mencari |
| Session | Ctrl+o | Mengelola session dan detach |
| Locked | Ctrl+g | Mengunci seluruh input |
| Tmux | Ctrl+b | Emulasi prefix key ala tmux |
Ketika kalian menekan Ctrl+p, status bar berubah menampilkan mode PANES beserta semua aksi yang tersedia: n untuk pane baru, d split ke bawah, r split ke kanan, x menutup pane, dan seterusnya. Kalian tidak perlu menghafal apa pun — petunjuknya selalu ada di layar. Tekan Esc atau Enter untuk kembali ke Normal mode.
Mode bukan sekadar cara mengelompokkan aksi; ia juga menyelesaikan masalah konflik keybinding. Keybinding Ctrl+t yang di tmux harus "diselamatkan" dari konflik dengan editor adalah hal biasa. Di Zellij, Ctrl+t selalu masuk Tab mode, dan konflik itu ditangani dengan konsistensi yang jelas: setiap mode punya domain aksi sendiri, sehingga tidak ada dua mode yang berebut key yang sama untuk makna berbeda.
Important
Mode adalah jantung Zellij. Jika kalian memahami mode, seluruh keybinding Zellij menjadi bisa ditebak — tidak perlu dihafal. Setiap kali kalian lupa cara melakukan sesuatu, pikirkan dulu mode mana yang menanganinya: urusan pane di Pane mode (Ctrl+p), urusan tab di Tab mode (Ctrl+t), urusan session di Session mode (Ctrl+o). Episode 4 akan membedah mode system ini secara menyeluruh.
Selain mode berbasis Ctrl+, Zellij juga menyediakan quick keys yang langsung bekerja di Normal mode: Alt+n membuat pane baru, Alt+h/j/k/l memindahkan fokus, Alt+f menoggle floating panes, Alt+= dan Alt+- untuk resize cepat. Kombinasi ini dirancang agar tangan kalian tidak perlu beranjak dari baris tombol, menjadikan Zellij sangat nyaman setelah beberapa hari pemakaian.
Lapisan terakhir arsitektur yang harus kalian kenal adalah layout system. Zellij menggunakan format KDL untuk mendefinisikan workspace secara declarative: alih-alih membangun pane satu per satu secara manual setiap kali membuka session, kalian menulis file layout yang menggambarkan struktur tab dan pane yang diinginkan, lalu Zellij membangunnya untuk kalian.
template {
pane size=1 borderless=true {
plugin location="zellij:tab-bar"
}
pane split_direction="vertical" {
pane command="nvim"
pane command="zsh"
}
pane size=2 borderless=true {
plugin location="zellij:status-bar"
}
}Layout di atas mendefinisikan struktur dasar yang mirip default Zellij: tab-bar plugin di atas, dua pane berdampingan (Neovim dan shell) di tengah, dan status-bar plugin di bawah. Setiap pane bisa diatur dengan command, cwd, ukuran, dan bahkan floating untuk pane melayang. Layout bisa didefinisikan per proyek dan dijalankan dengan zellij -l nama-layout atau zellij --layout path/to/file.
Keindahan layout KDL ada di determinismenya: workspace yang sama akan terbentuk persis setiap kali dibuka. Tim bisa berbagi file layout untuk memastikan semua orang bekerja dengan struktur yang seragam, dan developer bisa menyimpan layout per proyek di dalam repository. Kita akan menggali layout system secara penuh di episode 10 — untuk sekarang, cukup ketahui bahwa ini adalah jembatan antara arsitektur internal dan cara kalian bekerja sehari-hari.
Ctrl+q atau zellij kill-session./tmp secara sembarangan. Direktori zellij-$(id -u) di /tmp berisi data session. Menghapusnya saat session berjalan bisa membuat session tidak bisa di-attach. Jangan bersihkan tanpa memahami konsekuensinya.Episode 2 ini memberi kalian peta arsitektur Zellij secara utuh. Kalian telah memahami model client-server yang memisahkan proses server yang selalu hidup dari client yang datang dan pergi, komponen inti Rust yang menangani session, tab, pane, terminal emulation, dan rendering, plugin system WASM yang menjadikan seluruh antarmuka sebagai modul terisolasi, hierarki session, tab, pane, dan floating pane, mode input yang mengorganisasikan semua aksi, serta layout system KDL yang membuat workspace bisa didefinisikan secara declarative.
Poin yang harus kalian bawa:
Sekarang arsitektur sudah jelas, saatnya mengotori tangan. Di episode 3 kita mulai mempraktikkan fondasi operasional: membuat dan mengelola session dengan zellij, zellij -s, attach, detach, zellij ls, dan kill-session, lalu berpindah ke manajemen tab dengan Ctrl+t dan pane dasar dengan Ctrl+p. Sampai jumpa di episode 3!