---
title: Quickstart
description: Set up jalco-drop on Cloudflare in a few minutes, or as a Docker container on any server.
---

You need Node 22.18 or newer. Pick where it runs.

**Cloudflare**

The fastest way is the button. It forks the repo into your GitHub account, creates the R2 bucket, asks for an `ADMIN_TOKEN` (any long random string; save it in a password manager) and deploys to a `workers.dev` address. Add your own domain afterwards under the Worker's **Domains & Routes**.

<div className="deploy-buttons"><a className="deploy-button deploy-cloudflare" href="https://deploy.workers.cloudflare.com/?url=https://github.com/jal-co/jalco-drop"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M16.5088 16.8447c.1475-.5068.0908-.9707-.1553-1.3154-.2246-.3164-.6045-.499-1.0615-.5205l-8.6592-.1123a.1559.1559 0 0 1-.1333-.0713c-.0283-.042-.0351-.0986-.021-.1553.0278-.084.1123-.1484.2036-.1562l8.7359-.1123c1.0351-.0489 2.1601-.8868 2.5537-1.9136l.499-1.3013c.0215-.0561.0293-.1128.0147-.168-.5625-2.5463-2.835-4.4453-5.5499-4.4453-2.5039 0-4.6284 1.6177-5.3876 3.8614-.4927-.3658-1.1187-.5625-1.794-.499-1.2026.119-2.1665 1.083-2.2861 2.2856-.0283.31-.0069.6128.0635.894C1.5683 13.171 0 14.7754 0 16.752c0 .1748.0142.3515.0352.5273.0141.083.0844.1475.1689.1475h15.9814c.0909 0 .1758-.0645.2032-.1553l.12-.4268zm2.7568-5.5634c-.0771 0-.1611 0-.2383.0112-.0566 0-.1054.0415-.127.0976l-.3378 1.1744c-.1475.5068-.0918.9707.1543 1.3164.2256.3164.6055.498 1.0625.5195l1.8437.1133c.0557 0 .1055.0263.1329.0703.0283.043.0351.1074.0214.1562-.0283.084-.1132.1485-.204.1553l-1.921.1123c-1.041.0488-2.1582.8867-2.5527 1.914l-.1406.3585c-.0283.0713.0215.1416.0986.1416h6.5977c.0771 0 .1474-.0489.169-.126.1122-.4082.1757-.837.1757-1.2803 0-2.6025-2.125-4.727-4.7344-4.727" /></svg>Deploy to Cloudflare</a></div>

To set it up from your terminal instead:

You need a Cloudflare account with the domain you want to serve from, R2 enabled, and Browser Rendering for preview cards. The Workers Paid plan ($5 a month) is likely needed: Workers Free allows 10 ms of CPU per request, and rendering a highlighted file or a markdown page usually takes more. Storage stays free up to 10 GB, and downloads are always free. To pay nothing, run the [Docker version](/v1.2/self-hosting) on a server you already have.

1. **Create the project**

    ```bash
    npx jalco-drop init my-drop
    ```

    Setup copies the project and asks for your domain, your name, a site name, an accent colour, a code theme and where `/` should redirect. Every question has a default.

2. **Deploy**

    Answer **yes** when setup offers to deploy. It signs in to Cloudflare, creates the R2 bucket, deploys the Worker, and prints a new admin token once. Save it in a password manager.

3. **Upload something**

    ```bash
    export JALCO_DROP_URL=https://drop.example.com
    export JALCO_DROP_TOKEN=<your admin token>
    bin/jalco-drop README.md
    ```

**Docker**

On Render, the button runs the image with a 10 GB disk and generates the admin token for you. Render needs a paid plan for disks.

<div className="deploy-buttons"><a className="deploy-button deploy-render" href="https://render.com/deploy?repo=https://github.com/jal-co/jalco-drop"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M18.263.007c-3.121-.147-5.744 2.109-6.192 5.082-.018.138-.045.272-.067.405-.696 3.703-3.936 6.507-7.827 6.507-1.388 0-2.691-.356-3.825-.979a.2024.2024 0 0 0-.302.178V24H12v-8.999c0-1.656 1.338-3 2.987-3h2.988c3.382 0 6.103-2.817 5.97-6.244-.12-3.084-2.61-5.603-5.682-5.75" /></svg>Deploy to Render</a></div>

On your own server:

You need Docker and a server with a domain pointed at it.

1. **Create the project**

    ```bash
    npx jalco-drop init my-drop --target docker
    ```

    Setup writes `.env` (with a fresh admin token) and `docker-compose.yml`.

2. **Start it**

    ```bash
    cd my-drop
    docker compose up -d --build
    ```

    The image includes Chromium, so preview cards work out of the box. Files go to the `drop-data` volume.

3. **Put TLS in front**

    Point your domain at the server through a reverse proxy with TLS, such as Caddy, nginx or Cloudflare Tunnel, forwarding to port 3000.

**Neon**

You need a Neon project in us-east-1, us-east-2, eu-central-1 or ap-southeast-1.

```bash
npx jalco-drop init my-drop --target neon
cd my-drop
npx neon@latest link
npm run deploy:neon
```

Or add it to an existing Neon project with `neon functions new jalco-drop`. [Deploy on Neon](/v1.2/neon) covers both, the bucket and cleanup trigger, custom domains and the 10 MB upload limit.

:::tip
Every question has a flag, so setup also runs unattended:

```bash
npx jalco-drop init my-drop --domain drop.example.com --owner Tess --accent "#3b82f6" --theme vesper --deploy --yes
```

Handing the repo to a coding agent works too. `AGENTS.md` walks it through the same steps.
:::
