[{"data":1,"prerenderedAt":2418},["ShallowReactive",2],{"docs-navigation":3,"docs-search":117,"docs:\u002Fdocs\u002Fspec":930,"docs-surround:\u002Fdocs\u002Fspec":2415},[4],{"title":5,"path":6,"stem":7,"children":8,"page":116},"Docs","\u002Fdocs","docs",[9,15,20,26,31,37,42,47,52,57,62,67,72,77,82,87,92,97,101,106,111],{"title":10,"path":11,"stem":12,"section":13,"order":14},"Overview","\u002Fdocs\u002Freadme","docs\u002FREADME","Getting started",1,{"title":16,"path":17,"stem":18,"section":13,"order":19},"Your account, passkeys and recovery codes","\u002Fdocs\u002Faccount","docs\u002Faccount",4,{"title":21,"path":22,"stem":23,"section":24,"order":25},"Addresses and DNS","\u002Fdocs\u002Faddresses","docs\u002Faddresses","Running servers",12,{"title":27,"path":28,"stem":29,"section":24,"order":30},"Backups","\u002Fdocs\u002Fbackups","docs\u002Fbackups",11,{"title":32,"path":33,"stem":34,"section":35,"order":36},"Branding","\u002Fdocs\u002Fbranding","docs\u002Fbranding","Looking after the machine",20,{"title":38,"path":39,"stem":40,"section":24,"order":41},"Mods, plugins and datapacks","\u002Fdocs\u002Fcontent","docs\u002Fcontent",10,{"title":43,"path":44,"stem":45,"section":24,"order":46},"Crashes","\u002Fdocs\u002Fcrashes","docs\u002Fcrashes",15,{"title":48,"path":49,"stem":50,"section":24,"order":51},"Discord app","\u002Fdocs\u002Fdiscord","docs\u002Fdiscord",18,{"title":53,"path":54,"stem":55,"section":35,"order":56},"Disk space","\u002Fdocs\u002Fdisk","docs\u002Fdisk",21,{"title":58,"path":59,"stem":60,"section":13,"order":61},"Your first server","\u002Fdocs\u002Ffirst-server","docs\u002Ffirst-server",3,{"title":63,"path":64,"stem":65,"section":13,"order":66},"Installing Flytower","\u002Fdocs\u002Finstall","docs\u002Finstall",2,{"title":68,"path":69,"stem":70,"section":24,"order":71},"Web map","\u002Fdocs\u002Fmap","docs\u002Fmap",19,{"title":73,"path":74,"stem":75,"section":24,"order":76},"Notifications","\u002Fdocs\u002Fnotifications","docs\u002Fnotifications",16,{"title":78,"path":79,"stem":80,"section":13,"order":81},"People and roles","\u002Fdocs\u002Fpeople","docs\u002Fpeople",5,{"title":83,"path":84,"stem":85,"section":24,"order":86},"Scheduled tasks","\u002Fdocs\u002Fschedules","docs\u002Fschedules",14,{"title":88,"path":89,"stem":90,"section":13,"order":91},"Keyboard shortcuts","\u002Fdocs\u002Fshortcuts","docs\u002Fshortcuts",6,{"title":93,"path":94,"stem":95,"section":24,"order":96},"Server YAML reference","\u002Fdocs\u002Fspec","docs\u002Fspec",17,{"title":98,"path":99,"stem":100,"section":24,"order":71},"Player stats","\u002Fdocs\u002Fstats","docs\u002Fstats",{"title":102,"path":103,"stem":104,"section":24,"order":105},"Public status page","\u002Fdocs\u002Fstatus-page","docs\u002Fstatus-page",13,{"title":107,"path":108,"stem":109,"section":35,"order":110},"Troubleshooting","\u002Fdocs\u002Ftroubleshooting","docs\u002Ftroubleshooting",23,{"title":112,"path":113,"stem":114,"section":35,"order":115},"Updating Flytower","\u002Fdocs\u002Fupdating","docs\u002Fupdating",22,false,[118,121,126,130,134,138,143,146,149,154,159,164,169,174,179,184,187,190,195,200,205,208,212,217,222,227,232,237,242,245,249,254,259,264,269,274,277,281,286,291,296,301,306,311,316,319,322,327,332,337,342,345,349,354,359,364,369,374,379,384,389,394,399,402,405,410,415,420,425,430,433,436,441,446,451,456,461,466,471,476,481,486,489,493,498,503,508,513,517,520,524,529,534,539,544,549,554,557,561,566,571,576,581,586,591,594,597,602,607,612,617,622,627,630,634,639,644,649,654,659,662,665,670,675,680,685,688,692,697,701,706,711,716,721,726,731,736,741,746,751,756,761,766,771,776,779,782,787,792,797,800,803,807,812,816,821,826,830,835,840,842,845,850,855,860,865,870,875,880,882,885,890,895,900,905,910,915,920,925],{"id":11,"title":10,"titles":119,"content":120,"level":14},[],"Flytower is a web panel for running Minecraft servers on your own VPS. You install it once, then create and look after servers from the browser. You sign in with a passkey.",{"id":122,"title":123,"titles":124,"content":125,"level":14},"\u002Fdocs\u002Freadme#flytower-documentation","Flytower documentation",[],"Flytower is a web panel for running Minecraft servers on your own VPS. You install it once, then create and look after servers from the browser. You sign in with a passkey. These pages are also in the panel itself, for the version you have installed: Help in the sidebar, the ? at the top of each page for the page you're on, and  to search them.",{"id":127,"title":13,"titles":128,"content":129,"level":66},"\u002Fdocs\u002Freadme#getting-started",[123],"Installing Flytower: what you need, the installer, and its options. Your first server: creating, starting and joining a server. Your account, passkeys and recovery codes: signing in, extra devices, your name and appearance, and what to do if you lose them. People and roles: inviting people as Admins, Operators or Viewers, for one server or all of them. Keyboard shortcuts: G then a letter to jump about, J and K through lists, and ? to list them.",{"id":131,"title":24,"titles":132,"content":133,"level":66},"\u002Fdocs\u002Freadme#running-servers",[123],"Mods, plugins and datapacks: Modrinth, Hangar, Vanilla Tweaks, and your own files. Backups: schedules, retention, restoring, off-site copies, and past worlds. Addresses and DNS: giving each server its own hostname. Public status page: a page anyone can open, with the address, whether it's up and who's on. Scheduled tasks: restarts with an in-game countdown, console commands and announcements. Crashes: crash reports, crash loops, and servers that stop responding. Player stats: leaderboards for playtime, deaths, kills, distance and blocks mined, and leaving players out. Notifications: Discord, ntfy and JSON webhooks for crashes, failed backups, a filling disk, updates and players. Discord app: slash commands like \u002Fstatus and \u002Fplayers in your Discord server. Web map: a map of the world in the browser, drawn by Flytower, with players on it. Server YAML reference: every field of a server spec.",{"id":135,"title":35,"titles":136,"content":137,"level":66},"\u002Fdocs\u002Freadme#looking-after-the-machine",[123],"Branding: your own name, colours, font, logo and favicon. Disk space: where the space has gone, warnings at 85% and 95%, and freeing some up. Updating Flytower: self-update, going back, update badges, and upgrading old installs. Troubleshooting: logs, SSH, and getting the panel itself back.",{"id":139,"title":140,"titles":141,"content":142,"level":66},"\u002Fdocs\u002Freadme#how-it-fits-together","How it fits together",[123],"The panel (flytower-panel) is the web app. It runs as the unprivileged flytower user and listens only on 127.0.0.1:3000. Caddy puts it on HTTPS. The agent (flytower-agent) is a small root helper. It does a fixed list of jobs over a Unix socket: creating server users and folders, managing systemd units, installing Java, opening ports, and updating Flytower. Each server runs as its own user (mc-\u003Cname>) from \u002Fsrv\u002Fflytower\u002Fservers\u002F\u003Cname>, under systemd (flytower-mc@\u003Cname>), with a fixed memory limit. Its folder is an ordinary Minecraft server folder that still runs without Flytower.",{"id":17,"title":16,"titles":144,"content":145,"level":14},[],"Flytower has no passwords. You sign in with a passkey: your phone, laptop or password manager proves it's you with your fingerprint, face or PIN. Passkeys can't be phished, and there's nothing to leak.",{"id":147,"title":16,"titles":148,"content":145,"level":14},"\u002Fdocs\u002Faccount#your-account-passkeys-and-recovery-codes",[],{"id":150,"title":151,"titles":152,"content":153,"level":66},"\u002Fdocs\u002Faccount#setting-up","Setting up",[16],"The installer gives you a setup link and a setup token (or uses the token you chose). The first time, open the link (or open the panel and enter the token), create your passkey, and save the ten recovery codes you're shown. Download them or copy them somewhere safe, like your password manager. You're asked to type one back to show you've saved them.",{"id":155,"title":156,"titles":157,"content":158,"level":66},"\u002Fdocs\u002Faccount#more-than-one-device","More than one device",[16],"Your passkeys and recovery codes, on Your account. On Your account (your name at the bottom of the sidebar), Your passkeys: Add a passkey creates one on the device you're using, or on a security key. Add at least two, so losing one device doesn't lock you out. Passkeys in iCloud Keychain, Google Password Manager, 1Password and similar sync between your devices by themselves. Remove a passkey you no longer use, or one on a lost device. Removing one also signs you out on every other device, so a lost one can't carry on; sign in again on the ones you still use. Your last passkey can't be removed.",{"id":160,"title":161,"titles":162,"content":163,"level":66},"\u002Fdocs\u002Faccount#if-you-lose-every-passkey","If you lose every passkey",[16],"On the sign-in page, choose Lost your passkeys? Use a recovery code. Each code works once. After signing in with one, you're asked to add a new passkey straight away, before anything else. Down to your last few codes? Your account, Make new codes gives you a fresh set of ten. The old ones stop working. If your codes were made before Flytower 1.4.1, making a new set is worth doing: newer codes are quicker for the panel to check.",{"id":165,"title":166,"titles":167,"content":168,"level":66},"\u002Fdocs\u002Faccount#if-you-lose-your-passkeys-and-your-codes","If you lose your passkeys and your codes",[16],"You need to get onto the machine itself, through your VPS provider's web console (or SSH if it's open). Then re-run the installer with a new setup token: curl -fsSL https:\u002F\u002Fgithub.com\u002FMattA-Official\u002Fmc-panel\u002Freleases\u002Flatest\u002Fdownload\u002Finstall.sh \\\n  | sudo bash -s -- --domain panel.example.com --setup-token NEW-LONG-RANDOM-TOKEN\nsudo sqlite3 \u002Fvar\u002Flib\u002Fflytower\u002Fflytower.db 'DELETE FROM credentials; DELETE FROM recovery_codes;'\nsudo systemctl restart flytower-panel The panel then asks for the setup token again, as on the first day. Your servers, backups and settings are untouched. (sqlite3 may need installing with apt install sqlite3.)",{"id":170,"title":171,"titles":172,"content":173,"level":66},"\u002Fdocs\u002Faccount#who-did-what","Who did what",[16],"Activity lists every sign-in, passkey change and recovery-code use, alongside everything done to servers.",{"id":175,"title":176,"titles":177,"content":178,"level":66},"\u002Fdocs\u002Faccount#your-account","Your account",[16],"Click your name at the bottom of the sidebar to open Your account: Profile: change your name (it shows in Activity and on Access) and pick Appearance: light, dark or system. Your choice is saved for you, so it follows you to every device. The sun and moon button in the sidebar switches too. Your passkeys and recovery codes, as above. Sign out everywhere else: for a lost phone or a shared computer. Every other browser signed in as you is signed out on its next click; this one stays signed in. It asks for your passkey.",{"id":180,"title":181,"titles":182,"content":183,"level":66},"\u002Fdocs\u002Faccount#this-browser","This browser",[16],"Some settings live in the browser rather than on your account, so each device can be different. They're under This browser on Your account. Use Flytower's right-click menus. Right-click a server card for its actions: open, start or stop, back up, go to a tab, clone or delete. Shift + right-click always shows the browser's own menu, as do text you've selected and any field. On a phone, press and hold a card instead. Turn this off to keep the browser's menu everywhere; the ⋯ button on each card offers the same actions either way. Use single-key shortcuts. Keys like G then S for Servers, J and K to move through a list, and ? to list them all (see Keyboard shortcuts). Turn this off if keys get pressed for you, by voice control for example. Ctrl + K and Ctrl + S work either way. html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":22,"title":21,"titles":185,"content":186,"level":14},[],"By default players connect to your VPS's IP address, with a port for every server after the first. A hostname per server lets them type survival.example.com instead, with no port.",{"id":188,"title":21,"titles":189,"content":186,"level":14},"\u002Fdocs\u002Faddresses#addresses-and-dns",[],{"id":191,"title":192,"titles":193,"content":194,"level":66},"\u002Fdocs\u002Faddresses#setting-one","Setting one",[21],"A server's Settings, General, Address: enter the hostname, such as survival.example.com. You can also set it with hostname: in the YAML. Two servers can't share one.",{"id":196,"title":197,"titles":198,"content":199,"level":66},"\u002Fdocs\u002Faddresses#dns-records","DNS records",[21],"Under the address, DNS records lists exactly what to create with your DNS provider: An A record (and AAAA if the machine has IPv6) pointing the hostname at the VPS. An SRV record (_minecraft._tcp.\u003Chostname>), when the server isn't on port 25565. This tells Minecraft which port to use, so players don't need to type it. On Cloudflare, set the records to DNS only (grey cloud). Minecraft traffic can't go through Cloudflare's proxy. Check again looks the records up and marks each one Right, Missing or Wrong (with where it points now). DNS changes can take a few minutes to show.",{"id":201,"title":202,"titles":203,"content":204,"level":66},"\u002Fdocs\u002Faddresses#the-panels-own-address","The panel's own address",[21],"The panel's domain is set when you install (--domain). Caddy gets and renews its certificate. To move the panel to another domain, re-run the installer with the new --domain. Your passkeys belong to the old domain, so sign in with a recovery code once on the new one, then add a passkey.",{"id":28,"title":27,"titles":206,"content":207,"level":14},[],"Everything here is on a server's World tab, which opens on .",{"id":209,"title":27,"titles":210,"content":211,"level":14},"\u002Fdocs\u002Fbackups#backups",[],"Everything here is on a server's World tab, which opens on . The Backups section of a server's World tab.",{"id":213,"title":214,"titles":215,"content":216,"level":66},"\u002Fdocs\u002Fbackups#taking-backups","Taking backups",[27],", with a note if you like. If the server is running, it pauses saving for a moment so the world on disk is consistent. Players stay connected. : every 6 or 12 hours, daily, weekly, or your own cron expression, in your time zone. Flytower also takes a safety backup before anything risky: applying a plan that touches mods or the world, restoring, resetting the world, or copying another world in. Backups are .tar.zst archives of the whole server folder. They live in \u002Fvar\u002Flib\u002Fflytower\u002Fbackups\u002F\u003Cserver>, and you can download them. Some things are left out because they're never worth restoring: logs, crash-reports, spark's scratch folder config\u002Fspark\u002Ftmp, and any file ending in .tmp. If a file can't be read, for example because a mod made it private to the server, the backup leaves that file out rather than failing, and the backup's job says which files it skipped.",{"id":218,"title":219,"titles":220,"content":221,"level":66},"\u002Fdocs\u002Fbackups#how-many-are-kept","How many are kept",[27],"Scheduled backups are thinned out by the keep settings. By default Flytower keeps the newest 6, plus the newest from each of the last 7 days and the last 4 weeks. The three newest safety backups are kept. Backups you take yourself are never deleted automatically. To keep any backup forever, choose Keep forever on it. It gets a Kept badge, retention never deletes it, and it doesn't count towards the numbers above. Stop keeping forever hands it back to retention. When the disk is 95% full, scheduled backups are skipped rather than risk filling it, and Back up now asks first. See Disk space.",{"id":223,"title":224,"titles":225,"content":226,"level":66},"\u002Fdocs\u002Fbackups#restoring","Restoring",[27],"Choose Restore on a backup. Flytower asks for your passkey, takes a safety backup of how things are now, stops the server, puts the backup back, and starts it again. Changed your mind? Restore the safety backup.",{"id":228,"title":229,"titles":230,"content":231,"level":66},"\u002Fdocs\u002Fbackups#off-site-copies","Off-site copies",[27],"A backup on the same machine won't help if the machine is lost. Flytower can copy backups to any S3-compatible storage, such as Backblaze B2, Cloudflare R2, Wasabi or Amazon S3. Create a bucket with your provider, and an access key that can read, write and delete in it. With R2 and B2, a key limited to that one bucket is best. System, Off-site storage, Add storage. Enter the endpoint (for example https:\u002F\u002Fs3.eu-central-003.backblazeb2.com), region, bucket, an optional folder prefix, and the key. Test writes, reads back and deletes a small file. On each server's World, Backups, choose the storage under Off-site copies, or set backups.offsite in its YAML. Existing backups are copied, and new ones follow within a minute or two. Each backup shows a cloud icon once its copy is safe. Failed uploads retry by themselves (after 1, 5 and 30 minutes), and Retry off-site copy tries again straight away. Deleting a backup, or retention removing it, deletes its copy too. Copies are stored under \u003Cprefix>\u002F\u003Cserver>\u002F\u003Cfile>. If a backup's local file is lost, the backup shows Off-site only, and restoring it downloads it first. The secret key is encrypted with the panel's app secret (in \u002Fetc\u002Fflytower\u002Fpanel.env) and is never shown again after you save it.",{"id":233,"title":234,"titles":235,"content":236,"level":66},"\u002Fdocs\u002Fbackups#sharing-a-world","Sharing a world",[27],"World, Past worlds, Export world makes a zip of just the world, ready for single player. Share gives a link anyone can download it from, without signing in, for as long as you choose. Revoke a link to stop it working.",{"id":238,"title":239,"titles":240,"content":241,"level":66},"\u002Fdocs\u002Fbackups#past-worlds","Past worlds",[27],"Resetting a world (World, Tools, Reset the world) can end a season rather than throw it away. The reset dialog offers to: Keep the old world as a past world, under a name you choose (for example \"2025–26 world\"). Flytower zips the old world, datapacks included, after the server has stopped and before anything is cleared, so it opens in single player exactly as it was. If there isn't room on the disk, the reset stops and nothing changes. Keep the final backup forever: the safety backup taken first is marked as kept. It holds the whole server (mods, settings and world), not just the world. Past worlds are listed under World, Past worlds, and are kept until you delete them. Each one can be downloaded, shared with a link like an export, renamed, or turned into a new server with Start a server from it, which opens Import with that world chosen. Import, A past world lists every server's past worlds too. Deleting a server leaves its past worlds and backups in place.",{"id":33,"title":32,"titles":243,"content":244,"level":14},[],"Flytower can wear your society's or community's name and colours instead of its own, without changing any code. Set it on System, Branding. Saving asks for your passkey.",{"id":246,"title":32,"titles":247,"content":248,"level":14},"\u002Fdocs\u002Fbranding#branding",[],"Flytower can wear your society's or community's name and colours instead of its own, without changing any code. Set it on System, Branding. Saving asks for your passkey. The name, colour and font, on System, Branding.",{"id":250,"title":251,"titles":252,"content":253,"level":66},"\u002Fdocs\u002Fbranding#what-you-can-change","What you can change",[32],"Name: up to 40 characters. It replaces \"Flytower\" in the menu, on the sign-in page, in browser tab titles, as the name on Discord notifications and in passkey prompts. Accent colour: your brand colour, as a hex code like #2f6fd0 or from the picker. See below for how it's used. Display font: the face for titles and server names. Choose from Big Shoulders Display (Flytower's own), IBM Plex Sans, Fraunces (a serif) or Space Grotesk. All of them are bundled with Flytower, so nothing is loaded from Google or anywhere else. Body text and the console stay in IBM Plex. Logo: shown next to the name in the menu and on the sign-in page. Favicon: the browser tab's icon. Without one, the logo is used. Powered by Flytower: a small line under the menu and on the sign-in page. It only shows when your name isn't Flytower, and you can turn it off. Reset to Flytower puts everything back and deletes uploaded images. Branding is stored in Flytower's database, so it's kept through updates and travels with the database.",{"id":255,"title":256,"titles":257,"content":258,"level":66},"\u002Fdocs\u002Fbranding#colours-and-contrast","Colours and contrast",[32],"You pick one colour. Flytower works out a full range of lighter and darker shades from it, keeping its hue, with your exact colour as one of them. The form shows the range. Then, for light mode and for dark mode separately, it uses the shade nearest your colour that's easy to read: at least 4.5:1 contrast (WCAG AA) against the page and card backgrounds, and against the text on a coloured button. So a dark navy is used as it is on the light theme, and a lighter navy on the dark theme. The preview shows both, with the shade and contrast ratio each uses. Status colours (green for running, amber for starting, red for crashed) and warnings never change, so a red brand won't make a healthy server look crashed.",{"id":260,"title":261,"titles":262,"content":263,"level":66},"\u002Fdocs\u002Fbranding#logos-and-favicons","Logos and favicons",[32],"Upload an SVG or PNG. It's cleaned before it's kept: SVG: rebuilt from shapes, gradients, text and simple filters only. Scripts, event handlers, embedded images and web pages, links to other files, animations and editor metadata are taken out. Files with a DOCTYPE are refused. The SVG needs a viewBox (or a width and height) so it can be scaled. If your design tool's export is refused, export it again as \"plain\" or \"optimised\" SVG. PNG: up to 1024 pixels on each side. Text, EXIF and other metadata are removed, so nothing like a camera location or an author's name is published. Once cleaned, an image can be up to 256 KB. Logos are shown at about 28 pixels high in the menu and 40 on the sign-in page, so a square or slightly wide mark works best. Uploaded images are public, like the sign-in page, since that page shows them before anyone signs in.",{"id":265,"title":266,"titles":267,"content":268,"level":66},"\u002Fdocs\u002Fbranding#where-else-it-shows","Where else it shows",[32],"Discord: notifications are posted under your name, and the footer reads \"Name · server\". If your logo is a PNG and the panel has a domain, it's the webhook's avatar too (Discord can't show SVG avatars). Discord doesn't allow names that mention Discord, so those post as Flytower. The colours down the side of each message still mean how serious it is. In-game: scheduled announcements and restart warnings use your accent colour instead of gold. Passkeys: the prompt to create or use a passkey names your panel. Existing passkeys keep working. The public status page (coming in 1.2) uses the same name, colours and logo.",{"id":270,"title":271,"titles":272,"content":273,"level":66},"\u002Fdocs\u002Fbranding#for-other-tools","For other tools",[32],"GET \u002Fapi\u002Fbranding returns the name, colour, the shades used in each mode, the font and the logo and favicon addresses as JSON, without signing in. \u002Fbranding\u002Ftheme.css is the stylesheet every page loads; it's empty while the colours and font are Flytower's own.",{"id":39,"title":38,"titles":275,"content":276,"level":14},[],"A server's Content tab lists what it runs. Add content searches the sources Flytower trusts. Everything you add goes into a plan first, and every download is checked against the hash its source publishes, so a tampered file is refused.",{"id":278,"title":38,"titles":279,"content":280,"level":14},"\u002Fdocs\u002Fcontent#mods-plugins-and-datapacks",[],"A server's Content tab lists what it runs. Add content searches the sources Flytower trusts. Everything you add goes into a plan first, and every download is checked against the hash its source publishes, so a tampered file is refused. A server's Content tab.",{"id":282,"title":283,"titles":284,"content":285,"level":66},"\u002Fdocs\u002Fcontent#what-each-loader-runs","What each loader runs",[38],"Loader Mods (mods\u002F) Plugins (plugins\u002F) Datapacks (world\u002Fdatapacks\u002F) Vanilla ✓ Fabric ✓ ✓ Paper ✓ ✓",{"id":287,"title":288,"titles":289,"content":290,"level":66},"\u002Fdocs\u002Fcontent#sources","Sources",[38],"Modrinth: mods, plugins and datapacks. Only versions made for your loader and Minecraft version are offered. Required dependencies (Fabric API, for example) come along by themselves, and are marked \"Needed by …\". Hangar: PaperMC's plugin repository, for Paper servers. Hangar dependencies come along too. Plugins that Hangar only links to on another site can't be checked, so they're refused; add them as a link instead (below). Vanilla Tweaks: tick the datapacks and crafting tweaks you want. Flytower builds the zip from Vanilla Tweaks just as their site does. A link: any https file with its SHA-256, in the YAML.",{"id":292,"title":293,"titles":294,"content":295,"level":66},"\u002Fdocs\u002Fcontent#client-only-mods","Client-only mods",[38],"Modrinth lets each author say whether their project runs on a server. Search leaves out the ones marked client-only, since most (minimaps, shaders, zoom) do nothing there. Some server mods need one anyway, and the marks aren't always right, so turn on Show client-only in Add content to see them, or list one in the YAML like anything else. A required dependency marked client-only comes along by itself too. Either way, the plan shows a warning like \"Modrinth marks Voxy as client-only. It's installed because you asked for it; remove it if the server won't start.\" The plan still applies, and the item is locked and checked for updates like any other.",{"id":297,"title":298,"titles":299,"content":300,"level":66},"\u002Fdocs\u002Fcontent#updates","Updates",[38],"Nothing updates by itself. The Content tab shows what's newer for your Minecraft version; update one item or all of them. Flytower also checks in the background every six hours and puts the number of updates on the server's card and its Content tab, and says when a newer Minecraft is out that everything installed is ready for. See Update badges. When you change the Minecraft version (Settings, Version), the plan moves every item to a build for the new version, and names anything that has none. The plan won't apply until you remove those.",{"id":302,"title":303,"titles":304,"content":305,"level":66},"\u002Fdocs\u002Fcontent#removing","Removing",[38],"Remove an item and anything that was only there for it goes too.",{"id":307,"title":308,"titles":309,"content":310,"level":66},"\u002Fdocs\u002Fcontent#files-you-add-yourself","Files you add yourself",[38],"Jars and zips you put in mods\u002F, plugins\u002F or datapacks\u002F yourself (through the Files tab or SFTP) are listed as added by hand. Flytower leaves them alone: it never updates or removes them.",{"id":312,"title":313,"titles":314,"content":315,"level":66},"\u002Fdocs\u002Fcontent#the-lockfile","The lockfile",[38],"Each server folder has a flytower.lock.json, listing exactly what's installed: the version, where it came from, and its hash. It's what lets Flytower tell its own files from yours. Leave it in place if you move the folder.",{"id":44,"title":43,"titles":317,"content":318,"level":14},[],"Flytower notices when a server crashes, tells you why, and stops a server that keeps crashing from restarting forever. It also spots a server that is still running but has stopped responding.",{"id":320,"title":43,"titles":321,"content":318,"level":14},"\u002Fdocs\u002Fcrashes#crashes",[],{"id":323,"title":324,"titles":325,"content":326,"level":66},"\u002Fdocs\u002Fcrashes#what-happens-when-a-server-crashes","What happens when a server crashes",[43],"Flytower follows systemd's journal (through its system helper), so it hears about a crash, or a server started or stopped with systemctl, as it happens, without checking over and over. As a safety net it also looks at every server every five minutes. If the journal can't be followed, it falls back to checking every ten seconds. systemd restarts it after 15 seconds. On newer systems (systemd 254 or later, such as Ubuntu 24.04) the wait grows with each crash, up to a minute. Flytower records the crash with its cause, a link to Minecraft's crash report if one was written, and the last 50 lines of the log (which would otherwise be lost when the server starts again). The server's badge reads Restarting after a crash, and the Console tab shows a banner with the time, the cause and an Open crash report button, which opens the report in the Files tab. The banner stays until you close it, even after the server is back. The servers list shows a red dot next to a server with a crash nobody has looked at. The crash is in Activity, credited to Flytower, and a notification is sent, followed by \"Server is back up\" once players can join again (when the log says it's ready). The cause is one of: Minecraft crashed, with the crash report's description, such as \"Exception ticking world\". Out of memory: either the server went over its memory limit and the system stopped it, or Java ran out of heap. Give it more memory under Settings, General, or take out mods. Java itself crashed (an hs_err_pid….log file in the server folder). It exited with code N, or It was killed by SIGKILL (or another signal), when there's nothing more specific. Every crash, crash loop and \"not responding\" from the last 30 days is listed under the Console's Crashes button (or View logs, Crashes), each with its crash report and the log from just before it.",{"id":328,"title":329,"titles":330,"content":331,"level":66},"\u002Fdocs\u002Fcrashes#crash-loops","Crash loops",[43],"After three crashes in ten minutes, the server is left stopped and marked Crash-looping, and a \"Server keeps crashing\" notification is sent. Fix the cause (the crash report usually says which mod), then press Start. Starting it from Flytower clears the crash loop.",{"id":333,"title":334,"titles":335,"content":336,"level":66},"\u002Fdocs\u002Fcrashes#not-responding","Not responding",[43],"Once a minute, Flytower asks each running server for its player list and tick time over RCON (the same questions as the performance charts on the servers list). If a server that systemd says is running doesn't answer for five minutes in a row, it's marked Not responding and a notification is sent. A server that has only just started gets fifteen minutes, since a big world can take a while to load. Nothing else happens unless you turn on Restart it when it stops responding under the server's Settings, Maintenance (or recovery: { restartWhenUnresponsive: true } in its YAML). Then Flytower restarts it once. If it's still stuck afterwards, it stays marked but isn't restarted again until it has answered at least once.",{"id":338,"title":339,"titles":340,"content":341,"level":66},"\u002Fdocs\u002Fcrashes#what-isnt-a-crash","What isn't a crash",[43],"Stopping or restarting from Flytower, including the stop and start around applying changes, restoring a backup or resetting the world, even if the server crashes on the way down. Typing stop in the console. The server stops normally and isn't restarted. If Minecraft writes a crash report and then exits normally (so systemd sees a clean exit), Flytower still counts it as a crash and starts the server again itself, within the same three-in-ten-minutes limit.",{"id":49,"title":48,"titles":343,"content":344,"level":14},[],"Flytower can answer slash commands in your Discord server, such as \u002Fstatus and \u002Fplayers, through a Discord app you make. It's separate from notifications, which only need a channel webhook.",{"id":346,"title":48,"titles":347,"content":348,"level":14},"\u002Fdocs\u002Fdiscord#discord-app",[],"Flytower can answer slash commands in your Discord server, such as \u002Fstatus and \u002Fplayers, through a Discord app you make. It's separate from notifications, which only need a channel webhook. Discord sends each command to your panel over HTTPS, so the panel needs a domain that Discord can reach from the internet. Flytower doesn't keep a connection open to Discord, unless you turn on chat from Discord.",{"id":350,"title":351,"titles":352,"content":353,"level":66},"\u002Fdocs\u002Fdiscord#connecting-an-app","Connecting an app",[48],"Open the Discord Developer Portal and press New Application. Its name and icon are what people see next to the answers. On the app's Bot tab, press Reset Token and copy the token. In Flytower, open System, Integrations, paste the token into Discord app and press Connect. You're asked for your passkey. The Discord app card, on System, Integrations. Flytower then: reads the app's name, application ID and public key from Discord, so you don't copy them by hand, stores the token encrypted (it's never shown again), and sets the app's Interactions Endpoint URL to https:\u002F\u002F\u003Cyour panel domain>\u002Fapi\u002Fdiscord\u002Finteractions. Discord checks the address straight away by calling it, so a green Connected means Discord can reach the panel. Last, press Add to a Discord server and pick the server. The app only needs the applications.commands scope, so it can't read messages or change anything in your Discord server.",{"id":355,"title":356,"titles":357,"content":358,"level":66},"\u002Fdocs\u002Fdiscord#commands","Commands",[48],"Command Answers \u002Fstatus [server] Whether the server is online, starting or offline, its address, how many are on, its version, and a link to its web map when that's public. \u002Fplayers [server] Who's on right now. \u002Fleaderboard [stat] [period] [server] The top players for playtime, deaths, mob kills, distance or blocks mined, for all time, this month or this week. \u002Fstats \u003Cplayer> [server] One player's figures for all time, and what they added this week.",{"id":360,"title":361,"titles":362,"content":363,"level":61},"\u002Fdocs\u002Fdiscord#staff-commands","Staff commands",[48,356],"These need a Discord role mapped to a Flytower role with the permission shown, on the server picked. Command Needs Does \u002Fwhitelist add \u003Cplayer> [server] Manage players Lets a player join. Works while the server is stopped too, like the Players tab. \u002Fwhitelist remove \u003Cplayer> [server] Manage players Takes a player off the whitelist. \u002Frestart [server] Start and stop Says \"Restarting\" at once, then \"back up\" once players can join again (or why it failed). \u002Fbackup [server] [note] Take backups Says \"Backing up\" at once, then the size when it's done (or why it failed). \u002Fsay \u003Cmessage> [server] Send console commands Shows [Discord] Your name: message to everyone in the game. You can leave out server when your role only covers one server; otherwise Discord suggests the ones you can act on. Every staff command is in Activity as \"Name via Discord\". \u002Fsay sends plain text only: Minecraft formatting codes and line breaks are taken out, and nothing in the message can run a command or add a click action. Leave out server to get every server at once; as you type it, Discord suggests the servers you can see. Both answer from the same information as the public status page, so the server itself is never asked and the page's settings apply: a server whose page shows only a count shows only a count in Discord, and one that hides players or its version hides them here too. Which servers show. Servers with their public page turned on, plus any server the caller can see through their Discord role. Everything else stays hidden: asking for it answers the same as a server that doesn't exist. Leaderboards and stats. \u002Fleaderboard and \u002Fstats use the same figures as the server's stats on its Players tab. They only cover servers whose public page shows leaderboards (which needs the page to show player names, and the server to keep stats). Players left out of stats never appear. For anyone who can't see the server in Flytower, \u002Fstats only knows the players on the public all-time or weekly leaderboards (the top five), shows only their figures on those boards, and never says when someone last played. With more than one such server, pick one with server. Answers are posted in the channel for everyone to see, except \"no such server\" and similar, which only the person who asked sees. Player names can never ping anyone. Flytower sends Discord its command list when you connect, and again after an update if the list changed. If Discord didn't take it, the card says so, with Send them again.",{"id":365,"title":366,"titles":367,"content":368,"level":66},"\u002Fdocs\u002Fdiscord#discord-roles","Discord roles",[48],"Staff commands use the access of a Flytower role. Under Discord roles on the card, give a Discord role a Flytower role, for all servers or one server, and its members can do in Discord what that role can do in the panel. Discord sends the caller's roles with every command, so nobody has to link their Discord account. In Discord, turn on Developer Mode (User Settings, Advanced). In your Discord server's Server Settings, Roles, right-click the role and choose Copy Role ID. On the card, press Give a Discord role access, paste the ID, give it a name you'll recognise (Discord doesn't tell the app role names), and pick the Flytower role and servers. A member with several mapped roles gets all of them together. Changes apply to the next command. Owner can't be given out through Discord. Saving needs Manage integrations, Manage roles and your passkey, and is in Activity. As with giving people roles, you can only give a Discord role what you could do on those servers yourself, and only remove a mapping you could have made. Mappings you leave as they are stay. Anyone without a mapped role who tries a staff command gets a private \"Sorry, you can't use that\", and the attempt is in Activity. Commands used in a direct message with the app only get what everyone gets. Everything done through Discord is in Activity as \"Name via Discord\", using the member's nickname in your Discord server.",{"id":370,"title":371,"titles":372,"content":373,"level":66},"\u002Fdocs\u002Fdiscord#if-the-endpoint-isnt-set","If the endpoint isn't set",[48],"The card says Endpoint not set, with Discord's reason, when Discord couldn't reach the panel or the panel has no domain. Fix the cause, then press Try the endpoint again. You can also copy the endpoint from the card into Interactions Endpoint URL on the app's General Information page in the Developer Portal; Discord checks it there too.",{"id":375,"title":376,"titles":377,"content":378,"level":66},"\u002Fdocs\u002Fdiscord#testing-and-disconnecting","Testing and disconnecting",[48],"Test connection checks the stored token still works for the same app, and notices if the endpoint was changed in the Developer Portal. Disconnect takes the app's commands down, clears its endpoint, and forgets the token. The app itself stays in the Developer Portal and in any Discord server it was added to; remove it there if you don't want it any more. If you think the token has leaked, press Reset Token in the Developer Portal: the old one stops working at once, and you connect again with the new one.",{"id":380,"title":381,"titles":382,"content":383,"level":66},"\u002Fdocs\u002Fdiscord#game-chat-in-a-channel","Game chat in a channel",[48],"Each server can post what players say in game to a Discord channel. This only needs the channel's webhook, not the app. In Discord, open the channel's settings, Integrations, Webhooks, press New Webhook and Copy Webhook URL. In Flytower, open the server, Settings, Community, Discord chat, paste the URL and press Turn on. You're asked for your passkey. Send a test posts a line first if you'd like to check. Discord chat, in a server's Settings, Community. Chat (and \u002Fme) is posted under the player's name with their face as the picture. say and me from the panel's console are posted under [Server] and the name of whoever sent them. Joins, leaves, deaths and advancements are posted the same way, in italics (joined the game, was slain by Zombie, has made the advancement [Stone Age]). Everything is plain text, unlike notifications, which use embeds. Turn any of the four off with the switches. Lines come from the server's log the moment Minecraft writes them, including chat that mods like No Chat Reports turn into system messages. Nothing typed in game can ping anyone: every message has mentions switched off, and Markdown, @everyone, \u003C@…> and similar show exactly as typed. Links still work but don't get a preview. Discord limits how fast a webhook can post. Flytower sends one message at a time per server and waits whenever Discord says to. When chat is quicker than that, one player's lines in a row go as one message, and a bigger backlog goes as one message listing everyone's lines, so nothing is lost unless the server is 200 lines behind. Player faces need the panel to have a domain, because Discord fetches them from the panel (the address is signed, so it can't be used to look up other players). Without one, chat is posted with Discord's default picture. If Discord says the webhook is gone (it was deleted) or refuses it, Flytower stops posting and the card says why. Paste a new webhook, or press Save to try the same one again. The webhook URL is stored encrypted and never shown again; the card shows only the webhook's ID.",{"id":385,"title":386,"titles":387,"content":388,"level":66},"\u002Fdocs\u002Fdiscord#chat-from-discord","Chat from Discord",[48],"Messages people send in a server's Discord chat channel can be shown in game too, as [Discord] name: message. It's off until you turn it on, because it keeps one connection to Discord open from the panel and needs a setting switched on in the Developer Portal. In the Discord Developer Portal, open the app's Bot tab and turn on Message Content Intent under Privileged Gateway Intents. Without it Discord sends messages with no text. In Flytower, open System, Integrations. Under Chat from Discord on the Discord app card, press Add the bot to a Discord server and pick your server. Unlike the commands, this adds the app as a bot; it only asks to see channels. Press Turn on. You're asked for your passkey. The badge shows Connected once Discord has accepted the connection. For each server, open Settings, Community, Discord chat, switch on Chat from Discord and press Save. Messages from the channel the server's chat webhook posts to are then shown in game. Flytower asks Discord which channel that is, so there's nothing to copy. The name shown is the person's nickname in your Discord server, or their display name. Only what people type comes through: bots, webhooks (including Flytower's own chat posts, so nothing echoes back) and Discord's own messages like joins and pins are left out. A message that's only a picture, file or sticker shows as [sent an image] and so on. Messages are plain text in game. Mentions show as @name, channels as #channel, roles as @role and custom emoji as :name:; Markdown is taken out and spoilers show as [spoiler]. Line breaks become spaces, Minecraft formatting codes are removed, and anything over 256 characters is cut. The text is sent with tellraw as JSON built by the panel, so nothing typed can run a command or add a click action. Messages also show in the server's console in the panel. Messages only go to servers that are running, one at a time and in order. If Discord sends more than 20 at once for one server, the rest are dropped rather than queued up.",{"id":390,"title":391,"titles":392,"content":393,"level":61},"\u002Fdocs\u002Fdiscord#if-the-connection-drops","If the connection drops",[48,386],"The connection heartbeats as Discord asks. When it drops, or Discord stops answering, the card shows Reconnecting and the panel connects again, resuming where it left off so no messages are missed. It waits a little longer after each failed attempt, up to a minute. It stops, with Stopped and Discord's reason, when trying again can't help: most often because Message Content Intent is off, or the bot token was reset. Fix that, then press Connect again. Disconnecting the app closes the connection; connecting one again reopens it if chat from Discord is still on. A server's Discord chat card says when chat from Discord is switched on there but can't work yet: when it's off for the whole panel, the connection has stopped, or the bot isn't in that channel's Discord server. Turning chat from Discord on and off is in Activity, as is switching it on or off for a server.",{"id":395,"title":396,"titles":397,"content":398,"level":66},"\u002Fdocs\u002Fdiscord#how-its-kept-safe","How it's kept safe",[48],"Every request to the endpoint must carry Discord's Ed25519 signature, made with the app's private key and checked against its public key before anything else happens. Requests with a missing or wrong signature, or a timestamp more than five minutes off, get a 401. The bot token and each server's chat webhook are encrypted with keys derived from the panel's own secret, like notification and off-site storage secrets. Connecting and disconnecting need Manage integrations and a passkey check, and both are in Activity. So does turning on chat from Discord. Chat from Discord asks Discord for as little as it can: the list of Discord servers the bot is in, and messages in the channels it can see. The bot only has permission to see channels.",{"id":54,"title":53,"titles":400,"content":401,"level":14},[],"A full disk is one of the few things that can corrupt a Minecraft world: if the server can't finish writing a save, the region file it was writing can be left half done. Flytower shows where the space has gone and warns you well before it runs out.",{"id":403,"title":53,"titles":404,"content":401,"level":14},"\u002Fdocs\u002Fdisk#disk-space",[],{"id":406,"title":407,"titles":408,"content":409,"level":66},"\u002Fdocs\u002Fdisk#where-the-space-has-gone","Where the space has gone",[53],"The Disk card, on System, Overview. System, Overview, Disk shows one bar for the disk that holds your servers. Each server has its own colour, then imports and archives, then the rest of the machine in grey, then free space. Hover over a part of the bar to see its size. The table under it lists each server's total and its largest part, with links to its details and its backups. A server's total includes its backups and world exports, since those are kept for it. Under the servers, the rest of the machine is split into parts, in shades of grey so the servers keep their colours: Part What's in it Java runtimes The Java versions Flytower installed for your servers, in \u002Fopt\u002Fflytower\u002Fruntimes Flytower Flytower itself, including the older version kept so you can go back, its settings in \u002Fetc\u002Fflytower and its database System logs The systemd journal and everything else in \u002Fvar\u002Flog Package cache and temp files Packages apt has downloaded (\u002Fvar\u002Fcache\u002Fapt), \u002Ftmp and \u002Fvar\u002Ftmp Operating system and everything else Whatever's left: the operating system, programs you installed yourself, and anything else Flytower doesn't know about Only what's on the same disk as your servers counts. On many machines \u002Ftmp is kept in memory, so it shows as nothing. If Flytower can't measure these (straight after updating from an older version, for example, before the helper has restarted), the rest of the machine shows as one System and other files part, as it used to.",{"id":411,"title":412,"titles":413,"content":414,"level":61},"\u002Fdocs\u002Fdisk#cleaning-up","Cleaning up",[53,407],"Three of the parts have a Clean up button, for people who can manage Flytower: Part What it does System logs Shrinks the systemd journal to the size you pick (100 MB to 1 GB), deleting the oldest entries first. Package cache and temp files Clears apt's cache of downloaded packages. apt downloads them again if they're ever needed. Flytower Removes Flytower versions other than the one running and the one you can go back to, along with the copies of the database kept for them. Each one says how much it should free before you start, asks for your passkey, and is recorded in Activity with how much it freed. The disk is measured again straight after. Nothing is removed from \u002Ftmp, \u002Fvar\u002Ftmp or the rest of \u002Fvar\u002Flog: they belong to other programs. Each server's Settings, Maintenance has a Disk use card that splits the server into: Part What's in it World Every folder starting with world, and the folder named by level-name in server.properties Backups This server's backups, kept in \u002Fvar\u002Flib\u002Fflytower\u002Fbackups\u002F\u003Cname> World exports Zips made with World, Past worlds Logs and crash reports logs and crash-reports Mods, plugins and config mods, plugins and config Web map The server's web map, kept in \u002Fvar\u002Flib\u002Fflytower\u002Fmaps\u002Fservers\u002F\u003Cname> Other Everything else, such as the server jar and its libraries Sizes are what files really take up on the disk. Symbolic links aren't followed, and a file linked twice is counted once.",{"id":416,"title":417,"titles":418,"content":419,"level":66},"\u002Fdocs\u002Fdisk#when-its-measured","When it's measured",[53],"Walking a big world takes a while, so Flytower measures in the background, one server at a time, and pages show the last result. Flytower's system helper does the measuring, so it can read every folder, including ones the panel isn't allowed into. It's measured: straight after anything that changes a server's files: a backup, restore, world reset, world copy, export, import, or applying a spec; every hour, to catch everything else (the world growing as people explore, logs piling up); when you press Measure now on System. The last result is kept, so the figures are there straight away after Flytower restarts. If Flytower can't read some of a server's files (Java's temporary files, for example), the figures say so, since the real total is a little higher. How full the disk is, as a whole, is checked every minute along with the rest of the machine's metrics.",{"id":421,"title":422,"titles":423,"content":424,"level":66},"\u002Fdocs\u002Fdisk#warnings","Warnings",[53],"How full What happens 85% System shows a warning, and a notification goes out if a channel has The disk is nearly full ticked. 95% A red banner shows on every page. Scheduled backups are skipped, a second notification goes out, and Back up now asks before it starts. Below 80% A \"back to normal\" notification goes out. A scheduled backup that's skipped doesn't start at all, so it can't fill the disk halfway through. It shows in the job list as \"Skipped: the disk is 96% full…\", and channels with A backup failed ticked hear about it. Backups carry on as normal once there's room. You can still back up by hand: Flytower warns you first, since the backup itself needs space.",{"id":426,"title":427,"titles":428,"content":429,"level":66},"\u002Fdocs\u002Fdisk#freeing-up-space","Freeing up space",[53],"Old backups and world exports are the usual culprits. Lower how many backups each server keeps (World, Backups, Schedule), or delete old ones. Backups you took yourself are never deleted automatically. Delete world exports you've already downloaded (World, Past worlds). Deleted servers are kept as archives in \u002Fvar\u002Flib\u002Fflytower-archive (before 1.4.1, \u002Fvar\u002Flib\u002Fflytower\u002Farchive; the system helper moves them across) so they can be brought back. Delete the ones you're sure about over SSH. With off-site copies set up, you can keep fewer backups on the machine.",{"id":59,"title":58,"titles":431,"content":432,"level":14},[],"",{"id":434,"title":58,"titles":435,"content":432,"level":14},"\u002Fdocs\u002Ffirst-server#your-first-server",[],{"id":437,"title":438,"titles":439,"content":440,"level":66},"\u002Fdocs\u002Ffirst-server#create-it","Create it",[58],"The New server form. Servers, . Give it a name , which is what players see. The short name below it is used for its folder and can't change later. Pick a loader :\nVanilla: Mojang's server, unchanged. Datapacks only. Fabric: for mods (performance mods like Lithium, or gameplay mods). Datapacks work too. Paper: for plugins (from Modrinth or Hangar), with Paper's own performance improvements. Datapacks work too. Pick the Minecraft version. The newest release is chosen for you; tick Snapshots to see test versions. Choose memory . The slider stops at what the machine has free (see Memory budget below). Leave port empty to use the next free one, starting at 25565. . Flytower installs the right Java, downloads the server, accepts the EULA for you (you agree to it by creating the server), and starts it. Players connect to  ( ). That's your VPS's address, with :port if it isn't 25565. To give each server a name of its own instead, see Addresses and DNS.",{"id":442,"title":443,"titles":444,"content":445,"level":66},"\u002Fdocs\u002Ffirst-server#other-ways-to-start","Other ways to start",[58],"Import server: upload a world (a zip of the world folder) or a whole server folder, from your own computer or another host. Vanilla, Fabric, Paper, Spigot and Purpur servers are recognised. Spigot and Purpur come in as Paper, which reads the same worlds and plugins. server.properties, the whitelist, ops and bans come across. From YAML: paste a server spec, for example one downloaded from another Flytower. Clone (a server's Settings, Maintenance): a copy with the same settings and content, with or without its world. A deleted server: deleting a server archives its folder first, and you can import it back from Import server.",{"id":447,"title":448,"titles":449,"content":450,"level":66},"\u002Fdocs\u002Ffirst-server#the-servers-tabs","The server's tabs",[58],"Tab What it's for Console Live output, and commands (without the \u002F). ,  and  are in the header. View logs opens today's log and older ones to search or download, and Crashes lists recent crashes. Players People: who's online; kick, ban, operators, and the whitelist. Stats: leaderboards and a card for every player (see Stats). Content Mods, plugins and datapacks. See Content. World Backups (taking, restoring, schedule, off-site copies), the Web map, Past worlds and world exports, and Tools: pre-generating chunks, copying another server's world in, and resetting. Files The server folder: edit, upload, rename, delete. Settings General: server.properties, memory, version and loader, address. Community: public page, player stats, Discord chat. Schedules. Maintenance: crashes, disk use, cloning, deleting. Edit as YAML at the bottom: the whole server as one spec. World and Settings list their sections on one page. Click a section's bar to open or close it; the panel remembers which ones you left open. Closed sections show a short summary on their bar, such as whether the public page is on.",{"id":452,"title":453,"titles":454,"content":455,"level":66},"\u002Fdocs\u002Ffirst-server#how-busy-a-server-is","How busy a server is",[58],"On the servers list, each running server's card shows its Tick time, Memory and CPU, with a line of tick time over the last hour. Each figure is marked ● fine, ▲ busy or ■ struggling, and hovering over it says why: Tick: Minecraft aims for 20 ticks a second, so each tick has 50 ms. Over 40 ms is busy; over 50 ms is struggling, and the game slows down for everyone. Memory: busy over 90% of the server's memory limit. Give it more under Settings, General if it stays there. CPU: the server's share of the whole machine. Busy when it has been over 85% for five minutes in a row. Click the figures for the full charts: CPU, memory, players and time per tick over the last hour, day or week.",{"id":457,"title":458,"titles":459,"content":460,"level":66},"\u002Fdocs\u002Ffirst-server#typing-commands-in-the-console","Typing commands in the console",[58],"The console suggests as you type: command names first, then what comes next, such as online players and @a\u002F@p for a player, item and block ids for give and setblock, effects, sounds, game modes and coordinates. A line under the suggestions shows the command's shape, like give \u003Ctargets> \u003Citem> [\u003Ccount>]. Tab fills in the highlighted suggestion; press it again to go through the others, and Shift+Tab to go back. Type a space to move on to the next part. Up and Down move through the suggestions while they're open, and through your earlier commands when they're not. Escape closes them, and → at the end of the line takes the greyed-out suggestion. On a phone, suggestions are a row of buttons above the box. Flytower gets the vanilla commands from the game itself: the first time a console opens for a Minecraft version, it downloads that version's server from Mojang and runs its built-in command report (in the background, at low priority, with the Java the server already uses), then keeps the result. Until that's done, and if it can't be done, you still get the commands from the server's help. Mods' and plugins' commands come from help too, so they complete by name and show their usage; their arguments don't. They're read again each time the server starts. Only people who can send commands get suggestions.",{"id":462,"title":463,"titles":464,"content":465,"level":61},"\u002Fdocs\u002Ffirst-server#talking-to-players","Talking to players",[58,458],"say, me and msg (or tell and w) from the console show under your name rather than the game's \"Rcon\": say hello shows [Server] Your name: hello to everyone, with the tag in your brand colour, and msg Steve hi reaches only Steve as \"Server Your name whispers to you: hi\". The message is plain text, so formatting codes are taken out and @p in it isn't swapped for a name. A scheduled command task shows as [Server] alone. If the server posts game chat to Discord, say and me go there too, under [Server] Your name; whispers don't.",{"id":467,"title":468,"titles":469,"content":470,"level":66},"\u002Fdocs\u002Ffirst-server#how-it-looks-in-the-server-list","How it looks in the server list",[58],"Settings, General, Game settings has the server's entry in Minecraft's multiplayer list. Server icon: Upload a PNG, JPEG or WebP picture (up to 10 MB), drag and zoom to crop it square, and save. Flytower scales it to the 64×64 server-icon.png Minecraft reads, keeping only the image itself (nothing else from the file, such as its metadata). Remove goes back to the default. Clones keep the icon. It isn't part of the spec, since a spec can't carry a picture. Message of the day: two lines, with colours and formatting from the toolbar, or § codes with Show codes. See properties. A preview shows the whole entry as it'll look, and warns when a line is too long. Minecraft reads both when the server starts, so they show after the next restart.",{"id":472,"title":473,"titles":474,"content":475,"level":66},"\u002Fdocs\u002Ffirst-server#plans","Plans",[58],"Anything that changes what a server runs (content, its version or loader, settings in YAML) shows a plan first: what will be added, updated or removed, how much will be downloaded, and whether a restart is needed. Nothing happens until you press Apply. Anything that touches mods or the world takes a backup first.",{"id":477,"title":478,"titles":479,"content":480,"level":66},"\u002Fdocs\u002Ffirst-server#memory-budget","Memory budget",[58],"Each server gets the memory you give it, plus about 0.5 GB that Java uses around it. Flytower keeps 1 GB for the system and itself, and won't let the total go over what the machine has. The Servers and System pages show who has what. If you need more room, lower another server's memory or move to a bigger VPS.",{"id":482,"title":483,"titles":484,"content":485,"level":66},"\u002Fdocs\u002Ffirst-server#dangerous-actions","Dangerous actions",[58],"Restoring a backup, resetting or copying a world, deleting a backup, an export, a past world or a server, opening SSH, adding or removing passkeys, off-site storage changes and updates all ask for your passkey again, unless you confirmed one in the last five minutes.",{"id":64,"title":63,"titles":487,"content":488,"level":14},[],"Flytower installs on a fresh Ubuntu 24.04+ or Debian 12+ server (amd64 or arm64). The installer sets up the panel only. Java and Minecraft are installed later, from the panel, when you create a server.",{"id":490,"title":63,"titles":491,"content":492,"level":14},"\u002Fdocs\u002Finstall#installing-flytower",[],"Flytower installs on a fresh Ubuntu 24.04+ or Debian 12+ server (amd64 or arm64). The installer sets up the panel only. Java and Minecraft are installed later, from the panel, when you create a server. You need: A VPS with at least 4 GB of RAM (8 GB if you want more than one server running). A domain name you can add a DNS record to, for the panel itself (for example panel.example.com). Passkeys only work over HTTPS on a real name, and Flytower gets the certificate for you.",{"id":494,"title":495,"titles":496,"content":497,"level":66},"\u002Fdocs\u002Finstall#option-a-hetzner-cloud-no-ssh-at-all","Option A: Hetzner Cloud, no SSH at all",[63],"Pick a setup token. Any long random string, for example from a password manager. You'll type it into the panel once. In the Hetzner Cloud console, create a server: Image: Ubuntu 24.04 Type: CPX21 or larger (CPX31 for a few servers) Networking: keep a public IPv4 Cloud config: paste this, with your domain and token: #cloud-config\nruncmd:\n  - curl -fsSL https:\u002F\u002Fgithub.com\u002FMattA-Official\u002Fmc-panel\u002Freleases\u002Flatest\u002Fdownload\u002Finstall.sh | bash -s -- --domain panel.example.com --setup-token YOUR-SETUP-TOKEN\nOnce the server shows its IPv4 address, add a DNS A record for your panel domain pointing at it. If your DNS is on Cloudflare, leave it DNS only (grey cloud). Wait two or three minutes, then open https:\u002F\u002Fpanel.example.com. If the certificate isn't ready yet, give it another minute: Caddy keeps retrying once DNS resolves. Open the setup link the installer prints (or enter the setup token), create your passkey, and save your recovery codes.",{"id":499,"title":500,"titles":501,"content":502,"level":66},"\u002Fdocs\u002Finstall#option-b-an-existing-server-over-ssh","Option B: an existing server over SSH",[63],"curl -fsSL https:\u002F\u002Fgithub.com\u002FMattA-Official\u002Fmc-panel\u002Freleases\u002Flatest\u002Fdownload\u002Finstall.sh \\\n  | sudo bash -s -- --domain panel.example.com The installer prints a setup link and a setup token at the end. Open the link to go straight to creating your passkey, or open the panel and type the token if the link won't open where you are (on another device, say). Either works once, within 24 hours. Lost them before finishing setup? Run the same command again for new ones. It keeps the version you have.",{"id":504,"title":505,"titles":506,"content":507,"level":66},"\u002Fdocs\u002Finstall#what-the-installer-does","What the installer does",[63],"Unpacks the release (which includes its own Bun runtime) into \u002Fopt\u002Fflytower\u002Freleases\u002F\u003Cversion> and points \u002Fopt\u002Fflytower\u002Fcurrent at it. Creates a flytower system user for the panel. The panel never runs as root; a small root helper (flytower-agent) does the handful of things that need it. Installs Caddy for HTTPS, and opens 80, 443 and your SSH port with ufw. It asks sshd which port SSH uses (22 if it can't tell) and says which it opened. Minecraft ports are opened per server as you create them. Stores data in \u002Fvar\u002Flib\u002Fflytower, configuration in \u002Fetc\u002Fflytower, and servers in \u002Fsrv\u002Fflytower\u002Fservers\u002F\u003Cname>. Running the installer again keeps your data, secret and servers. On a box that already has Flytower, it also keeps the installed version, whichever channel it came from, unless you pass --version, --beta, --native, --pr or --tarball. To update, use System → Updates in the panel (or --version latest for the newest stable release). If the version you pick is older than the one installed, the installer first saves a copy of the panel's database in \u002Fvar\u002Flib\u002Fflytower-agent\u002Fdb-backups\u002F. The installer checks the release's signature before installing anything, and prints \"Release signature checked\" when it matches. Releases before 1.0 are marked as pre-releases on GitHub, so the latest links above skip them. To install one, use the versioned link from its release notes.",{"id":509,"title":510,"titles":511,"content":512,"level":61},"\u002Fdocs\u002Finstall#options","Options",[63,505],"Option Meaning --domain \u003Chost> The panel's address. Required. --version \u003Cx.y.z> Install a specific release. --version latest is the newest stable one. A fresh install defaults to that; a re-run keeps what's installed. --beta Install the newest release, betas included. --native Install the newest native build. For test servers. --setup-token \u003Ctext> Use this setup token instead of generating one. --tarball \u003Cfile> Install from a release tarball already on the machine. Its signature isn't checked, so only use one you trust. --pr \u003Cnumber> Install the signed test build of that pull request. For testing only. --no-caddy Skip Caddy if you run your own HTTPS proxy (point it at 127.0.0.1:3000). --no-firewall Leave ufw alone.",{"id":514,"title":107,"titles":515,"content":516,"level":66},"\u002Fdocs\u002Finstall#troubleshooting",[63],"The page doesn't load: check DNS points at the server (dig +short panel.example.com), and that ports 80 and 443 are allowed in any provider firewall. Logs: journalctl -u flytower-panel -u flytower-agent -n 100, and journalctl -u flytower-mc@\u003Cname> for a server. More in Troubleshooting. Next: your first server. html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}",{"id":69,"title":68,"titles":518,"content":519,"level":14},[],"A server can have a map of its world that opens in the browser. It looks like the game's own maps seen from above, keeps up as players explore and build, and shows where everyone is while you watch.",{"id":521,"title":68,"titles":522,"content":523,"level":14},"\u002Fdocs\u002Fmap#web-map",[],"A server can have a map of its world that opens in the browser. It looks like the game's own maps seen from above, keeps up as players explore and build, and shows where everyone is while you watch. Flytower draws it itself, from the world's files. Nothing is added to the server, so it works the same on vanilla, Fabric and Paper, and the server needs no extra memory or ports.",{"id":525,"title":526,"titles":527,"content":528,"level":66},"\u002Fdocs\u002Fmap#turning-it-on","Turning it on",[68],"On the server's World tab, Web map, switch on Draw a web map. Flytower draws the whole world straight away, then keeps it up to date. You can also set it in the YAML with map: { enabled: true }. Web map, on a server's World tab. Turning it off stops drawing and deletes the map's files. Turning it back on draws everything again.",{"id":530,"title":531,"titles":532,"content":533,"level":66},"\u002Fdocs\u002Fmap#how-it-keeps-up","How it keeps up",[68],"Minecraft saves the world every few minutes, and whenever the server stops. Flytower notices each save as it happens (it doesn't keep checking) and, once saving has been quiet for half a minute, draws just the parts of the world that changed. A busy server is redrawn at least every five minutes. Draw now on the card draws what's changed without waiting. Redraw everything draws the whole world again, which is only needed if something looks wrong. When the world is reset, copied from another server or restored from a backup, the next drawing notices that every region file is new and draws the new world, and parts of the old one that aren't in the new world disappear. The card shows how drawing is going, as it happens: when the map was last drawn, how much changed, and how long it took. If any chunks couldn't be read (a damaged region file, say), it says how many and why, and draws the rest.",{"id":535,"title":536,"titles":537,"content":538,"level":61},"\u002Fdocs\u002Fmap#colours","Colours",[68,531],"The colours come from the game itself: the first time a server on a new Minecraft version is drawn, Flytower downloads that version's game files from Mojang, checks them against Mojang's published checksum, works out a colour for every block and biome, and deletes the download. Nothing in it is ever run. If that download fails, the map is drawn with simpler built-in colours, the card says so, and the next drawing tries again.",{"id":540,"title":541,"titles":542,"content":543,"level":66},"\u002Fdocs\u002Fmap#opening-it","Opening it",[68],"Once the map has been drawn, the card has an Open map button. The map is at: https:\u002F\u002F\u003Cyour panel>\u002Fs\u002F\u003Cserver name>\u002Fmap\u002F https:\u002F\u002F\u003Chostname>\u002Fmap\u002F too, when the server has its own hostname and its public page is on. On the map: Drag to move around. Scroll, pinch, double-click (Shift to zoom out) or use + and − to zoom. Pick the Overworld, Nether or End at the top. The Nether is drawn below its roof. The coordinates under the pointer are at the bottom left. Players online in this dimension show with their heads. The list at the bottom right jumps to each one. The address keeps where you're looking, so you can send someone a link to a spot. An open map checks for newly drawn parts every minute, and player positions every few seconds.",{"id":545,"title":546,"titles":547,"content":548,"level":66},"\u002Fdocs\u002Fmap#who-can-see-it","Who can see it",[68],"Show players: where each online player is. Flytower asks the server with the game's own data command, only while someone has the map open, and at most every three seconds however many people are looking. Someone who opens the map without signing in only sees players when the public page shows player names; with it set to show how many are on, or nothing, the public map shows no players either. Anyone can open it: lets people open the map without signing in, and links it from the public page and \u002Fstatus in Discord. This needs the public page on. Off (the default), only people who can see the server in the panel can open it. When the map is public, the card shows its address to share, with a copy button. Someone who isn't signed in and opens a map that isn't public is sent to sign in. Anyone who can't see the server, or opens a map that's off, gets \"Not found\", exactly as for a server that doesn't exist. Player heads come from the panel's own copy of their skins, never from another site. The map page loads nothing from anywhere else, and a public map never sets a cookie.",{"id":550,"title":551,"titles":552,"content":553,"level":66},"\u002Fdocs\u002Fmap#what-it-costs","What it costs",[68],"CPU: drawing runs at the lowest priority, so the Minecraft servers always come first. Each server's map is drawn one pass at a time, and at most two servers' maps at once, so one huge world doesn't hold up the others. A pass that makes no progress for ten minutes is stopped and shows as failed on the card; the next save tries again. A 512×512-block region takes well under a second; after the first drawing, only changed regions are drawn. Memory: about 20 MB while drawing, and nothing in between. Disk: one image per 512×512 blocks of explored world, plus zoomed-out copies. The server's Disk use card shows it on its own line, Web map. The files are in \u002Fvar\u002Flib\u002Fflytower\u002Fmaps, not in the server's folder, so they're never in backups. Ports: none. The panel serves the map itself.",{"id":74,"title":73,"titles":555,"content":556,"level":14},[],"Flytower can tell you when something needs attention, so you don't have to watch the panel. It sends to a Discord channel, to your phone through ntfy, or to anything else as a signed JSON webhook.",{"id":558,"title":73,"titles":559,"content":560,"level":14},"\u002Fdocs\u002Fnotifications#notifications",[],"Flytower can tell you when something needs attention, so you don't have to watch the panel. It sends to a Discord channel, to your phone through ntfy, or to anything else as a signed JSON webhook. Set them up on System, Notifications. Each place Flytower sends to is a channel. You can have as many as you like, each with its own events and servers: for example, problems to an admins' Discord channel and joins to a public one. The notification channels, on System, Notifications.",{"id":562,"title":563,"titles":564,"content":565,"level":66},"\u002Fdocs\u002Fnotifications#what-you-can-hear-about","What you can hear about",[73],"Group Event When Problems A server crashed As it happens (Flytower follows systemd), with the cause. \"Back up\" follows once it's running. Problems A server kept crashing and was left stopped After three crashes in ten minutes. See Crashes. Problems A server stopped responding Its console hasn't answered for five minutes. \"Responding again\" follows when it does. Problems A backup failed A manual or scheduled backup fails. A \"working again\" message follows the next good backup. Problems Copying a backup off-site failed An off-site copy fails twice in a row (one blip that the retry fixes stays quiet), and when it works again. Problems A scheduled restart, command or announcement failed It failed, or was skipped because a backup or change ran for ten minutes. See Scheduled tasks. Problems The disk is nearly full Once at 85%, once more at 95%, and \"back to normal\" when it drops below 80%. Updates A new version of Flytower is out Once per new version on your update channel (betas only on Beta). Flytower checks every six hours. Updates Updates for installed mods, plugins or datapacks Once per server per new set of updates, from the same check as the Content tab. Activity A server started or stopped The moment players can join, and the moment it starts shutting down, however it happened. Activity A server restarted from the panel \"Restarting\" when you press Restart, then \"Restarted\" once players can join again. Activity A player joined or left The moment it happens. New channels start with the problems and updates ticked, and the activity left off. Channels made before crash alerts and scheduled-task alerts existed get them ticked if they already had any problem ticked. How activity is noticed. Flytower reads each server's own log (logs\u002Flatest.log) and Linux tells it the moment a line is written, so nothing is checked on a timer and no mod or plugin is needed. \"Server started\" means the log said Done (…)! For help, type \"help\", which is when players can actually join. \"Server stopping\" means it said Stopping the server. A restart from the panel sends \"Restarting\" and \"Restarted\" instead of a stop and a start. Chat can't fake any of these: a player typing \"Steve joined the game\" doesn't count. Crashes come from systemd's journal instead, since a crashed server may not get to write anything; see Crashes. Quiet periods. The same problem on the same server is sent at most once every 30 minutes (ten for crashes), so a backup that fails every hour doesn't flood the channel. Once a problem has cleared, the next one is sent straight away. Updates are sent once per version. Activity isn't held back. Servers. Leave Servers empty to hear about every server, including ones you create later, or pick some. Machine-wide events (the disk, Flytower updates) go to every channel that has them ticked.",{"id":567,"title":568,"titles":569,"content":570,"level":66},"\u002Fdocs\u002Fnotifications#discord","Discord",[73],"In Discord, open the channel's settings (the cog), then Integrations, Webhooks, New Webhook. Name it (Flytower sends as \"Flytower\" anyway) and Copy Webhook URL. In Flytower: Add channel, Send to Discord, paste the URL, tick what you want, Send test, then Add. Messages are embeds coloured by how serious they are (red for problems, amber for warnings, blue for news, green for \"back to normal\"). The title links back to the right page of the panel. Player names can't ping anyone: Flytower turns off mentions on every message.",{"id":572,"title":573,"titles":574,"content":575,"level":66},"\u002Fdocs\u002Fnotifications#ntfy-phone-push","ntfy (phone push)",[73],"ntfy sends push notifications to its phone app with no account needed. Install the ntfy app and subscribe to a topic. On the public ntfy.sh server, anyone who knows a topic's name can read it, so make it long and hard to guess, like flytower-7f3k2q9x. In Flytower: Add channel, Send to ntfy, and enter https:\u002F\u002Fntfy.sh\u002Fyour-topic. If you run your own ntfy server with access control, put an access token in Access token. Problems arrive as high or urgent priority, and tapping one opens the panel.",{"id":577,"title":578,"titles":579,"content":580,"level":66},"\u002Fdocs\u002Fnotifications#json-webhook","JSON webhook",[73],"For anything else (Slack through a workflow, Home Assistant, your own script), Flytower POSTs each event as JSON: {\n  \"version\": 1,\n  \"id\": \"8d2babc4-494b-4b97-b835-a6b70a3da5b2\",\n  \"kind\": \"backup.failed\",\n  \"severity\": \"critical\",\n  \"title\": \"A scheduled backup failed\",\n  \"detail\": \"Not enough disk space: this needs up to 2.1 GB and only 1.4 GB is free.\",\n  \"server\": { \"name\": \"survival\", \"displayName\": \"Survival\" },\n  \"link\": \"https:\u002F\u002Fpanel.example.com\u002Fservers\u002Fsurvival\u002Fbackups\",\n  \"at\": \"2026-11-10T03:00:12.512Z\"\n} kind is one of backup.failed, offsite.failed, disk.full, update.flytower, update.content, server.started, server.stopped, server.restarted, player.joined, player.left or test. severity is critical, warning, info or ok (\"back to normal\"). server is null for machine-wide events. Headers: X-Flytower-Event (the kind), X-Flytower-Delivery (the id, the same across retries) and, if you set a signing secret, X-Flytower-Signature. Checking the signature. Use Generate for a secret, and keep a copy for your receiver. The signature is sha256= followed by the hex HMAC-SHA256 of the exact request body, keyed with the secret. Compare it in constant time before trusting the body. In Bun: import { timingSafeEqual } from 'node:crypto'\n\nconst body = await req.text()\nconst mac = new Bun.CryptoHasher('sha256', secret).update(body).digest('hex')\nconst expected = Buffer.from(`sha256=${mac}`)\nconst given = Buffer.from(req.headers.get('x-flytower-signature') ?? '')\nconst ok = given.length === expected.length && timingSafeEqual(given, expected) Answer with any 2xx status. Anything else counts as a failed delivery.",{"id":582,"title":583,"titles":584,"content":585,"level":66},"\u002Fdocs\u002Fnotifications#when-delivery-fails","When delivery fails",[73],"Flytower tries each message four times over about two and a half minutes. If Discord says to slow down, it waits as long as Discord asks. An address that says it doesn't exist (404) or refuses the token (401, 403) isn't retried. A channel whose last delivery failed shows the error in red under it on System, Notifications, until a message gets through. The error is also in the panel's log (journalctl -u flytower-panel). A failed notification never sets off another one.",{"id":587,"title":588,"titles":589,"content":590,"level":66},"\u002Fdocs\u002Fnotifications#security","Security",[73],"Adding, changing and removing channels asks for your passkey, because they send information off the machine. Each change is in Activity. The address and any token or secret are stored encrypted, like off-site storage keys, and never sent back to the browser. The list shows a masked version (for example discord.com\u002Fapi\u002Fwebhooks\u002F1234…\u002F••••) so you can tell channels apart. To change the address, type the new one in; leaving it blank keeps the saved one. Messages say what happened and on which server, never passwords or file contents. Player names do appear in join and leave messages. html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"id":79,"title":78,"titles":592,"content":593,"level":14},[],"Flytower can have more than one person signing in. Each person has one or more roles, each for one server or for all of them. Roles add up: someone can be an Operator on every server and an Admin on one.",{"id":595,"title":78,"titles":596,"content":593,"level":14},"\u002Fdocs\u002Fpeople#people-and-roles",[],{"id":598,"title":599,"titles":600,"content":601,"level":66},"\u002Fdocs\u002Fpeople#roles","Roles",[78],"Role Can Owner Everything, including people, Flytower updates, SSH, notifications, off-site storage and branding. There's always at least one Owner. Admin Everything on their servers: settings, files, content, backups and downloads, worlds, schedules, and deleting the server. On all servers, can also create new servers. Operator Start, stop and restart, the console and logs, players (whitelist, operators, bans) and taking backups. Viewer The server's status, settings and who's online. Not the console or logs, since they show players' IP addresses. Dangerous actions (deleting, restoring, resetting a world, opening SSH and so on) still ask for a passkey, whatever the role.",{"id":603,"title":604,"titles":605,"content":606,"level":66},"\u002Fdocs\u002Fpeople#custom-roles","Custom roles",[78],"On Access, the Roles tab lists every role, and  makes your own, such as a Moderator who can read the console and manage players but not start or stop the server. Tick what it can do. Anything done on a server includes seeing it, and some permissions bring others along: sending console commands includes reading the console, changing files includes reading them, and Edit the YAML includes every kind of setting. The permissions under Across Flytower (creating servers, inviting and managing people, roles, updates, notifications, integrations, branding, SSH and all activity) only count when the role is given for all servers. A server's settings are split so a role can cover just part of them: Change settings (properties, MOTD, icon, memory, recovery, address, time zone), Manage content (mods, plugins, datapacks, game version), Manage schedules, Change backup settings, and Manage community features (public page, stats, Discord chat, web map). The YAML tab can change everything at once, so it needs Edit the YAML; a change made anywhere else only needs the permission for the part it touches. The editor groups permissions by area, and All ticks a whole area. Permissions that come with one you've ticked are ticked and locked, with what brings them. Ones you don't have yourself are switched off, since you can't hand them out. Permissions that amount to full control (console commands, changing files or content, the YAML, managing people or roles, updates and SSH) are marked Powerful, with a line on why. Every role, built-in ones included, has a copy button. New role can also Start from any role. A copy only keeps the permissions you have yourself. Under each role you can see how many people have it and where. On People, the checklist button shows what someone can do: everything their roles add up to, on all servers, on single servers, and across Flytower. Changing a role changes it for everyone who has it, straight away. A role can be deleted once nobody has it, and its unused invite links are cancelled. Built-in roles can't be changed (copy one instead), and you can't make a role that can do more than you can. Activity says which permissions a change added or removed, and which roles someone was given or lost.",{"id":608,"title":609,"titles":610,"content":611,"level":66},"\u002Fdocs\u002Fpeople#what-people-see","What people see",[78],"People only see the servers they've been given. On a server, tabs they can't use are hidden: without the console permission a server opens on its players, and Files only shows with the files permission. Where they can look but not change things (settings, content, players, backups, schedules, world), the tab says View only and its buttons are off. Start, stop and restart only show for people who can use them, as do New server and the System pages for updates, storage, notifications, branding and SSH. If someone's access changes while they have the panel open, it updates when they come back to the tab.",{"id":613,"title":614,"titles":615,"content":616,"level":66},"\u002Fdocs\u002Fpeople#inviting-someone","Inviting someone",[78],"Access, People: everyone who can sign in, and invite links not used yet. Go to Access in the sidebar. On the People tab, choose . Pick a role and a server (or all servers). A note for who it's for is optional and only shown to you. Copy the link and send it to them. It works once, for 7 days, and is only shown once. When they open it, they choose a name, create a passkey and save their recovery codes, the same steps as first-time setup. Until they do, the link shows under Invite links not used yet, where you can cancel it. You can only give someone access you have yourself.",{"id":618,"title":619,"titles":620,"content":621,"level":66},"\u002Fdocs\u002Fpeople#changing-or-removing-someone","Changing or removing someone",[78],"On Access, People, choose the pencil to change someone's roles, or the remove button to take them off. Both ask for your passkey and apply straight away: a removed person is signed out on their next click and their passkeys stop working. The last Owner can't be removed or given a smaller role. Make someone else an Owner first. Everything here is recorded under Activity, in Sign-ins and access.",{"id":623,"title":624,"titles":625,"content":626,"level":66},"\u002Fdocs\u002Fpeople#one-servers-access","One server's access",[78],"A server's Settings has an Access section for people who manage people, or who have Manage who has access on that server. It lists everyone who can reach the server: roles they have on it, and roles they have on all servers (those are changed on Access). From there you can change someone's roles on this server, add someone who isn't on it yet, and make or cancel invite links for it. Manage who has access suits someone who runs one server, like an event server, and brings in their own helpers. They can only give roles they could have on that server themselves, and can't touch other servers or anyone's roles for all servers. Admin doesn't include it; give it with a custom role. Changes are in the server's Activity.",{"id":84,"title":83,"titles":628,"content":629,"level":14},[],"Each server can run things by itself on a schedule: a restart with a countdown in-game, a console command, or an announcement in everyone's chat. For example, restart at 5am every day, warning players 15, 5 and 1 minutes and 10 seconds beforehand.",{"id":631,"title":83,"titles":632,"content":633,"level":14},"\u002Fdocs\u002Fschedules#scheduled-tasks",[],"Each server can run things by itself on a schedule: a restart with a countdown in-game, a console command, or an announcement in everyone's chat. For example, restart at 5am every day, warning players 15, 5 and 1 minutes and 10 seconds beforehand. Set them under the server's Settings, , or under schedules in its YAML. Both are the same list.",{"id":635,"title":636,"titles":637,"content":638,"level":66},"\u002Fdocs\u002Fschedules#adding-a-task","Adding a task",[83],"The Schedules section of a server's Settings, with a daily restart and an hourly save. Press  and choose what it does: Restart: warns anyone online, saves the world, then restarts the server. Command: runs a console command, such as save-all or whitelist reload. Write it without the slash. Its reply is kept, and shows when you point at the task's last result. Announcement: shows a line of text in everyone's chat, in gold (or your brand colour). Then choose when: every day at a time, every week on a day, every hour, every few minutes, or a cron expression for anything else. Cron has five parts: minute, hour, day of the month, month, and day of the week. 0 5 * * * is 05:00 every day, and 30 3 * * 1-5 is 03:30 on weekdays. The form shows the next three times it would run. Every task on the list shows when it runs next, and when it last ran and how that went.  runs it straight away. The list updates by itself while a task runs.",{"id":640,"title":641,"titles":642,"content":643,"level":66},"\u002Fdocs\u002Fschedules#time-zone","Time zone",[83],"Tasks run in the server's time zone, set at the bottom of Settings, Schedules (or timezone in the YAML). It starts as UTC, so set it to where your players are, such as Europe\u002FLondon. Clocks changing for summer time are handled: 05:00 stays 05:00. Backups keep their own time zone, set under World, Backups.",{"id":645,"title":646,"titles":647,"content":648,"level":66},"\u002Fdocs\u002Fschedules#restarts","Restarts",[83],"A restart set for 05:00 starts its countdown at the first warning, so with the usual warnings it begins at 04:45 and restarts at 05:00: Players see \"Server restarting in 15 minutes\" in chat, then again at each warning. The last 10 seconds also show as a title in the middle of the screen. The world is saved (save-all flush). The server restarts the same way as the Restart button. It isn't counted as a crash, and if a channel has A server restarted from the panel ticked, the restart is announced there. The task records how long the restart took, such as \"Restarted in 41s (4 warnings)\". The warnings are up to you: any of 10s, 1m, 15m, 1h and so on, up to two hours, or none at all. Restart straight away when nobody is online (on by default) skips the countdown if the server is empty when the countdown would start. The restart then happens at once, up to the first warning early, which saves keeping an empty server waiting. While a restart counts down, its Run now button becomes Call off. Calling it off tells anyone who was warned that the restart isn't happening, and the task's result says it was cancelled. Run now on a restart asks first, and starts the countdown from the moment you confirm.",{"id":650,"title":651,"titles":652,"content":653,"level":66},"\u002Fdocs\u002Fschedules#when-a-task-cant-run","When a task can't run",[83],"The server isn't running: the task is skipped, and its result says so. No notification is sent. A backup, restore or change is running on the server: the task waits until it's finished, for up to ten minutes. If it's still going after that, the task is skipped, its result says why, and a notification is sent. A restart's countdown doesn't hold the server up: a backup due during the warnings still runs, and the restart waits for it to finish before saving and restarting. The server is stopped during a restart's countdown: the restart is called off rather than starting the server again, and its result says so. The task is changed or deleted during its countdown (or its server is deleted): the countdown is called off, and anyone who was warned hears that the restart isn't happening. It fails: for example, the console doesn't answer, or the server doesn't come back after a restart. The task's result says what went wrong, and a A scheduled restart, command or announcement failed notification is sent. The next run that works sends \"Scheduled tasks are working again\". Every run is in Activity: credited to Flytower when it ran on its schedule, or to you when you pressed Run now.",{"id":655,"title":656,"titles":657,"content":658,"level":66},"\u002Fdocs\u002Fschedules#things-a-task-cant-do","Things a task can't do",[83],"A command can't be stop. To systemd, a server that stops by itself looks like a crash, so it would be started again (and counted as a crash). Use a restart task instead. A command is one line, and an announcement is at most 256 characters. A task waits for a backup, restore or change on its server, and for a restart that is saving and restarting, for up to ten minutes as above. A command or announcement due during a restart's warnings runs straight away.",{"id":89,"title":88,"titles":660,"content":661,"level":14},[],"Press ? on any page to see these in the panel. They never fire while you're typing in a field, the console or an editor, and they never replace the browser's own Ctrl (⌘ on a Mac) keys.",{"id":663,"title":88,"titles":664,"content":661,"level":14},"\u002Fdocs\u002Fshortcuts#keyboard-shortcuts",[],{"id":666,"title":667,"titles":668,"content":669,"level":66},"\u002Fdocs\u002Fshortcuts#anywhere","Anywhere",[88],"Keys Does Ctrl + K Search servers, pages and actions ? List the shortcuts \u002F Focus the page's search, or the console's command line Ctrl + S Save on Settings or in the file editor; on YAML, review your changes Escape Close the open dialog, menu or editor",{"id":671,"title":672,"titles":673,"content":674,"level":66},"\u002Fdocs\u002Fshortcuts#go-to-press-g-then-a-letter","Go to (press G, then a letter)",[88],"Keys Goes to G S Servers G A Activity G Y System On a server page these go to a part of that server: Keys Goes to G C Console G L, or just L Logs G P Players G B Backups (on World) G N Content G W World G F Files G T Settings G M YAML and The same tab on the previous or next server",{"id":676,"title":677,"titles":678,"content":679,"level":66},"\u002Fdocs\u002Fshortcuts#lists-and-cards","Lists and cards",[88],"On the server cards and the rows of Files, Backups and Content: Keys Does J and K, or ↓ and ↑ Move to the next or previous row Enter Open the row (a file opens in the editor, a card opens its server) . or Shift + F10 Open the row's menu, as a right-click would Shift + Delete Delete the row, with the usual confirm Starting, restarting and stopping a server have no single key on purpose, so a stray key press can't stop it. Use the buttons, the row's menu or Ctrl + K.",{"id":681,"title":682,"titles":683,"content":684,"level":66},"\u002Fdocs\u002Fshortcuts#turning-them-off","Turning them off",[88],"Single-key shortcuts (the letters, ?, \u002F, ** and **) can be turned off for one browser under This browser on Your account, for example if you use voice control or a screen reader that sends keys. Ctrl + K and Ctrl + S keep working.",{"id":94,"title":93,"titles":686,"content":687,"level":14},[],"Every server can be written as one YAML document, its spec. Settings, YAML shows a server's spec and lets you edit it. New server, From YAML makes a server from one. Changes go through a plan like any other.",{"id":689,"title":93,"titles":690,"content":691,"level":14},"\u002Fdocs\u002Fspec#server-yaml-reference",[],"Every server can be written as one YAML document, its spec. Settings, YAML shows a server's spec and lets you edit it. New server, From YAML makes a server from one. Changes go through a plan like any other. The first line points editors at the schema (\u002Fschema\u002Fserver-v1.json on your panel). In VS Code with the YAML extension, that gives you autocomplete and checking.",{"id":693,"title":694,"titles":695,"content":696,"level":66},"\u002Fdocs\u002Fspec#example","Example",[93],"# yaml-language-server: $schema=https:\u002F\u002Fpanel.example.com\u002Fschema\u002Fserver-v1.json\nname: survival\ndisplayName: Weekend Survival\nloader:\n  type: fabric\n  minecraft: '26.3'\nmemory: 6G\nport: 25566\nhostname: survival.example.com\nproperties:\n  motd: Welcome back\n  difficulty: normal\n  max-players: 30\n  view-distance: 12\ncontent:\n  - modrinth: lithium\n  - modrinth: chunky\n  - vanillatweaks: Survival\u002Fmultiplayer sleep\n  - url: https:\u002F\u002Fexample.com\u002Fmy-datapack.zip\n    sha256: 0f343b0931126a20f133d67c2b018a3b5f0c6d0e7c5c1f2a2b1e5c8d9f7a6b5c\n    kind: datapack\nbackups:\n  schedule: '0 4 * * *'\n  timezone: Europe\u002FLondon\n  keep: { last: 6, daily: 7, weekly: 4 }\n  offsite: B2\ntimezone: Europe\u002FLondon\nschedules:\n  - restart: '0 5 * * *'\n  - command: save-all\n    cron: '*\u002F30 * * * *'\n  - announce: 'The server restarts at 5am'\n    cron: '0 22 * * *'",{"id":698,"title":699,"titles":700,"content":432,"level":66},"\u002Fdocs\u002Fspec#fields","Fields",[93],{"id":702,"title":703,"titles":704,"content":705,"level":61},"\u002Fdocs\u002Fspec#name-required","name (required)",[93,699],"The short name, used for the server's folder, user and unit. Lowercase letters, digits and hyphens, 2 to 31 characters, starting with a letter. It can't change once the server exists.",{"id":707,"title":708,"titles":709,"content":710,"level":61},"\u002Fdocs\u002Fspec#displayname","displayName",[93,699],"What players and you see. Defaults to the name.",{"id":712,"title":713,"titles":714,"content":715,"level":61},"\u002Fdocs\u002Fspec#loader-required","loader (required)",[93,699],"Field Meaning type vanilla, fabric or paper. minecraft The Minecraft version, in quotes (unquoted, YAML reads 1.20 as the number 1.2). version The Fabric loader version or Paper build number. Leave it out for the newest stable one when the plan runs. Changing the version or loader goes through a plan that takes a backup first. Going back to an older Minecraft version is refused, because worlds can't be downgraded. Restore a backup instead.",{"id":717,"title":718,"titles":719,"content":720,"level":61},"\u002Fdocs\u002Fspec#memory","memory",[93,699],"Memory for Java, like 4G or 3584M, between 1G and 64G. It must fit the machine's memory budget.",{"id":722,"title":723,"titles":724,"content":725,"level":61},"\u002Fdocs\u002Fspec#port","port",[93,699],"The game port, 1024 to 65535. Leave it out to use the next free one. Clashes with other servers are refused.",{"id":727,"title":728,"titles":729,"content":730,"level":61},"\u002Fdocs\u002Fspec#hostname","hostname",[93,699],"The address players use, such as survival.example.com. null clears it; left out, it stays as it is. See Addresses and DNS.",{"id":732,"title":733,"titles":734,"content":735,"level":61},"\u002Fdocs\u002Fspec#properties","properties",[93,699],"Values for server.properties: strings, numbers or booleans. Anything left out keeps its current value. Values equal to Minecraft's defaults are left out when Flytower writes a spec. Some keys can't be set here: server-port, enable-rcon and rcon.port are managed by Flytower. Set the port with port. Secrets are hidden: rcon.password, management-server-secret, and any other key ending in secret or password (such as -secret or .password). They're never written into a spec or shown in the Settings form, and editing other properties or applying a spec keeps whatever secret is on disk. A cloned server gets fresh secrets of its own. To change one by hand, edit server.properties in the Files tab. motd is the message of the day, shown under the server in the multiplayer list. It can have two lines and Minecraft's § formatting codes: colours §0 to §f, §l bold, §o italic, §n underline, §m strikethrough, §k obfuscated and §r to reset. In YAML, use double quotes so \\n starts the second line: properties:\n  motd: \"§6§lNew Theatre §r§7Survival\\n§bOpen to members\" The editor in Settings, General, Game settings writes the same string, so you rarely need to type codes by hand. Hex colours aren't supported, because vanilla only reads the 16 colours from server.properties.",{"id":737,"title":738,"titles":739,"content":740,"level":61},"\u002Fdocs\u002Fspec#content","content",[93,699],"The full list of what the server runs. Anything installed through Flytower that isn't listed is removed. Dependencies don't need listing. Each item is one of: Item Fields Modrinth modrinth: project slug or id. version: a version number or id (newest compatible if left out). kind: mod, plugin or datapack, rarely needed. Hangar hangar: slug or owner\u002Fslug (Paper only). version: a version name (newest compatible if left out). Vanilla Tweaks vanillatweaks: \"Category\u002Fpack name\", as on their site. tweak: crafting for a crafting tweak; datapack otherwise. A link url: an https link. sha256: the file's hash; it's refused if it doesn't match. kind: mod, plugin or datapack. filename: optional. See Mods, plugins and datapacks.",{"id":742,"title":743,"titles":744,"content":745,"level":61},"\u002Fdocs\u002Fspec#backups","backups",[93,699],"Left out entirely, a server's backup settings stay as they are. When present: Field Meaning schedule A cron expression (minute hour day month weekday), such as '0 4 * * *' for 4am daily, or null for no schedule. timezone The time zone the schedule runs in, such as Europe\u002FLondon. Defaults to UTC. keep last (default 6), daily (7) and weekly (4): how many scheduled backups to keep. See Backups. offsite The name of off-site storage from System, Off-site storage, or null for none. Left out, it stays.",{"id":747,"title":748,"titles":749,"content":750,"level":61},"\u002Fdocs\u002Fspec#recovery","recovery",[93,699],"What Flytower does when the server gets stuck. Left out, the current setting stays. Field Meaning restartWhenUnresponsive true to restart the server once when its console hasn't answered for five minutes. Defaults to false. See Crashes.",{"id":752,"title":753,"titles":754,"content":755,"level":61},"\u002Fdocs\u002Fspec#public","public",[93,699],"The server's public status page. Left out, the current settings stay. Field Meaning enabled true to turn the page on at \u002Fs\u002F\u003Cname>. Defaults to false. description A few lines about the server, up to 500 characters, shown as plain text with line breaks. show.players count (the default) shows how many are online, names shows their heads and names, none shows nothing. show.version false to hide the Minecraft version and loader. Defaults to true. show.leaderboard true to show the player stats leaderboards. Needs show.players: names and stats on. Defaults to false. pack.enabled false to stop offering the players' modpack. Defaults to true; Fabric only. pack.extras Client-only extras for the modpack: a list of modrinth: \u003Cslug>, each with an optional exact version. public:\n  enabled: true\n  description: |\n    Survival for New Theatre members.\n    Season 3 started in September.\n  show:\n    players: names\n  pack:\n    extras:\n      - modrinth: iris\n      - modrinth: complementary-reimagined",{"id":757,"title":758,"titles":759,"content":760,"level":61},"\u002Fdocs\u002Fspec#map","map",[93,699],"The server's web map. Left out, the current settings stay. Field Meaning enabled true to draw a web map of the world. Defaults to false. public true to let anyone open the map without signing in. Needs the public page on. Defaults to false: only people who can see the server can. players false to hide where players are. Defaults to true. map:\n  enabled: true\n  public: true",{"id":762,"title":763,"titles":764,"content":765,"level":61},"\u002Fdocs\u002Fspec#timezone","timezone",[93,699],"The time zone the server's scheduled tasks run in, such as Europe\u002FLondon. Left out, it stays (UTC to begin with). Backups have their own, under backups.",{"id":767,"title":768,"titles":769,"content":770,"level":61},"\u002Fdocs\u002Fspec#schedules","schedules",[93,699],"Restarts, console commands and announcements the server runs by itself. See Scheduled tasks. When present, the whole list is replaced (tasks that haven't changed keep their last run). Left out, the current tasks stay; write schedules: [] to remove them all. Each item is one of: Item Meaning restart: '0 5 * * *' Restart at these times. warn lists when to warn players beforehand, like [15m, 5m, 1m, 10s] (the default), up to 2h; [] for none. skipWarningsWhenEmpty (default true) restarts straight away when nobody is online. command: save-all cron: '*\u002F30 * * * *' Run a console command, without the slash. It can't be stop; use a restart instead. announce: 'Restart at 5am' cron: '0 22 * * *' Show a line in everyone's chat, in gold or the brand colour. At most 256 characters. Applying changed schedules never restarts the server. The plan lists tasks added and removed under Schedules.",{"id":772,"title":773,"titles":774,"content":775,"level":66},"\u002Fdocs\u002Fspec#errors","Errors",[93],"Mistakes are marked on their line with a message saying what's wrong, and you can't apply until they're fixed. Problems the plan finds (a port in use, a mod with no build for your version, not enough memory) are listed in the plan, and stop it from applying. html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}",{"id":99,"title":98,"titles":777,"content":778,"level":14},[],"Each server's Players tab has a Stats view with leaderboards and a card for every player. Anyone who can see the server in the panel can see it.",{"id":780,"title":98,"titles":781,"content":778,"level":14},"\u002Fdocs\u002Fstats#player-stats",[],{"id":783,"title":784,"titles":785,"content":786,"level":66},"\u002Fdocs\u002Fstats#where-the-figures-come-from","Where the figures come from",[98],"Flytower doesn't add a mod or plugin for this. It uses two things it already has: Visits: when each player joins and leaves, from the server's log. This gives first and last seen, the number of visits and who is online. A daily read of Minecraft's own stats files (world\u002Fplayers\u002Fstats\u002F, or world\u002Fstats\u002F on older versions) at 03:30 in the server's time zone. Flytower keeps about twenty numbers per player from them, not the thousands of counters the files hold. Because the stats are read once a day, the leaderboards can be up to a day behind. People who can change the server's settings can press Read now on the Stats view to read them straight away.",{"id":788,"title":789,"titles":790,"content":791,"level":66},"\u002Fdocs\u002Fstats#leaderboards","Leaderboards",[98],"There are five boards, each showing the top ten: Board What it counts Playtime Time in the game, as Minecraft counts it Deaths Times the player died Mob kills Mobs killed Distance travelled Walking, sprinting, swimming, flying with elytra, boats, horses and minecarts together Blocks mined Every block broken with the right tool Switch between All time, This month and This week. Weeks start on Monday and months on the 1st, in the server's time zone. Players with the same figure share a place. If a world is reset, its counts start again from zero; Flytower counts everything in the new world as new.",{"id":793,"title":794,"titles":795,"content":796,"level":66},"\u002Fdocs\u002Fstats#turning-stats-off-and-leaving-players-out","Turning stats off and leaving players out",[98],"Under Settings, Community, Player stats you can turn stats off for a server (what was kept stays and is still shown, but nothing new is kept) or leave individual players out. A player who is left out has everything kept about them on that server deleted, and never appears on the Stats view, a leaderboard or anywhere else.",{"id":103,"title":102,"titles":798,"content":799,"level":14},[],"Each server can have a page that anyone can open without signing in, at https:\u002F\u002F\u003Cyour panel>\u002Fs\u002F\u003Cserver name>. It shows the server's name, icon and MOTD, a few lines you write about it, whether it's up, the address to join with a Copy button, the Minecraft version, and who's online. It wears your branding and works in light and dark mode. It's useful to link from a Discord server or a website, and those sites show a preview of the link with the server's name and description.",{"id":801,"title":102,"titles":802,"content":799,"level":14},"\u002Fdocs\u002Fstatus-page#public-status-page",[],{"id":804,"title":526,"titles":805,"content":806,"level":66},"\u002Fdocs\u002Fstatus-page#turning-it-on",[102],"A server's Settings, Community, Public page: switch on Show a public page for this server, write a description (up to 500 characters, shown as plain text with line breaks), choose what it says about players, and Save. The card then shows the page's address with a copy button. Public page, in a server's Settings, Community. If the server has its own hostname, the page is also at https:\u002F\u002F\u003Chostname>, such as https:\u002F\u002Fsurvival.example.com. See On the server's own address. While the page is off, its address says \"Nothing here\", exactly as for a server that doesn't exist, so nobody can find out which servers you have by guessing names. You can also set it with public: in the YAML.",{"id":808,"title":809,"titles":810,"content":811,"level":66},"\u002Fdocs\u002Fstatus-page#players","Players",[102],"You choose what the page says about who's online: How many are online (the default): \"3 of 20 players online\". Names and heads: everyone who's on, by name, with their face. Heads come through the panel, as on the Players tab, so visitors' browsers never contact Mojang or anyone else. Nothing. Bear in mind that Minecraft itself already tells anyone who adds your server to their multiplayer list how many people are on, and a sample of their names, unless you set hide-online-players=true in the server's settings.",{"id":813,"title":789,"titles":814,"content":815,"level":66},"\u002Fdocs\u002Fstatus-page#leaderboards",[102],"With Names and heads chosen, you can also tick Show leaderboards. The page then shows the top five for playtime, deaths, mob kills, distance travelled and blocks mined, for all time, this month and this week, from the same figures as the server's stats on its Players tab. It's off unless you turn it on. Leaderboards only show while the page shows names and the server keeps player stats. Players left out of stats never appear. Only names, heads and the figures leave the panel: nothing about when people played or who is left out.",{"id":817,"title":818,"titles":819,"content":820,"level":66},"\u002Fdocs\u002Fstatus-page#modpack-for-players","Modpack for players",[102],"On a Fabric server, the page can offer a modpack (.mrpack): one file players open in the Modrinth app or Prism Launcher to get a ready-to-play instance with the right Minecraft, Fabric and mods. It's on by default while the page is on; switch off Offer a modpack for players to hide it. What goes in it: From the server: each Modrinth mod in the server's content that also runs on players' computers, at the exact version the server has. Mods whose Modrinth page says they don't run on clients are left out (Modrinth's own labels decide, so a mod marked \"optional\" on clients, like Lithium, is included as optional), and so are plugins, datapacks and files that didn't come from Modrinth. Extras for players: client-only mods, shader packs and resource packs you add by their Modrinth slug, the last part of the project's address (sodium, iris, complementary-reimagined). Flytower picks the newest version for the server's Minecraft version and adds the mods they need. A shader pack needs Iris, so add iris too. The Public page card lists What players get and, under Left out, anything that wasn't added and why. The pack lists each file by its Modrinth download and checksums, as the format requires, so Flytower never copies or hosts anyone's mods: the launcher downloads them from Modrinth. It's rebuilt the first time someone asks for it after the server's content, extras or versions change, and kept under \u002Fvar\u002Flib\u002Fflytower\u002Fpacks. Paper and vanilla servers don't get one, since their plugins and datapacks only run on the server.",{"id":822,"title":823,"titles":824,"content":825,"level":66},"\u002Fdocs\u002Fstatus-page#on-the-servers-own-address","On the server's own address",[102],"A server with a hostname (and its A record pointing at the VPS, which players need anyway) shows its public page at https:\u002F\u002F\u003Chostname> too. There, nothing else of the panel is reachable: the address only serves that server's page, its modpack and the branding. Signing in and every other page stay on the panel's own domain. Caddy gets a certificate for the hostname the first time someone opens it, after asking the panel that the name belongs to a server whose public page is on, so nobody can make your box request certificates for other names. Turning the page off stops new certificates; the address then shows \"Not found\". Installs from before 1.2 get this added to Caddy's configuration by the system helper the first time it starts after an update, so the hostname starts working on its own. The old file is kept as \u002Fetc\u002Fcaddy\u002FCaddyfile.before-hostnames. If it's still not working, check journalctl -u flytower-agent for \"updating the Caddyfile failed\". \u002Fs\u002F\u003Cname> on the panel's domain works either way. If you manage Caddy yourself (--no-caddy), Flytower leaves your Caddyfile alone, so add this to it: {\n    on_demand_tls {\n        ask http:\u002F\u002F127.0.0.1:3000\u002Fapi\u002Fpublic\u002Ftls-ask\n    }\n}\n\nhttps:\u002F\u002F {\n    tls {\n        on_demand\n    }\n    reverse_proxy 127.0.0.1:3000\n}",{"id":827,"title":68,"titles":828,"content":829,"level":66},"\u002Fdocs\u002Fstatus-page#web-map",[102],"When the server's web map is on and set so Anyone can open it, the page has an Open the map button once the map has been drawn. Turning the public page off makes the map private again.",{"id":831,"title":832,"titles":833,"content":834,"level":66},"\u002Fdocs\u002Fstatus-page#how-it-stays-light","How it stays light",[102],"Visitors never reach the Minecraft server. Who's online comes from the \"joined the game\" and \"left the game\" lines in the server's log, which Flytower already follows for notifications. When the panel starts, it asks the console once who's already on. Whether the server is up comes from systemd, as everywhere else in the panel. The page refreshes itself every 30 seconds while it's open in a visible tab. The panel limits each visitor to 120 requests a minute, and nothing on the page loads from other sites.",{"id":836,"title":837,"titles":838,"content":839,"level":66},"\u002Fdocs\u002Fstatus-page#what-the-page-never-shows","What the page never shows",[102],"Only what's listed above leaves the panel: no ports other than the join address, no file paths, console output, backups or settings, and no other servers. Offline-mode player names get the default Steve or Alex head.",{"id":108,"title":107,"titles":841,"content":432,"level":14},[],{"id":843,"title":107,"titles":844,"content":432,"level":14},"\u002Fdocs\u002Ftroubleshooting#troubleshooting",[],{"id":846,"title":847,"titles":848,"content":849,"level":66},"\u002Fdocs\u002Ftroubleshooting#the-panel-doesnt-load","The panel doesn't load",[107],"Check the domain points at the machine: dig +short panel.example.com. Check ports 80 and 443 are open in your provider's firewall, as well as on the machine (the installer opens them with ufw). Right after installing, Caddy may still be getting the certificate. Give it a minute after DNS resolves.",{"id":851,"title":852,"titles":853,"content":854,"level":66},"\u002Fdocs\u002Ftroubleshooting#logs","Logs",[107],"You'll need a shell on the machine: SSH (open it for a while from System, SSH), or your provider's web console. journalctl -u flytower-panel -u flytower-agent -n 200 --no-pager   # the panel and agent\njournalctl -u flytower-mc@survival -n 200 --no-pager               # one server\njournalctl -u 'flytower-update-*' --no-pager                        # updates A server's own logs are also under View logs on its Console tab, and in \u002Fsrv\u002Fflytower\u002Fservers\u002F\u003Cname>\u002Flogs.",{"id":856,"title":857,"titles":858,"content":859,"level":66},"\u002Fdocs\u002Ftroubleshooting#a-server-wont-start","A server won't start",[107],"Its Console and View logs show Minecraft's own error. The usual causes are a mod or plugin that doesn't suit the version, or a broken config file. Remove the content you added last (or restore the backup taken before it), then start it again. Out of memory: lower other servers' memory or raise this one's within the budget. If it crashed, the Console tab's banner links to the crash report, and its Crashes button has the log from just before it. After three crashes in ten minutes it's left stopped; Start tries again. See Crashes.",{"id":861,"title":862,"titles":863,"content":864,"level":66},"\u002Fdocs\u002Ftroubleshooting#ssh","SSH",[107],"The installer leaves SSH open. Once the panel works and you have a passkey, close it from System, SSH. You can open it again for a set time (15 minutes to 24 hours). It closes by itself when the time is up, even across reboots. If the panel itself is broken and SSH is closed, use your VPS provider's web console.",{"id":866,"title":867,"titles":868,"content":869,"level":66},"\u002Fdocs\u002Ftroubleshooting#backing-up-the-panel","Backing up the panel",[107],"Server backups don't include the panel's own database. To keep a copy of it (your passkeys, settings, history and off-site storage details), copy both of these somewhere safe: \u002Fvar\u002Flib\u002Fflytower\u002Fflytower.db \u002Fetc\u002Fflytower\u002Fpanel.env. It holds the app secret, which off-site storage keys are encrypted with. To restore them on a new machine: install Flytower, stop the panel (systemctl stop flytower-panel), put both files back (owned by flytower), and start it.",{"id":871,"title":872,"titles":873,"content":874,"level":66},"\u002Fdocs\u002Ftroubleshooting#where-things-are","Where things are",[107],"Path What \u002Fopt\u002Fflytower\u002Fcurrent The installed release (with its own Bun) \u002Fetc\u002Fflytower Configuration and the app secret \u002Fvar\u002Flib\u002Fflytower\u002Fflytower.db The panel's database \u002Fvar\u002Flib\u002Fflytower\u002Fbackups Backups, one folder per server \u002Fsrv\u002Fflytower\u002Fservers\u002F\u003Cname> Server folders \u002Fetc\u002Fcaddy\u002FCaddyfile HTTPS, written by the installer",{"id":876,"title":877,"titles":878,"content":879,"level":66},"\u002Fdocs\u002Ftroubleshooting#reporting-a-problem","Reporting a problem",[107],"Open an issue on GitHub, with what you did, what happened, and the logs above if you can. html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":113,"title":112,"titles":881,"content":432,"level":14},[],{"id":883,"title":112,"titles":884,"content":432,"level":14},"\u002Fdocs\u002Fupdating#updating-flytower",[],{"id":886,"title":887,"titles":888,"content":889,"level":66},"\u002Fdocs\u002Fupdating#from-the-panel","From the panel",[112],"System, Updates shows the version you're on and offers any newer release, with its notes. Update asks for your passkey, then: downloads the release and checks its signature against Flytower's release key; copies the panel's database aside, into \u002Fvar\u002Flib\u002Fflytower-agent\u002Fdb-backups, which only root can read. If the copy can't be made (a full disk, say), the update stops there and your database is left exactly as it was; switches to the new version and restarts the panel and agent. Your Minecraft servers keep running throughout; checks the new panel starts and answers. If it doesn't, Flytower puts the previous version and the database back by itself, and the card says what went wrong. The panel is away for a minute or so. Go back to the previous version is offered afterwards in the same way. Both show up in Activity. One update runs at a time: while one is downloading or switching, another update, a Go back to or a clean-up of old releases is refused until it's done. The system helper only installs releases newer than the one running. To go back, use Go back to, which offers the releases still on the machine.",{"id":891,"title":892,"titles":893,"content":894,"level":66},"\u002Fdocs\u002Fupdating#stable-or-beta","Stable or Beta",[112],"The Update channel on the same card chooses what you're offered: Stable (the default): finished releases only. Beta: betas too, such as 1.1.0-beta.1, so you can try new features before they're released. They're signed and tested like any release, but may have rough edges. Take a backup of anything you care about first. Changing the channel doesn't install anything, and shows up in Activity. A beta is marked Beta when it's offered. Choosing Stable again while you're running a beta doesn't take you backwards: you're offered the next stable release that's newer than your beta (1.1.0 comes after 1.1.0-beta.3). To leave a beta sooner, Go back to the version you had before. If you install a beta with the installer and never choose a channel, Flytower assumes Beta.",{"id":896,"title":897,"titles":898,"content":899,"level":66},"\u002Fdocs\u002Fupdating#native-builds","Native builds",[112],"The Native channel is for trying Flytower with parts rewritten in Rust and Go, such as the system helper. These builds are made from the same code as the release they go with. Each one is numbered after the release it goes with, plus a counter: 1.2.0-beta.2.native.1 goes with 1.2.0-beta.2, and 1.2.0-native.1 goes with 1.2.0. Beta and Stable never offer them, and Native offers only them, so a native install stays native until you choose another channel. Use native builds on a test server. Leaving them means using Go back to for a version you had before, or reinstalling. To start on one, install with --native, or choose Native under System, Updates. From 1.4.0, the system helper and the updater are the Rust versions on every channel (1.3 carried them switched off). The Bun versions are still in each release: if the Rust helper fails to start, Flytower starts the Bun one by itself and says so in journalctl -u flytower-agent. To use Bun on purpose, run echo bun > \u002Fetc\u002Fflytower\u002Fagent as root and restart flytower-agent. Delete that file and restart again to go back. After a fallback, the box stays on Bun until it reboots or updates; to try Rust again sooner, delete \u002Frun\u002Fflytower\u002Fagent-rust-starting and restart flytower-agent.",{"id":901,"title":902,"titles":903,"content":904,"level":66},"\u002Fdocs\u002Fupdating#releases-are-signed","Releases are signed",[112],"Each release's SHA256SUMS is signed with Flytower's Ed25519 release key. The installer and the updater both check the signature before installing anything, using the public key built into them. A download that doesn't match is refused.",{"id":906,"title":907,"titles":908,"content":909,"level":66},"\u002Fdocs\u002Fupdating#re-running-the-installer","Re-running the installer",[112],"Running the installer again keeps your data, settings and app secret. On a box that already has Flytower it also keeps the installed version, so a beta, native or test box stays as it is. Use it if the panel won't start at all, or for a new setup token: curl -fsSL https:\u002F\u002Fgithub.com\u002FMattA-Official\u002Fmc-panel\u002Freleases\u002Flatest\u002Fdownload\u002Finstall.sh \\\n  | sudo bash -s -- --domain panel.example.com To change version with it, add --version \u003Cx.y.z>, --version latest (the newest stable release), --beta or --native. Installs from before 0.5.0, which had no updater, upgrade this way with --version latest. If the version you pick is older than the one installed, the installer saves a copy of the panel's database in \u002Fvar\u002Flib\u002Fflytower-agent\u002Fdb-backups\u002F before switching, since older code may not understand newer data. Every release is tested upgrading from each earlier one, including the database, before it's published.",{"id":911,"title":912,"titles":913,"content":914,"level":66},"\u002Fdocs\u002Fupdating#minecraft-and-java","Minecraft and Java",[112],"Flytower updates itself, not your servers. Minecraft versions change only when you choose (Settings, Version), and mods and plugins only when you update them. See Content. Java is installed per server as each Minecraft version needs it.",{"id":916,"title":917,"titles":918,"content":919,"level":66},"\u002Fdocs\u002Fupdating#update-badges","Update badges",[112],"Flytower looks for updates in the background, so you don't have to remember to press Check now. It never installs anything by itself; it only tells you. What Where it shows Compared with Flytower A count on System in the sidebar and on Updates; a banner on System The newest release on your update channel Mods, plugins, datapacks A count on the server's card and on its Content tab Newer builds for the server's Minecraft version, the same as the Content tab Minecraft A note on the Content tab The newest release the loader supports, and whether everything installed has a build for it Java System, Updates, under Java Adoptium's newest Temurin build for the same Java version When. Every six hours, at a minute and hour picked when the panel starts, so installs don't all ask Modrinth and GitHub at once. Opening the panel checks again if the last check is over an hour old, and Check now on System, Updates checks everything straight away. Badges update by themselves in open tabs as results arrive. A newer Minecraft is only mentioned. Upgrading a world can't be undone without a backup, so Flytower never notifies about it or offers it as an update. The Content tab says when one is out, and either that everything installed is ready for it, or which items don't have a build yet (and, if there is one, the newest version that everything is ready for). Change version from Settings, Version when you're ready. When a check fails, for example because Modrinth or GitHub is down, the last good result and its badge stay, and a quiet line says the check failed. Nothing is sent to notification channels, and the next good check clears the message. Notifications. The same check feeds the A new version of Flytower is out and Updates for installed mods, plugins or datapacks notifications: one message per new version, not one per check. See Notifications. Java shows each Java version Flytower has installed, which servers use it, and whether Adoptium has a newer build. Installing the newer build from the panel isn't there yet; until then servers keep running on the build they have.",{"id":921,"title":922,"titles":923,"content":924,"level":66},"\u002Fdocs\u002Fupdating#publishing-a-beta","Publishing a beta",[112],"For maintainers: run the Release workflow with a version like 1.1.0-beta.1. Any version with a -suffix is published as a GitHub pre-release, which only Beta installs are offered. Number betas beta.1, beta.2 and so on; beta.10 correctly comes after beta.9.",{"id":926,"title":927,"titles":928,"content":929,"level":66},"\u002Fdocs\u002Fupdating#publishing-a-native-build","Publishing a native build",[112],"For maintainers: run the Release workflow on main (or the ref of the release it goes with) with that release's version plus .native.N, such as 1.3.0-beta.1.native.1. For a stable release, use -native.N, such as 1.3.0-native.1. Native builds are published alongside each release, and in between when native work is worth trying. They're tagged native-\u003Cversion> rather than v…, because Beta panels offer every v-tagged pre-release and older panels never look at other tags. Write the summary in .github\u002Frelease-notes\u002F\u003Cversion>.md as usual. html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":931,"title":93,"body":932,"description":687,"extension":2406,"meta":2407,"navigation":2408,"order":96,"panelRoute":2409,"path":94,"section":24,"seo":2412,"since":2413,"stem":95,"__hash__":2414},"docs\u002Fdocs\u002Fspec.md",{"type":933,"value":934,"toc":2386},"minimark",[935,939,969,977,981,1383,1386,1393,1395,1400,1402,1407,1475,1478,1482,1496,1500,1502,1506,1519,1523,1530,1580,1625,1657,1671,1675,1678,1791,1796,1800,1803,1894,1898,1901,1933,1937,1945,2073,2170,2174,2179,2232,2260,2264,2276,2280,2290,2370,2376,2379,2382],[936,937,93],"h1",{"id":938},"server-yaml-reference",[940,941,942,943,947,948,951,952,955,956,951,959,962,963,968],"p",{},"Every server can be written as one YAML document, its ",[944,945,946],"strong",{},"spec",". ",[944,949,950],{},"Settings",", ",[944,953,954],{},"YAML"," shows a server's spec and lets you edit it. ",[944,957,958],{},"New server",[944,960,961],{},"From YAML"," makes a server from one. Changes go through a ",[964,965,967],"a",{"href":966},"first-server#plans","plan"," like any other.",[940,970,971,972,976],{},"The first line points editors at the schema (",[973,974,975],"code",{},"\u002Fschema\u002Fserver-v1.json"," on your panel). In VS Code with the YAML extension, that gives you autocomplete and checking.",[978,979,694],"h2",{"id":980},"example",[982,983,987],"pre",{"className":984,"code":985,"language":986,"meta":432,"style":432},"language-yaml shiki shiki-themes material-theme-lighter github-light github-dark","# yaml-language-server: $schema=https:\u002F\u002Fpanel.example.com\u002Fschema\u002Fserver-v1.json\nname: survival\ndisplayName: Weekend Survival\nloader:\n  type: fabric\n  minecraft: '26.3'\nmemory: 6G\nport: 25566\nhostname: survival.example.com\nproperties:\n  motd: Welcome back\n  difficulty: normal\n  max-players: 30\n  view-distance: 12\ncontent:\n  - modrinth: lithium\n  - modrinth: chunky\n  - vanillatweaks: Survival\u002Fmultiplayer sleep\n  - url: https:\u002F\u002Fexample.com\u002Fmy-datapack.zip\n    sha256: 0f343b0931126a20f133d67c2b018a3b5f0c6d0e7c5c1f2a2b1e5c8d9f7a6b5c\n    kind: datapack\nbackups:\n  schedule: '0 4 * * *'\n  timezone: Europe\u002FLondon\n  keep: { last: 6, daily: 7, weekly: 4 }\n  offsite: B2\ntimezone: Europe\u002FLondon\nschedules:\n  - restart: '0 5 * * *'\n  - command: save-all\n    cron: '*\u002F30 * * * *'\n  - announce: 'The server restarts at 5am'\n    cron: '0 22 * * *'\n","yaml",[973,988,989,997,1011,1020,1028,1038,1055,1065,1076,1086,1092,1102,1112,1122,1132,1138,1151,1162,1174,1186,1196,1206,1212,1226,1237,1280,1291,1300,1307,1324,1337,1352,1369],{"__ignoreMap":432},[990,991,993],"span",{"class":992,"line":14},"line",[990,994,996],{"class":995},"sutJx","# yaml-language-server: $schema=https:\u002F\u002Fpanel.example.com\u002Fschema\u002Fserver-v1.json\n",[990,998,999,1003,1007],{"class":992,"line":66},[990,1000,1002],{"class":1001},"sQzsp","name",[990,1004,1006],{"class":1005},"sP7_E",":",[990,1008,1010],{"class":1009},"s_sjI"," survival\n",[990,1012,1013,1015,1017],{"class":992,"line":61},[990,1014,708],{"class":1001},[990,1016,1006],{"class":1005},[990,1018,1019],{"class":1009}," Weekend Survival\n",[990,1021,1022,1025],{"class":992,"line":19},[990,1023,1024],{"class":1001},"loader",[990,1026,1027],{"class":1005},":\n",[990,1029,1030,1033,1035],{"class":992,"line":81},[990,1031,1032],{"class":1001},"  type",[990,1034,1006],{"class":1005},[990,1036,1037],{"class":1009}," fabric\n",[990,1039,1040,1043,1045,1049,1052],{"class":992,"line":91},[990,1041,1042],{"class":1001},"  minecraft",[990,1044,1006],{"class":1005},[990,1046,1048],{"class":1047},"sjJ54"," '",[990,1050,1051],{"class":1009},"26.3",[990,1053,1054],{"class":1047},"'\n",[990,1056,1058,1060,1062],{"class":992,"line":1057},7,[990,1059,718],{"class":1001},[990,1061,1006],{"class":1005},[990,1063,1064],{"class":1009}," 6G\n",[990,1066,1068,1070,1072],{"class":992,"line":1067},8,[990,1069,723],{"class":1001},[990,1071,1006],{"class":1005},[990,1073,1075],{"class":1074},"srdBf"," 25566\n",[990,1077,1079,1081,1083],{"class":992,"line":1078},9,[990,1080,728],{"class":1001},[990,1082,1006],{"class":1005},[990,1084,1085],{"class":1009}," survival.example.com\n",[990,1087,1088,1090],{"class":992,"line":41},[990,1089,733],{"class":1001},[990,1091,1027],{"class":1005},[990,1093,1094,1097,1099],{"class":992,"line":30},[990,1095,1096],{"class":1001},"  motd",[990,1098,1006],{"class":1005},[990,1100,1101],{"class":1009}," Welcome back\n",[990,1103,1104,1107,1109],{"class":992,"line":25},[990,1105,1106],{"class":1001},"  difficulty",[990,1108,1006],{"class":1005},[990,1110,1111],{"class":1009}," normal\n",[990,1113,1114,1117,1119],{"class":992,"line":105},[990,1115,1116],{"class":1001},"  max-players",[990,1118,1006],{"class":1005},[990,1120,1121],{"class":1074}," 30\n",[990,1123,1124,1127,1129],{"class":992,"line":86},[990,1125,1126],{"class":1001},"  view-distance",[990,1128,1006],{"class":1005},[990,1130,1131],{"class":1074}," 12\n",[990,1133,1134,1136],{"class":992,"line":46},[990,1135,738],{"class":1001},[990,1137,1027],{"class":1005},[990,1139,1140,1143,1146,1148],{"class":992,"line":76},[990,1141,1142],{"class":1005},"  -",[990,1144,1145],{"class":1001}," modrinth",[990,1147,1006],{"class":1005},[990,1149,1150],{"class":1009}," lithium\n",[990,1152,1153,1155,1157,1159],{"class":992,"line":96},[990,1154,1142],{"class":1005},[990,1156,1145],{"class":1001},[990,1158,1006],{"class":1005},[990,1160,1161],{"class":1009}," chunky\n",[990,1163,1164,1166,1169,1171],{"class":992,"line":51},[990,1165,1142],{"class":1005},[990,1167,1168],{"class":1001}," vanillatweaks",[990,1170,1006],{"class":1005},[990,1172,1173],{"class":1009}," Survival\u002Fmultiplayer sleep\n",[990,1175,1176,1178,1181,1183],{"class":992,"line":71},[990,1177,1142],{"class":1005},[990,1179,1180],{"class":1001}," url",[990,1182,1006],{"class":1005},[990,1184,1185],{"class":1009}," https:\u002F\u002Fexample.com\u002Fmy-datapack.zip\n",[990,1187,1188,1191,1193],{"class":992,"line":36},[990,1189,1190],{"class":1001},"    sha256",[990,1192,1006],{"class":1005},[990,1194,1195],{"class":1009}," 0f343b0931126a20f133d67c2b018a3b5f0c6d0e7c5c1f2a2b1e5c8d9f7a6b5c\n",[990,1197,1198,1201,1203],{"class":992,"line":56},[990,1199,1200],{"class":1001},"    kind",[990,1202,1006],{"class":1005},[990,1204,1205],{"class":1009}," datapack\n",[990,1207,1208,1210],{"class":992,"line":115},[990,1209,743],{"class":1001},[990,1211,1027],{"class":1005},[990,1213,1214,1217,1219,1221,1224],{"class":992,"line":110},[990,1215,1216],{"class":1001},"  schedule",[990,1218,1006],{"class":1005},[990,1220,1048],{"class":1047},[990,1222,1223],{"class":1009},"0 4 * * *",[990,1225,1054],{"class":1047},[990,1227,1229,1232,1234],{"class":992,"line":1228},24,[990,1230,1231],{"class":1001},"  timezone",[990,1233,1006],{"class":1005},[990,1235,1236],{"class":1009}," Europe\u002FLondon\n",[990,1238,1240,1243,1245,1248,1251,1253,1256,1259,1262,1264,1267,1269,1272,1274,1277],{"class":992,"line":1239},25,[990,1241,1242],{"class":1001},"  keep",[990,1244,1006],{"class":1005},[990,1246,1247],{"class":1005}," {",[990,1249,1250],{"class":1001}," last",[990,1252,1006],{"class":1005},[990,1254,1255],{"class":1074}," 6",[990,1257,1258],{"class":1005},",",[990,1260,1261],{"class":1001}," daily",[990,1263,1006],{"class":1005},[990,1265,1266],{"class":1074}," 7",[990,1268,1258],{"class":1005},[990,1270,1271],{"class":1001}," weekly",[990,1273,1006],{"class":1005},[990,1275,1276],{"class":1074}," 4",[990,1278,1279],{"class":1005}," }\n",[990,1281,1283,1286,1288],{"class":992,"line":1282},26,[990,1284,1285],{"class":1001},"  offsite",[990,1287,1006],{"class":1005},[990,1289,1290],{"class":1009}," B2\n",[990,1292,1294,1296,1298],{"class":992,"line":1293},27,[990,1295,763],{"class":1001},[990,1297,1006],{"class":1005},[990,1299,1236],{"class":1009},[990,1301,1303,1305],{"class":992,"line":1302},28,[990,1304,768],{"class":1001},[990,1306,1027],{"class":1005},[990,1308,1310,1312,1315,1317,1319,1322],{"class":992,"line":1309},29,[990,1311,1142],{"class":1005},[990,1313,1314],{"class":1001}," restart",[990,1316,1006],{"class":1005},[990,1318,1048],{"class":1047},[990,1320,1321],{"class":1009},"0 5 * * *",[990,1323,1054],{"class":1047},[990,1325,1327,1329,1332,1334],{"class":992,"line":1326},30,[990,1328,1142],{"class":1005},[990,1330,1331],{"class":1001}," command",[990,1333,1006],{"class":1005},[990,1335,1336],{"class":1009}," save-all\n",[990,1338,1340,1343,1345,1347,1350],{"class":992,"line":1339},31,[990,1341,1342],{"class":1001},"    cron",[990,1344,1006],{"class":1005},[990,1346,1048],{"class":1047},[990,1348,1349],{"class":1009},"*\u002F30 * * * *",[990,1351,1054],{"class":1047},[990,1353,1355,1357,1360,1362,1364,1367],{"class":992,"line":1354},32,[990,1356,1142],{"class":1005},[990,1358,1359],{"class":1001}," announce",[990,1361,1006],{"class":1005},[990,1363,1048],{"class":1047},[990,1365,1366],{"class":1009},"The server restarts at 5am",[990,1368,1054],{"class":1047},[990,1370,1372,1374,1376,1378,1381],{"class":992,"line":1371},33,[990,1373,1342],{"class":1001},[990,1375,1006],{"class":1005},[990,1377,1048],{"class":1047},[990,1379,1380],{"class":1009},"0 22 * * *",[990,1382,1054],{"class":1047},[978,1384,699],{"id":1385},"fields",[1387,1388,1390,1392],"h3",{"id":1389},"name-required",[973,1391,1002],{}," (required)",[940,1394,705],{},[1387,1396,1398],{"id":1397},"displayname",[973,1399,708],{},[940,1401,710],{},[1387,1403,1405,1392],{"id":1404},"loader-required",[973,1406,1024],{},[1408,1409,1410,1423],"table",{},[1411,1412,1413],"thead",{},[1414,1415,1416,1420],"tr",{},[1417,1418,1419],"th",{},"Field",[1417,1421,1422],{},"Meaning",[1424,1425,1426,1447,1465],"tbody",{},[1414,1427,1428,1434],{},[1429,1430,1431],"td",{},[973,1432,1433],{},"type",[1429,1435,1436,951,1439,1442,1443,1446],{},[973,1437,1438],{},"vanilla",[973,1440,1441],{},"fabric"," or ",[973,1444,1445],{},"paper",".",[1414,1448,1449,1454],{},[1429,1450,1451],{},[973,1452,1453],{},"minecraft",[1429,1455,1456,1457,1460,1461,1464],{},"The Minecraft version, ",[944,1458,1459],{},"in quotes"," (unquoted, YAML reads ",[973,1462,1463],{},"1.20"," as the number 1.2).",[1414,1466,1467,1472],{},[1429,1468,1469],{},[973,1470,1471],{},"version",[1429,1473,1474],{},"The Fabric loader version or Paper build number. Leave it out for the newest stable one when the plan runs.",[940,1476,1477],{},"Changing the version or loader goes through a plan that takes a backup first. Going back to an older Minecraft version is refused, because worlds can't be downgraded. Restore a backup instead.",[1387,1479,1480],{"id":718},[973,1481,718],{},[940,1483,1484,1485,1442,1488,1491,1492,1446],{},"Memory for Java, like ",[973,1486,1487],{},"4G",[973,1489,1490],{},"3584M",", between 1G and 64G. It must fit the machine's ",[964,1493,1495],{"href":1494},"first-server#memory-budget","memory budget",[1387,1497,1498],{"id":723},[973,1499,723],{},[940,1501,725],{},[1387,1503,1504],{"id":728},[973,1505,728],{},[940,1507,1508,1509,947,1512,1515,1516,1446],{},"The address players use, such as ",[973,1510,1511],{},"survival.example.com",[973,1513,1514],{},"null"," clears it; left out, it stays as it is. See ",[964,1517,21],{"href":1518},"addresses",[1387,1520,1521],{"id":733},[973,1522,733],{},[940,1524,1525,1526,1529],{},"Values for ",[973,1527,1528],{},"server.properties",": strings, numbers or booleans. Anything left out keeps its current value. Values equal to Minecraft's defaults are left out when Flytower writes a spec. Some keys can't be set here:",[1531,1532,1533,1549],"ul",{},[1534,1535,1536,951,1539,1542,1543,1546,1547,1446],"li",{},[973,1537,1538],{},"server-port",[973,1540,1541],{},"enable-rcon"," and ",[973,1544,1545],{},"rcon.port"," are managed by Flytower. Set the port with ",[973,1548,723],{},[1534,1550,1551,1552,951,1555,1558,1559,1442,1562,1565,1566,1442,1569,1572,1573,1575,1576,1579],{},"Secrets are hidden: ",[973,1553,1554],{},"rcon.password",[973,1556,1557],{},"management-server-secret",", and any other key ending in ",[973,1560,1561],{},"secret",[973,1563,1564],{},"password"," (such as ",[973,1567,1568],{},"-secret",[973,1570,1571],{},".password","). They're never written into a spec or shown in the Settings form, and editing other properties or applying a spec keeps whatever secret is on disk. A cloned server gets fresh secrets of its own. To change one by hand, edit ",[973,1574,1528],{}," in the ",[944,1577,1578],{},"Files"," tab.",[940,1581,1582,1585,1586,1589,1590,1593,1594,951,1597,1600,1601,1604,1605,1608,1609,1612,1613,1616,1617,1620,1621,1624],{},[973,1583,1584],{},"motd"," is the message of the day, shown under the server in the multiplayer list. It can have two lines and Minecraft's ",[973,1587,1588],{},"§"," formatting codes: colours ",[973,1591,1592],{},"§0"," to ",[973,1595,1596],{},"§f",[973,1598,1599],{},"§l"," bold, ",[973,1602,1603],{},"§o"," italic, ",[973,1606,1607],{},"§n"," underline, ",[973,1610,1611],{},"§m"," strikethrough, ",[973,1614,1615],{},"§k"," obfuscated and ",[973,1618,1619],{},"§r"," to reset. In YAML, use double quotes so ",[973,1622,1623],{},"\\n"," starts the second line:",[982,1626,1628],{"className":984,"code":1627,"language":986,"meta":432,"style":432},"properties:\n  motd: \"§6§lNew Theatre §r§7Survival\\n§bOpen to members\"\n",[973,1629,1630,1636],{"__ignoreMap":432},[990,1631,1632,1634],{"class":992,"line":14},[990,1633,733],{"class":1001},[990,1635,1027],{"class":1005},[990,1637,1638,1640,1642,1645,1648,1651,1654],{"class":992,"line":66},[990,1639,1096],{"class":1001},[990,1641,1006],{"class":1005},[990,1643,1644],{"class":1047}," \"",[990,1646,1647],{"class":1009},"§6§lNew Theatre §r§7Survival",[990,1649,1623],{"class":1650},"s_hVV",[990,1652,1653],{"class":1009},"§bOpen to members",[990,1655,1656],{"class":1047},"\"\n",[940,1658,1659,1660,951,1662,951,1665,1668,1669,1446],{},"The editor in ",[944,1661,950],{},[944,1663,1664],{},"General",[944,1666,1667],{},"Game settings"," writes the same string, so you rarely need to type codes by hand. Hex colours aren't supported, because vanilla only reads the 16 colours from ",[973,1670,1528],{},[1387,1672,1673],{"id":738},[973,1674,738],{},[940,1676,1677],{},"The full list of what the server runs. Anything installed through Flytower that isn't listed is removed. Dependencies don't need listing. Each item is one of:",[1408,1679,1680,1689],{},[1411,1681,1682],{},[1414,1683,1684,1687],{},[1417,1685,1686],{},"Item",[1417,1688,699],{},[1424,1690,1691,1719,1739,1760],{},[1414,1692,1693,1696],{},[1429,1694,1695],{},"Modrinth",[1429,1697,1698,1701,1702,1704,1705,1708,1709,951,1712,1442,1715,1718],{},[973,1699,1700],{},"modrinth",": project slug or id. ",[973,1703,1471],{},": a version number or id (newest compatible if left out). ",[973,1706,1707],{},"kind",": ",[973,1710,1711],{},"mod",[973,1713,1714],{},"plugin",[973,1716,1717],{},"datapack",", rarely needed.",[1414,1720,1721,1724],{},[1429,1722,1723],{},"Hangar",[1429,1725,1726,1708,1729,1442,1732,1735,1736,1738],{},[973,1727,1728],{},"hangar",[973,1730,1731],{},"slug",[973,1733,1734],{},"owner\u002Fslug"," (Paper only). ",[973,1737,1471],{},": a version name (newest compatible if left out).",[1414,1740,1741,1744],{},[1429,1742,1743],{},"Vanilla Tweaks",[1429,1745,1746,1708,1749,1752,1753,1708,1756,1759],{},[973,1747,1748],{},"vanillatweaks",[973,1750,1751],{},"\"Category\u002Fpack name\"",", as on their site. ",[973,1754,1755],{},"tweak",[973,1757,1758],{},"crafting"," for a crafting tweak; datapack otherwise.",[1414,1761,1762,1765],{},[1429,1763,1764],{},"A link",[1429,1766,1767,1770,1771,1774,1775,1778,1779,1708,1781,951,1783,1442,1785,947,1787,1790],{},[973,1768,1769],{},"url",": an ",[973,1772,1773],{},"https"," link. ",[973,1776,1777],{},"sha256",": the file's hash; it's refused if it doesn't match. ",[973,1780,1707],{},[973,1782,1711],{},[973,1784,1714],{},[973,1786,1717],{},[973,1788,1789],{},"filename",": optional.",[940,1792,1793,1794,1446],{},"See ",[964,1795,38],{"href":738},[1387,1797,1798],{"id":743},[973,1799,743],{},[940,1801,1802],{},"Left out entirely, a server's backup settings stay as they are. When present:",[1408,1804,1805,1813],{},[1411,1806,1807],{},[1414,1808,1809,1811],{},[1417,1810,1419],{},[1417,1812,1422],{},[1424,1814,1815,1832,1845,1869],{},[1414,1816,1817,1822],{},[1429,1818,1819],{},[973,1820,1821],{},"schedule",[1429,1823,1824,1825,1828,1829,1831],{},"A cron expression (minute hour day month weekday), such as ",[973,1826,1827],{},"'0 4 * * *'"," for 4am daily, or ",[973,1830,1514],{}," for no schedule.",[1414,1833,1834,1838],{},[1429,1835,1836],{},[973,1837,763],{},[1429,1839,1840,1841,1844],{},"The time zone the schedule runs in, such as ",[973,1842,1843],{},"Europe\u002FLondon",". Defaults to UTC.",[1414,1846,1847,1852],{},[1429,1848,1849],{},[973,1850,1851],{},"keep",[1429,1853,1854,1857,1858,1861,1862,1865,1866,1446],{},[973,1855,1856],{},"last"," (default 6), ",[973,1859,1860],{},"daily"," (7) and ",[973,1863,1864],{},"weekly"," (4): how many scheduled backups to keep. See ",[964,1867,27],{"href":1868},"backups#how-many-are-kept",[1414,1870,1871,1876],{},[1429,1872,1873],{},[973,1874,1875],{},"offsite",[1429,1877,1878,1879,1883,1884,951,1887,1890,1891,1893],{},"The name of ",[964,1880,1882],{"href":1881},"backups#off-site-copies","off-site storage"," from ",[944,1885,1886],{},"System",[944,1888,1889],{},"Off-site storage",", or ",[973,1892,1514],{}," for none. Left out, it stays.",[1387,1895,1896],{"id":748},[973,1897,748],{},[940,1899,1900],{},"What Flytower does when the server gets stuck. Left out, the current setting stays.",[1408,1902,1903,1911],{},[1411,1904,1905],{},[1414,1906,1907,1909],{},[1417,1908,1419],{},[1417,1910,1422],{},[1424,1912,1913],{},[1414,1914,1915,1920],{},[1429,1916,1917],{},[973,1918,1919],{},"restartWhenUnresponsive",[1429,1921,1922,1925,1926,1929,1930,1446],{},[973,1923,1924],{},"true"," to restart the server once when its console hasn't answered for five minutes. Defaults to ",[973,1927,1928],{},"false",". See ",[964,1931,43],{"href":1932},"crashes#not-responding",[1387,1934,1935],{"id":753},[973,1936,753],{},[940,1938,1939,1940,1944],{},"The server's ",[964,1941,1943],{"href":1942},"status-page","public status page",". Left out, the current settings stay.",[1408,1946,1947,1955],{},[1411,1948,1949],{},[1414,1950,1951,1953],{},[1417,1952,1419],{},[1417,1954,1422],{},[1424,1956,1957,1975,1985,2006,2020,2038,2057],{},[1414,1958,1959,1964],{},[1429,1960,1961],{},[973,1962,1963],{},"enabled",[1429,1965,1966,1968,1969,1972,1973,1446],{},[973,1967,1924],{}," to turn the page on at ",[973,1970,1971],{},"\u002Fs\u002F\u003Cname>",". Defaults to ",[973,1974,1928],{},[1414,1976,1977,1982],{},[1429,1978,1979],{},[973,1980,1981],{},"description",[1429,1983,1984],{},"A few lines about the server, up to 500 characters, shown as plain text with line breaks.",[1414,1986,1987,1992],{},[1429,1988,1989],{},[973,1990,1991],{},"show.players",[1429,1993,1994,1997,1998,2001,2002,2005],{},[973,1995,1996],{},"count"," (the default) shows how many are online, ",[973,1999,2000],{},"names"," shows their heads and names, ",[973,2003,2004],{},"none"," shows nothing.",[1414,2007,2008,2013],{},[1429,2009,2010],{},[973,2011,2012],{},"show.version",[1429,2014,2015,2017,2018,1446],{},[973,2016,1928],{}," to hide the Minecraft version and loader. Defaults to ",[973,2019,1924],{},[1414,2021,2022,2027],{},[1429,2023,2024],{},[973,2025,2026],{},"show.leaderboard",[1429,2028,2029,2031,2032,2035,2036,1446],{},[973,2030,1924],{}," to show the player stats leaderboards. Needs ",[973,2033,2034],{},"show.players: names"," and stats on. Defaults to ",[973,2037,1928],{},[1414,2039,2040,2045],{},[1429,2041,2042],{},[973,2043,2044],{},"pack.enabled",[1429,2046,2047,2049,2050,1972,2054,2056],{},[973,2048,1928],{}," to stop offering the players' ",[964,2051,2053],{"href":2052},"status-page#modpack-for-players","modpack",[973,2055,1924],{},"; Fabric only.",[1414,2058,2059,2064],{},[1429,2060,2061],{},[973,2062,2063],{},"pack.extras",[1429,2065,2066,2067,2070,2071,1446],{},"Client-only extras for the modpack: a list of ",[973,2068,2069],{},"modrinth: \u003Cslug>",", each with an optional exact ",[973,2072,1471],{},[982,2074,2076],{"className":984,"code":2075,"language":986,"meta":432,"style":432},"public:\n  enabled: true\n  description: |\n    Survival for New Theatre members.\n    Season 3 started in September.\n  show:\n    players: names\n  pack:\n    extras:\n      - modrinth: iris\n      - modrinth: complementary-reimagined\n",[973,2077,2078,2084,2095,2106,2111,2116,2123,2133,2140,2147,2159],{"__ignoreMap":432},[990,2079,2080,2082],{"class":992,"line":14},[990,2081,753],{"class":1001},[990,2083,1027],{"class":1005},[990,2085,2086,2089,2091],{"class":992,"line":66},[990,2087,2088],{"class":1001},"  enabled",[990,2090,1006],{"class":1005},[990,2092,2094],{"class":2093},"syTEX"," true\n",[990,2096,2097,2100,2102],{"class":992,"line":61},[990,2098,2099],{"class":1001},"  description",[990,2101,1006],{"class":1005},[990,2103,2105],{"class":2104},"sVHd0"," |\n",[990,2107,2108],{"class":992,"line":19},[990,2109,2110],{"class":1009},"    Survival for New Theatre members.\n",[990,2112,2113],{"class":992,"line":81},[990,2114,2115],{"class":1009},"    Season 3 started in September.\n",[990,2117,2118,2121],{"class":992,"line":91},[990,2119,2120],{"class":1001},"  show",[990,2122,1027],{"class":1005},[990,2124,2125,2128,2130],{"class":992,"line":1057},[990,2126,2127],{"class":1001},"    players",[990,2129,1006],{"class":1005},[990,2131,2132],{"class":1009}," names\n",[990,2134,2135,2138],{"class":992,"line":1067},[990,2136,2137],{"class":1001},"  pack",[990,2139,1027],{"class":1005},[990,2141,2142,2145],{"class":992,"line":1078},[990,2143,2144],{"class":1001},"    extras",[990,2146,1027],{"class":1005},[990,2148,2149,2152,2154,2156],{"class":992,"line":41},[990,2150,2151],{"class":1005},"      -",[990,2153,1145],{"class":1001},[990,2155,1006],{"class":1005},[990,2157,2158],{"class":1009}," iris\n",[990,2160,2161,2163,2165,2167],{"class":992,"line":30},[990,2162,2151],{"class":1005},[990,2164,1145],{"class":1001},[990,2166,1006],{"class":1005},[990,2168,2169],{"class":1009}," complementary-reimagined\n",[1387,2171,2172],{"id":758},[973,2173,758],{},[940,2175,1939,2176,1944],{},[964,2177,2178],{"href":758},"web map",[1408,2180,2181,2189],{},[1411,2182,2183],{},[1414,2184,2185,2187],{},[1417,2186,1419],{},[1417,2188,1422],{},[1424,2190,2191,2204,2218],{},[1414,2192,2193,2197],{},[1429,2194,2195],{},[973,2196,1963],{},[1429,2198,2199,2201,2202,1446],{},[973,2200,1924],{}," to draw a web map of the world. Defaults to ",[973,2203,1928],{},[1414,2205,2206,2210],{},[1429,2207,2208],{},[973,2209,753],{},[1429,2211,2212,2214,2215,2217],{},[973,2213,1924],{}," to let anyone open the map without signing in. Needs the public page on. Defaults to ",[973,2216,1928],{},": only people who can see the server can.",[1414,2219,2220,2225],{},[1429,2221,2222],{},[973,2223,2224],{},"players",[1429,2226,2227,2229,2230,1446],{},[973,2228,1928],{}," to hide where players are. Defaults to ",[973,2231,1924],{},[982,2233,2235],{"className":984,"code":2234,"language":986,"meta":432,"style":432},"map:\n  enabled: true\n  public: true\n",[973,2236,2237,2243,2251],{"__ignoreMap":432},[990,2238,2239,2241],{"class":992,"line":14},[990,2240,758],{"class":1001},[990,2242,1027],{"class":1005},[990,2244,2245,2247,2249],{"class":992,"line":66},[990,2246,2088],{"class":1001},[990,2248,1006],{"class":1005},[990,2250,2094],{"class":2093},[990,2252,2253,2256,2258],{"class":992,"line":61},[990,2254,2255],{"class":1001},"  public",[990,2257,1006],{"class":1005},[990,2259,2094],{"class":2093},[1387,2261,2262],{"id":763},[973,2263,763],{},[940,2265,2266,2267,2270,2271,2273,2274,1446],{},"The time zone the server's ",[964,2268,2269],{"href":768},"scheduled tasks"," run in, such as ",[973,2272,1843],{},". Left out, it stays (UTC to begin with). Backups have their own, under ",[973,2275,743],{},[1387,2277,2278],{"id":768},[973,2279,768],{},[940,2281,2282,2283,2285,2286,2289],{},"Restarts, console commands and announcements the server runs by itself. See ",[964,2284,83],{"href":768},". When present, the whole list is replaced (tasks that haven't changed keep their last run). Left out, the current tasks stay; write ",[973,2287,2288],{},"schedules: []"," to remove them all. Each item is one of:",[1408,2291,2292,2300],{},[1411,2293,2294],{},[1414,2295,2296,2298],{},[1417,2297,1686],{},[1417,2299,1422],{},[1424,2301,2302,2335,2355],{},[1414,2303,2304,2309],{},[1429,2305,2306],{},[973,2307,2308],{},"restart: '0 5 * * *'",[1429,2310,2311,2312,2315,2316,2319,2320,2323,2324,2327,2328,2331,2332,2334],{},"Restart at these times. ",[973,2313,2314],{},"warn"," lists when to warn players beforehand, like ",[973,2317,2318],{},"[15m, 5m, 1m, 10s]"," (the default), up to ",[973,2321,2322],{},"2h","; ",[973,2325,2326],{},"[]"," for none. ",[973,2329,2330],{},"skipWarningsWhenEmpty"," (default ",[973,2333,1924],{},") restarts straight away when nobody is online.",[1414,2336,2337,2348],{},[1429,2338,2339,2342,2345],{},[973,2340,2341],{},"command: save-all",[2343,2344],"br",{},[973,2346,2347],{},"cron: '*\u002F30 * * * *'",[1429,2349,2350,2351,2354],{},"Run a console command, without the slash. It can't be ",[973,2352,2353],{},"stop","; use a restart instead.",[1414,2356,2357,2367],{},[1429,2358,2359,2362,2364],{},[973,2360,2361],{},"announce: 'Restart at 5am'",[2343,2363],{},[973,2365,2366],{},"cron: '0 22 * * *'",[1429,2368,2369],{},"Show a line in everyone's chat, in gold or the brand colour. At most 256 characters.",[940,2371,2372,2373,1446],{},"Applying changed schedules never restarts the server. The plan lists tasks added and removed under ",[944,2374,2375],{},"Schedules",[978,2377,773],{"id":2378},"errors",[940,2380,2381],{},"Mistakes are marked on their line with a message saying what's wrong, and you can't apply until they're fixed. Problems the plan finds (a port in use, a mod with no build for your version, not enough memory) are listed in the plan, and stop it from applying.",[2383,2384,2385],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}",{"title":432,"searchDepth":66,"depth":66,"links":2387},[2388,2389,2405],{"id":980,"depth":66,"text":694},{"id":1385,"depth":66,"text":699,"children":2390},[2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404],{"id":1389,"depth":61,"text":703},{"id":1397,"depth":61,"text":708},{"id":1404,"depth":61,"text":713},{"id":718,"depth":61,"text":718},{"id":723,"depth":61,"text":723},{"id":728,"depth":61,"text":728},{"id":733,"depth":61,"text":733},{"id":738,"depth":61,"text":738},{"id":743,"depth":61,"text":743},{"id":748,"depth":61,"text":748},{"id":753,"depth":61,"text":753},{"id":758,"depth":61,"text":758},{"id":763,"depth":61,"text":763},{"id":768,"depth":61,"text":768},{"id":2378,"depth":66,"text":773},"md",{},true,[2410,2411],"\u002Fservers\u002F:name\u002Fsettings\u002Fyaml","\u002Fservers\u002Ffrom-yaml",{"title":93,"description":687},null,"NDXM1U5DmsIsKtW5Ar7f3cnJY1n4fE5a0X-0sAfcHGM",[2416,2417],{"title":88,"path":89,"stem":90,"description":661,"children":-1},{"title":98,"path":99,"stem":100,"description":778,"children":-1},1794483547555]