1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
|
# sl0ppij — an opinionated Zellij fork
> This is **not** upstream Zellij. It is a fork maintained at
> <https://git.sl0p.foo/sl0ppij.git>, tracking [zellij-org/zellij][upstream] with a
> small set of opinionated additions, mostly about how panes *look*.
>
> Upstream's README follows below, unchanged.
[upstream]: https://github.com/zellij-org/zellij
## What this fork adds
Everything lives in the existing `ui { pane_frames { ... } }` block, and every option
defaults to upstream behaviour — an unmodified config renders exactly as stock Zellij.
```kdl
ui {
pane_frames {
// Where the pane title sits in the frame. Upstream hardcodes it flush
// left for full frames. (Frameless mode already centred it.)
title_alignment "center" // "left" | "center" | "right" (default: left)
// Outer gap: real empty terminal between panes, WM style.
// Expressed in ROWS. A pane insets right/bottom always and left/top
// only at the screen edge, so two neighbours show exactly `gap`
// between them -- not double -- and the screen edges match.
gap 1 // default: 0
// Inner padding between a pane's frame and its content.
// CSS-style shorthand, but the 4-value order is UP DOWN LEFT RIGHT,
// deliberately NOT CSS's clockwise top-right-bottom-left:
// padding 1 all four sides
// padding 1 2 up/down = 1, left/right = 2
// padding 1 2 3 4 up=1 down=2 left=3 right=4
padding 1 // default: 0
// Columns per row. Terminal cells are ~2x taller than they are wide, so
// 1 row of gap needs ~2 columns to look like the same distance.
// Applies to `gap`, and to the 1-value form of `padding`. The 2- and
// 4-value padding forms are taken literally. Set to 1 to disable.
gap_aspect 2 // default: 2
}
}
```
### Double-click a pane title to rename it
Double-clicking the **top edge** of a pane's frame focuses that pane and drops
straight into rename mode — the same state the rename keybind produces.
Frame corners are excluded (they are resize handles), and a single click on the top
edge still starts the usual resize drag. Currently tiled panes only: on floating panes
the title is the drag handle for moving the pane, so that path is left alone for now.
Also in the fork, not configurable:
- A compact scroll indicator (`↑42`) in place of upstream's `SCROLL: 42/1000`, shown
only when actually scrolled up rather than whenever scrollback exists.
- `sl0p.foo` branding in the default tab-bar plugin.
## Which changes apply live
`config.kdl` is watched, but only some things reach a running session:
| change | applies |
|---|---|
| `title_alignment`, `gap`, `padding`, `gap_aspect` | **live**, no restart |
| `rounded_corners`, and other stock options | **live** (upstream behaviour) |
| anything requiring a new binary | **new session** — a running server keeps its old inode |
## Building
Upstream's `[profile.release]` uses fat LTO and `codegen-units = 1`, which costs ~3
minutes for a one-line change. For iteration use the `fastdev` profile added here —
same `opt-level = 3`, no LTO, parallel codegen, incremental cache kept:
```bash
cargo build --profile fastdev -p zellij # ~3s incremental -> target/fastdev/zellij
cargo build --release -p zellij # ~3min -> ship this one
```
See `.fastfeedback/SPEED.md` for narrow test commands, measured timings, and the
pre-existing test-failure baselines (this tree has failures that are **not** caused by
the fork — check against `upstream/main` before chasing one).
## Known rough edges
- **`gap` and `padding` only apply with `pane_frame_style "full"`.** With `"titles"` or
`"none"` they are ignored: the cells around a pane's content there belong to the
inter-pane boundary renderer (`ui/boundaries.rs`), and insetting into that region
would leave cells nobody repaints (stale glyphs on resize) or paint over the
boundaries themselves. Rather than half-apply, a frameless pane is simply not inset.
Your config keeps its values; they just take effect if you switch back to full
frames.
- **Floating panes** get `padding` but no `gap`: they are positioned explicitly, so an
inter-pane gap does not apply.
- **Stacked panes** apply the gap uniformly; stack header spacing may look slightly off
at larger gaps.
- The fork's options are **not** exposed over the plugin protobuf API. Plugins have no
use for them and adding proto fields would mean regenerating the committed prost
assets in `zellij-utils/assets/prost/`.
## Version string
Fork builds report a `+sl0pN` build-metadata suffix, so `zellij --version` is
distinguishable from upstream:
```
$ zellij --version
zellij 0.45.0+sl0p1
```
Build metadata rather than a `-sl0pN` prerelease on purpose: cargo ignores build
metadata when matching version requirements, so the intra-workspace
`zellij-utils = "0.45.0"` dependencies still resolve. A prerelease suffix does not,
and would require editing every member manifest.
Bump the suffix per published fork build; reset to 1 when rebasing onto a new
upstream release. Note that a version bump changes `ZELLIJ_PLUGIN_ARTIFACT_DIR`, so
the bundled wasm plugins are recompiled once on first run.
## Staying current with upstream
```
origin ssh://git@git.sl0p.foo:39327/srv/git/sl0ppij.git (this fork; main = fork work)
upstream https://github.com/zellij-org/zellij.git (vanilla)
```
The local `main` branch is kept clean on `upstream/main` so fork commits can be rebased
onto new Zellij releases.
---
<h1 align="center">
<br>
<img src="https://raw.githubusercontent.com/zellij-org/zellij/main/assets/logo.png" alt="logo" width="200">
<br>
Zellij
<br>
<br>
</h1>
<p align="center">
<img src="https://raw.githubusercontent.com/zellij-org/zellij/main/assets/demo.gif" alt="demo">
</p>
<h4 align="center">
[<a href="https://zellij.dev/documentation/installation">Installation</a>]
[<a href="https://zellij.dev/screencasts/">Screencasts & Tutorials</a>]
[<a href="https://zellij.dev/documentation/configuration">Configuration</a>]
[<a href="https://zellij.dev/documentation/layouts">Layouts</a>]
[<a href="https://zellij.dev/documentation/faq">FAQ</a>]
</h4>
<p align="center">
<a href="https://discord.gg/CrUAFH3"><img alt="Discord Chat" src="https://img.shields.io/discord/771367133715628073?color=5865F2&label=discord&style=flat-square"></a>
<a href="https://matrix.to/#/#zellij_general:matrix.org"><img alt="Matrix Chat" src="https://img.shields.io/matrix/zellij_general:matrix.org?color=1d7e64&label=matrix%20chat&style=flat-square&logo=matrix"></a>
<a href="https://zellij.dev/documentation/"><img alt="Zellij documentation" src="https://img.shields.io/badge/zellij-documentation-fc0060?style=flat-square"></a>
</p>
<br>
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/bc5daac4-140a-4b83-8729-71c944ee1100">
<img src="https://github.com/user-attachments/assets/55156624-a71a-46b5-939e-f562e3b2dd7f" alt="Sponsored by ">
</picture>
<a href="https://www.gresearch.com/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/d609936a-abf8-4406-8cfc-889f76a09d74">
<img src="https://github.com/user-attachments/assets/742ae902-fe9d-41c6-baf2-4bc143061da3" alt="gresearch logo">
</picture>
</a>
</p>
# What is this?
[Zellij](#origin-of-the-name) is a workspace aimed at developers, ops-oriented people and anyone who loves the terminal. Similar programs are sometimes called "Terminal Multiplexers".
Zellij is designed around the philosophy that one must not sacrifice simplicity for power, taking pride in its great experience out of the box as well as the advanced features it places at its users' fingertips.
Zellij is geared toward beginner and power users alike - allowing deep customizability, personal automation through [layouts](https://zellij.dev/documentation/layouts.html), true multiplayer collaboration, unique UX features such as floating and stacked panes, and a [plugin system](https://zellij.dev/documentation/plugins.html) allowing one to create plugins in any language that compiles to WebAssembly.
Zellij includes a built-in [web-client](https://zellij.dev/tutorials/web-client/), making a terminal optional.
You can get started by [installing](https://zellij.dev/documentation/installation.html) Zellij and checking out the [Screencasts & Tutorials](https://zellij.dev/screencasts/).
For more details about our future plans, read about upcoming features in our [roadmap](#roadmap).
## How do I install it?
The easiest way to install Zellij is through a [package for your OS](./docs/THIRD_PARTY_INSTALL.md).
If one is not available for your OS, you could download a prebuilt binary from the [latest release](https://github.com/zellij-org/zellij/releases/latest) and place it in your `$PATH`. If you'd like, we could [automatically choose one for you](#try-zellij-without-installing).
You can also install (compile) with `cargo`:
```
cargo install --locked zellij
```
#### Try Zellij without installing
bash/zsh:
```bash
bash <(curl -L https://zellij.dev/launch)
```
fish/xonsh:
```bash
bash -c 'bash <(curl -L https://zellij.dev/launch)'
```
#### Installing from `main`
Installing Zellij from the `main` branch is not recommended. This branch represents pre-release code, is constantly being worked on and may contain broken or unusable features. In addition, using it may corrupt the cache for future versions, forcing users to clear it before they can use the officially released version.
That being said - no-one will stop you from using it (and bug reports involving new features are greatly appreciated), but please consider using the latest release instead as detailed at the top of this section.
## How do I start a development environment?
* Clone the project
* In the project folder, for debug builds run: `cargo xtask run`
* To run all tests: `cargo xtask test`
For more build commands, see [CONTRIBUTING.md](CONTRIBUTING.md).
## Configuration
For configuring Zellij, please see the [Configuration Documentation](https://zellij.dev/documentation/configuration.html).
## About issues in this repository
Issues in this repository, whether open or closed, do not necessarily indicate a problem or a bug in the software. They only indicate that the reporter wanted to communicate their experiences or thoughts to the maintainers. The Zellij maintainers do their best to go over and reply to all issue reports, but unfortunately cannot promise these will always be dealt with or even read. Your understanding is appreciated.
## Roadmap
Presented here is the project roadmap, divided into three main sections.
These are issues that are either being actively worked on or are planned for the near future.
***If you'll click on the image, you'll be led to an SVG version of it on the website where you can directly click on every issue***
[](https://zellij.dev/roadmap)
## Origin of the Name
[From Wikipedia, the free encyclopedia](https://en.wikipedia.org/wiki/Zellij)
Zellij (Arabic: الزليج, romanized: zillīj; also spelled zillij or zellige) is a style of mosaic tilework made from individually hand-chiseled tile pieces. The pieces were typically of different colours and fitted together to form various patterns on the basis of tessellations, most notably elaborate Islamic geometric motifs such as radiating star patterns composed of various polygons. This form of Islamic art is one of the main characteristics of architecture in the western Islamic world. It is found in the architecture of Morocco, the architecture of Algeria, early Islamic sites in Tunisia, and in the historic monuments of al-Andalus (in the Iberian Peninsula).
## License
MIT
## Sponsored by
<a href="https://terminaltrove.com/"><img src="https://avatars.githubusercontent.com/u/121595180?s=200&v=4" width="80px"></a>
|