---
title: "Deploy Penpot Custom Fonts"
description: "Upload your team fonts to a self-hosted Penpot"
category: "Other"
url: https://railway.com/deploy/deploy-penpot-with-custom-fonts
---

# Deploy Penpot Custom Fonts

Upload your team fonts to a self-hosted Penpot

**[Deploy Penpot Custom Fonts on Railway](https://railway.com/template/deploy-penpot-with-custom-fonts)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/deploy-penpot-with-custom-fonts/manifest.json

- **Creator:** onepush
- **Category:** Other

## Template content

### penpot-frontend

- **Image:** penpotapp/frontend:2.18.3@sha256:bb8abe27d53de84c95597f2c02c0e702b2779971fb0703e543f9ecf183e999f6
- **Start command:** `/bin/bash -c 'printf "upstream penpot-backend { zone penpot_backend 64k; server %s:6060 resolve; }\nupstream penpot-exporter { zone penpot_exporter 64k; server %s:6061 resolve; }\nupstream penpot-assets { zone penpot_assets 64k; server %s:6070 resolve; }\n" "$PENPOT_BACKEND_HOST" "$PENPOT_EXPORTER_HOST" "$PENPOT_BACKEND_HOST" > /etc/nginx/overrides/http.d/railway-upstreams.conf && printf "location ~ ^/internal/assets/(.*)\$ { internal; proxy_pass http://penpot-assets/\$1; proxy_hide_header Content-Type; include /etc/nginx/nginx-security-headers.conf; }\n" > /etc/nginx/overrides/server.d/railway-assets.conf && exec /bin/bash /entrypoint.sh nginx -g "daemon off;"'`
- **Health check:** /
- **Public domain:** Yes

### Valkey

- **Image:** valkey/valkey:8.1.10@sha256:640c5e62cea04b6d6f2084232651d0cc70362d31f4f805e7be94dbed6855e8f2

### penpot-backend

- **Image:** penpotapp/backend:2.18.3@sha256:2df1b3440d2a82cc3571db211b4ffdfa2b89ccc910759e8d5e9387fb62971b5c
- **Start command:** `/bin/bash -c 'python3 -m http.server 6070 --bind :: --directory /opt/data/assets >/dev/null 2>&1 & exec /bin/bash run.sh'`
- **Health check:** /readyz

### Postgres https://devicons.railway.app/i/postgresql.svg

- **Image:** ghcr.io/railwayapp-templates/postgres-ssl:18.6@sha256:fcc6686a3f4f1962fe4ed77a15884553b7bd611ae1cea3204687968c5c09d517

### penpot-exporter

- **Image:** penpotapp/exporter:2.18.3@sha256:418232d6ca3120b1c2bfde298a56a05a1f41f567cd8494deac3fe7fbc186cfbd
- **Health check:** /readyz

## Documentation

# Deploy and Host self hosted Penpot Custom Fonts (Self-Hosted Design Tool with Your Team Fonts) on Railway

This template deploys Penpot 2.18.3 on Railway so your design team can upload its brand and licensed typefaces once and use them across every file in the team.

## About Hosting Penpot Custom Fonts open-source software on Railway (self hosted custom fonts in self-hosted Penpot template)

Your design files sit in Postgres on your own Railway project, and the font files you upload sit on a backend volume you control.

## Why Deploy Penpot Custom Fonts, the Figma alternative on Railway (Railway Free Trial)

Figma shares custom fonts only on paid org plans and keeps your files in its cloud. The $5 trial credit is enough to deploy and check that your fonts render.

Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.

By deploying Penpot Custom Fonts on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.

### Railway vs Other Hosting Providers and VPS for Penpot Custom Fonts self hosting

Running this stack on Railway trades some low-level control for less upkeep than a general-purpose provider.

| Provider | What You Get with Railway | What You Get with the Other Provider |
| --- | --- | --- |
| DigitalOcean | Five services from one template, with the font volume and Postgres wired up. | Full Droplet control, but you install Docker and handle TLS and upgrades. |
| AWS | Frontend, backend, exporter, Postgres and Valkey already on private networking. | Deep networking and storage control, with many more moving parts to manage. |
| Hetzner | Managed restarts, HTTPS on a public domain, and persistent volumes for fonts. | Low-cost servers with generous RAM, but setup, backups and patches are on you. |

## Common Use Cases for hosted Penpot Custom Fonts

- **Brand typefaces for a design system:** Upload your licensed brand family once, and every designer on the team can pick it from the Fonts list.
- **Licensed fonts that cannot use Google Fonts:** Commercial typefaces often are not on Google Fonts. Uploading them to your own Penpot keeps them inside your team and within your license terms.
- **Client fonts per agency team:** Give each client its own team and upload that client's fonts there, so the typefaces stay out of other clients' files.
- **Consistent exports with custom fonts:** The exporter renders PNG and PDF output with your uploaded fonts, so exports match what you see on screen.
- **Replacing missing fonts in imported Figma files:** When a file opens with fonts Penpot lacks, upload the right family to the team and swap it in instead of rebuilding text styles by hand.

## Dependencies for Penpot Custom Fonts Docker hosted on Railway

This section covers what the stack needs from Railway and from the Penpot images. Most of it is already wired into the template.

### Deployment Dependencies for Managed Penpot Custom Fonts Service (Design Tool)

Five services run the stack. penpot-frontend uses penpotapp/frontend:2.18.3, runs nginx, and is the only public service on port 8080. penpot-backend uses penpotapp/backend:2.18.3 with private ports 6060 and 6070 and mounts a volume at /opt/data/assets, which holds every uploaded font file. penpot-exporter uses penpotapp/exporter:2.18.3 with headless Chromium on private port 6061.

### Implementation Details for Penpot Custom Fonts (Using Penpot official docker image)

Set PENPOT_OBJECTS_STORAGE_BACKEND=fs and PENPOT_OBJECTS_STORAGE_FS_DIRECTORY=/opt/data/assets on the backend so fonts land on the volume.

## How does Penpot Custom Fonts compare against other ways to use brand fonts in a design tool

### Penpot vs Figma for custom fonts (Figma Alternative for Team Typefaces)

- **Font sharing:** Penpot uploads fonts once per team from the Fonts section, and every file in that team can use them. Figma shares org fonts on paid plans, so it wins on polish.
- **Storage:** Your font files sit on your own backend volume. Figma keeps everything in its cloud.
- **Grouping:** Penpot groups uploads by family name and weight, so you may need to rename the family after upload.

### Penpot vs Canva brand fonts (Canva Alternative for Brand Kits)

- **Target user:** Canva suits quick social posts by non-designers. Penpot is a proper vector and prototyping tool for design teams.
- **Font upload:** Penpot accepts TTF, OTF, WOFF and WOFF2 files you control. Canva's brand font options depend on its plan.
- **Exports:** Penpot renders exports with your custom fonts, which keeps PDF and PNG output consistent.

### Penpot vs Sketch (Sketch Alternative for Custom Typefaces)

- **Platform:** Sketch is macOS-only and relies on fonts installed on each machine. Penpot runs in the browser on any OS.
- **Collaboration:** Penpot offers real-time multiplayer editing in one shared file. Sketch leans more on cloud links and plugins.
- **Maturity:** Sketch has a long track record and a deep macOS plugin library. Penpot has fewer third-party plugins.

### Penpot vs Lunacy (Lunacy Alternative for Desktop Font Workflows)

- **Price:** Lunacy is a free desktop app by Icons8, hard to beat for solo work. Penpot is free to self-host, but you pay for the server.
- **Font handling:** Lunacy uses local machine fonts, which is awkward for a shared team library. Penpot keeps team fonts on the server so everyone gets the same family.
- **Platform:** Lunacy is a native desktop app and wins if your team works offline. Penpot runs in the browser.

## How to use Penpot Custom Fonts (the OSS design and prototyping tool)?

1. Create your account and a team. No email verification on this template, so you're in as soon as you sign up.

2. Open the team dashboard, go to **Fonts**, and click **Add custom font**. Select the TTF, OTF, WOFF or WOFF2 files for every weight you use.

3. Check that the variants group into one family. If bold shows up separately, rename the family in the list so the variants match.

4. Open a file in the same team and pick the family from the text typography menu. Other teams won't see it.

5. Export a board to PNG or PDF to confirm the font renders.

6. Back up the `penpot-backend` volume at `/opt/data/assets` and Postgres.

Check family and weight metadata before uploading:

```bash
fc-scan --format "%{family} | %{style} | %{weight}\n" BrandSans-Bold.otf
```

## How to self host Penpot Custom Fonts on other VPS Services (Penpot self hosting guide)

Any VPS with Docker can run this stack, and custom fonts persist the same way they do on Railway. Replace your-domain with the public address you point at the server.

### Clone the Repository

Penpot keeps its compose file in the main repo. Clone it and move into the images directory.

```bash
git clone https://github.com/penpot/penpot.git
cd penpot/docker/images
```

### Install Dependencies

You need Docker with the Compose plugin and about 2 GB of RAM or more. Check both first.

```bash
docker --version
docker compose version
free -h
```

### Configure Environment Variables

Set PENPOT_PUBLIC_URI to https://your-domain and replace the default secret key with a random value.

```bash
export PENPOT_PUBLIC_URI=https://your-domain
export PENPOT_SECRET_KEY=$(openssl rand -hex 32)
```

### Start the Penpot Custom Fonts Application

Start the stack detached, then confirm the backend is healthy. Put HTTPS in front of port 8080 with a reverse proxy before you upload your team fonts.

```bash
docker compose -p penpot -f docker-compose.yaml up -d
docker compose -p penpot ps
```

Railway handles the reverse proxy, TLS certificate, and persistent volume for you.

## Official Pricing of Penpot Custom Fonts (Penpot pricing)

Penpot itself is free and open source under the MPL-2.0 license, so self-hosting it and uploading your team fonts costs nothing in licensing.

## Penpot Custom Fonts cloud vs self hosted comparison (Pricing, features, costs, and more)

Self-hosting keeps your team's licensed typefaces on infrastructure you control. Penpot is free, so your costs are infrastructure only.

### Monthly cost of self hosting Penpot Custom Fonts on Railway

Expect roughly $10-25 per month on Railway for the whole stack at light team use, mostly driven by RAM. Railway's $5 trial is enough to test the custom font upload flow first.

### System Requirements for Hosting Penpot Custom Fonts on a VPS

A VPS needs Docker and about 2 GB of RAM or more to run the upstream compose setup. Keep to one backend instance, because filesystem storage is tied to one disk.

## Frequently Asked Questions (FAQs)

### Why do my weights show up as separate families?

Penpot groups uploads by the family name stored in the font file's metadata, and if the bold or italic files report a slightly different family name, they land in their own group.

### Which font formats does Penpot accept?

Penpot accepts TTF, OTF, WOFF and WOFF2 files. You only need one format per variant, so upload a TTF or OTF for each weight and skip the web formats unless you already have them.

### Are custom fonts shared across teams?

No, fonts are uploaded per team and every file inside that team can use them.

### Who is allowed to upload fonts?

Team members with edit permissions (editor, admin or owner) can add and manage fonts in the team Fonts section. Viewers can use the fonts in files but cannot change the list.

### Do exports render with the custom font?

Yes, the exporter fetches the uploaded font files from the backend, so PNG, SVG and PDF exports show the typeface you chose.

### What happens to Figma files that use fonts I don't have?

Penpot shows a missing font warning when it opens the imported file, and you can replace each missing font with an uploaded or built-in one.


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/deploy-penpot-with-custom-fonts
