From Ghost to Zulip: Setting Up Zulip Locally on WSL2 (and Fixing Tricky Python Issues)

Published: (December 17, 2025 at 10:45 PM EST)
2 min read
Source: Dev.to

Source: Dev.to

Cover image for From Ghost to Zulip: Setting Up Zulip Locally on WSL2 (and Fixing Tricky Python Issues)

Abdul Talha


Introduction

After contributing to Ghost, I wanted to push myself further by working on a larger and more complex backend system.

That curiosity led me to Zulip, an open‑source team collaboration tool known for its topic‑based threading and production‑grade architecture.

Zulip is built with:

  • Django
  • Tornado
  • PostgreSQL
  • RabbitMQ

Setting up Zulip locally isn’t hard, but it’s very different from a typical Django project. I ran into a few unexpected issues, especially around Python virtual environments and WSL configuration.

In this post, I’ll walk through:

  • How I set up Zulip locally on WSL2
  • The issues I faced during setup
  • How I fixed them, including the activate_this.py problem

If you’re new to Zulip or moving into larger backend systems, this guide should help you avoid common setup blockers.

Who This Post Is For

  • Developers contributing to Zulip for the first time
  • Open‑source contributors moving beyond small projects
  • Anyone using WSL2 on Windows
  • Developers stuck with Python 3.12 or activate_this.py errors

Prerequisites

General

  • 2 GB+ RAM
  • Stable internet connection
  • GitHub account

Windows

  • Windows 10/11 (64‑bit)
  • Virtualisation enabled (VT‑x / AMD‑V)
  • Admin access

Git and GitHub Setup

If Git is already configured, you can skip this section.

  1. Generate an SSH key

    ssh-keygen -t ed25519 -C "your_email@example.com"
  2. Copy the public key

    cat ~/.ssh/id_ed25519.pub
  3. Add it to GitHub → Settings → SSH and GPG Keys.

Setting Up WSL2 for Zulip

If you already use native Ubuntu or WSL2, feel free to skip ahead.

Enable Virtualisation

Make sure VT‑x / AMD‑V is enabled in BIOS.

Install WSL2

wsl --install

This installs Ubuntu automatically.

Enable systemd (Required)

Zulip relies on background services like PostgreSQL, Redis, and RabbitMQ.

sudo nano /etc/wsl.conf

Add the following:

[boot]
systemd=true

Restart WSL:

wsl --shutdown

Install Required Services

sudo apt update && sudo apt upgrade
sudo apt install rabbitmq-server memcached redis-server postgresql

RabbitMQ Configuration

sudo nano /etc/rabbitmq/rabbitmq-env.conf

Add:

NODE_IP_ADDRESS=127.0.0.1
NODE_PORT=5672

Cloning the Zulip Repository

  1. Fork Zulip on GitHub, then clone your fork:

    git clone --config pull.rebase git@github.com:YOURUSERNAME/zulip.git
    cd zulip
    git remote add -f upstream https://github.com/zulip/zulip.git

Running Zulip Locally

  1. Install dependencies

    ./tools/provision
  2. Activate the virtual environment

    source .venv/bin/activate
  3. Start the dev server

    ./tools/run-dev
  4. Visit

    http://localhost:9991

Common Issues I Faced (and How I Fixed Them)

Issue 1: Missing activate_this.py

Error

FileNotFoundError: No such file or directory ... activate_this.py

Why this happens

Zulip now uses uv, which doesn’t automatically create activate_this.py. Some scripts still expect it.

Fix

Manually create the file:

cat > .venv/bin/activate_this.py   
- Zulip Dev Docs:   
- Zulip Community Chat:   
- WSL Docs:   
- uv:
Back to Blog

Related posts

Read more »

Rython - New Programming language!

Who am I Maybe you already know—if so, you’re doing great, thanks for reading my posts! If not, I’m Igor, a Ukrainian developer who created a Neovim plugin tha...