All docs · Media Server Setup

Documentation

Media Server Setup

Link the Plex library you already run so your server can hold watch parties — Set up, Status and Remove, from the admin console.

Watch parties play from a machine you control: the Plex library you already run, on your own hardware. Asbern connects to it. We supply no media, host nothing, and never hold your Plex sign-in.

Everything happens in /menu › Other › Admin › Media, which has five rows: Set up, Status, Remove, Voice status and Music.

Before You Start

  • A computer that stays on, with the library on it.
  • About 5 Mbps of upload per viewer.
  • A hardware video encoder, or roughly 4–6 CPU cores per 1080p stream.
  • Usually nothing to set up on your router for the watch party: a box that may open router ports (it asks when you install it) opens what it needs while a screening runs, and every screening gets its own address (The watch party on your box). Where it cannot, Turn on says why.

Set Up

Watch plays from your own Plex, on a machine that stays on — and that machine is Your Asbern Box. No box yet? /menu › Other › Admin › Media › Set up says so and sends you to /menu › Other › Admin › Box first: pick where it runs and paste the one line it gives you there.

With your box online, Set up has three steps, and it remembers where you got to, so you can stop and come back:

  • Point it at Plex — press Link Plex. Your box asks Plex for a sign-in link: press Open Plex to approve, sign in to Plex (on a phone too), and the card finishes by itself. Your box finds your server and keeps the sign-in. There is no token to copy and no password typed in Discord, and the sign-in never reaches us. The same Link Plex sits on your box's card.
  • Open the screening room — on a box, press Turn on: your box orders its own certificate and starts the rooms, and Rooms sets one or two. Nothing to type, and usually nothing to set up on your router — see The watch party on your box.
  • Prove it works — a check that every piece answers, end to end. Members see Watch disabled until you press Turn on beside Verify here.

The Watch Party on Your Box

On an Asbern box the watch party runs beside your companion, and the box looks after all of it.

  • Turn on (the Open the screening room step of Set up) — your box orders its own certificate, starts the rooms and is ready. The first time takes a minute or two; Check again shows where it is.
  • Rooms — one or two watch parties at once. A playing room costs your machine about 4–6 CPU cores, and every viewer about 5 Mbps of your upload.
  • Every screening has its own address. When a screening starts, the links members are handed point at a name made for that screening under Asbern's names domain. When it ends the name is taken down, so a link from an earlier screening opens nothing.
  • One door, only while it is needed. Your box opens one port on your router for the watch party while something is playing, and closes it again when the room is idle. It never takes the web's standard ports, so whatever else you run at home keeps them. If your box may not open router ports, your router will not let it, or your connection has no public IPv4 address, Turn on and the Room step say so and what to do.
  • The certificate stays on your box. Its keys are made there and never leave it. Asbern publishes only the one-time value that proves the name is yours, and takes it down straight after.

Viewers' browsers connect to your home directly, so a viewer can see your home's internet address — the same as any game your friends join.

Watching from home? If a link will not open on your home network, open it from outside it (your phone's mobile data, for example): some home connections cannot reach their own outside address.

No Names Zone on This Deployment?

On a deployment with no names zone (NAMES_ZONE blank), the watch party is reached at an address of your own.

  • On a box, Set address on the Room step takes your domain, and the box serves the watch party on 127.0.0.1:8080 for your own reverse proxy (which adds HTTPS). No reverse proxy? Run docker exec -it asbern-agent asbern watch expose standard on the box (high for 8080/8443), forward ports 80 and 443 to it, and press Turn on — it then gets its own certificate, and anyone who opens your address can see your home's internet address. Room 2 is room2.<your address>.
  • A companion linked before your box needs a free web address (duckdns.org works) and ports 80 and 443 forwarded to your machine, and the watch-party file below; a new setup never does.

The Watch-Party File

Only for a companion linked before your box: the Open the screening room step's Download the watch party button gives you the projector as a file, the same way the companion comes: docker load -i asbern-cinema-engine-VERSION.tar.gz. Owncast (the stream) and Caddy (the web address and its certificate) are their projects' own public images, which this file fetches.

Save it as compose.yml in an empty folder, put the .env the step prints beside it — your address, the stream key, the rooms and the projector's name — and run docker compose up -d there. It needs Docker Compose 2.23.1 or newer. It joins the asbern network the companion made, so the companion finds the projector by name; nothing else on your network can reach it.

To change the number of rooms, press Rooms in the same step and put the two lines it gives you in .env, then docker compose up -d again. To update, download and load the new file, change the version on the ASBERN_WATCH_IMAGE line, and docker compose up -d.

Linked a companion before 0.8.0 that runs outside Docker? Its page shows an ENGINE_SECRET=… line under Projector. Add it to the same .env and run docker compose up -d again: the projector then answers only your companion, and the file addresses it is handed travel sealed and never come back in its answers.

# The Asbern watch party — the part of Watch that runs on your own machine.
#
# PARKED (0.8.0): an Asbern box makes its watch party itself — no file, no .env and
# nothing to set up on your router. This file is for a deployment with no names zone
# and for an install made before the box (the docs' "No names zone" section).
#
# Save this file as compose.yml in an empty folder, put the .env from Discord's
# "Open the screening room" step beside it, and run: docker compose up -d
#
# Before that, once: download the watch party from the same step and load it with
# docker load -i <the file> — the projector image is not on any registry, which is
# why pull_policy is never. Owncast and Caddy are their projects' public images.
#
# Ports 80 and 443 must be forwarded to this machine: 80 is how the free HTTPS
# certificate is issued, 443 is what your members' browsers reach. Nothing else
# is exposed: the projector and Owncast publish on 127.0.0.1 only.
#
# One room is the default. Rooms are profiles, so the number is two lines in the
# .env (SCREENING_ROOMS and COMPOSE_PROFILES) — Discord's Rooms button gives both.
# Room 1 is your address; room 2 is room2.<your address>.
#
# Running the Windows app? Copy the ENGINE_SECRET line from Asbern Companion's
# page into the .env too, so the projector answers only your companion.

name: asbern-watch

x-logs: &logs
  driver: json-file
  options: { max-size: "10m", max-file: "3" }

x-engine: &engine
  image: ${ASBERN_WATCH_IMAGE:?set ASBERN_WATCH_IMAGE in .env - the Room step in Discord gives you the line}
  labels: { com.centurylinklabs.watchtower.enable: "false" }
  pull_policy: never
  restart: unless-stopped
  init: true
  environment: &engine-env
    ENCODER: ${ENCODER:-libx264}
    WIDTH: ${VIDEO_WIDTH:-1920}
    HEIGHT: ${VIDEO_HEIGHT:-1080}
    FPS: ${VIDEO_FPS:-60}
    VIDEO_BITRATE: ${VIDEO_BITRATE:-8M}
    VIDEO_BUFSIZE: ${VIDEO_BUFSIZE:-16M}
    IDLE_STOP_MINUTES: ${IDLE_STOP_MINUTES:-10}
  networks: [watch, asbern]
  logging: *logs

x-owncast: &owncast
  image: owncast/owncast:latest
  restart: unless-stopped
  networks: [watch, asbern]
  # The stream key is a flag: Owncast ignores it as an environment variable.
  command: ["-streamkey", "${OWNCAST_STREAM_KEY:?set OWNCAST_STREAM_KEY in .env - the Room step in Discord gives you the line}"]
  logging: *logs

services:
  # The only thing the outside world reaches. Its Caddyfile is written at start
  # for exactly the rooms that are running (the entrypoint below).
  caddy:
    image: caddy:2
    container_name: asbern-watch-caddy
    restart: unless-stopped
    logging: *logs
    ports:
      - "80:80"
      - "443:443"
    environment:
      CINEMA_DOMAIN: ${CINEMA_DOMAIN:?set CINEMA_DOMAIN in .env - the Room step in Discord gives you the line}
      SCREENING_ROOMS: ${SCREENING_ROOMS:-1}
    configs:
      - source: caddy-entrypoint
        target: /usr/local/bin/caddy-entrypoint.sh
    volumes:
      - "${CADDY_DATA_ROOT:-./data/caddy}:/data"
      - "${CADDY_CONFIG_ROOT:-./data/caddy-config}:/config"
    entrypoint: ["/bin/sh", "/usr/local/bin/caddy-entrypoint.sh"]
    networks: [watch]

  cinema-1:
    <<: *engine
    profiles: ["room1"]
    container_name: asbern-watch-cinema-1
    ports: ["127.0.0.1:${CINEMA_PORT_1:-8099}:8099"]
    environment:
      <<: *engine-env
      OWNCAST_RTMP: rtmp://owncast-1:1935/live/${OWNCAST_STREAM_KEY:?set OWNCAST_STREAM_KEY in .env}
      ENGINE_SECRET: ${ENGINE_SECRET:-}

  owncast-1:
    <<: *owncast
    profiles: ["room1"]
    container_name: asbern-watch-owncast-1
    ports: ["127.0.0.1:${OWNCAST_PORT_1:-8090}:8080"]
    volumes: ["${OWNCAST_DATA_ROOT:-./data/owncast}/1:/app/data"]

  cinema-2:
    <<: *engine
    profiles: ["room2"]
    container_name: asbern-watch-cinema-2
    ports: ["127.0.0.1:${CINEMA_PORT_2:-8100}:8099"]
    environment:
      <<: *engine-env
      OWNCAST_RTMP: rtmp://owncast-2:1935/live/${OWNCAST_STREAM_KEY:?set OWNCAST_STREAM_KEY in .env}
      ENGINE_SECRET: ${ENGINE_SECRET:-}

  owncast-2:
    <<: *owncast
    profiles: ["room2"]
    container_name: asbern-watch-owncast-2
    ports: ["127.0.0.1:${OWNCAST_PORT_2:-8091}:8080"]
    volumes: ["${OWNCAST_DATA_ROOT:-./data/owncast}/2:/app/data"]

networks:
  watch:
    driver: bridge
  # The network the companion joined on its first run (docker network create asbern).
  # The companion finds the projector and Owncast on it by name: cinema-1, owncast-1.
  asbern:
    external: true
    name: asbern

configs:
  # Writes a Caddyfile for exactly the rooms that exist, then runs Caddy.
  # $$ is how compose writes a literal $ — the script receives a single one.
  caddy-entrypoint:
    content: |
      #!/bin/sh
      set -eu

      DOMAIN="$${CINEMA_DOMAIN:?CINEMA_DOMAIN is not set}"
      ROOMS="$${SCREENING_ROOMS:-1}"

      case "$$ROOMS" in
        1|2|3|4) : ;;
        *) echo "caddy-entrypoint: SCREENING_ROOMS must be 1-4, got '$$ROOMS'" >&2; exit 1 ;;
      esac

      OUT=/etc/caddy/Caddyfile
      : > "$$OUT"

      n=1
      while [ "$$n" -le "$$ROOMS" ]; do
        if [ "$$n" -eq 1 ]; then host="$$DOMAIN"; else host="room$${n}.$${DOMAIN}"; fi

        cat >> "$$OUT" <<EOF
      $${host} {
      	@admin path /admin* /api/admin* /api/integrations*
      	handle @admin {
      		respond 403
      	}

      	forward_auth cinema-$${n}:8099 {
      		uri /gate
      		header_up X-Forwarded-Uri {uri}
      		copy_headers Set-Cookie
      	}

      	handle /watch* {
      		redir * /?{query} 302
      	}

      	handle {
      		reverse_proxy owncast-$${n}:8080
      	}
      }

      EOF
        n=$$((n + 1))
      done

      caddy fmt --overwrite "$$OUT" 2>/dev/null || true

      echo "caddy-entrypoint: $${ROOMS} room(s) on $${DOMAIN}"
      exec caddy run --config "$$OUT" --adapter caddyfile

