Skip to content

gl0bal01/zellij-layouts

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

2 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Zellij Layouts

Zellij License

Zellij layouts for Claude Code projects, Docker, pentesting, malware analysis, and OSINT β€” launch a full workspace with one command

Zellij is a terminal multiplexer (like tmux/screen) with a layout system that lets you define pane arrangements in .kdl files. This repo provides ready-to-use layouts you can launch with a single command.

Quick start

git clone <this-repo> ~/zellij-conf
cd ~/zellij-conf
make setup      # one-time: create working directories
make install    # validate and install all layouts

Then launch any layout:

zellij --layout project options --default-cwd ~/projects/my-app

What is a layout?

A Zellij layout is a .kdl file that describes:

  • Tabs β€” named workspaces you switch between (Ctrl+t)
  • Panes β€” terminal splits within a tab (vertical/horizontal)
  • Commands β€” auto-run commands in specific panes (e.g. watch git status)

Layouts live in ~/.config/zellij/layouts/. Zellij finds them by name:

zellij --layout <name>           # loads ~/.config/zellij/layouts/<name>.kdl

Official docs: zellij.dev/documentation/layouts


Available layouts

claude-projects β€” Multi-project workspace

zp       # alias (named session: "claude")

Multiple project tabs generated from generate-layout.sh, each with:

  • 70% left β€” main shell (focused)
  • 30% right β€” live git status (top) + log tail or shell (bottom)

Plus fixed tabs: 🏠 cockpit (btop + ccusage) and πŸ§ͺ scratch.

project β€” Single project

zo ~/projects/my-app    # alias
zp-new my-app           # creates dir + named session "my-app"

Same pane pattern as above, without the cockpit. Use --default-cwd to point it at any directory.

docker β€” Docker / Compose

zdk                     # alias (session: "docker", cwd: ~/docker)
zdk-new my-stack        # creates ~/docker/my-stack, session "dk-my-stack"
Tab Panes
🐳 stack Compose commands + live docker ps + image shell
πŸ“œ logs docker compose logs -f + docker stats
πŸ”§ debug Container exec + build shell

pentest β€” Penetration testing

zpt                     # alias (session: "pentest", cwd: ~/ops/pentest)
zpt-new acme-corp       # creates ~/ops/pentest/acme-corp, session "pt-acme-corp"
Tab Panes
🎯 recon Scanner + enum + network monitor + notes
βš”οΈ exploit MSF + payload + listener + proxy
πŸ”“ post Session + pivot + process monitor + loot
πŸ“ loot Hash cracking + report

malware-analysis β€” Malware analysis

zma                     # alias (session: "malware", cwd: ~/ops/malware)
zma-new emotet          # creates ~/ops/malware/emotet, session "ma-emotet"
Tab Panes
πŸ”¬ static file/strings/objdump + disasm + hex + YARA
πŸ§ͺ dynamic strace/ltrace + sandbox + process & file monitors
🌐 network tcpdump + DNS + connection tracker + FakeNet
πŸ“‹ ioc Hash/VT lookups + strings + report

osint β€” OSINT investigation

zos                     # alias (session: "osint", cwd: ~/ops/osint)
zos-new target-co       # creates ~/ops/osint/target-co, session "os-target-co"
Tab Panes
🎯 target whois/dig + Shodan/Censys + IP lookup + notes
🌐 web Wayback/archive + metadata + tech stack + certs
πŸ“‘ social Username/email/phone/leak search
πŸ—‚οΈ timeline Report + data correlation + evidence log

How sessions work

Zellij sessions persist after you detach. You can have multiple sessions running simultaneously and switch between them.

zellij --session myname --layout project   # start a named session

If a session with that name already exists, Zellij reattaches to it instead of creating a duplicate.

Action Command / Keybind
List sessions zls
Attach to session za <name>
Detach (keeps running) Ctrl+o then d
Switch session (inside Zellij) Ctrl+o then w
Kill one session zks <name>
Kill all sessions zka

Navigating inside Zellij

Zellij uses modes β€” press a key combo to enter a mode, do your thing, press Esc to exit.

Tabs

Action Keybind
Enter tab mode Ctrl+t
Next / previous tab l / h (or β†’ / ←)
Go to tab by number 1–9
New tab n
Rename tab r

Panes

Action Keybind
Enter pane mode Ctrl+p
Move focus h/j/k/l (or arrows)
Toggle full-screen f

Scrolling

Action Keybind
Enter scroll mode Ctrl+s
Scroll ↑/↓ or PgUp/PgDn
Search in output s (then type)

Full keybinding reference: zellij.dev/documentation/keybindings


Shell setup

Add these aliases and functions to your .zshrc or .bashrc:

Aliases

