# 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