Status

/menu › Other › Admin › Media › Status shows everything Watch needs in one place — the switch, your machine, Plex and the watch address — and what is left to do. It only reads; it changes nothing.

Remove

/menu › Other › Admin › Media › Remove turns Watch off for everyone, unlinks your machine and forgets Plex, after showing you what it will do.

  • Remove unlinks your whole box, game servers and music included.
  • Your address, rooms and watch history are kept. Linking a machine again starts from /menu › Other › Admin › Box, with a fresh line.
  • It does not touch plex.tv. To remove the device there too, remove it from your Plex account.

Voice Status

/menu › Other › Admin › Media › Voice status is a switch, and it is on unless you turn it off. While something plays, the voice channel it plays in shows what it is under the channel's name — 🎬 Now watching: </em>, <em>⏸️ Paused</em> or <em>📺 Live: <channel></em> — and the line changes only when that changes. A status a member set themselves is never replaced.</p> <ul> <li>Asbern needs <strong>Set Voice Channel Status</strong> and <strong>Manage Channels</strong> on that voice channel. Without them nothing is shown, and the Voice status row names what is missing.</li> <li>Turning it off takes down the line Asbern put up, and leaves every voice channel alone.</li> </ul> <h2 id="what-members-get">What Members Get</h2> <p>Once Watch is set up, members open it from <strong>/menu › Community › Watch</strong> — the first door there:</p> <ul> <li><strong>/menu › Community › Watch › Resume</strong> — every paused film and episode. A show rolls into the next episode on its own.</li> <li><strong>/menu › Community › Watch › Browse</strong> — your library with posters, filtered by films, TV shows or ⭐ Saved — the titles you saved with ⭐ <strong>Save</strong> on a title's card.</li> <li><strong>/menu › Community › Watch › Music</strong> — your Plex music, played by your box into the voice channel you are in. Members queue songs and vote to skip; admins skip, pause, stop and change the volume. <strong>Music</strong> in Media switches it off. <a href="/docs/music">Music</a> has the rest.</li> <li><strong>/menu › Community › Watch › Add New</strong> — search your library and the catalogue together, and request what nobody has yet. Your own Radarr and Sonarr fetch it.</li> <li><strong>/menu › Community › Watch › Live TV</strong> — a guide of what is on, where your Plex has live TV.</li> </ul> <p>A screening belongs to the voice channel it started from: only people in that channel, or an admin, can pause, switch or stop it. Time watched counts towards pay and your resume points.</p> <h2 id="jellyfin">Jellyfin</h2> <p>Run Jellyfin instead of Plex, or beside it? Your box can link the Jellyfin you already run, with one press of <strong>Link Jellyfin</strong> on your box's card and a code you type into Jellyfin. On a server with no Plex, members then browse and search your Jellyfin library under <strong>/menu › Community › Watch</strong>; playing together, Resume and Live TV still need Plex. <a href="/docs/jellyfin">Link Jellyfin</a> has the steps.</p> <h2 id="troubleshooting">Troubleshooting</h2> <p><strong>Open Plex to approve stopped working.</strong> A sign-in link does not last for ever. Press <strong>New link</strong> on the same card for a fresh one.</p> <p><strong>Linked, but not answering.</strong> Check the machine is awake and Docker is running (on Windows and a Mac, Docker Desktop). <strong>Status</strong> tells "never linked" apart from "linked and silent" — the second means the pairing is fine and the box is not running.</p> <p><strong>Plex works on the machine but not for your box.</strong> <strong>Check</strong>, under <strong>/menu › Other › Admin › Box</strong>, has a <strong>Plex</strong> row that says your box cannot reach Plex, or names the Unraid setting to turn on. There is no address to type.</p> <p><strong>Playback starts and then drops.</strong> Almost always upload bandwidth. Encoding happens on your machine, and so does the ceiling.</p> <h2 id="what-it-costs">What it Costs</h2> <p>Nothing. Asbern is free: every feature on this page is included in every server, and no card is needed.</p> </div></div></article></div></div></div><!--$--><!--/$--></main><footer class="site-foot GoatBubble-module__QpPBqq__reserve"><div class="container"><div class="site-foot-grid"><div class="site-foot-brand"><a class="site-brand" href="/" aria-label="Asbern home"><img class="brand-stacked brand-on-light" src="/brand/asbern-lockup-light.png" width="160" height="140" alt="" loading="lazy" decoding="async"/><img class="brand-stacked brand-on-dark" src="/brand/asbern-lockup-dark.png" width="160" height="140" alt="" loading="lazy" decoding="async"/></a><p class="site-foot-tagline">Everything your Discord needs in one bot.</p><p>Asbern is free. Every feature is included in every server, and no card is needed.</p></div><nav aria-label="Product"><p class="site-foot-label">Product</p><ul class="site-foot-links"><li><a href="/features">Features</a></li><li><a href="/#demo">Asbern Demo</a></li><li><a href="/stats">Stats</a></li><li><a href="/pricing">Pricing</a></li></ul></nav><nav aria-label="Documentation"><p class="site-foot-label">Docs</p><ul class="site-foot-links"><li><a href="/docs/getting-started">Getting Started</a></li><li><a href="/docs/admin-console">Admin Console</a></li><li><a href="/docs/media-server">Media Server Setup</a></li><li><a href="/docs/game-servers">Game Server Setup</a></li><li><a href="/docs">All documentation</a></li><li><a href="/faq">Questions and answers</a></li></ul></nav><nav aria-label="Legal"><p class="site-foot-label">Legal</p><ul class="site-foot-links"><li><a href="/privacy">Privacy Policy</a></li><li><a href="/terms">Terms of Service</a></li></ul></nav></div><div class="site-foot-bottom"><p>© <!-- -->2026<!-- --> Asbern.</p><p>Discord is a trademark of Discord Inc. Pokémon is a trademark of Nintendo, Creatures Inc. and GAME FREAK inc. Asbern is not affiliated with or endorsed by either, and its Pokémon adventure is free. MEE6, Arcane, and StatBot are trademarks of their owners; Asbern is not affiliated with them.</p></div></div></footer><aside class="GoatBubble-module__QpPBqq__root" aria-label="Asbern" data-fixed-overlay="true" data-wait="true"><a class="GoatBubble-module__QpPBqq__goatLink" href="/add" aria-label="Add Asbern to Discord"><img class="GoatBubble-module__QpPBqq__goat" src="/brand/asbern-icon-256.png" alt="" width="56" height="56" decoding="async"/></a><button type="button" class="GoatBubble-module__QpPBqq__goatToggle" aria-expanded="false" aria-controls="goat-bubble" aria-label="Asbern’s message"><img class="GoatBubble-module__QpPBqq__goat" src="/brand/asbern-icon-256.png" alt="" width="56" height="56" decoding="async"/></button><a class="GoatBubble-module__QpPBqq__bubble" id="goat-bubble" href="/add"><span class="GoatBubble-module__QpPBqq__text">Hi, I’m Asbern. Let’s make your Discord GOATED</span><span class="btn btn-sm btn-discord"><svg class="btn-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path fill="currentColor" d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128c.126-.094.252-.192.372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"></path></svg>Add to Discord</span></a><button type="button" class="GoatBubble-module__QpPBqq__close" aria-label="Hide the message">×</button></aside><script src="/_next/static/chunks/20m32vv8s7aky.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n3:I[88181,[\"/_next/static/chunks/0ozcleccomfrf.js\"],\"default\"]\n5:I[85064,[\"/_next/static/chunks/0ozcleccomfrf.js\"],\"default\"]\n6:I[33012,[\"/_next/static/chunks/0ozcleccomfrf.js\"],\"default\"]\n7:I[79767,[\"/_next/static/chunks/0ozcleccomfrf.js\"],\"default\"]\n8:I[67536,[\"/_next/static/chunks/17jjq2ybvu1vs.js\"],\"default\"]\n9:I[52859,[\"/_next/static/chunks/0ozcleccomfrf.js\",\"/_next/static/chunks/30tk3qyxhfxeo.js\"],\"default\"]\na:I[30495,[\"/_next/static/chunks/17jjq2ybvu1vs.js\"],\"default\"]\n16:I[4567,[\"/_next/static/chunks/0ozcleccomfrf.js\",\"/_next/static/chunks/1gwuhddoo86l9.js\"],\"default\"]\n:HL[\"/_next/static/chunks/1brg3bn0gaazp.css\",\"style\"]\n:HL[\"/_next/static/chunks/382h9j9rzgho5.css\",\"style\"]\n:HL[\"/_next/static/chunks/2-1f3_0r4v9r3.css\",\"style\"]\n:HL[\"/_next/static/chunks/2zn2_4wqrwkzs.css\",\"style\"]\n:HL[\"/_next/static/media/Inter_Variable_latin.p.0gsaq8ukbf34m.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/Orbitron_Variable_latin-s.p.3tm7a0g9vbnim.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/chunks/1crfmw_npth2j.css\",\"style\"]\n2:[[\"$\",\"source\",null,{\"media\":\"(max-width: 479.98px)\",\"srcSet\":\"/brand/asbern-icon-256.png\",\"width\":\"32\",\"height\":\"32\"}],[\"$\",\"img\",null,{\"className\":\"brand-logo\",\"src\":\"/brand/asbern-logo-h64.png\",\"width\":\"156\",\"height\":\"32\",\"alt\":\"\",\"decoding\":\"async\"}]]\n4:T43f,M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128c.126-.094.252-.192.372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z14:X\n0:{\"P\":null,\"c\":[\"\",\"docs\",\"media-server\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"docs\",{\"children\":[[\"slug\",\"media-server\",\"d\",[]],{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1brg3bn0gaazp.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/382h9j9rzgho5.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2-1f3_0r4v9r3.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2zn2_4wqrwkzs.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0ozcleccomfrf.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"sans_a6d6a7d2-module__cHp7-W__variable mono_6780ebe0-module__6th5ZG__variable brand_36c902bc-module__P6NhZq__variable\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=window.localStorage.getItem('asbern-theme');if(t==='light'||t==='dark'){document.documentElement.setAttribute('data-theme',t);}}catch(e){}})();\"}}]}],[\"$\",\"body\",null,{\"children\":[[\"$\",\"a\",null,{\"className\":\"skip-link\",\"href\":\"#main\",\"children\":\"Skip to content\"}],[\"$\",\"header\",null,{\"className\":\"site-header\",\"children\":[\"$\",\"div\",null,{\"className\":\"container site-header-inner\",\"children\":[[\"$\",\"a\",null,{\"className\":\"site-brand\",\"href\":\"/\",\"aria-label\":\"Asbern home\",\"children\":[\"$\",\"picture\",null,{\"className\":\"brand-pic\",\"children\":\"$2\"}]}],[\"$\",\"nav\",null,{\"className\":\"site-links SiteHeader-module__pdxPVG__links\",\"aria-label\":\"Primary\",\"children\":[\"$\",\"$L3\",null,{\"items\":[{\"href\":\"/\",\"label\":\"Home\"},{\"href\":\"/features\",\"label\":\"Features\"},{\"href\":\"/stats\",\"label\":\"Stats\"},{\"href\":\"/docs\",\"label\":\"Docs\"},{\"href\":\"/pricing\",\"label\":\"Pricing\"}]}]}],[\"$\",\"div\",null,{\"className\":\"site-actions\",\"children\":[[\"$\",\"a\",null,{\"className\":\"btn btn-sm btn-discord\",\"href\":\"/add\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"btn-icon\",\"viewBox\":\"0 0 24 24\",\"aria-hidden\":\"true\",\"focusable\":\"false\",\"children\":[\"$\",\"path\",null,{\"fill\":\"currentColor\",\"d\":\"$4\"}]}],\"Add to Discord\"]}],[\"$\",\"div\",null,{\"className\":\"site-actions-wide\",\"children\":[[\"$\",\"$L5\",null,{}],[\"$\",\"$L6\",null,{\"serversLabel\":\"My servers\"}]]}],[\"$\",\"$L7\",null,{\"items\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:1:props:children:props:children:1:props:children:props:items\",\"serversLabel\":\"My servers\"}]]}]]}]}],[\"$\",\"main\",null,{\"id\":\"main\",\"tabIndex\":-1,\"children\":[\"$\",\"$L8\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$9\",\"errorStyles\":[],\"errorScripts\":[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/30tk3qyxhfxeo.js\",\"async\":true}]],\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"section\",null,{\"className\":\"mk-ground\",\"children\":[\"$\",\"div\",null,{\"className\":\"container mk-hero\",\"children\":[[[\"$\",\"p\",null,{\"className\":\"eyebrow-pill\",\"children\":\"404 · Page not found\"}],[\"$\",\"h1\",null,{\"children\":\"That page isn't here.\"}],[[\"$\",\"p\",\"0\",{\"className\":\"hero-lede\",\"children\":\"The link may be out of date, or the address may have a typo in it. Everything below is one press away.\"}],\"$Lb\"],\"$Lc\"],\"$undefined\"]}]}],\"$Ld\"],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],\"$Le\",\"$Lf\",\"$L10\"]}]]}]]}],{\"children\":[\"$L11\",{\"children\":[\"$L12\",{\"children\":[\"$L13\",{},null,false,null]},null,false,\"$14\"]},null,false,\"$14\"]},null,false,null],\"$L15\",false]],\"m\":\"$undefined\",\"G\":[\"$16\",[\"$L17\",\"$L18\",\"$L19\",\"$L1a\"]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"0DQD_U9KizNfG-_ANJJHR\"}\n1b:I[88086,[\"/_next/static/chunks/0ozcleccomfrf.js\"],\"default\"]\n1c:I[48194,[\"/_next/static/chunks/0ozcleccomfrf.js\"],\"default\"]\n1e:I[44764,[\"/_next/static/chunks/17jjq2ybvu1vs.js\"],\"OutletBoundary\"]\n1f:\"$Sreact.suspense\"\n21:I[44764,[\"/_next/static/chunks/17jjq2ybvu1vs.js\"],\"ViewportBoundary\"]\n23:I[44764,[\"/_next/static/chunks/17jjq2ybvu1vs.js\"],\"MetadataBoundary\"]\nb:[\"$\",\"p\",\"1\",{\"className\":\"hero-lede\",\"children\":\"While you are here: Asbern is free. Every feature is included in every server, and no card is needed.\"}]\nc:[\"$\",\"div\",null,{\"className\":\"cta-pair\",\"children\":[[\"$\",\"a\",null,{\"className\":\"btn btn-lg btn-primary\",\"href\":\"/\",\"children\":[null,\"Back to the front page\"]}],[\"$\",\"a\",null,{\"className\":\"btn btn-lg btn-secondary\",\"href\":\"/features\",\"children\":[null,\"Everything it does\"]}]]}]\nd:[\"$\",\"section\",null,{\"className\":\"sec\",\"id\":\"$undefined\",\"children\":[\"$\",\"div\",null,{\"className\":\"container\",\"children\":[[\"$\",\"header\",null,{\"className\":\"sec-head\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"sec-title\",\"children\":\"Where You Were Probably Going\"}],[],null]}],[\"$\",\"div\",null,{\"className\":\"cards cards-3\",\"children\":[[\"$\",\"a\",null,{\"className\":\"card card-link\",\"href\":\"/\",\"children\":[[\"$\",\"h3\",null,{\"className\":\"card-title\",\"children\":[\"Home\",\"$undefined\"]}],null,[\"$\",\"p\",null,{\"children\":\"What Asbern is, what it replaces, and how to add it to your server.\"}],null]}],[\"$\",\"a\",null,{\"className\":\"card card-link\",\"href\":\"/features\",\"children\":[[\"$\",\"h3\",null,{\"className\":\"card-title\",\"children\":[\"Features\",\"$undefined\"]}],null,[\"$\",\"p\",null,{\"children\":\"Every module in the bot, what it does, and which parts are free.\"}],null]}],[\"$\",\"a\",null,{\"className\":\"card card-link\",\"href\":\"/#demo\",\"children\":[[\"$\",\"h3\",null,{\"className\":\"card-title\",\"children\":[\"Asbern Demo\",\"$undefined\"]}],null,[\"$\",\"p\",null,{\"children\":\"Click through the real /menu against a private demo server. Nothing to install.\"}],null]}],[\"$\",\"a\",null,{\"className\":\"card card-link\",\"href\":\"/docs\",\"children\":[[\"$\",\"h3\",null,{\"className\":\"card-title\",\"children\":[\"Docs\",\"$undefined\"]}],null,[\"$\",\"p\",null,{\"children\":\"Setup, configuration and the answer to most questions.\"}],null]}],[\"$\",\"a\",null,{\"className\":\"card card-link\",\"href\":\"/pricing\",\"children\":[[\"$\",\"h3\",null,{\"className\":\"card-title\",\"children\":[\"Pricing\",\"$undefined\"]}],null,[\"$\",\"p\",null,{\"children\":\"Asbern is free. Every feature is included in every server, and no card is needed.\"}],null]}],[\"$\",\"a\",null,{\"className\":\"card card-link\",\"href\":\"/stats\",\"children\":[[\"$\",\"h3\",null,{\"className\":\"card-title\",\"children\":[\"Stats\",\"$undefined\"]}],null,[\"$\",\"p\",null,{\"children\":\"Server statistics, rendered from the bot's own archive.\"}],null]}]]}]]}]}]\ne:[\"$\",\"footer\",null,{\"className\":\"site-foot GoatBubble-module__QpPBqq__reserve\",\"children\":[\"$\",\"div\",null,{\"className\":\"container\",\"children\":[[\"$\",\"div\",null,{\"className\":\"site-foot-grid\",\"children\":[[\"$\",\"div\",null,{\"className\":\"site-foot-brand\",\"children\":[[\"$\",\"a\",null,{\"className\":\"site-brand\",\"href\":\"/\",\"aria-label\":\"Asbern home\",\"children\":[[\"$\",\"img\",null,{\"className\":\"brand-stacked brand-on-light\",\"src\":\"/brand/asbern-lockup-light.png\",\"width\":\"160\",\"height\":\"140\",\"alt\":\"\",\"loading\":\"lazy\",\"decoding\":\"async\"}],[\"$\",\"img\",null,{\"className\":\"brand-stacked brand-on-dark\",\"src\":\"/brand/asbern-lockup-dark.png\",\"width\":\"160\",\"height\":\"140\",\"alt\":\"\",\"loading\":\"lazy\",\"decoding\":\"async\"}]]}],[\"$\",\"p\",null,{\"className\":\"site-foot-tagline\",\"children\":\"Everything your Discord needs in one bot.\"}],[\"$\",\"p\",null,{\"children\":\"Asbern is free. Every feature is included in every server, and no card is needed.\"}]]}],[\"$\",\"nav\",null,{\"aria-label\":\"Product\",\"children\":[[\"$\",\"p\",null,{\"className\":\"site-foot-label\",\"children\":\"Product\"}],[\"$\",\"ul\",null,{\"className\":\"site-foot-links\",\"children\":[[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"/features\",\"children\":\"Features\"}]}],[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"/#demo\",\"children\":\"Asbern Demo\"}]}],[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"/stats\",\"children\":\"Stats\"}]}],[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"/pricing\",\"children\":\"Pricing\"}]}]]}]]}],[\"$\",\"nav\",null,{\"aria-label\":\"Documentation\",\"children\":[[\"$\",\"p\",null,{\"className\":\"site-foot-label\",\"children\":\"Docs\"}],[\"$\",\"ul\",null,{\"className\":\"site-foot-links\",\"children\":[[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/getting-started\",\"children\":\"Getting Started\"}]}],[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/admin-console\",\"children\":\"Admin Console\"}]}],[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/media-server\",\"children\":\"Media Server Setup\"}]}],[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/game-servers\",\"children\":\"Game Server Setup\"}]}],[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"/docs\",\"children\":\"All documentation\"}]}],[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"/faq\",\"children\":\"Questions and answers\"}]}]]}]]}],[\"$\",\"nav\",null,{\"aria-label\":\"Legal\",\"children\":[[\"$\",\"p\",null,{\"className\":\"site-foot-label\",\"children\":\"Legal\"}],[\"$\",\"ul\",null,{\"className\":\"site-foot-links\",\"children\":[[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"/privacy\",\"children\":\"Privacy Policy\"}]}],[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"/terms\",\"children\":\"Terms of Service\"}]}]]}]]}]]}],[\"$\",\"div\",null,{\"className\":\"site-foot-bottom\",\"children\":[[\"$\",\"p\",null,{\"children\":[\"© \",2026,\" Asbern.\"]}],[\"$\",\"p\",null,{\"children\":\"Discord is a trademark of Discord Inc. Pokémon is a trademark of Nintendo, Creatures Inc. and GAME FREAK inc. Asbern is not affiliated with or endorsed by either, and its Pokémon adventure is free. MEE6, Arcane, and StatBot are trademarks of their owners; Asbern is not affiliated with them.\"}]]}]]}]}]\nf:[\"$\",\"$L1b\",null,{}]\n10:[\"$\",\"$L1c\",null,{}]\n11:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L8\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n12:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L8\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n13:[\"$\",\"$1\",\"c\",{\"children\":[\"$L1d\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1crfmw_npth2j.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"$L1e\",null,{\"children\":[\"$\",\"$1f\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@20\"}]}]]}]\n15:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L21\",null,{\"children\":\"$L22\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L23\",null,{\"children\":[\"$\",\"$1f\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L24\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\n17:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1brg3bn0gaazp.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n18:[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/382h9j9rzgho5.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n19:[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2-1f3_0r4v9r3.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n1a:[\"$\",\"link\",\"3\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2zn2_4wqrwkzs.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n14:C\n1d:[[[\"$\",\"script\",\"BreadcrumbList-0\",{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"BreadcrumbList\\\",\\\"itemListElement\\\":[{\\\"@type\\\":\\\"ListItem\\\",\\\"position\\\":1,\\\"name\\\":\\\"Documentation\\\",\\\"item\\\":\\\"https://asbern.gg/docs\\\"},{\\\"@type\\\":\\\"ListItem\\\",\\\"position\\\":2,\\\"name\\\":\\\"Media Server Setup\\\",\\\"item\\\":\\\"https://asbern.gg/docs/media-server\\\"}]}\"}}]],[\"$\",\"div\",null,{\"className\":\"container sec\",\"children\":[\"$\",\"div\",null,{\"className\":\"doc-shell\",\"children\":[[[\"$\",\"details\",null,{\"className\":\"doc-nav-mobile\",\"children\":[[\"$\",\"summary\",null,{\"children\":[\"All docs · Media Server Setup\",[\"$\",\"svg\",null,{\"className\":\"chevron-icon\",\"viewBox\":\"0 0 16 16\",\"aria-hidden\":\"true\",\"focusable\":\"false\",\"children\":[\"$\",\"path\",null,{\"d\":\"M4 6l4 4 4-4\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":\"1.75\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\"}]}]]}],[\"$\",\"nav\",null,{\"aria-label\":\"Documentation\",\"children\":[[\"$\",\"div\",\"Start here\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Start Here\"}],[[\"$\",\"div\",\"getting-started\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/getting-started\",\"children\":\"Getting Started\"}]}],[\"$\",\"div\",\"admin-console\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/admin-console\",\"children\":\"The Admin Console\"}]}]]]}],[\"$\",\"div\",\"Play\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Play\"}],[[\"$\",\"div\",\"games\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/games\",\"children\":\"Casino and Idle Tycoon\"}]}],[\"$\",\"div\",\"pokemon\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/pokemon\",\"children\":\"The Pokémon Adventure\"}]}],[\"$\",\"div\",\"casino\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/casino\",\"children\":\"The Casino\"}]}],[\"$\",\"div\",\"daily\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/daily\",\"children\":\"Daily Claim\"}]}]]]}],[\"$\",\"div\",\"Levels and progression\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Levels and Progression\"}],[[\"$\",\"div\",\"progression\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/progression\",\"children\":\"Achievements, Leaderboards and Daily\"}]}],[\"$\",\"div\",\"levelling\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/levelling\",\"children\":\"Levelling and Rank Roles\"}]}],[\"$\",\"div\",\"prestige\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/prestige\",\"children\":\"Prestige\"}]}],[\"$\",\"div\",\"achievements\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/achievements\",\"children\":\"Achievements\"}]}],[\"$\",\"div\",\"challenges\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/challenges\",\"children\":\"Challenges\"}]}],[\"$\",\"div\",\"wrapped\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/wrapped\",\"children\":\"Wrapped\"}]}]]]}],[\"$\",\"div\",\"Economy\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Economy\"}],[[\"$\",\"div\",\"tycoon\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/tycoon\",\"children\":\"Idle Tycoon\"}]}],[\"$\",\"div\",\"currency\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/currency\",\"children\":\"Your Server’s Currency\"}]}],[\"$\",\"div\",\"giveaways\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/giveaways\",\"children\":\"Giveaways\"}]}]]]}],[\"$\",\"div\",\"Statistics\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Statistics\"}],[[\"$\",\"div\",\"statistics\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/statistics\",\"children\":\"Statistics\"}]}],[\"$\",\"div\",\"server-stats\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/server-stats\",\"children\":\"Server and Member Statistics\"}]}],[\"$\",\"div\",\"web-dashboard\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/web-dashboard\",\"children\":\"The Web Dashboard\"}]}],[\"$\",\"div\",\"counters\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/counters\",\"children\":\"Live Counter Channels\"}]}],[\"$\",\"div\",\"reports\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/reports\",\"children\":\"Member and Channel Reports\"}]}]]]}],[\"$\",\"div\",\"Moderation and safety\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Moderation and Safety\"}],[\"$L25\",\"$L26\",\"$L27\",\"$L28\",\"$L29\",\"$L2a\",\"$L2b\"]]}],\"$L2c\",\"$L2d\",\"$L2e\",\"$L2f\"]}]]}],\"$L30\"],\"$L31\"]}]}]]\n25:[\"$\",\"div\",\"moderation\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/moderation\",\"children\":\"Moderation\"}]}]\n26:[\"$\",\"div\",\"mod-actions\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/mod-actions\",\"children\":\"Moderation Actions\"}]}]\n27:[\"$\",\"div\",\"automod\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/automod\",\"children\":\"Automod and Anti-Raid\"}]}]\n28:[\"$\",\"div\",\"tickets\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/tickets\",\"children\":\"Support Tickets\"}]}]\n29:[\"$\",\"div\",\"verification\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/verification\",\"children\":\"Verification\"}]}]\n2a:[\"$\",\"div\",\"modlog\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/modlog\",\"children\":\"Moderation Log\"}]}]\n2b:[\"$\",\"div\",\"appeals\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/appeals\",\"children\":\"Appeals\"}]}]\n2c:[\"$\",\"div\",\"Community\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Community\"}],[[\"$\",\"div\",\"community\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/community\",\"children\":\"Community\"}]}],[\"$\",\"div\",\"feeds\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/feeds\",\"children\":\"Feeds — News, Sports, Streams and Any Site\"}]}],[\"$\",\"div\",\"polls\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/polls\",\"children\":\"Polls\"}]}],[\"$\",\"div\",\"reminders\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/reminders\",\"children\":\"Reminders\"}]}],[\"$\",\"div\",\"leaderboard\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/leaderboard\",\"children\":\"Leaderboards\"}]}],[\"$\",\"div\",\"member-search\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/member-search\",\"children\":\"Members\"}]}],[\"$\",\"div\",\"prison\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/prison\",\"children\":\"AFK\"}]}],[\"$\",\"div\",\"categories\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/categories\",\"children\":\"Access\"}]}],[\"$\",\"div\",\"starboard\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/starboard\",\"children\":\"Starboard\"}]}],[\"$\",\"div\",\"birthdays\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/birthdays\",\"children\":\"Birthdays\"}]}],[\"$\",\"div\",\"counting\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/counting\",\"children\":\"Counting\"}]}],[\"$\",\"div\",\"recaps\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/recaps\",\"children\":\"Recaps\"}]}],[\"$\",\"div\",\"highlights\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/highlights\",\"children\":\"Highlights and Milestones\"}]}]]]}]\n2d:[\"$\",\"div\",\"Run it from Discord\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Run it From Discord\"}],[[\"$\",\"div\",\"joining\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/joining\",\"children\":\"Welcome and Goodbye\"}]}],[\"$\",\"div\",\"branding\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/branding\",\"children\":\"Your Bot, Your Look\"}]}],[\"$\",\"div\",\"help\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/help\",\"children\":\"Help and Feedback\"}]}],[\"$\",\"div\",\"profile\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/profile\",\"children\":\"Member Profile and Settings\"}]}]]]}]\n2e:[\"$\",\"div\",\"Link your homelab\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Link Your Homelab\"}],[[\"$\",\"div\",\"music\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/music\",\"children\":\"Music in Voice\"}]}],[\"$\",\"div\",\"homelab\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/homelab\",\"children\":\"Link Your Homelab\"}]}],[\"$\",\"div\",\"media-server\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"span\",null,{\"className\":\"doc-nav-here\",\"aria-current\":\"page\",\"children\":\"Media Server Setup\"}]}],[\"$\",\"div\",\"game-servers\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/game-servers\",\"children\":\"Game Server Setup\"}]}],[\"$\",\"div\",\"self-hosting\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/self-hosting\",\"children\":\"Your Asbern Box\"}]}],[\"$\",\"div\",\"live-tv\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/live-tv\",\"children\":\"Live TV\"}]}],[\"$\",\"div\",\"requests\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/requests\",\"children\":\"Requests\"}]}]]]}]\n2f:[\"$\",\"div\",\"How do I…\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"How Do I…\"}],[[\"$\",\"div\",\"run-a-movie-night\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/run-a-movie-night\",\"children\":\"Run a Movie Night\"}]}],[\"$\",\"div\",\"start-a-game-server\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/start-a-game-server\",\"children\":\"Start a Game Server From Discord\"}]}],[\"$\",\"div\",\"set-up-levelling\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/set-up-levelling\",\"children\":\"Set up Levelling\"}]}],[\"$\",\"div\",\"import-statbot-history\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/import-statbot-history\",\"children\":\"Import Your StatBot History\"}]}],[\"$\",\"div\",\"port-forwarding\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/port-forwarding\",\"children\":\"Forward Ports on Your Router\"}]}],[\"$\",\"div\",\"friends-join\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/friends-join\",\"children\":\"Friends Join Automatically\"}]}],[\"$\",\"div\",\"jellyfin\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/jellyfin\",\"children\":\"Link Jellyfin\"}]}]]]}]\n30:[\"$\",\"aside\",null,{\"className\":\"doc-side GoatBubble-module__QpPBqq__sideReserve\",\"children\":[\"$\",\"nav\",null,{\"aria-label\":\"Documentation\",\"children\":[[\"$\",\"div\",\"Start here\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Start Here\"}],[[\"$\",\"div\",\"getting-started\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/getting-started\",\"children\":\"Getting Started\"}]}],[\"$\",\"div\",\"admin-console\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/admin-console\",\"children\":\"The Admin Console\"}]}]]]}],[\"$\",\"div\",\"Play\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Play\"}],[[\"$\",\"div\",\"games\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/games\",\"children\":\"Casino and Idle Tycoon\"}]}],[\"$\",\"div\",\"pokemon\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/pokemon\",\"children\":\"The Pokémon Adventure\"}]}],[\"$\",\"div\",\"casino\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/casino\",\"children\":\"The Casino\"}]}],[\"$\",\"div\",\"daily\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/daily\",\"children\":\"Daily Claim\"}]}]]]}],[\"$\",\"div\",\"Levels and progression\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Levels and Progression\"}],[[\"$\",\"div\",\"progression\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/progression\",\"children\":\"Achievements, Leaderboards and Daily\"}]}],[\"$\",\"div\",\"levelling\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/levelling\",\"children\":\"Levelling and Rank Roles\"}]}],[\"$\",\"div\",\"prestige\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/prestige\",\"children\":\"Prestige\"}]}],[\"$\",\"div\",\"achievements\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/achievements\",\"children\":\"Achievements\"}]}],[\"$\",\"div\",\"challenges\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/challenges\",\"children\":\"Challenges\"}]}],[\"$\",\"div\",\"wrapped\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/wrapped\",\"children\":\"Wrapped\"}]}]]]}],[\"$\",\"div\",\"Economy\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Economy\"}],[[\"$\",\"div\",\"tycoon\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/tycoon\",\"children\":\"Idle Tycoon\"}]}],[\"$\",\"div\",\"currency\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/currency\",\"children\":\"Your Server’s Currency\"}]}],[\"$\",\"div\",\"giveaways\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/giveaways\",\"children\":\"Giveaways\"}]}]]]}],[\"$\",\"div\",\"Statistics\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Statistics\"}],[[\"$\",\"div\",\"statistics\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/statistics\",\"children\":\"Statistics\"}]}],[\"$\",\"div\",\"server-stats\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/server-stats\",\"children\":\"Server and Member Statistics\"}]}],[\"$\",\"div\",\"web-dashboard\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/web-dashboard\",\"children\":\"The Web Dashboard\"}]}],[\"$\",\"div\",\"counters\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/counters\",\"children\":\"Live Counter Channels\"}]}],[\"$\",\"div\",\"reports\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/reports\",\"children\":\"Member and Channel Reports\"}]}]]]}],[\"$\",\"div\",\"Moderation and safety\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Moderation and Safety\"}],[[\"$\",\"div\",\"moderation\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/moderation\",\"children\":\"Moderation\"}]}],[\"$\",\"div\",\"mod-actions\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/mod-actions\",\"children\":\"Moderation Actions\"}]}],[\"$\",\"div\",\"automod\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/automod\",\"children\":\"Automod and Anti-Raid\"}]}],[\"$\",\"div\",\"tickets\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/tickets\",\"children\":\"Support Tickets\"}]}],[\"$\",\"div\",\"verification\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/verification\",\"children\":\"Verification\"}]}],[\"$\",\"div\",\"modlog\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/modlog\",\"children\":\"Moderation Log\"}]}],[\"$\",\"div\",\"appeals\",{\"className\":\"doc-nav-item\",\"children\":\"$L32\"}]]]}],\"$L33\",\"$L34\",\"$L35\",\"$L36\"]}]}]\n37:T46ea,\u003cp\u003eWatch parties play from \u003cstrong\u003ea machine you control\u003c/strong\u003e: the Plex library you already run, on your own\nhardware. Asbern connects to it. We supply no media, host nothing, and never hold your Plex\nsign-in.\u003c/p\u003e\n\u003cp\u003eEverything happens in \u003cstrong\u003e/menu › Other › Admin › Media\u003c/strong\u003e, which has five rows: \u003cstrong\u003eSet up\u003c/strong\u003e,\n\u003cstrong\u003eStatus\u003c/strong\u003e, \u003cstrong\u003eRemove\u003c/strong\u003e, \u003cstrong\u003eVoice status\u003c/strong\u003e and \u003cstrong\u003eMusic\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"before-you-start\"\u003eBefore You Start\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eA computer that stays on, with the library on it.\u003c/li\u003e\n\u003cli\u003eAbout 5 Mbps of \u003cstrong\u003eupload\u003c/strong\u003e per viewer.\u003c/li\u003e\n\u003cli\u003eA hardware video encoder, or roughly 4–6 CPU cores per 1080p stream.\u003c/li\u003e\n\u003cli\u003eUsually nothing to set up on your router for the watch party: a box that may open router ports (it asks\nwhen you install it) opens what it needs while a screening runs, and every screening gets its own address\n(\u003ca href=\"#the-watch-party-on-your-box\"\u003eThe watch party on your box\u003c/a\u003e). Where it cannot, \u003cstrong\u003eTurn on\u003c/strong\u003e says why.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"set-up\"\u003eSet Up\u003c/h2\u003e\n\u003cp\u003eWatch plays from your own Plex, on a machine that stays on — and that machine is\n\u003ca href=\"/docs/self-hosting\"\u003eYour Asbern Box\u003c/a\u003e. No box yet? \u003cstrong\u003e/menu › Other › Admin › Media › Set up\u003c/strong\u003e says so and\nsends you to \u003cstrong\u003e/menu › Other › Admin › Box\u003c/strong\u003e first: pick where it runs and paste the one line it gives\nyou there.\u003c/p\u003e\n\u003cp\u003eWith your box online, \u003cstrong\u003eSet up\u003c/strong\u003e has three steps, and it remembers where you got to, so you can stop and\ncome back:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePoint it at Plex\u003c/strong\u003e — press \u003cstrong\u003eLink Plex\u003c/strong\u003e. Your box asks Plex for a sign-in link: press \u003cstrong\u003eOpen Plex to\napprove\u003c/strong\u003e, sign in to Plex (on a phone too), and the card finishes by itself. Your box finds your\nserver and keeps the sign-in. There is no token to copy and no password typed in Discord, and the\nsign-in never reaches us. The same \u003cstrong\u003eLink Plex\u003c/strong\u003e sits on your box\u0026#39;s card.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOpen the screening room\u003c/strong\u003e — on a box, press \u003cstrong\u003eTurn on\u003c/strong\u003e: your box orders its own certificate and starts\nthe rooms, and \u003cstrong\u003eRooms\u003c/strong\u003e sets one or two. Nothing to type, and usually nothing to set up on your router — see\n\u003ca href=\"#the-watch-party-on-your-box\"\u003eThe watch party on your box\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eProve it works\u003c/strong\u003e — a check that every piece answers, end to end. Members see Watch disabled until you\npress \u003cstrong\u003eTurn on\u003c/strong\u003e beside \u003cstrong\u003eVerify\u003c/strong\u003e here.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"the-watch-party-on-your-box\"\u003eThe Watch Party on Your Box\u003c/h2\u003e\n\u003cp\u003eOn an Asbern box the watch party runs beside your companion, and the box looks after all of it.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTurn on\u003c/strong\u003e (the \u003cstrong\u003eOpen the screening room\u003c/strong\u003e step of \u003cstrong\u003eSet up\u003c/strong\u003e) — your box orders its own certificate,\nstarts the rooms and is ready. The first time takes a minute or two; \u003cstrong\u003eCheck again\u003c/strong\u003e shows where it is.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRooms\u003c/strong\u003e — one or two watch parties at once. A playing room costs your machine about 4–6 CPU cores,\nand every viewer about 5 Mbps of your upload.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEvery screening has its own address.\u003c/strong\u003e When a screening starts, the links members are handed point at\na name made for that screening under Asbern\u0026#39;s names domain. When it ends the name is taken down, so a\nlink from an earlier screening opens nothing.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOne door, only while it is needed.\u003c/strong\u003e Your box opens one port on your router for the watch party while\nsomething is playing, and closes it again when the room is idle. It never takes the web\u0026#39;s standard ports,\nso whatever else you run at home keeps them. If your box may not open router ports, your router will not\nlet it, or your connection has no public IPv4 address, \u003cstrong\u003eTurn on\u003c/strong\u003e and the Room step say so and what to do.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eThe certificate stays on your box.\u003c/strong\u003e Its keys are made there and never leave it. Asbern publishes\nonly the one-time value that proves the name is yours, and takes it down straight after.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eViewers\u0026#39; browsers connect to your home directly, so a viewer can see your home\u0026#39;s internet address — the\nsame as any game your friends join.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWatching from home?\u003c/strong\u003e If a link will not open on your home network, open it from outside it (your\nphone\u0026#39;s mobile data, for example): some home connections cannot reach their own outside address.\u003c/p\u003e\n\u003ch2 id=\"no-names-zone-on-this-deployment\"\u003eNo Names Zone on This Deployment?\u003c/h2\u003e\n\u003cp\u003eOn a deployment with no names zone (\u003ccode\u003eNAMES_ZONE\u003c/code\u003e blank), the watch party is reached at an address of your\nown.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eOn a box\u003c/strong\u003e, \u003cstrong\u003eSet address\u003c/strong\u003e on the Room step takes your domain, and the box serves the watch party on\n\u003ccode\u003e127.0.0.1:8080\u003c/code\u003e for your own reverse proxy (which adds HTTPS). No reverse proxy? Run\n\u003ccode\u003edocker exec -it asbern-agent asbern watch expose standard\u003c/code\u003e on the box (\u003ccode\u003ehigh\u003c/code\u003e for 8080/8443), forward\nports 80 and 443 to it, and press \u003cstrong\u003eTurn on\u003c/strong\u003e — it then gets its own certificate, and anyone who opens your\naddress can see your home\u0026#39;s internet address. Room 2 is \u003ccode\u003eroom2.\u0026lt;your address\u0026gt;\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eA companion linked before your box\u003c/strong\u003e needs a free web address (duckdns.org works) and ports 80 and 443\n\u003ca href=\"/docs/port-forwarding\"\u003eforwarded to your machine\u003c/a\u003e, and the watch-party file below; a new setup never does.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"the-watch-party-file\"\u003eThe Watch-Party File\u003c/h2\u003e\n\u003cp\u003eOnly for a companion linked before your box: the \u003cstrong\u003eOpen the screening room\u003c/strong\u003e step\u0026#39;s \u003cstrong\u003eDownload the watch\nparty\u003c/strong\u003e button gives you the projector as a file, the same way the companion comes:\n\u003ccode\u003edocker load -i asbern-cinema-engine-VERSION.tar.gz\u003c/code\u003e. Owncast\n(the stream) and Caddy (the web address and its certificate) are their projects\u0026#39; own public images,\nwhich this file fetches.\u003c/p\u003e\n\u003cp\u003eSave it as \u003ccode\u003ecompose.yml\u003c/code\u003e in an empty folder, put the \u003ccode\u003e.env\u003c/code\u003e the step prints beside it — your address,\nthe stream key, the rooms and the projector\u0026#39;s name — and run \u003ccode\u003edocker compose up -d\u003c/code\u003e there. It needs\nDocker Compose 2.23.1 or newer. It joins the \u003ccode\u003easbern\u003c/code\u003e network the companion made, so the companion\nfinds the projector by name; nothing else on your network can reach it.\u003c/p\u003e\n\u003cp\u003eTo change the number of rooms, press \u003cstrong\u003eRooms\u003c/strong\u003e in the same step and put the two lines it gives you in\n\u003ccode\u003e.env\u003c/code\u003e, then \u003ccode\u003edocker compose up -d\u003c/code\u003e again. To update, download and load the new file, change the\nversion on the \u003ccode\u003eASBERN_WATCH_IMAGE\u003c/code\u003e line, and \u003ccode\u003edocker compose up -d\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eLinked a companion before 0.8.0 that runs outside Docker? Its page shows an \u003ccode\u003eENGINE_SECRET=…\u003c/code\u003e line under \u003cstrong\u003eProjector\u003c/strong\u003e. Add it to\nthe same \u003ccode\u003e.env\u003c/code\u003e and run \u003ccode\u003edocker compose up -d\u003c/code\u003e again: the projector then answers only your companion, and\nthe file addresses it is handed travel sealed and never come back in its answers.\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-yaml\"\u003e# The Asbern watch party — the part of Watch that runs on your own machine.\n#\n# PARKED (0.8.0): an Asbern box makes its watch party itself — no file, no .env and\n# nothing to set up on your router. This file is for a deployment with no names zone\n# and for an install made before the box (the docs\u0026#39; \u0026quot;No names zone\u0026quot; section).\n#\n# Save this file as compose.yml in an empty folder, put the .env from Discord\u0026#39;s\n# \u0026quot;Open the screening room\u0026quot; step beside it, and run: docker compose up -d\n#\n# Before that, once: download the watch party from the same step and load it with\n# docker load -i \u0026lt;the file\u0026gt; — the projector image is not on any registry, which is\n# why pull_policy is never. Owncast and Caddy are their projects\u0026#39; public images.\n#\n# Ports 80 and 443 must be forwarded to this machine: 80 is how the free HTTPS\n# certificate is issued, 443 is what your members\u0026#39; browsers reach. Nothing else\n# is exposed: the projector and Owncast publish on 127.0.0.1 only.\n#\n# One room is the default. Rooms are profiles, so the number is two lines in the\n# .env (SCREENING_ROOMS and COMPOSE_PROFILES) — Discord\u0026#39;s Rooms button gives both.\n# Room 1 is your address; room 2 is room2.\u0026lt;your address\u0026gt;.\n#\n# Running the Windows app? Copy the ENGINE_SECRET line from Asbern Companion\u0026#39;s\n# page into the .env too, so the projector answers only your companion.\n\nname: asbern-watch\n\nx-logs: \u0026amp;logs\n driver: json-file\n options: { max-size: \u0026quot;10m\u0026quot;, max-file: \u0026quot;3\u0026quot; }\n\nx-engine: \u0026amp;engine\n image: ${ASBERN_WATCH_IMAGE:?set ASBERN_WATCH_IMAGE in .env - the Room step in Discord gives you the line}\n labels: { com.centurylinklabs.watchtower.enable: \u0026quot;false\u0026quot; }\n pull_policy: never\n restart: unless-stopped\n init: true\n environment: \u0026amp;engine-env\n ENCODER: ${ENCODER:-libx264}\n WIDTH: ${VIDEO_WIDTH:-1920}\n HEIGHT: ${VIDEO_HEIGHT:-1080}\n FPS: ${VIDEO_FPS:-60}\n VIDEO_BITRATE: ${VIDEO_BITRATE:-8M}\n VIDEO_BUFSIZE: ${VIDEO_BUFSIZE:-16M}\n IDLE_STOP_MINUTES: ${IDLE_STOP_MINUTES:-10}\n networks: [watch, asbern]\n logging: *logs\n\nx-owncast: \u0026amp;owncast\n image: owncast/owncast:latest\n restart: unless-stopped\n networks: [watch, asbern]\n # The stream key is a flag: Owncast ignores it as an environment variable.\n command: [\u0026quot;-streamkey\u0026quot;, \u0026quot;${OWNCAST_STREAM_KEY:?set OWNCAST_STREAM_KEY in .env - the Room step in Discord gives you the line}\u0026quot;]\n logging: *logs\n\nservices:\n # The only thing the outside world reaches. Its Caddyfile is written at start\n # for exactly the rooms that are running (the entrypoint below).\n caddy:\n image: caddy:2\n container_name: asbern-watch-caddy\n restart: unless-stopped\n logging: *logs\n ports:\n - \u0026quot;80:80\u0026quot;\n - \u0026quot;443:443\u0026quot;\n environment:\n CINEMA_DOMAIN: ${CINEMA_DOMAIN:?set CINEMA_DOMAIN in .env - the Room step in Discord gives you the line}\n SCREENING_ROOMS: ${SCREENING_ROOMS:-1}\n configs:\n - source: caddy-entrypoint\n target: /usr/local/bin/caddy-entrypoint.sh\n volumes:\n - \u0026quot;${CADDY_DATA_ROOT:-./data/caddy}:/data\u0026quot;\n - \u0026quot;${CADDY_CONFIG_ROOT:-./data/caddy-config}:/config\u0026quot;\n entrypoint: [\u0026quot;/bin/sh\u0026quot;, \u0026quot;/usr/local/bin/caddy-entrypoint.sh\u0026quot;]\n networks: [watch]\n\n cinema-1:\n \u0026lt;\u0026lt;: *engine\n profiles: [\u0026quot;room1\u0026quot;]\n container_name: asbern-watch-cinema-1\n ports: [\u0026quot;127.0.0.1:${CINEMA_PORT_1:-8099}:8099\u0026quot;]\n environment:\n \u0026lt;\u0026lt;: *engine-env\n OWNCAST_RTMP: rtmp://owncast-1:1935/live/${OWNCAST_STREAM_KEY:?set OWNCAST_STREAM_KEY in .env}\n ENGINE_SECRET: ${ENGINE_SECRET:-}\n\n owncast-1:\n \u0026lt;\u0026lt;: *owncast\n profiles: [\u0026quot;room1\u0026quot;]\n container_name: asbern-watch-owncast-1\n ports: [\u0026quot;127.0.0.1:${OWNCAST_PORT_1:-8090}:8080\u0026quot;]\n volumes: [\u0026quot;${OWNCAST_DATA_ROOT:-./data/owncast}/1:/app/data\u0026quot;]\n\n cinema-2:\n \u0026lt;\u0026lt;: *engine\n profiles: [\u0026quot;room2\u0026quot;]\n container_name: asbern-watch-cinema-2\n ports: [\u0026quot;127.0.0.1:${CINEMA_PORT_2:-8100}:8099\u0026quot;]\n environment:\n \u0026lt;\u0026lt;: *engine-env\n OWNCAST_RTMP: rtmp://owncast-2:1935/live/${OWNCAST_STREAM_KEY:?set OWNCAST_STREAM_KEY in .env}\n ENGINE_SECRET: ${ENGINE_SECRET:-}\n\n owncast-2:\n \u0026lt;\u0026lt;: *owncast\n profiles: [\u0026quot;room2\u0026quot;]\n container_name: asbern-watch-owncast-2\n ports: [\u0026quot;127.0.0.1:${OWNCAST_PORT_2:-8091}:8080\u0026quot;]\n volumes: [\u0026quot;${OWNCAST_DATA_ROOT:-./data/owncast}/2:/app/data\u0026quot;]\n\nnetworks:\n watch:\n driver: bridge\n # The network the companion joined on its first run (docker network create asbern).\n # The companion finds the projector and Owncast on it by name: cinema-1, owncast-1.\n asbern:\n external: true\n name: asbern\n\nconfigs:\n # Writes a Caddyfile for exactly the rooms that exist, then runs Caddy.\n # $$ is how compose writes a literal $ — the script receives a single one.\n caddy-entrypoint:\n content: |\n #!/bin/sh\n set -eu\n\n DOMAIN=\u0026quot;$${CINEMA_DOMAIN:?CINEMA_DOMAIN is not set}\u0026quot;\n ROOMS=\u0026quot;$${SCREENING_ROOMS:-1}\u0026quot;\n\n case \u0026quot;$$ROOMS\u0026quot; in\n 1|2|3|4) : ;;\n *) echo \u0026quot;caddy-entrypoint: SCREENING_ROOMS must be 1-4, got \u0026#39;$$ROOMS\u0026#39;\u0026quot; \u0026gt;\u0026amp;2; exit 1 ;;\n esac\n\n OUT=/etc/caddy/Caddyfile\n : \u0026gt; \u0026quot;$$OUT\u0026quot;\n\n n=1\n while [ \u0026quot;$$n\u0026quot; -le \u0026quot;$$ROOMS\u0026quot; ]; do\n if [ \u0026quot;$$n\u0026quot; -eq 1 ]; then host=\u0026quot;$$DOMAIN\u0026quot;; else host=\u0026quot;room$${n}.$${DOMAIN}\u0026quot;; fi\n\n cat \u0026gt;\u0026gt; \u0026quot;$$OUT\u0026quot; \u0026lt;\u0026lt;EOF\n $${host} {\n \t@admin path /admin* /api/admin* /api/integrations*\n \thandle @admin {\n \t\trespond 403\n \t}\n\n \tforward_auth cinema-$${n}:8099 {\n \t\turi /gate\n \t\theader_up X-Forwarded-Uri {uri}\n \t\tcopy_headers Set-Cookie\n \t}\n\n \thandle /watch* {\n \t\tredir * /?{query} 302\n \t}\n\n \thandle {\n \t\treverse_proxy owncast-$${n}:8080\n \t}\n }\n\n EOF\n n=$$((n + 1))\n done\n\n caddy fmt --overwrite \u0026quot;$$OUT\u0026quot; 2\u0026gt;/dev/null || true\n\n echo \u0026quot;caddy-entrypoint: $${ROOMS} room(s) on $${DOMAIN}\u0026quot;\n exec caddy run --config \u0026quot;$$OUT\u0026quot; --adapter caddyfile\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"status\"\u003eStatus\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e/menu › Other › Admin › Media › Status\u003c/strong\u003e shows everything Watch needs in one place — the switch,\nyour machine, Plex and the watch address — and what is left to do. It only reads; it changes\nnothing.\u003c/p\u003e\n\u003ch2 id=\"remove\"\u003eRemove\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e/menu › Other › Admin › Media › Remove\u003c/strong\u003e turns Watch off for everyone, unlinks your machine and\nforgets Plex, after showing you what it will do.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRemove\u003c/strong\u003e unlinks your whole box, game servers and music included.\u003c/li\u003e\n\u003cli\u003eYour address, rooms and watch history are kept. Linking a machine again starts from\n\u003cstrong\u003e/menu › Other › Admin › Box\u003c/strong\u003e, with a fresh line.\u003c/li\u003e\n\u003cli\u003eIt does not touch plex.tv. To remove the device there too, remove it from your Plex account.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"voice-status\"\u003eVoice Status\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e/menu › Other › Admin › Media › Voice status\u003c/strong\u003e is a switch, and it is \u003cstrong\u003eon\u003c/strong\u003e unless you turn it off.\nWhile something plays, the voice channel it plays in shows what it is under the channel\u0026#39;s name —\n\u003cem\u003e🎬 Now watching: \u003ctitle\u003e\u003c/em\u003e, \u003cem\u003e⏸️ Paused\u003c/em\u003e or \u003cem\u003e📺 Live: \u003cchannel\u003e\u003c/em\u003e — and the line changes only when that\nchanges. A status a member set themselves is never replaced.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAsbern needs \u003cstrong\u003eSet Voice Channel Status\u003c/strong\u003e and \u003cstrong\u003eManage Channels\u003c/strong\u003e on that voice channel. Without\nthem nothing is shown, and the Voice status row names what is missing.\u003c/li\u003e\n\u003cli\u003eTurning it off takes down the line Asbern put up, and leaves every voice channel alone.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"what-members-get\"\u003eWhat Members Get\u003c/h2\u003e\n\u003cp\u003eOnce Watch is set up, members open it from \u003cstrong\u003e/menu › Community › Watch\u003c/strong\u003e — the first door there:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e/menu › Community › Watch › Resume\u003c/strong\u003e — every paused film and episode. A show rolls into the next episode on\nits own.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e/menu › Community › Watch › Browse\u003c/strong\u003e — your library with posters, filtered by films, TV shows or ⭐ Saved — the\ntitles you saved with ⭐ \u003cstrong\u003eSave\u003c/strong\u003e on a title\u0026#39;s card.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e/menu › Community › Watch › Music\u003c/strong\u003e — your Plex music, played by your box into the voice channel you are in.\nMembers queue songs and vote to skip; admins skip, pause, stop and change the volume. \u003cstrong\u003eMusic\u003c/strong\u003e in Media\nswitches it off. \u003ca href=\"/docs/music\"\u003eMusic\u003c/a\u003e has the rest.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e/menu › Community › Watch › Add New\u003c/strong\u003e — search your library and the catalogue together, and request what\nnobody has yet. Your own Radarr and Sonarr fetch it.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e/menu › Community › Watch › Live TV\u003c/strong\u003e — a guide of what is on, where your Plex has live TV.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eA screening belongs to the voice channel it started from: only people in that channel, or an admin,\ncan pause, switch or stop it. Time watched counts towards pay and your resume points.\u003c/p\u003e\n\u003ch2 id=\"jellyfin\"\u003eJellyfin\u003c/h2\u003e\n\u003cp\u003eRun Jellyfin instead of Plex, or beside it? Your box can link the Jellyfin you already run, with one\npress of \u003cstrong\u003eLink Jellyfin\u003c/strong\u003e on your box\u0026#39;s card and a code you type into Jellyfin. On a server with no\nPlex, members then browse and search your Jellyfin library under \u003cstrong\u003e/menu › Community › Watch\u003c/strong\u003e; playing\ntogether, Resume and Live TV still need Plex. \u003ca href=\"/docs/jellyfin\"\u003eLink Jellyfin\u003c/a\u003e has the steps.\u003c/p\u003e\n\u003ch2 id=\"troubleshooting\"\u003eTroubleshooting\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eOpen Plex to approve stopped working.\u003c/strong\u003e A sign-in link does not last for ever. Press \u003cstrong\u003eNew link\u003c/strong\u003e on\nthe same card for a fresh one.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLinked, but not answering.\u003c/strong\u003e Check the machine is awake and Docker is running (on Windows and a Mac,\nDocker Desktop). \u003cstrong\u003eStatus\u003c/strong\u003e tells \u0026quot;never linked\u0026quot; apart from \u0026quot;linked and silent\u0026quot; — the second means the\npairing is fine and the box is not running.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePlex works on the machine but not for your box.\u003c/strong\u003e \u003cstrong\u003eCheck\u003c/strong\u003e, under \u003cstrong\u003e/menu › Other › Admin › Box\u003c/strong\u003e, has a\n\u003cstrong\u003ePlex\u003c/strong\u003e row that says your box cannot reach Plex, or names the Unraid setting to turn on. There is no\naddress to type.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePlayback starts and then drops.\u003c/strong\u003e Almost always upload bandwidth. Encoding happens on your\nmachine, and so does the ceiling.\u003c/p\u003e\n\u003ch2 id=\"what-it-costs\"\u003eWhat it Costs\u003c/h2\u003e\n\u003cp\u003eNothing. Asbern is free: every feature on this page is included in every server, and no card is needed.\u003c/p\u003e\n31:[\"$\",\"div\",null,{\"className\":\"doc-main\",\"children\":[\"$\",\"article\",null,{\"children\":[[[\"$\",\"div\",\"prose-0\",{\"className\":\"prose\",\"children\":[[\"$\",\"header\",null,{\"className\":\"doc-head\",\"children\":[[\"$\",\"p\",null,{\"className\":\"eyebrow-pill\",\"children\":\"Documentation\"}],[\"$\",\"h1\",null,{\"className\":\"doc-title\",\"children\":\"Media Server Setup\"}],[[\"$\",\"p\",\"0\",{\"className\":\"doc-lede\",\"children\":\"Link the Plex library you already run so your server can hold watch parties — Set up, Status and Remove, from the admin console.\"}]],null]}],[\"$\",\"div\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"$37\"}}]]}]],null]}]}]\n32:[\"$\",\"a\",null,{\"href\":\"/docs/appeals\",\"children\":\"Appeals\"}]\n33:[\"$\",\"div\",\"Community\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Community\"}],[[\"$\",\"div\",\"community\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/community\",\"children\":\"Community\"}]}],[\"$\",\"div\",\"feeds\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/feeds\",\"children\":\"Feeds — News, Sports, Streams and Any Site\"}]}],[\"$\",\"div\",\"polls\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/polls\",\"children\":\"Polls\"}]}],[\"$\",\"div\",\"reminders\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/reminders\",\"children\":\"Reminders\"}]}],[\"$\",\"div\",\"leaderboard\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/leaderboard\",\"children\":\"Leaderboards\"}]}],[\"$\",\"div\",\"member-search\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/member-search\",\"children\":\"Members\"}]}],[\"$\",\"div\",\"prison\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/prison\",\"children\":\"AFK\"}]}],[\"$\",\"div\",\"categories\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/categories\",\"children\":\"Access\"}]}],[\"$\",\"div\",\"starboard\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/starboard\",\"children\":\"Starboard\"}]}],[\"$\",\"div\",\"birthdays\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/birthdays\",\"children\":\"Birthdays\"}]}],[\"$\",\"div\",\"counting\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/counting\",\"children\":\"Counting\"}]}],[\"$\",\"div\",\"recaps\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/recaps\",\"children\":\"Recaps\"}]}],[\"$\",\"div\",\"highlights\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/highlights\",\"children\":\"Highlights and Milestones\"}]}]]]}]\n34:[\"$\",\"div\",\"Run it from Discord\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Run it From Discord\"}],[[\"$\",\"div\",\"joining\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/joining\",\"children\":\"Welcome and Goodbye\"}]}],[\"$\",\"div\",\"branding\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/branding\",\"children\":\"Your Bot, Your Look\"}]}],[\"$\",\"div\",\"help\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/help\",\"children\":\"Help and Feedback\"}]}],[\"$\",\"div\",\"profile\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/profile\",\"children\":\"Member Profile and Settings\"}]}]]]}]\n35:[\"$\",\"div\",\"Link your homelab\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"Link Your Homelab\"}],[[\"$\",\"div\",\"music\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/music\",\"children\":\"Music in Voice\"}]}],[\"$\",\"div\",\"homelab\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/homelab\",\"children\":\"Link Your Homelab\"}]}],[\"$\",\"div\",\"media-server\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"span\",null,{\"className\":\"doc-nav-here\",\"aria-current\":\"page\",\"children\":\"Media Server Setup\"}]}],[\"$\",\"div\",\"game-servers\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/game-servers\",\"children\":\"Game Server Setup\"}]}],[\"$\",\"div\",\"self-hosting\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/self-hosting\",\"children\":\"Your Asbern Box\"}]}],[\"$\",\"div\",\"live-tv\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/live-tv\",\"children\":\"Live TV\"}]}],[\"$\",\"div\",\"requests\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/requests\",\"children\":\"Requests\"}]}]]]}]\n36:[\"$\",\"div\",\"How do I…\",{\"className\":\"doc-nav-group\",\"children\":[[\"$\",\"div\",null,{\"className\":\"doc-nav-label\",\"children\":\"How Do I…\"}],[[\"$\",\"div\",\"run-a-movie-night\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/run-a-movie-night\",\"children\":\"Run a Movie Night\"}]}],[\"$\",\"div\",\"start-a-game-server\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/start-a-game-server\",\"children\":\"Start a Game Server From Discord\"}]}],[\"$\",\"div\",\"set-up-levelling\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/set-up-levelling\",\"children\":\"Set up Levelling\"}]}],[\"$\",\"div\",\"import-statbot-history\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/import-statbot-history\",\"children\":\"Import Your StatBot History\"}]}],[\"$\",\"div\",\"port-forwarding\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/port-forwarding\",\"children\":\"Forward Ports on Your Router\"}]}],[\"$\",\"div\",\"friends-join\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/friends-join\",\"children\":\"Friends Join Automatically\"}]}],[\"$\",\"div\",\"jellyfin\",{\"className\":\"doc-nav-item\",\"children\":[\"$\",\"a\",null,{\"href\":\"/docs/jellyfin\",\"children\":\"Link Jellyfin\"}]}]]]}]\n22:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#0b0714\",\"media\":\"(prefers-color-scheme: dark)\"}],[\"$\",\"meta\",\"3\",{\"name\":\"theme-color\",\"content\":\"#f9fafe\",\"media\":\"(prefers-color-scheme: light)\"}],[\"$\",\"meta\",\"4\",{\"name\":\"color-scheme\",\"content\":\"dark light\"}]]\n38:I[1514,[\"/_next/static/chunks/17jjq2ybvu1vs.js\"],\"IconMark\"]\n20:null\n24:[[\"$\",\"title\",\"0\",{\"children\":\"Media Server Setup · Asbern\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Link the Plex library you already run so your server can hold watch parties — Set up, Status and Remove, from the admin console.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"canonical\",\"href\":\"https://asbern.gg/docs/media-server\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:title\",\"content\":\"Media Server Setup\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:description\",\"content\":\"Link the Plex library you already run so your server can hold watch parties — Set up, Status and Remove, from the admin console.\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:url\",\"content\":\"https://asbern.gg/docs/media-server\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:site_name\",\"content\":\"Asbern\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:image\",\"content\":\"https://asbern.gg/opengraph-image?v=1dptonc\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:image:alt\",\"content\":\"Asbern: Everything your Discord needs in one bot. Asbern is free. Every feature is included in every server, and no card is needed.\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"13\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"14\",{\"name\":\"twitter:title\",\"content\":\"Media Server Setup\"}],[\"$\",\"meta\",\"15\",{\"name\":\"twitter:description\",\"content\":\"Link the Plex library you already run so your server can hold watch parties — Set up, Status and Remove, from the admin console.\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:image\",\"content\":\"https://asbern.gg/opengraph-image?v=1dptonc\"}],[\"$\",\"link\",\"17\",{\"rel\":\"icon\",\"href\":\"/icon?251b943dbd09bff2\",\"alt\":\"$undefined\",\"type\":\"image/png\",\"sizes\":\"512x512\"}],[\"$\",\"link\",\"18\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-icon?fe6aeb84691a7fa9\",\"alt\":\"$undefined\",\"type\":\"image/png\",\"sizes\":\"180x180\"}],[\"$\",\"$L38\",\"19\",{}]]\n"])</script></body></html>