# Zellij
alias z='zellij'

# Layouts (with named sessions)
alias zp='zellij --session claude --layout claude-projects'
alias zo='zellij --layout project options --default-cwd'
alias zdk='zellij --session docker --layout docker options --default-cwd ~/docker'
alias zpt='zellij --session pentest --layout pentest options --default-cwd ~/ops/pentest'
alias zma='zellij --session malware --layout malware-analysis options --default-cwd ~/ops/malware'
alias zos='zellij --session osint --layout osint options --default-cwd ~/ops/osint'

# Session management
alias zls='zellij list-sessions'
alias za='zellij attach'
alias zks='zellij kill-session'
alias zka='rm -rf ~/.cache/zellij'

Per-engagement functions

These create a fresh directory and launch a named session in one step:

# zpt-new acme    β†’ ~/ops/pentest/acme, session "pt-acme"
# zma-new emotet  β†’ ~/ops/malware/emotet, session "ma-emotet"
# zos-new corp    β†’ ~/ops/osint/corp, session "os-corp"
# zdk-new stack   β†’ ~/docker/stack, session "dk-stack"
# zp-new my-app   β†’ ~/projects/my-app, session "my-app"

zpt-new() {
  [[ -z "$1" ]] && { echo "Usage: zpt-new <name>"; return 1; }
  mkdir -p "$HOME/ops/pentest/$1"
  zellij --session "pt-$1" --layout pentest options --default-cwd "$HOME/ops/pentest/$1"
}

zma-new() {
  [[ -z "$1" ]] && { echo "Usage: zma-new <name>"; return 1; }
  mkdir -p "$HOME/ops/malware/$1"
  zellij --session "ma-$1" --layout malware-analysis options --default-cwd "$HOME/ops/malware/$1"
}

zos-new() {
  [[ -z "$1" ]] && { echo "Usage: zos-new <name>"; return 1; }
  mkdir -p "$HOME/ops/osint/$1"
  zellij --session "os-$1" --layout osint options --default-cwd "$HOME/ops/osint/$1"
}

zdk-new() {
  [[ -z "$1" ]] && { echo "Usage: zdk-new <name>"; return 1; }
  mkdir -p "$HOME/docker/$1"
  zellij --session "dk-$1" --layout docker options --default-cwd "$HOME/docker/$1"
}

zp-new() {
  [[ -z "$1" ]] && { echo "Usage: zp-new <name>"; return 1; }
  mkdir -p "$HOME/projects/$1"
  zellij --session "$1" --layout project options --default-cwd "$HOME/projects/$1"
}

Customising claude-projects

This is the only generated layout. Edit the projects array in generate-layout.sh:

projects=(
  "my-app:πŸš€::logs/dev.log"   # dirname:emoji:label:logfile
  "api:πŸ”Œ:backend-api:"        # empty logfile β†’ plain shell pane
)

Format: "dirname:emoji:label:logfile"

  • dirname β€” subdirectory under ~/projects/
  • emoji β€” tab icon
  • label β€” tab display name (defaults to dirname if empty)
  • logfile β€” path to tail relative to project dir (omit for plain shell)

Then run make install.


Make targets

make            # regenerate claude-projects.kdl
make install    # lint + regenerate + install all layouts
make uninstall  # remove installed layouts (keeps local files)
make clean      # remove generated + installed files
make setup      # create ~/ops/{pentest,malware,osint}
make lint       # validate KDL brace balance
make list       # show installed layouts
make help       # show all targets

Tips

  • Keybind conflicts? Press Ctrl+g to enter locked mode β€” all keys pass through to the app (e.g. Claude Code). Press Ctrl+g again to unlock and use Zellij keybinds.
  • Reattach, don't relaunch. Running zpt twice reattaches to the existing "pentest" session β€” it won't create a duplicate.
  • Full-screen a pane with Ctrl+p f when you need more space, then Ctrl+p f again to restore.
  • Scroll back with Ctrl+s β€” useful for reading long command output. Press s inside scroll mode to search.
  • Rename tabs with Ctrl+t r β€” handy for per-engagement tabs in the security layouts.
  • Floating pane with Ctrl+p w β€” spawns a temporary pane on top without changing your layout.
  • Sync panes β€” Ctrl+t s toggles sync mode: type in one pane, it echoes to all panes in the tab. Great for running the same command across multiple shells.
  • Copy mode β€” Ctrl+s then select text with arrows + Enter. Works without mouse.
  • Pipe pane output β€” zellij pipe lets you send pane output to external scripts.

More tips: zellij.dev/documentation


Resources

About

Opinionated Zellij layouts for multi-project development, Docker workflows, and security operations (pentest, malware analysis, OSINT)

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors