Install Claper: Self-Host Interactive Presentations with Docker
Create interactive presentations with Claper. This guide shows you step-by-step how to install and secure Claper on your own server using Docker and Docker Compose.

Table of Contents
Boring, one-sided presentations? It doesn’t have to be that way. Imagine being able to directly engage your audience in your presentation – with live polls, an interactive quiz, or a moderated Q&A session. This is exactly what Claper, an open-source tool that brings your presentations to life, makes possible.
While there is a hosted service at claper.co, we want to maintain full control here and install Claper on our own server. In this guide, I’ll show you how to set up Claper with Docker and Docker Compose and publish it securely via a reverse proxy.
What is Claper?
Claper is a tool that helps make presentations more interactive. Instead of just showing slides, you can directly involve your audience. The main features are:
- Questions & Answers (Q&A): The audience can submit questions, which you can moderate and answer live.
- Quizzes and Polls: Create multiple-choice questions or open-ended polls and display the results in real-time.
- Forms: Collect structured feedback or information from participants.
- Embed Web Content: Integrate external websites or videos directly into your presentation.
- Moderation Tools: Maintain control over what content is visible to everyone.
- Reports: Analyze engagement and results after the presentation.
Since Claper is open-source software under a GNU v3.0 license, we can run it for free on our own server.
Step 1: Server Preparation and Docker Installation
I’m assuming for this guide that you already have a running server with Docker and Docker Compose. If not, here’s the short version:
-
Server and Domain: You need a server (e.g., a VPS from Hetzner or Netcup) and a domain that points to the server’s IP address. Check this with
ping your-domain.com
. You can find more details on initial setup in my VPS Basics Guide. -
Connect to the Server:
ssh your-user@YOUR_SERVER_IP
-
Install Docker (if not already done):
# Install dependencies sudo apt-get update sudo apt-get install -y ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add repository and install Docker echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Verify the installation with
docker --version
anddocker compose version
.
Step 2: Installing Claper with Docker Compose
Now, let’s set up Claper. We’ll base our setup on the compose.yaml
from the official Claper GitHub Repository.
Creating the Directory Structure
First, we’ll create a dedicated folder for our Claper project.
mkdir claper
cd claper
If you have trouble with the commands in the terminal, feel free to check out my blog post on the most important terminal commands.
Creating Docker Compose and Configuration Files
Now we’ll create all the necessary files and folders.
# Create folders for persistent data
mkdir db uploads
# Create configuration files
touch compose.yaml .env
Now, let’s edit the compose.yaml
file with an editor like vim
or nano
. Press i
to enter Insert Mode in Vim.
vim compose.yaml
Copy the following content into it. I have already adjusted it slightly:
services:
db:
image: postgres:16
container_name: claper-db
restart: unless-stopped
volumes:
- ./db:/var/lib/postgresql/data
healthcheck:
test:
- CMD
- pg_isready
- "-q"
- "-d"
- "claper"
- "-U"
- "claper"
retries: 3
timeout: 5s
environment:
POSTGRES_PASSWORD: claper
POSTGRES_USER: claper
POSTGRES_DB: claper
networks:
- claper-net
app:
image: ghcr.io/claper-app/claper:2
ports:
- 4000:4000
container_name: claper
restart: unless-stopped
volumes:
- ./uploads:/app/uploads
healthcheck:
test: curl --fail http://localhost:4000 || exit 1
retries: 3
start_period: 20s
timeout: 5s
env_file: .env
depends_on:
db:
condition: service_healthy
networks:
- claper-net
networks:
claper-net:
external: false
Adjustments in compose.yaml
image
: I have set the PostgreSQL version to16
and Claper to version2
. This prevents unexpected “breaking changes” from alatest
update.volumes
: I have replaced the named volumes with bind mounts (./db
and./uploads
). This way, the data is stored directly in our project folder, which simplifies backups.ports
: Port4000
is exposed so we can access Claper directly before the reverse proxy is configured.
Save the file with :x
and Enter.
Configuring the .env
File
Now comes the most important configuration file. The env.sample
from the Claper repository gives us the template.
vim .env
Paste this content and customize it:
# PostgreSQL settings
POSTGRES_HOST=db
POSTGRES_USER=claper
POSTGRES_DB=claper
POSTGRES_PASSWORD=YOUR_SECURE_DB_PASSWORD
# Claper settings
BASE_URL=http://YOUR_SERVER_IP:4000
SECRET_KEY_BASE=YOUR_VERY_SECRET_KEY
PRESENTATION_STORAGE=local
PRESENTATION_STORAGE_DIR=/app/uploads
# Mail configuration
MAIL_TRANSPORT=local
MAIL_FROM=noreply@claper.co
MAIL_FROM_NAME=Claper
#SMTP_RELAY=xx.example.com
#SMTP_USERNAME=johndoe@example.com
#SMTP_PASSWORD=xxx
#SMTP_PORT=465
# SMTP settings (Optional, for email functions)
# SMTP_HOST=
# SMTP_PORT=
# SMTP_USERNAME=
# SMTP_PASSWORD=
# SMTP_SENDER_EMAIL=
# Claper configuration
#ENABLE_ACCOUNT_CREATION=true
SECRET_KEY_BASE
: Replace this with a long, random string. You can generate one withopenssl rand -base64 32
.BASE_URL
: For now, enter your server’s IP address and port4000
.
Starting the Containers
Now we are ready. In the claper
directory, run:
sudo docker compose up -d
The Docker images will be downloaded on the first start. If everything has worked, you can access Claper in your browser at http://YOUR_SERVER_IP:4000
.
Step 3: Initial Setup and Security
You should now see the Claper start page.
- Create a user account: Click on “Login” and create your admin account.
- Disable registration: After creating your account, other people can also register. We want to prevent this.
- Stop the containers:
sudo docker compose down
- Edit the
.env
file:vim .env
- Change
#ENABLE_ACCOUNT_CREATION=true
toENABLE_ACCOUNT_CREATION=false
. - Restart the containers:
sudo docker compose up -d
- Stop the containers:
Step 4: Setting up a Reverse Proxy with Caddy (Recommended)
To securely access Claper via a domain with HTTPS, a reverse proxy is the best solution.
-
Create a network (if not already done):
sudo docker network create proxy
-
Set up Caddy: Create a separate directory for Caddy with the necessary files. You can find a detailed guide on this in my Nextcloud tutorial. Here’s the short version:
~/caddy/docker-compose.yml
:services: caddy: image: caddy:2 container_name: caddy restart: unless-stopped ports: ["80:80", "443:443", "443:443/udp"] volumes: ["./Caddyfile:/etc/caddy/Caddyfile", "./data:/data", "./config:/config"] networks: - proxy networks: proxy: external: true
~/caddy/Caddyfile
:claper.your-domain.com { reverse_proxy claper:4000 }
-
Adapt Claper for the proxy:
- Edit Claper’s
compose.yaml
:- Add
claper
to theproxy
network. - Remove the
ports
section.
- Add
- Edit Claper’s
.env
file:- Change the
BASE_URL
tohttps://claper.your-domain.com
.
- Change the
- Edit Claper’s
-
Start everything:
# In the Caddy directory sudo docker compose up -d # In the Claper directory sudo docker compose up -d
You should now be able to securely access Claper at your domain, with a valid SSL certificate.
Practice Test: Creating an Interactive Presentation
Now that everything is running, we can try out Claper.
- Create an event: Give your presentation a name and upload a PDF or PowerPoint file.
- Invite participants: Share the displayed code or QR code with your audience.
- Add interactions:
- Click “Add Interaction”.
- Create a poll with yes/no answers.
- Add a quiz and mark the correct answer.
- Embed a YouTube video or another webpage.
During your presentation, you can activate the interactions and display the results live. Participants can send messages and reactions via their smartphones. After the presentation, a detailed report is available.
CAUTION
If uploading files fails, it is often due to an incorrect BASE_URL
in the .env
file. The value there must exactly match the URL you use to access Claper. Check the logs with sudo docker compose logs -f app
for precise error messages.
Conclusion
Claper is an incredibly useful tool for taking presentations and lectures to the next level. The installation with Docker is quick, once you know the small hurdles. With a self-hosted instance, you retain full control and can engage your audience in a new, interactive way.
FAQs
Is Claper free?
Yes, Claper is open-source software under the GNU v3.0 license. You can install and use it for free on your own server. Costs only arise for your server and your domain.
Can I install Claper without Docker?
Yes, the official documentation also describes a manual installation. For most users, however, the installation with Docker is much easier and requires less maintenance, as all dependencies are encapsulated in the containers.
What file formats can I upload for my presentations?
Claper supports common formats like PDF and PowerPoint (.pptx). The files are converted into a web-friendly format during processing. Note that animations from PowerPoint may be lost in the process.
How do I update my Claper instance?
Thanks to Docker, an update is easy. Change the image tag in your `compose.yaml` file to the desired new version, run `sudo docker compose pull` to download the new image, and then restart the containers with `sudo docker compose down && sudo docker compose up -d`. Always make a backup beforehand!