From Screen to Tmux to Zellij

I used GNU screen for years. I don’t think alternatives existed when I started using. It worked everywhere, and I only needed a few features.

The insides of an old PC thrown on the ground outside. Weathered.

Eventually, curiosity pushed me to try tmux a few years ago but I didn’t see what advantage it had over the older software I knew already, so I went back to screen.

So it went for several years, until in the last few days I decided to try tmux again, and I even configured it to use the same CTRL-a shortcut as screen and it worked well! I configured it to switch between tabs like in screen using the 1-0 keys. I could scroll back, just like in screen. It even had a session manager that let me choose which tab to use, although I’m annoyed I had to tap right arrow to expand the list first.

I announced on Slack that I was moving to tmux, and shortly after, someone casually asked, “if you are doing the switch now, have you tried zellij?”

Life with screen

My screen usage was almost aggressively simple:

  • Ctrl-a c to create a new window
  • Ctrl-a 1–0 to jump between windows
  • Ctrl-a a to toggle to the last window
  • ESC and page up to view the scroll back.

That was it, but I used it all the time. The first thing I did on connecting to a server was screen -D -r to connect to screen.

I wasn’t using splits. I wasn’t scripting layouts. Screen was effectively a tab manager for shells, and it did that job reliably for decades. It’s still running like that on my servers, for the moment.

Moving to tmux

The first pleasant surprise was that tmux doesn’t force you to relearn anything.

With a small config change, tmux can behave almost exactly like screen:

  • Ctrl-a prefix
  • number-based window switching
  • last-window toggle
  • better copy/paste
  • better session handling

At that point, tmux felt like screen, but actively maintained. Tmux felt like the natural evolution of screen. I only used it for a day or so, but then I tried Zellij.

Discovering Zellij

Zellij describes itself as a “Terminal Workspace with Batteries Included”. Zellij doesn’t feel like a screen or tmux replacement. It is quite different. Instead of a simple bar at the end of the screen showing the tabs, there’s a menu with keys. Tapping the key combination updates the menu, showing new options. At the top of the screen are the tabs you’ll use. Unlike screen and tmux, there’s no one single shortcut like CTRL-a or CTRL-b, there are multiple. There’s one for each mode: panes, tabs, search and session (plus a few more).

The biggest conceptual shift is this: tmux is tab-first. Zellij is pane-first.

In tmux, I naturally created lots of windows, like I did with screen. I split one or two, but Zellij takes that to the next level.

In Zellij, the expectation is:

  • One tab = one context
  • Panes = the work inside that context

This sounds subtle, but it changes everything. You’re encouraged to create new panes in each tab before you make new tabs.

Discoverability over memorization

Zellij uses modes (pane mode, tab mode, scroll mode), and it shows you available keys on screen.

You don’t need a cheat sheet taped to your monitor. You look down, and the UI tells you what’s possible.

This is something tmux simply doesn’t try to do.

Pane-centric workflows

Zellij really shines when you stop creating tabs constantly and instead:

  • edit code in one pane
  • run or build in another
  • tail logs in a third
  • fullscreen a pane temporarily when you need focus

It feels closer to an IDE or a tiling window manager than a tabbed terminal.

Modern assumptions

Zellij assumes:

  • a modern terminal
  • Unicode support
  • decent fonts
  • OSC 52 clipboard support

That’s great locally. I’ll be interested to see how well it works on my VPS.

The Terminal

I use iTerm2 on a Mac and there were a few things to set up before I could use Zellij fully.

  • In Preferences → Profiles → (your profile) → Terminal make sure that “Mouse Reporting” is checked. That lets you click panes to select them, scroll up a pane, and select text to copy it.
  • Zellij uses the ALT key, but if you use CMD on a Mac the operating system will intercept that. Instead use the Option key. In Preferences → Profiles → Keys set “Left option key” to “Esc+”. That may interfere with copying and pasting though. Now type Option-n to open a new pane!
  • I was seeing odd characters in the UI. Little “?” characters in boxes. I needed a new font: brew install --cask font-jetbrains-mono-nerd-font
    Then in Preferences → Profiles → Text set the font to “JetBrainsMono Nerd Font Mono” or whichever one you prefer. You may have to restart Zellij to see the change.

This is barely touching the surface of what Zellij can do. If you use screen or tmux give it a go.

Creating a Shared Photo Library in Immich

If you’re using Immich to manage your photos, you may have discovered that sharing photos between users isn’t as straightforward as you’d like. Many users, particularly couples or families, want a shared folder where both parties can upload photos that are automatically visible to each other, complete with face recognition and smart search capabilities.

Boats in Crosshaven at sunset.

While Immich has shared albums, they don’t quite solve this problem. The photos don’t appear in search and aren’t processed for face recognition or analysis. What we really need is a true shared library where both users have full access to the same photos with all of Immich’s powerful features.

Here’s a solution using external libraries and symlinks that creates a pseudo-shared folder between Immich users.

The as yet new and unnamed bridge in Cork.

Important: If you rely on uploading photos through the Immich app on your phone this method won’t work for you. You’ll need to sync the photos some other way and copy them into an external library. I export my photos from Lightroom Classic on my laptop, and Syncthing syncs them to the Immich server. Everything is automated from the moment I publish them to the shared directory.

Fisherman's hut in Connemara.

This approach uses external libraries and symbolic links (symlinks) to create a shared photo directory that appears in both users’ Immich libraries. Each user uploads to their own “shared” directory, and through symlinks, those photos automatically appear in the other person’s library as well.

Requirements

  • Access to the Immich server’s file system (typically via SSH or direct access).
  • External libraries enabled for each user.
  • Basic familiarity with Linux commands.

Step-by-Step Setup

Let’s walk through this with an example using John and Mary, a couple who want to share their photos.

1. Set Up External Libraries

First, both users need to have external libraries configured in Immich. For this example, let’s say the external library on the server is this folder:

/mnt/external_library/

It will be mounted in Immich at /external_library/ in this example.

Create a directory structure like this:

/mnt/external_library/
├── john/
│   └── shared/
└── mary/
    └── shared/

2. Configure the External Libraries in Immich

In Immich’s admin web interface:

  • For John, add an external library pointing to /external_library/john
  • For Mary, add an external library pointing to /external_library/mary

3. Create the Symlinks

This is where the magic happens. We’ll create symbolic links that connect each person’s shared directory to the other person’s external library.

Log in to the Immich server and run these commands:

cd /mnt/external_library/john/
ln -s ../mary/shared mary_files
cd ../mary
ln -s ../john/shared john_files

4. Upload and Scan

Now when John uploads photos to /mnt/external_library/john/shared/, they will:

  • Appear in his own Immich library
  • Automatically appear in Mary’s library (via the symlink at /mnt/external_library/mary/john_files)

The same works in reverse for Mary’s uploads.

After uploading, trigger a scan of the external libraries in Immich, and both users will see the shared photos.

A red deer digs up grass during the rutting in Killarney.

How It Works

A symbolic link is like a shortcut that points to another location in the filesystem. When Mary’s Immich library scans /external_library/mary/, it finds the john_files symlink and follows it to John’s actual shared directory. From Immich’s perspective, it looks like Mary has those photos in her library, but they’re actually stored in John’s directory.

Advantages

  • Full Immich functionality: Both users get face recognition, smart search, and all other Immich features on the shared photos
  • Simple uploads: Just upload to your own shared directory—no manual copying needed
  • Bidirectional sharing: Both users can add photos that the other will see
  • Single source of truth: Each photo is stored once (by the person who uploaded it)

Disadvantages

  • Duplicate processing: Immich will process each shared photo twice—once for each user. This means:
    • Face recognition runs twice.
    • Smart search/ML classification runs twice.
    • More CPU and storage usage for thumbnails and metadata.
  • File ownership: Photos remain in the uploader’s directory. If John deletes his Immich library or account, Mary loses access to his photos.
  • Requires server access: You need command-line access to the server to set up symlinks.

Important Notes

  • Upload directly to external libraries: Don’t upload to your main Immich library through the app. Upload directly to the shared directory in your external library.
  • Backup strategy: Make sure your backup solution covers the external library directories.
  • Permissions: Ensure that the Immich container has proper read permissions for all directories involved.
A man in a black coat and cap looks to the side in front of a "SALE" sign with people on the sign.
A young girl sits on the wall nearby.

Conclusion

While this solution requires some technical setup and comes with the overhead of duplicate processing, it provides a practical way to share photos between Immich users with full functionality. This approach has proven reliable for my wife and me, who wanted a shared family photo library without waiting for native multi-user library support in Immich.

If you’re comfortable with the command line and the tradeoff of duplicate processing, this solution provides the shared photo experience many users are looking for.