# Overview
Painting sends resource packs to your players and deals with everything that usually goes wrong.
Different Minecraft versions need differently-built packs. Downloads fail and players get kicked. You update a pack on your CDN and suddenly nobody can download it because the checksum no longer matches. Painting handles all three without you having to think about it.
It runs on a single Paper server, on a Velocity proxy, or both together.
## The problems it solves
**Players on different versions need different packs.** Tell Painting which pack goes with which versions and it works out what each player should get as they connect:
```yaml
variants:
- versions: "1.21+"
url: "https://cdn.example.com/pack-121.zip"
- versions: ">=1.20,<1.21"
url: "https://cdn.example.com/pack-120.zip"
```
**Downloads fail sometimes.** Rather than kicking straight away, Painting offers the pack again with a slightly different URL so the player's cache doesn't serve them the broken copy twice.
**Updating a pack breaks it.** Minecraft checks a pack against a checksum, and if you upload a new version without updating that number, every download fails. Painting notices the pack changed and updates the number itself.
**New Minecraft versions come out.** The version list lives in a file in your plugin folder, so when a new version appears you can add it yourself rather than waiting for a Painting update.
## How you can run it
| Setup | What you install | When |
|---|---|---|
| **Single server** | Painting on Paper | No proxy |
| **Proxy** | Painting on Velocity | You have a proxy and your backends don't run Painting |
| **Both** | Painting on both | Velocity decides which packs to send, and your Paper servers still get told what happened so their own plugins can react |
Painting works out which of these it's in by itself. You can pin it with `mode: STANDALONE` or `mode: PROXIED` if you'd rather be explicit.
## Other things worth knowing
**You don't need a CDN.** Painting can serve pack files straight off your server over its own small web server, and works out the checksums for you.
**Required or optional.** A required pack kicks players who decline or fail. An optional one never does.
**Players who ignore the prompt.** Set a timeout and they get kicked after so many seconds, for required packs only.
**Kicks can wait a moment.** Delay the kick so the player actually reads why it happened.
**Push updates from your build pipeline.** With Redis, your CI can tell Painting to reload, update a pack or resend to everyone, so a pack deploy reaches players without anyone logging in.
## What you need
| | |
|---|---|
| Paper | 1.21 or newer, for the server plugin |
| Velocity | 3.4 or newer, for the proxy plugin |
| Java | 21 or newer |
Nothing else to install.
Optionally: **Redis** if you want the CI hook, and **Bookshelf** which is recommended but not required.
## Related Pages
- [[Painting/Server Owners/Configuration]], every setting explained
- [[Painting/Server Owners/Commands]], every command
- [[Painting/Developers/Overview]], for plugin developers