# Hack Club program documentation full text Generated 2026-10-20T05:20:51.962Z. Pages are separated by "--- 8< ---". ## CloudFALL docs Stop wasting money, build it yourself Status: unknown (the program API was unreachable). --- 8< --- Page: CloudFALL docs URL: https://sterndocs.hackclub.com/cloudfall Source: content/cloudfall/index.md Author: Archer CloudFALL is a Hack Club YSWS program; _you ship, we ship._ You pay every month for things you could run yourself. Spotify, Gdrive, Netflix. CloudFALL is about building the replacement, shipping it open source, and ending up with a server of your own to run it on. These docs will serve as a way to learn how to replace these subscriptions, how to build something new of your own, and how selfhosting works and why do it. > [!NOTE] > Dates and status live in the header and the sidebar, not in this text. > They read the program directly, so they're right even when this page is out of > date and once the round closes, the join button is gone rather than pointing > at something you can't enter. ## The shape of it 1. **Sign up and get your hours counted.** You must be a member of [Hack Club Auth](https://auth.hackclub.com) More help at [Getting started](/cloudfall/getting-started). 2. **Pick something you actually pay for.** The best CloudFALL projects replace a specific line on a specific bill. [Pick a project](/cloudfall/pick-a-project) has the list, with the ports. 3. **Build it and get it running.** If you created a software project it should be up and hosted. [Self-hosting basics](/cloudfall/self-hosting-basics) isn't as hard as it looks. 4. **Ship it.** A public repo, a way to run it, tracked hours. [Submitting your project](/cloudfall/submitting) is the checklist. ## What makes a CloudFALL project A CloudFALL project should be something that will help break apart the cloud, it should be able to stand on it's own and stop you from needing to spend money on monthly/yearly subscriptions. It doesn't have to be a direct replacement but should make life easier for you, and preferable cheaper. Things like youtube downloaders to listen to music, a NAS app to back up things to your server instead of Gdrive. Hardware counts, as long as it's useful to a homelab, even indirectly. ## These docs are editable Every page here is a markdown file in a public repo, [AD-Archer/stern-docs](https://github.com/AD-Archer/stern-docs). If something is wrong, out of date, or was confusing the first time you read it, use **Suggest an edit** at the bottom of the page it opens a pull request. That's the only way these docs change, which means the person who got stuck is the person who gets to fix it. [How to edit these docs](/cloudfall/contributing). --- 8< --- Page: How it works URL: https://sterndocs.hackclub.com/cloudfall/how-it-works Source: content/cloudfall/how-it-works.md Author: Archer Copied from: cloudfall.hackclub.com, "How it works" by Archer (Copied verbatim from src/App.svelte and src/lib/data.js (MOVES, FINE_PRINT, TERMS) in AD-Archer/cloudFALL) ## 1. Pick Anything with a monthly bill. Netflix, Realms, iCloud, the gym. ## 2. Rebuild Same job, your hardware, open source. One file starts it. ## 3. Keep The hours you logged buy the gear to keep it running. Teens around the world. can sign up using [Hackatime](https://hackatime.hackclub.com/). to win prizes while building. - free to enter - ages 13 to 18 - sign up on stern - hours tracked in hackatime - non-AI hours only ## The terms of the deal | | | | --- | --- | | **what it is** | An online hackathon with no venue and no single weekend. You build from wherever you are, on your own schedule, and finish when it is finished. | | **who it is for** | Anyone aged 13 to 18, anywhere on earth. Free to enter, and nothing to pay later. | | **what you get** | Ship a project and pick real hardware off the shop list: blank discs to hold your library, or a Plex plan to serve it. Unlimited unless a listing says otherwise. | | **how hours count** | Track build time with Hackatime. Once your non-AI hours are approved they become spendable, and that approval is the only gate. | --- 8< --- Page: Getting started URL: https://sterndocs.hackclub.com/cloudfall/getting-started Source: content/cloudfall/getting-started.md Author: Archer Do this before you write any code. The hours you work before Hackatime/Lapse is installed can't be counted, and that's the most common way people lose a week. ## 1. Sign up for CloudFALL Use the join button in the header. It takes you to the program's welcome page, where you'll sign in with your Hack Club account and get added to program. If the button isn't there, the ysws isn't open the header shows the status, and the sidebar panel says what happened. ## 2. Join the Slack channel Everything happens in [**#ysws-CloudFALL**](https://hackclub.enterprise.slack.com/archives/C0BMV3W7Y05). Ask your questions there rather than in DMs we're a community here and like to help each other out If you've never used Hack Club Slack, sign up at [hackclub.com/slack](https://hackclub.com/slack) first. ## 3. Install Hackatime Hackatime is how your hours get counted. It's a plugin for your editor that reports what you're working on. 1. Sign in at [hackatime.hackclub.com](https://hackatime.hackclub.com) with your Hack Club account. 2. Follow the setup for your editor VS Code, JetBrains, Neovim and most others are supported. 3. Write some code, wait a minute, and check that time is showing up on your Hackatime dashboard. > [!IMPORTANT] > Untracked time cannot be counted, and it can't be added back later. If you > notice your editor stopped reporting, say so in the channel _while it's > happening_ rather than at submission time. ## 4. Check what counts as your project Hackatime reports a project name, taken from your folder name by default. Keep your CloudFALL work in one folder from the start, so the hours line up with the repo you eventually submit. It won't stop you from reciving rewards for your work, but it will make rewarding you harder ```bash # Fine: one folder, one project name, hours all in one place. ~/code/jukebox/ # Painful at submission time: work spread across three folders that # Hackatime reports as three unrelated projects. ~/code/test2/ ~/Downloads/jukebox-old/ ~/Desktop/final-real/ ``` ## Then what Pick something to build. [Pick a project](/cloudfall/pick-a-project) is a list of subscriptions and the open-source thing that replaces each one, including the port it listens on which is a surprisingly good way to tell whether a project is real yet. --- 8< --- Page: Pick a project URL: https://sterndocs.hackclub.com/cloudfall/pick-a-project Source: content/cloudfall/pick-a-project.md Author: Archer The strongest CloudFALL submissions will start with something specific: a service, a price, a month. For example "The $17.99 I pay Netflix, but I have dvds at home" is a project waiting to happen. ## Things people rent, and what runs instead | You pay for | Runs instead | Port | What you actually get | | ------------- | ------------ | ---- | --------------------------------------------------------------------------------------------------------- | | Netflix | [Jellyfin](/cloudfall/guides/jellyfin) | 8096 | Rip the discs you own, stream them to every screen in the house like netflix. | | Spotify | [Navidrome](/cloudfall/guides/navidrome) | 4533 | High quality music for free, with no ads that you own forever. | | Google Photos | [Immich](/cloudfall/guides/immich) | 2283 | Automated backups for all of your photos but you don't owe google $25/M for the rest of time. | | iCloud+ | [Syncthing](/cloudfall/guides/syncthing) | 8384 | Every photo and backup your phone makes on every device you own | That table is a starting point. The test is in [what reviewers check](/cloudfall/review): does it replace something proprietary(privately owned) that people pay for, and is it open source when you're done. ## Ways to make it yours Installing Jellyfin isn't a project!!! somebody already built Jellyfin! Building something _around_ the problem is: - The **thing that's missing** from an existing tool. A phone app for the service you run. A migration tool that gets your data out of the paid thing. - The **glue**. Something that watches a folder, tags what lands in it, and files it where three other services can find it. - The **hardware end**. An antenna that pulls in radio and streams it to your network. A sensor that logs something the paid app charges you to see. - The **subscription nobody has replaced yet**. Gym trackers, recipe apps, language courses, parking apps. Look at the last three things that charged your card. > [!TIP] > Ask in **#ysws-CloudFALL** before you commit a week to an idea. "Does this > count?" gets answered in minutes, and the answer sometimes makes the project > better rather than smaller. ## Hardware projects Hardware is in scope as long as it's useful to a homelab or on-prem setup, even somewhat indirectly the antenna example above is the canonical one. The same rules apply: it has to be documented well enough that someone else could build it, and open source means the schematics and firmware too, not just a photo of the finished box, that also means tracking your time using [lapse](https://lapse.hackclub.com) ## Scoping it Aim for something that runs end to end, then make it better. A working thing with three features beats a beautiful thing that doesn't start. You can submit muliple times even if you change something and add a new feature so **don't be afraid to ship.** --- 8< --- Page: What you pay for URL: https://sterndocs.hackclub.com/cloudfall/what-you-pay-for Source: content/cloudfall/what-you-pay-for.md Author: Archer Copied from: cloudfall.hackclub.com, "What you pay for" (the ledger) by Archer (Rows copied verbatim from src/lib/data.js (RENTALS) and src/lib/Ledger.svelte in AD-Archer/cloudFALL. The site shows them as a tickable ledger; here they are a table.) Copied from: cloudfall.hackclub.com, page description by Archer (The description above is the site's own meta description, minus its first sentence.) | You pay for | Plan | USD a month | Runs instead | How | | --- | --- | ---: | --- | --- | | Netflix | Standard, one household | 17.99 | [Jellyfin](/cloudfall/guides/jellyfin) | Rip the discs you own, stream them to every screen in the house. Nothing leaves the building. | | Spotify | Premium, one person | 11.99 | [Navidrome](/cloudfall/guides/navidrome) | Your library, your playlists, subsonic apps on every phone. The album stays yours when the deal expires. | | Google Photos | 2 TB, the family plan | 9.99 | [Immich](/cloudfall/guides/immich) | Same auto-backup, same face search, running on a box in your room instead of a rack in Iowa. | | iCloud+ | 2 TB, the family plan | 9.99 | [Syncthing](/cloudfall/guides/syncthing) | Every photo and backup your phone makes, landing on a drive in your house, with no account standing in the middle of it. | | Minecraft Realms | Realms Plus, ten players | 7.99 | [Paper server](/cloudfall/guides/minecraft-server) | Your world on your own box, with whatever mods you want, staying up after you stop paying anyone. | | Notion | Plus, one person | 12.00 | Joplin Server | Notes that sync between your laptop and your phone and stay readable as plain files if the company ever folds. | | Dropbox | Plus, 2 TB | 11.99 | Nextcloud | Files, calendar, contacts and shared links, without a company reading the folder names. | | YouTube Premium | One account, no ads | 13.99 | [TubeArchivist](/cloudfall/guides/tubearchivist) | Subscribe to channels, keep the videos, watch them again in ten years when the channel is gone. | | Audible | One credit a month | 14.95 | Audiobookshelf | Your audiobooks with your progress synced, and no licence server deciding whether you may listen. | | 1Password | Individual | 3.99 | Vaultwarden | The same browser extensions, talking to a vault that only exists on hardware you can unplug. | | The gym | The one you drive past | 42.00 | Something you built | Not every subscription is software. A written plan, a log you own and a bar in the garage counts here too. | > [!NOTE] > The prices are in USD and may not be accurate to your tier or how much you pay, this is just a rough estimate. Everything you pay for can be replaced with a free version you can build yourself, or find existing online. [Learn how to build one](/cloudfall/self-hosting-basics) --- 8< --- Page: Self-hosting basics URL: https://sterndocs.hackclub.com/cloudfall/self-hosting-basics Source: content/cloudfall/self-hosting-basics.md Author: Archer Creating your own server isn't hard, a server is a computer that gives(serves) data to other computers(clients). All you need to do to create a server is have a computer that can share data to another computer. This can be a Pi, old desktop or even a chromebook. ## The box You probably already own it: - A laptop with a cracked screen that still boots. - A Raspberry Pi in a drawer. - The desktop in the basement nobody uses. If it turns on and stays on, it can serve your house. You don't need anything big, fancy, all you need is internet(preferable ethernet), a device, and power ```bash # Ubuntu/Debian laptop: don't sleep when the lid shuts. sudo systemctl mask sleep.target suspend.target hibernate.target ``` ## One file starts the whole thing Almost everything worth running uses a Docker Compose file. You paste it in and run one command: ```yaml title="docker-compose.yml" services: jellyfin: image: jellyfin/jellyfin container_name: jellyfin ports: - "8096:8096" volumes: - ./config:/config - ./cache:/cache - /mnt/media:/media restart: unless-stopped ``` ```bash docker compose up -d # start it, in the background(note older docker verisons use "docker-compose" instead of "docker compose") docker compose logs -f # watch it boot; ctrl-c to stop watching docker compose down # stop it ``` That's the key to nearly every service you'll run. Learn to read that file and most of self-hosting stops being mysterious. > [!TIP] > Paste your compose file in **#ysws-CloudFALL** and someone will read it line by > line with you. This is the single fastest way to get unstuck. ## Reach it from anywhere, safely You do not need a static IP, and you should not open ports on your home router to get started. A mesh VPN puts your phone and your server on the same private network in about five minutes: 1. Install [Tailscale](https://tailscale.com/) on the server and on your phone. 2. Sign in to the same account on both. 3. Use the server's Tailscale address instead of its local IP. It works from anywhere, on any network. > [!WARNING] > Port-forwarding a service straight onto the public internet exposes it to > everyone who scans that port, which is everyone. If you do need a public URL, > put a reverse proxy with HTTPS in front of it and keep the service itself > private. ## Safety first It's a bit costly but no one wants to lose their family photos. Two copies, one of them somewhere else. That's the whole rule, and it's the part people skip until they lose something. - **Copy one** is the drive the service runs on. - **Copy two** is anywhere that isn't in the same building another drive you take somewhere, or discs/SSDs, which is what the blank spindles in the program shop are for. you can even use google drive for this(ironically) Test the restore, not just the backup. An untested backup is a hope. ## Then what Get the thing you built running the same way a repo someone else can clone and a container they can start. [Submitting your project](/cloudfall/submitting) covers what that has to look like. --- 8< --- Page: Package it so it runs URL: https://sterndocs.hackclub.com/cloudfall/packaging Source: content/cloudfall/packaging.md Author: Archer Every submission has to be something a reviewer can open and use. For a website that's a live link. For a self-hosted project which most CloudFALL projects are it's **a public repo and a Docker container**, so the reviewer can start it on their own machine. Minor expections for things like homelabs with extensions, things like custom UPS, antenna, etc ## The minimum A person who has never seen your project should be able to do this: ```bash git clone https://github.com/you/your-project cd your-project cp .env.example .env # if you need config at all docker compose up -d # open http://localhost:PORT ``` If your README's setup section is longer than a screen, that's may be a bad sign. ## A Dockerfile that works from a clean clone ```dockerfile title="Dockerfile" FROM node:22-alpine WORKDIR /app # Dependencies first: this layer is cached until your lockfile changes. COPY package*.json ./ RUN npm ci --omit=dev COPY . . EXPOSE 3000 CMD ["node", "server.js"] ``` ```yaml title="docker-compose.yml" services: app: build: . ports: - "3000:3000" environment: # Sensible defaults, so `docker compose up` works with no .env at all. DATA_DIR: /data volumes: - ./data:/data restart: unless-stopped ``` Then verify it the way a reviewer will from a fresh clone, in a directory you haven't been developing in: ```bash git clone https://github.com/you/your-project /tmp/clean-check cd /tmp/clean-check && docker compose up --build ``` That catches the file you never committed, which is the single most common reason a project comes back. > [!WARNING] > Don't commit secrets. Ship `.env.example` with the _names_ of the variables and > obviously-fake values, and keep the real `.env` in `.gitignore`. If a key has > ever been committed, rotate it deleting the line doesn't remove it from > history. ## The README a reviewer wants - **One sentence on what it replaces.** "Self-hosted replacement for Strava's paid tier" tells a reviewer more than three paragraphs of feature list. - **Screenshots.** At least one of the actual UI. Required, not decoration. - **Setup.** The four commands above, exactly as they work. - **A licence.** MIT, Apache-2.0 or similar. Without one, nobody can legally use it, and "open source" hasn't happened. ## Hosted, not self-hosted? If your project is a website with a live URL, that URL is your "it runs" but still ship the repo and keep it public. --- 8< --- Page: Self-hosting URL: https://sterndocs.hackclub.com/cloudfall/guides/self-hosting Source: content/cloudfall/guides/self-hosting.md Author: Archer Synced from sources: 2026-10-20 (scripts/sync-guides.mjs) Copied from: Wikipedia, "Self-hosting (network)" by Wikipedia contributors, CC BY-SA 4.0 (Sections copied verbatim; wiki markup converted to Markdown. Revision of 2026-07-27.) Copied from: Wikipedia, "Home server" by Wikipedia contributors, CC BY-SA 4.0 (Lead and the Media serving and BitTorrent sections copied verbatim. Revision of 2026-05-31.) Copied from: Self-Hosting Guide, "Getting Started with Self-Hosting" by Mike Royal, CC BY 4.0 (The two opening paragraphs copied verbatim from README.md. Upstream commit 3eaf827.) Self-hosting is the practice of running a website or service on a home server instead of a web hosting service outside of the administrator's own control. Self-hosting allows users to have more control over their data, privacy, and computing infrastructure, as well as potentially saving costs and improving skills. ## Getting Started with Self-Hosting [Self-Hosting](https://www.reddit.com/r/selfhosted/) is the practice of locally hosting(on premises & private web servers) and managing software applications by a person or organization instead of monthly subscriptions from [Software as a service (SaaS) providers](https://azure.microsoft.com/en-us/overview/what-is-saas/). Most self-hosted software can be installed using [Docker](https://en.wikipedia.org/wiki/Docker_(software)), a packaging system which allows software to bundle their configuration and dependencies and isolate them from your operating system. Software using docker can be installed using the command line or via graphical interfaces such as [Portainer](https://github.com/portainer/portainer). Software is installed with Docker by downloading an image file containing the application, then creating a copy that sets up its own dependencies and configuration within what is called a container. Without containers you would often need to install different versions of the same programming languages or tools to satisfy the dependencies for the software you want to use which can get complicated. ## Benefits Self-hosting software often allows a user greater customization over their software experience compared to solutions in the cloud. For example, Jellyfin has many add-ons allowing for new types of program information, interfaces, subtitles and other features that are not available on commercial streaming services. A self-hosted RSS reader can help a user control their own source of news, rather than be reliant on a corporation's algorithm to deliver their news. This degree of control can make self-hosted software more resistant to enshittification. Self-hosted services are usually more privacy-respecting because the user is hosting the data on hardware under their control, meaning that a for-profit company will not be able to leverage that data to generate revenue from targeted ads or similar strategies. The fact that the data does not leave the premises where it is stored also means the user may be less susceptible to mass surveillance, such as by hosting personal photographs on Immich to avoid those personal data being accessible to Google on Google Photos. While some self-hosted software solutions offer subscriptions to support their development, many are distributed via open-source repositories. This can allow a user to save money over the long term, such as by using Nextcloud to avoid subscriptions for cloud storage which often increase over time. ## Downsides While self-hosting can save money in some aspects, it also involves costs, such as for the computing hardware itself, but also the electricity costs, which some advanced users have noted can be unexpectedly high. If users access their self-hosted services on a domain they own, there is usually a cost involved in registering the domain. Performance can be faster on local hardware due to the lower latency, but it can sometimes be slower on self-hosted hardware, particularly if attempting to host on under-powered devices such as single-board computers like Raspberry Pi, which can struggle to run intensive processes involved in speech-to-text algorithms, video encoding and similar applications. Security must be considered when self-hosting software exposed to the public internet. Making resources on a home network remotely accessible usually involves port forwarding, setting up encryption methods like HTTPS, and other networking approaches which if not configured correctly, could become an attack surface for hackers and thieves. It is also recommended to back up any self-hosted data to a second location, potentially offsite, to ensure all data isn't lost in case of a fire, flood or other disaster that could destroy hardware in a home. Self-hosting software often has a steeper learning curve than competing software because of the need to learn about computer networking, security, and software configuration on environments such as Linux and the command line. This can require more time investment than paid alternatives. ## Home server A home server is a computing server located in a private residence providing services to other devices inside or outside the household through a home network or the Internet. Such services may include file and printer serving, media center serving, home automation control, web serving (on the network or Internet), web caching, file sharing and synchronization, video surveillance and digital video recorder, calendar and contact sharing and synchronization, account authentication, and backup services. Because of the relatively low number of computers on a typical home network, a home server commonly does not require significant computing power. Home servers can be implemented do-it-yourself style with a re-purposed, older computer, or a plug computer; pre-configured commercial home server appliances are also available. An uninterruptible power supply is sometimes used in case of power outages that can possibly corrupt data. ### Media serving Home servers are often used to serve multi-media content, including photos, music, and video to other devices in the household (and even to the Internet; see Space shifting, Tonido and Orb). Using standard protocols such as DLNA or proprietary systems such as iTunes, users can access their media stored on the home server from any room in the house. Windows XP Media Center Edition, Windows Vista, and Windows 7 can act as a home server, supporting a particular type of media serving that streams the interactive user experience to Media Center Extenders including the Xbox 360. Services such as Windows Home Server are less used, likely due to modern services such as Plex and Jellyfin. These services allow users to store their media on a NAS and stream and sometimes download it to devices within the network and optionally to devices outside the network. These services automatically sort users media and find metadata and sometimes subtitles. They also track and remember users progress within a movie or series so they can continue from where they left off. ### BitTorrent Home servers are ideal for utilizing the BitTorrent protocol for downloading and seeding files as some torrents can take days, or even weeks to complete and perform better on an uninterrupted connection. There are many text based clients such as rTorrent and web-based ones such as TorrentFlux and Tonido available for this purpose. BitTorrent also makes it easier for those with limited bandwidth to distribute large files over the Internet. ## Further reading - [Self-Hosting Guide](https://github.com/mikeroyal/Self-Hosting-Guide) - [awesome-selfhosted](https://github.com/awesome-selfhosted/awesome-selfhosted) - [selfh.st](https://selfh.st/) - [r/selfhosted](https://www.reddit.com/r/selfhosted/) --- 8< --- Page: What is a container? URL: https://sterndocs.hackclub.com/cloudfall/guides/what-is-a-container Source: content/cloudfall/guides/what-is-a-container.md Author: Archer Synced from sources: 2026-10-20 (scripts/sync-guides.mjs) Copied from: Docker Docs, "What is a container?" by Docker, Inc. and contributors, Apache-2.0 (Copied verbatim from the docker/docs repository; screenshots, video embeds and the Docker Desktop tab removed, links made absolute. Upstream commit 7efe900.) Imagine you're developing a killer web app that has three main components - a React frontend, a Python API, and a PostgreSQL database. If you wanted to work on this project, you'd have to install Node, Python, and PostgreSQL. How do you make sure you have the same versions as the other developers on your team? Or your CI/CD system? Or what's used in production? How do you ensure the version of Python (or Node or the database) your app needs isn't affected by what's already on your machine? How do you manage potential conflicts? Enter containers! What is a container? Simply put, containers are isolated processes for each of your app's components. Each component - the frontend React app, the Python API engine, and the database - runs in its own isolated environment, completely isolated from everything else on your machine. Here's what makes them awesome. Containers are: - Self-contained. Each container has everything it needs to function with no reliance on any pre-installed dependencies on the host machine. - Isolated. Since containers run in isolation, they have minimal influence on the host and other containers, increasing the security of your applications. - Independent. Each container is independently managed. Deleting one container won't affect any others. - Portable. Containers can run anywhere! The container that runs on your development machine will work the same way in a data center or anywhere in the cloud! ### Containers versus virtual machines (VMs) Without getting too deep, a VM is an entire operating system with its own kernel, hardware drivers, programs, and applications. Spinning up a VM only to isolate a single application is a lot of overhead. A container is simply an isolated process with all of the files it needs to run. If you run multiple containers, they all share the same kernel, allowing you to run more applications on less infrastructure. > **Using VMs and containers together** > > Quite often, you will see containers and VMs used together. As an example, in a cloud environment, the provisioned machines are typically VMs. However, instead of provisioning one machine to run one application, a VM with a container runtime can run multiple containerized applications, increasing resource utilization and reducing costs. ## Try it out Follow the instructions to run a container using the CLI: 1. Open your CLI terminal and start a container by using the [`docker run`](https://docs.docker.com/reference/cli/docker/container/run/) command: ```console $ docker run -d -p 8080:80 docker/welcome-to-docker ``` The output from this command is the full container ID. Congratulations! You just fired up your first container! πŸŽ‰ ### View your running containers You can verify if the container is up and running by using the [`docker ps`](https://docs.docker.com/reference/cli/docker/container/ls/) command: ```console docker ps ``` You will see output like the following: ```console CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a1f7a4bb3a27 docker/welcome-to-docker "/docker-entrypoint.…" 11 seconds ago Up 11 seconds 0.0.0.0:8080->80/tcp gracious_keldysh ``` This container runs a web server that displays a simple website. When working with more complex projects, you'll run different parts in different containers. For example, a different container for the `frontend`, `backend`, and `database`. > [!TIP] > > The `docker ps` command will show you _only_ running containers. To view stopped containers, add the `-a` flag to list all containers: `docker ps -a` ### Access the frontend When you launched the container, you exposed one of the container's ports onto your machine. Think of this as creating configuration to let you to connect through the isolated environment of the container. For this container, the frontend is accessible on port `8080`. To open the website, select the link in the **Port(s)** column of your container or visit [http://localhost:8080](http://localhost:8080) in your browser. ### Stop your container The `docker/welcome-to-docker` container continues to run until you stop it. You can stop a container using the `docker stop` command. 1. Run `docker ps` to get the ID of the container 2. Provide the container ID or name to the [`docker stop`](https://docs.docker.com/reference/cli/docker/container/stop/) command: ```console docker stop ``` > [!TIP] > > When referencing containers by ID, you don't need to provide the full ID. You only need to provide enough of the ID to make it unique. As an example, the previous container could be stopped by running the following command: > > ```console > docker stop a1f > ``` --- 8< --- Page: How Compose works URL: https://sterndocs.hackclub.com/cloudfall/guides/how-compose-works Source: content/cloudfall/guides/how-compose-works.md Author: Archer Synced from sources: 2026-10-20 (scripts/sync-guides.mjs) Copied from: Docker Docs, "How Compose works" by Docker, Inc. and contributors, Apache-2.0 (Copied verbatim from the docker/docs repository; screenshots, video embeds and the Docker Desktop tab removed, links made absolute. Upstream commit 7efe900.) With Docker Compose you use a YAML configuration file, known as the [Compose file](#the-compose-file), to configure your application’s services, and then you create and start all the services from your configuration with the [Compose CLI](#cli). The Compose file, or `compose.yaml` file, follows the rules provided by the [Compose Specification](https://docs.docker.com/reference/compose-file/) in how to define multi-container applications. This is the Docker Compose implementation of the formal [Compose Specification](https://github.com/compose-spec/compose-spec). ## The Compose application model Computing components of an application are defined as [services](https://docs.docker.com/reference/compose-file/services/). A service is an abstract concept implemented on platforms by running the same container image, and configuration, one or more times. Services communicate with each other through [networks](https://docs.docker.com/reference/compose-file/networks/). In the Compose Specification, a network is a platform capability abstraction to establish an IP route between containers within services connected together. Services store and share persistent data into [volumes](https://docs.docker.com/reference/compose-file/volumes/). The Specification describes such a persistent data as a high-level filesystem mount with global options. ## The Compose file The default path for a Compose file is `compose.yaml` (preferred) or `compose.yml` that is placed in the working directory. Compose also supports `docker-compose.yaml` and `docker-compose.yml` for backwards compatibility of earlier versions. If both files exist, Compose prefers the canonical `compose.yaml`. ## CLI The Docker CLI lets you interact with your Docker Compose applications through the `docker compose` command and its subcommands. If you're using Docker Desktop, the Docker Compose CLI is included by default. Using the CLI, you can manage the lifecycle of your multi-container applications defined in the `compose.yaml` file. The CLI commands enable you to start, stop, and configure your applications effortlessly. ### Key commands To start all the services defined in your `compose.yaml` file: ```console $ docker compose up ``` To stop and remove the running services: ```console $ docker compose down ``` If you want to monitor the output of your running containers and debug issues, you can view the logs with: ```console $ docker compose logs ``` To list all the services along with their current status: ```console $ docker compose ps ``` --- 8< --- Page: Persisting container data URL: https://sterndocs.hackclub.com/cloudfall/guides/persisting-container-data Source: content/cloudfall/guides/persisting-container-data.md Author: Archer Synced from sources: 2026-10-20 (scripts/sync-guides.mjs) Copied from: Docker Docs, "Persisting container data" by Docker, Inc. and contributors, Apache-2.0 (Copied verbatim from the docker/docs repository; screenshots, video embeds and the Docker Desktop tab removed, links made absolute. Upstream commit 7efe900.) When a container starts, it uses the files and configuration provided by the image. Each container is able to create, modify, and delete files and does so without affecting any other containers. When the container is deleted, these file changes are also deleted. While this ephemeral nature of containers is great, it poses a challenge when you want to persist the data. For example, if you restart a database container, you might not want to start with an empty database. So, how do you persist files? ### Container volumes Volumes are a storage mechanism that provide the ability to persist data beyond the lifecycle of an individual container. Think of it like providing a shortcut or symlink from inside the container to outside the container. As an example, imagine you create a volume named `log-data`. ```console $ docker volume create log-data ``` When starting a container with the following command, the volume will be mounted (or attached) into the container at `/logs`: ```console $ docker run -d -p 80:80 -v log-data:/logs docker/welcome-to-docker ``` If the volume `log-data` doesn't exist, Docker will automatically create it for you. When the container runs, all files it writes into the `/logs` folder will be saved in this volume, outside of the container. If you delete the container and start a new container using the same volume, the files will still be there. > **Sharing files using volumes** > > You can attach the same volume to multiple containers to share files between containers. This might be helpful in scenarios such as log aggregation, data pipelines, or other event-driven applications. ### Managing volumes Volumes have their own lifecycle beyond that of containers and can grow quite large depending on the type of data and applications you’re using. The following commands will be helpful to manage volumes: - `docker volume ls` - list all volumes - `docker volume rm ` - remove a volume (only works when the volume is not attached to any containers) - `docker volume prune` - remove all unused (unattached) volumes --- 8< --- Page: BitTorrent URL: https://sterndocs.hackclub.com/cloudfall/guides/bittorrent Source: content/cloudfall/guides/bittorrent.md Author: Archer Synced from sources: 2026-10-20 (scripts/sync-guides.mjs) Copied from: Wikipedia, "BitTorrent" by Wikipedia contributors, CC BY-SA 4.0 (Lead and parts of the Design, Creating and publishing, Anonymity, Legislation and Security sections copied verbatim. Revision of 2026-10-17.) Copied from: Wikipedia, "Seeding (computing)" by Wikipedia contributors, CC BY-SA 4.0 (Lead copied verbatim. Revision of 2026-10-11.) Copied from: Wikipedia, "Torrent file" by Wikipedia contributors, CC BY-SA 4.0 (Lead copied verbatim. Revision of 2026-09-22.) Copied from: Wikipedia, "Legal issues with BitTorrent" by Wikipedia contributors, CC BY-SA 4.0 (First paragraph copied verbatim. Revision of 2026-08-04.) Copied from: BEP 3: The BitTorrent Protocol Specification by Bram Cohen; placed in the public domain (Opening section copied verbatim; reStructuredText converted to Markdown. Upstream commit 7b7b41f.) BitTorrent is a communication protocol for peer-to-peer file sharing (P2P), which enables users to distribute data and electronic files over the Internet in a decentralized manner. The act of downloading and uploading data via BitTorrent is also labeled "torrenting". The protocol is developed and maintained by Rainberry, Inc., and was first released in 2001. To send or receive files, users use a BitTorrent client on their Internet-connected computer, which are available for a variety of computing platforms and operating systems, including an official client. BitTorrent trackers provide a list of files available for transfer and allow the client to find peer users, known as "seeds", who may transfer the files. BitTorrent downloading is considered to be faster than HTTP ("direct downloading") and FTP due to the lack of a central server that could limit bandwidth. BitTorrent is one of the most common protocols for transferring large files, such as digital video files containing TV shows and video clips, or digital audio files. BitTorrent accounted for a third of all internet traffic in 2004, according to a study by Cachelogic. As recently as 2019 BitTorrent remained a significant file sharing protocol according to Sandvine, generating a substantial amount of Internet traffic, with 2.46% of downstream, and 27.58% of upstream traffic, although this share has declined significantly since then. ## Design The BitTorrent protocol can be used to reduce the server and network impact of distributing large files. Rather than downloading a file from a single source server, the BitTorrent protocol allows users to join a "swarm" of hosts to upload and download from each other simultaneously. The protocol is an alternative to the older single source, multiple mirror sources technique for distributing data, and can work effectively over networks with lower bandwidth. Using the BitTorrent protocol, several basic computers, such as home computers, can replace large servers while efficiently distributing files to many recipients. This lower bandwidth usage also helps prevent large spikes in internet traffic in a given area, keeping internet speeds higher for all users in general, regardless of whether or not they use the BitTorrent protocol. The file being distributed is divided into segments called pieces. As each peer receives a new piece of the file, it becomes a source (of that piece) for other peers, relieving the original seed from having to send that piece to every computer or user wishing a copy. With BitTorrent, the task of distributing the file is shared by those who want it; it is entirely possible for the seed to send only a single copy of the file itself and eventually distribute to an unlimited number of peers. Each piece is protected by a cryptographic hash contained in the torrent descriptor. This ensures that any modification of the piece can be reliably detected, and thus prevents both accidental and malicious modifications of any of the pieces received at other nodes. If a node starts with an authentic copy of the torrent descriptor, it can verify the authenticity of the entire file it receives. Pieces are typically downloaded non-sequentially, and are rearranged into the correct order by the BitTorrent client, which monitors which pieces it needs, and which pieces it has and can upload to other peers. Pieces are of the same size throughout a single download (for example, a 10 MB file may be transmitted as ten 1 MB pieces or as forty 256 KB pieces). Due to the nature of this approach, the download of any file can be halted at any time and be resumed at a later date, without the loss of previously downloaded information, which in turn makes BitTorrent particularly useful in the transfer of larger files. This also enables the client to seek out readily available pieces and download them immediately, rather than halting the download and waiting for the next (and possibly unavailable) piece in line, which typically reduces the overall time of the download. This eventual transition from peers to seeders determines the overall "health" of the file (as determined by the number of times a file is available in its complete form). The distributed nature of BitTorrent can lead to a flood-like spreading of a file throughout many peer computer nodes. As more peers join the swarm, the likelihood of a successful download by any particular node increases. Relative to traditional Internet distribution schemes, this permits a significant reduction in the original distributor's hardware and bandwidth resource costs. Distributed downloading protocols in general provide redundancy against system problems, reduce dependence on the original distributor, and provide sources for the file which are generally transient and therefore there is no single point of failure as in one way server-client transfers. Though both ultimately transfer files over a network, a BitTorrent download differs from a one way server-client download (as is typical with an HTTP or FTP request, for example) in several fundamental ways: BitTorrent makes many small data requests over different IP connections to different machines, while server-client downloading is typically made via a single TCP connection to a single machine. BitTorrent downloads in a random or in a "rarest-first" approach that ensures high availability, while classic downloads are sequential. Taken together, these differences allow BitTorrent to achieve much lower cost to the content provider, much higher redundancy, and much greater resistance to abuse or to "flash crowds" than regular server software. However, this protection, theoretically, comes at a cost: downloads can take time to rise to full speed because it may take time for enough peer connections to be established, and it may take time for a node to receive sufficient data to become an effective uploader. This contrasts with regular downloads (such as from an HTTP server, for example) that, while more vulnerable to overload and abuse, rise to full speed very quickly, and maintain this speed throughout. In the beginning, BitTorrent's non-contiguous download methods made it harder to support "streaming playback". In 2014, the client Popcorn Time allowed for streaming of BitTorrent video files. Since then, more and more clients are offering streaming options. ### Downloading and sharing Users find a torrent of interest on a torrent index site or by using a search engine built into the client, download it, and open it with a BitTorrent client. The client connects to the tracker(s) or seeds specified in the torrent file, from which it receives a list of seeds and peers currently transferring pieces of the file(s). The client connects to those peers to obtain the various pieces. If the swarm contains only the initial seeder, the client connects directly to it, and begins to request pieces. Clients incorporate mechanisms to optimize their download and upload rates. ## Creating and publishing A BitTorrent user creates a torrent by generating a torrent file with a dedicated client or utility. This file contains metadata about the files to be shared, including file names, sizes, and piece length, along with the cryptographic hash of each piece to enable integrity checking during download. ### Magnet links Magnet links allow users to obtain the necessary metadata for a torrent without downloading a separate torrent file. The v2 specification extends magnet links with a hybrid mode that includes both SHA-1 and SHA-256 info hashes, maintaining compatibility with legacy clients while enabling the security improvements of v2. ### Publishing a torrent To publish a torrent, the creator uploads the .torrent file to a torrent index or distributes the magnet link. The creator must also seed the torrent by running a BitTorrent client that holds the complete set of files, enabling other peers to begin downloading. Peers discover each other through several standardized mechanisms: centralized trackers, distributed hash tables, and peer exchange. ## Seeding In computing, and specifically peer-to-peer file sharing, seeding is the uploading of already downloaded content for others to download from. A peer, a computer that is connected to the network, becomes a seed when having acquired the entire set of data, it offers its upload bandwidth to other peers attempting to download the file. This data consists of small parts so that seeds can effectively share their content with other peers, handing out the missing pieces. A peer deliberately chooses to become a seed by leaving the upload task active once the content has downloaded. The motivation to seed is mainly to keep the file being shared in circulation (as there is no central hub to continue uploading in the absence of peer seeders) and a desire to not act as a parasite. The opposite of a seed is a leech, a peer that downloads more than they upload. ## Torrent file In the BitTorrent file distribution system, a torrent file or meta-info file is a computer file that contains metadata about files and folders to be distributed, and usually also a list of the network locations of trackers, which are computers that help participants in the system find each other and form efficient distribution groups called swarms. Torrent files are normally named with the extension .torrent. A torrent file acts like a table of contents (index) that allows computers to find information through the use of a torrent client. With the help of a torrent file, one can download small parts of the original file from computers that have already downloaded it. These "peers" allow for downloading of the file in addition to, or in place of, the primary server. A torrent file does not contain the content to be distributed; it only contains information about those files, such as their names, folder structure, sizes, and cryptographic hash values for verifying file integrity. ## Anonymity BitTorrent does not, on its own, offer its users anonymity. One can usually see the IP addresses of all peers in a swarm in one's own client or firewall program. This may expose users with insecure systems to attacks. In some countries, copyright organizations scrape lists of peers, and send takedown notices to the Internet service provider (ISP) of users participating in the swarms of files that are under copyright. In some jurisdictions, copyright holders may launch lawsuits against uploaders or downloaders for infringement, and police may arrest suspects in such cases. Virtual private networks encrypt transfers, and substitute a different IP address for the users, so that anyone monitoring a torrent swarm will only see that address. ## Legislation Although the protocol itself is legal, problems stem from using the protocol to traffic copyright infringing works, since BitTorrent is often used to download otherwise paid content, such as movies and video games. There has been much controversy over the use of BitTorrent trackers. BitTorrent metafiles themselves do not store file contents. Whether the publishers of BitTorrent metafiles violate copyrights by linking to copyrighted works without the authorization of copyright holders is controversial. Various jurisdictions have pursued legal action against websites that host BitTorrent trackers. As a result, the use of BitTorrent may sometimes be limited by ISPs due to legal or copyright grounds. Users may choose to run seedboxes or virtual private networks (VPNs) to circumvent these restrictions. ## Security Several studies on BitTorrent from over a decade ago found files available for download containing malware. In particular, one small sample indicated that 18% of all executable programs available for download contained malware. Another study claims that as much as 14.5% of BitTorrent downloads contain "zero-day" malware not indexed by any antivirus, and that BitTorrent was used as the distribution mechanism for 47% of all zero-day malware they have found. ## Legal issues with BitTorrent The use of the BitTorrent protocol for the unauthorized sharing of copyrighted content generated a variety of novel legal issues. While the technology and related platforms are legal in many jurisdictions, law enforcement and prosecutorial agencies are attempting to address this avenue of copyright infringement. Notably, the use of BitTorrent in connection with copyrighted material may make the issuers of the BitTorrent file, link or metadata liable as an infringing party under some copyright laws. Similarly, the use of BitTorrent to procure illegal materials could potentially create liability for end users as an accomplice. ## The BitTorrent Protocol Specification BitTorrent is a protocol for distributing files. It identifies content by URL and is designed to integrate seamlessly with the web. Its advantage over plain HTTP is that when multiple downloads of the same file happen concurrently, the downloaders upload to each other, making it possible for the file source to support very large numbers of downloaders with only a modest increase in its load. ### A BitTorrent file distribution consists of these entities - An ordinary web server - A static 'metainfo' file - A BitTorrent tracker - An 'original' downloader - The end user web browsers - The end user downloaders There are ideally many end users for a single file. ### To start serving, a host goes through the following steps 1. Start running a tracker (or, more likely, have one running already). 1. Start running an ordinary web server, such as apache, or have one already. 1. Associate the extension .torrent with mimetype application/x-bittorrent on their web server (or have done so already). 1. Generate a metainfo (.torrent) file using the complete file to be served and the URL of the tracker. 1. Put the metainfo file on the web server. 1. Link to the metainfo (.torrent) file from some other web page. 1. Start a downloader which already has the complete file (the 'origin'). ### To start downloading, a user does the following 1. Install BitTorrent (or have done so already). 1. Surf the web. 1. Click on a link to a .torrent file. 1. Select where to save the file locally, or select a partial download to resume. 1. Wait for download to complete. 1. Tell downloader to exit (it keeps uploading until this happens). --- 8< --- Page: Hardlinks and Instant Moves (Atomic-Moves) URL: https://sterndocs.hackclub.com/cloudfall/guides/hardlinks Source: content/cloudfall/guides/hardlinks.md Author: Archer Synced from sources: 2026-10-20 (scripts/sync-guides.mjs) Copied from: TRaSH Guides, "Hardlinks and Instant Moves (Atomic-Moves)" by TRaSH-Guides contributors, MIT (Copied verbatim; collapsible boxes rendered as callouts, links made absolute. Upstream commit 529bd9c.) ## Description > [!NOTE] > If you’re wondering why hardlinks aren’t working or why a simple move is taking far longer than it should. > > Here we will try to explain it. This guide consists of 4 sections. 1. This page with a short description. 2. [How to set up](https://trash-guides.info/File-and-Folder-Structure/How-to-set-up/) for your installation method. 3. [Examples](https://trash-guides.info/File-and-Folder-Structure/Examples/) What you should use for your path settings in your used applications. 4. [Check if hardlinks are working](https://trash-guides.info/File-and-Folder-Structure/Check-if-hardlinks-are-working/) So you want one of the following? - Instant moves (Atomic-Moves) during import of the Starr Apps (useful when using Usenet)? - You don't want to use twice the storage when using torrents. (hardlinks)? - You want to perma-seed? Then Continue to [How to set up](https://trash-guides.info/File-and-Folder-Structure/How-to-set-up/) for your installation method. ## FAQ ### Hardlinks Limitations > [!CAUTION] > - You CAN'T create hardlinks for directories > - You CAN'T hardlink across separate file systems, partitions, volumes or mounts > - Some file systems, such as exFAT, are known not to support hardlinks and should be avoided (double-check if you are unsure!). ### What are Hardlinks > [!NOTE] > **What are hardlinks?** > - [**Short answer**] Having a file in multiple locations without using double your storage space. > - [**Long answer**] Hardlinks allow a copy operation to be instant and not consume space for those additional copies. > > Every file is a hardlink: some metadata that points at blocks on the file system, **which is why they're restricted to the same file system**. There can be as many metadata files pointing at those blocks as needed, and the blocks know how many links point to them. Once the blocks have 0 links, they're considered deleted. > > This means: > > - You can delete any "copy" without impacting other instances (hardlinks). > > Your download client can remove its "copy" without impacting the library "copy". The library "copy" can also be removed by Plex, Sonarr/Radarr, or manually without impacting your download client's "copy". > > - Space is only reclaimed once all "copies" of hardlinked data are deleted. > > - Modifying any copy of a hardlinked file will impact all "copies". > > For example, modifying the id3 tags of a .mp3 download after import would change the download client "copy", breaking the torrent. > > [More info from Wikipedia, the free encyclopedia](https://en.wikipedia.org/wiki/Hard_link) > > > [!WARNING] > > **Don't forget to read the [Hardlinks limitations](https://trash-guides.info/File-and-Folder-Structure/Hardlinks-and-Instant-Moves/#hardlinks-limitations)** ### What are Instant Moves (Atomic Moves) > [!NOTE] > **What are Instant Moves (Atomic Moves)?** > This is a real move, not a copying of a file from the download folder to the media folder and then deleting the file from the download folder. ### What are the Starr Apps > [!NOTE] > **What are the `Starr Apps`?** > Sonarr, Radarr, Lidarr, etc. ### Permissions, ownership, and UMASK > [!NOTE] > **Permissions, ownership, and UMASK** > Hardlinks and instant (atomic) moves require all paths to be on **one filesystem**, but they also depend on **permissions**: every app must be able to read β€” and the apps that import, upgrade, or delete must be able to write β€” each other's files. This is governed by the **user and group your apps run as**, the **`UMASK`**, and **ownership** β€” assumed knowledge here and explained in detail in the [Servarr Docker Guide](https://wiki.servarr.com/docker-guide). > > How the user and group are set depends on the image: many images (for example LinuxServer.io) use the `PUID` and `PGID` environment variables, while others use Docker's native `--user` / `user:` directive (a `uid:gid` pair). Either way, pick one of the two setups below and apply it consistently: > > | Setup | Users | `UMASK` | Resulting default permissions | > | --- | --- | --- | --- | > | **Per-app user + shared group** (recommended) | a separate user per app, all in one shared group | `002` | folders `775` (`drwxrwxr-x`), files `664` (`-rw-rw-r--`) | > | **Single shared user** (simpler, less strict) | one user for every app | `022` | folders `755` (`drwxr-xr-x`), files `644` (`-rw-r--r--`) | > > `UMASK 002` keeps the **group-write** bit, so files and folders created by one app can be read and written by the others. The single-user setup can use `022` because one user owns everything. > > > [!WARNING] > > Don't use `UMASK 000` (folders `777`, files `666`) β€” it makes everything readable and writable by **everyone**, which is poor Linux hygiene. --- 8< --- Page: Jellyfin URL: https://sterndocs.hackclub.com/cloudfall/guides/jellyfin Source: content/cloudfall/guides/jellyfin.md Author: Archer Synced from sources: 2026-10-20 (scripts/sync-guides.mjs) Copied from: Wikipedia, "Jellyfin" by Wikipedia contributors, CC BY-SA 4.0 (Lead copied verbatim. Revision of 2026-09-24.) Copied from: Jellyfin documentation, "Quick Start" by Jellyfin contributors, CC BY-ND 4.0 (Sections copied whole and unchanged, as the licence requires; only relative links were made absolute, site components removed and headings nested. Upstream commit 915333d.) Copied from: Jellyfin documentation, "Container" by Jellyfin contributors, CC BY-ND 4.0 (Sections copied whole and unchanged, as the licence requires; only relative links were made absolute, site components removed and headings nested. Upstream commit 915333d.) Copied from: Jellyfin documentation, "Movies" by Jellyfin contributors, CC BY-ND 4.0 (Sections copied whole and unchanged, as the licence requires; only relative links were made absolute, site components removed and headings nested. Upstream commit 915333d.) Copied from: Jellyfin documentation, "TV Shows" by Jellyfin contributors, CC BY-ND 4.0 (Sections copied whole and unchanged, as the licence requires; only relative links were made absolute, site components removed and headings nested. Upstream commit 915333d.) Jellyfin is a free and open-source media server and suite of multimedia applications designed to organize, manage, and share digital media files to networked devices. Jellyfin consists of a server application installed on a machine running Linux, Microsoft Windows, or macOS; and another application running on a client device such as a smartphone, tablet, smart TV, streaming media player, game console or in a web browser. Jellyfin also can serve media to DLNA and Chromecast-enabled devices. It is a fork of Emby. ## Quick Start Welcome to the Jellyfin quick start guide! Jellyfin is a powerful open-source media server that lets you organize, stream, and access your personal media collectionβ€”from movies and TV shows to music and photosβ€”on any device. To get started, you'll need to set up the server application, which acts as the central hub for serving your media. This guide will give a quick overview of the steps required to install and configure Jellyfin to get your media server up and running. ### Get started 1. [Install and launch Jellyfin](https://jellyfin.org/docs/general/installation) on the computer that will be your media server. 2. [Complete the setup wizard](https://jellyfin.org/docs/general/post-install/setup-wizard) to create an admin account, add media, and adjust settings. 3. Enjoy your media! #### (Optional) Extra credit - [Install mobile, tv, or desktop clients.](https://jellyfin.org/downloads) - [Configure remote access.](https://jellyfin.org/docs/general/post-install/networking/#external-access) ## Container ### Installation Instructions > [!WARNING] > If you wish to use [Windows](https://jellyfin.org/docs/general/installation/windows) or [macOS](https://jellyfin.org/docs/general/installation/macos), please install Jellyfin natively instead. > > While it is possible to run Jellyfin in a Container on a Windows or macOS host, it is NOT supported. Some features are known to be broken when running in a Container on platforms other than Linux, Notably: > > - Hardware Accelerated Transcoding > - [Scanning on macOS in Docker](https://github.com/jellyfin/jellyfin/issues/13093) > > You WILL NOT receive any support for running Jellyfin in a Container on platforms other than Linux. Create a `docker-compose.yml` file like the following. ```yml services: jellyfin: image: jellyfin/jellyfin container_name: jellyfin # Optional - specify the uid and gid you would like Jellyfin to use instead of root user: uid:gid ports: - 8096:8096/tcp - 7359:7359/udp volumes: - /path/to/config:/config - /path/to/cache:/cache - type: bind source: /path/to/media target: /media - type: bind source: /path/to/media2 target: /media2 read_only: true # Optional - extra fonts to be used during transcoding with subtitle burn-in - type: bind source: /path/to/fonts target: /usr/local/share/fonts/custom read_only: true restart: 'unless-stopped' # Optional - alternative address used for autodiscovery environment: - JELLYFIN_PublishedServerUrl=http://example.com # Optional - may be necessary for docker healthcheck to pass if running in host network mode extra_hosts: - 'host.docker.internal:host-gateway' ``` Then while in the same folder as the `docker-compose.yml` run: ```sh docker compose up ``` To run the container in background add `-d` to the above command. You can learn more about using Docker by [reading the official Docker documentation](https://docs.docker.com/). ## Movies Movies can be added to a Jellyfin server using the "Movies" library type. ### Organization Movies should be organized into individual folders for each movie. The folder can optionally contain extra files. ```txt Movies β”œβ”€β”€ Best_Movie_Ever (2019) β”‚ β”œβ”€β”€ Best_Movie_Ever (2019).mp4 β”‚ β”œβ”€β”€ Best_Movie_Ever (2019).nfo β”‚ β”œβ”€β”€ Best_Movie_Ever (2019).en_us.srt β”‚ β”œβ”€β”€ cover.png β”‚ └── theme.mp3 └── Movie (2021) [imdbid-tt12801262] β”œβ”€β”€ backdrop.jpg └── VIDEO_TS β”œβ”€β”€ VIDEO_TS.BUP β”œβ”€β”€ VIDEO_TS.IFO β”œβ”€β”€ VIDEO_TS.VOB β”œβ”€β”€ VTS_01_0.BUP β”œβ”€β”€ VTS_01_0.IFO β”œβ”€β”€ VTS_01_0.VOB β”œβ”€β”€ VTS_01_1.VOB └── VTS_01_2.VOB ``` ### Naming The folder containing the movie should be named in the following format: ```txt Movie Name (year) [metadata provider id] ``` The `year` and `metadata provider id` fields are optional, but they will help identify media more reliably. The video files within the folder should have the same name as the folder. I.e. if the folder is named `Super Fun Movie`, the video file within should be named `Super Fun Movie.mp4` (or any other extension), optionally with tags defined below. - Example with name only: `Jellyfin Documentary.mkv` - Example with year: `Jellyfin Documentary (2030).mkv` - Example with metadata provider id: `Jellyfin Documentary [imdbid-tt00000000].mkv` - Example with both year and metadata provider id: `Jellyfin Documentary (2030) [imdbid-tt00000000].mkv` ## TV Shows TV Shows can be added to Jellyfin using the "Shows" library type. ### Organization Shows should be organized into series folders, then into season folders under each series. ```txt Shows β”œβ”€β”€ Series Name A (2010) β”‚ β”œβ”€β”€ Season 00 β”‚ β”‚ β”œβ”€β”€ Some Special.mkv β”‚ β”‚ β”œβ”€β”€ Series Name A S00E01.mkv β”‚ β”‚ └── Series Name A S00E02.mkv β”‚ β”œβ”€β”€ Season 01 β”‚ β”‚ β”œβ”€β”€ Series Name A S01E01-E02.mkv β”‚ β”‚ β”œβ”€β”€ Series Name A S01E03.mkv β”‚ β”‚ └── Series Name A S01E04.mkv β”‚ └── Season 02 β”‚ β”œβ”€β”€ Series Name A S02E01.mkv β”‚ β”œβ”€β”€ Series Name A S02E02.mkv β”‚ β”œβ”€β”€ Series Name A S02E03 Part 1.mkv β”‚ └── Series Name A S02E03 Part 2.mkv └── Series Name B (2018) β”œβ”€β”€ Season 01 | β”œβ”€β”€ Series Name B S01E01.mkv | └── Series Name B S01E02.mkv └── Season 02 β”œβ”€β”€ Series Name B S02E01-E02.mkv └── Series Name B S02E03.mkv ``` Each video file may contain multiple episodes. However, they will be shown as a single entry containing metadata from multiple episodes. It is recommended that the video files be split into individual episodes using a tool like [MKVToolNix](https://mkvtoolnix.download) ### Naming The series folder should be named in the following format: ```txt Series Name (year) [metadata provider id] ``` The `year` and `metadata provider id` fields are optional, but they will help identify media more reliably. - Example with name only: `Jellyfin Documentary.mkv` - Example with year: `Jellyfin Documentary (2030)` - Example with metadata provider id: `Jellyfin Documentary [imdbid-tt00000000]` - Example with both year and metadata provider id: `Jellyfin Documentary (2030) [imdbid-tt00000000]` The Season folders should be named `Season *`, with `*` being any number. Do not abbreviate the `Season` name to `S01` or `SE01`. For the best results, please pad the season number with `0`s at the front to make sure each entry has the same number of digits. For example: `Season 5` -> `Season 05`. Also do not mix Season folders with episodes in the Shows folder. --- 8< --- Page: DVD and Blu-ray ripping URL: https://sterndocs.hackclub.com/cloudfall/guides/ripping-dvds Source: content/cloudfall/guides/ripping-dvds.md Author: Archer Synced from sources: 2026-10-20 (scripts/sync-guides.mjs) Copied from: Wikipedia, "Ripping" by Wikipedia contributors, CC BY-SA 4.0 (Lead, the DVD and Blu-ray ripping section and parts of the Legality section copied verbatim. Revision of 2026-09-16.) Copied from: Wikipedia, "Content Scramble System" by Wikipedia contributors, CC BY-SA 4.0 (Lead copied verbatim. Revision of 2026-09-29.) Copied from: HandBrake Documentation, "About HandBrake" by HandBrake Team, CC BY-SA 4.0 (Copied verbatim; screenshots and platform markers removed, links made absolute. Upstream commit 3553ecc.) Copied from: HandBrake Documentation, "Supported source formats" by HandBrake Team, CC BY-SA 4.0 (Copied verbatim; screenshots and platform markers removed, links made absolute. Upstream commit 3553ecc.) Copied from: HandBrake Documentation, "Quick start" by HandBrake Team, CC BY-SA 4.0 (Copied verbatim; screenshots and platform markers removed, links made absolute. Upstream commit 3553ecc.) Ripping is the extraction of digital content from a container, such as a CD, onto a new digital form and location. Later, the term was applied to ripping WAV or MP3 files from digital audio CDs, and after that to the extraction of contents from any storage media, including DVD and Blu-ray discs, as well as the extraction of video game sprites. Ripping is often used to shift formats, and to edit, duplicate or back up media content. A rip is the extracted content, in its destination format, along with accompanying files, such as a cue sheet or log file from the ripping software. To rip the contents out of a container is different from simply copying the whole container or a file. When creating a copy, nothing looks into the transferred file, nor checks if there is any encryption or not, and a raw copy is also not aware of any file format. One can copy a DVD byte by byte via programs like the Linux dd command onto a hard disk, and play the resulting ISO file just as one would play the original DVD. ## DVD and Blu-ray ripping A DVD ripper or Blu-ray ripper is a computer program for copying DVD or Blu-ray discs to disc images. Disc images can then be used to back up or duplicate discs or to convert video to different formats. Some DVD/Blu-ray rippers can also edit or transcode video to different video file formats to reduce file size or for playback on other devices, such as portable media players or mobile phones. Many DVD/Blu-ray rippers can remove or circumvent several types of digital rights management (DRM) and copy protection applied to discs, including Content Scramble System (CSS), Advanced Access Content System (AACS), region codes, Analog Protection System, user operation prohibitions (UOPs), and ARccOS. However, not all software can remove all protections, and some protections may be difficult to circumvent, such as Cinavia. Common ripping software includes DVD Decrypter, DVD Shrink, and AnyDVD (see Comparison of DVD ripper software). AnyDVD is specialized software that can remove or circumvent many types of protections in the background; this is useful to allow media player software to play protected discs directly (without first copying them to a disc image) as well as to allow other software to access or copy protected discs. ### Circumvention of DVD copy protection In the case where media contents are protected using some effective copy protection scheme, the Digital Millennium Copyright Act (DMCA) of 1998 makes it illegal to manufacture or distribute circumvention tools and use those tools for infringing purposes. In the 2009 case RealNetworks v. DVD CCA, the final injunction reads, "while it may well be fair use for an individual consumer to store a backup copy of a personally owned DVD on that individual's computer, a federal law has nonetheless made it illegal to manufacture or traffic in a device or tool that permits a consumer to make such copies." This case made clear that manufacturing and distribution of circumvention tools was illegal, but use of those tools for non-infringing purposes, including fair use purposes, was not. The Library of Congress periodically issues rulings to exempt certain classes of works from the DMCA's prohibition on the circumvention of copy protection for non-infringing purposes. One such ruling in 2010 declared, among other things, that the Content Scramble System (CSS) commonly employed on commercial DVDs could be circumvented to enable non-infringing uses of the DVD's content. The Electronic Frontier Foundation (EFF) hailed the ruling as enabling DVD excerpts to be used for the well-established fair-use activities of criticism and commentary, and for the creation of derivative works by video remix artists. However, the text of the ruling says the exemption can only be exercised by professional educators and their students, not the general public. ## Content Scramble System The Content Scramble System (CSS) is a digital rights management (DRM) and encryption system employed on many commercially produced DVD-Video discs. CSS utilizes a proprietary 40-bit stream cipher algorithm. The system was introduced around 1996 and was first compromised in 1999. CSS is one of several complementary systems designed to restrict DVD-Video access. ## Legality When the material being ripped is not in the public domain, and the person making the rip does not have the copyright owner's permission, then such ripping may be regarded as copyright infringement. However, some countries either explicitly allow it in certain circumstances, or at least do not forbid it. Some countries also have fair use-type laws which allow unauthorized copies to be made under certain conditions. ### United States In the U.S., ripping a CD to a file or to another medium for your personal use is generally considered to be legal fair use. Sharing it with anyone else would be an illegal copyright violation. This was decided by the United States Court of Appeals for the Ninth Circuit in the case Recording Industry Ass'n of America v. Diamond Multimedia Systems, Inc., in response to the RIAA's efforts to prevent the sale of the first MP3 players. As a part of the court's ruling in favor of the manufacturer, Justice Blackmun cited Sony Corp. of America v. Universal City Studios, Inc., which established that time shifting was legal, and reasoned that the same principle of fair use also makes place shifting legal. See the DVD and Blu-ray ripping section for additional considerations when a disc is encrypted. ### Canada The Copyright Act of Canada generally says that it is legal to make a backup copy of any copyrighted work if the user owns or has a licence to use a copy of the work or subject-matter as long as the user does not circumvent a technological protection measure or give any of the reproductions away. This means that in most cases, ripping DVDs in Canada is most likely illegal. ### Europe A directive of the European Union allows its member nations to institute in their legal framework a private copy exception to the authors' and editors' rights. If a member State chooses to do so, it must also introduce compensation for the copyright holders. Most European countries, except for Norway, have introduced a private copying levy that compensates the owners directly from the country's budget. In 2009, the sum awarded to them was $55 million. In all but a few of these countries (exceptions include the UK and Malta), the levy is imposed on all machines and blank materials capable of copying copyrighted works. Under the directive, making copies for other people is forbidden, and if done for profit, can lead to a jail sentence. ### Australia and New Zealand In Australia and New Zealand a copy of any legally purchased music may be made by its owner, as long as it is not distributed to others and its use remains personal. In Australia, this was extended in 2006 to also include photographs and films. ## About HandBrake ### What HandBrake does not do HandBrake **does not**: - Combine multiple video clips into one - Pass-through video without conversion (video is *always* converted) - Create Blu-ray, AVCHD, or DVD discs - Make cocktails (yet) HandBrake also does not defeat or circumvent [copy protection](https://en.wikipedia.org/wiki/Copy_protection) of any kind. It does not work with video files employing [Digital Rights Management](https://en.wikipedia.org/wiki/Digital_rights_management) (DRM). This includes but is not limited to, copy protected content from iTunes, Amazon Video, Netflix, or other online providers, and many commercial DVD and Blu-ray discs. Applications such as [AnyDVD HD](https://en.wikipedia.org/wiki/AnyDVD) for Windows and [MakeMKV](https://www.google.com/search?q=makemkv&ie=utf-8&oe=utf-8) for Linux, Mac, and Windows can create copies of DVD and Blu-ray discs that HandBrake can open, reducing wear on the original discs and often fixing errors due to poorly mastered or otherwise broken discs.[^third-party-apps] Do not use HandBrake or any other application to copy materials you do not own or have the right to copy. If you are uncertain about your right to copy any material, you should contact your legal advisor. [^third-party-apps]: The HandBrake Team has no affiliation with these applications or their creators. If support is needed, please use their respective contact channels directly. ## Supported source formats ### DVD, Blu-ray, AVCHD/AVCHD Lite[^avchd-partial-support], and HD-DVD[^hddvd-partial-support] discs or disc backups HandBrake can directly open DVD and Blu-ray discs. In most situations it is better to first copy the contents to your computer's hard drive[^uncopyable]. Common folders are VIDEO_TS and BDMV. Common video file types are VOB, EVO, and MTS or M2TS. Certain third-party disc copy tools such as MakeMKV commonly make... wait for it... MKV video files. Other tools create ISO (sometimes labeled CDR) images of DVD and Blu-ray discs. HandBrake usually can open these directly. BIN+CUE, MDF+MDS, and Toast images must first be mounted. Open the image using your operating system or appropriate software, and then open the virtual disc with HandBrake. [^avchd-partial-support]: AVCHD and AVCHD Lite playlists are not fully supported. Individual files/streams may work. [^hddvd-partial-support]: HD-DVD playlists are not fully supported. Individual files/streams may work. [^uncopyable]: Without special software, it is not possible to directly copy VIDEO_TS and BDMV folders from copy-protected discs. ## Quick start ### Open your existing video HandBrake calls the video you already have the `Source`. Select the `Open Source` button on the toolbar to browse your files for a video to open. You may also drag your `Source` video onto HandBrake's main window. ### Select a title Some `Sources` may contain more than one video clip, or a collection of `Titles`. Use HandBrake's `Title` control to select which video clip you want to use. Some `Sources` have only one `Title`. Blu-ray and DVD `Sources` often have multiple `Titles`. ### Select a preset HandBrake provides a number of settings `Presets` to make your new video work well with your playback devices and software. For instance, if you have a PlayStation 4, you may wish to select the `Playstation 1080p30 Surround` preset under `Devices`. The default `Fast 1080p30` preset is often a good choice because it's fast and compatible with most devices. `Presets` can affect compatibility (whether your video will work with your devices and software) and encoding time. Learn more about [Selecting a preset](https://handbrake.fr/docs/en/latest/workflow/select-preset.html). ### Select a destination HandBrake calls the file name and location of your new video the `Destination`. `Save As` is the file name of your new video. You can change it by typing directly in the box. `To` is the location where HandBrake will place your new video. You can select the `Browse...` button to choose a different location. Please take special care to *note your destination*. Otherwise, you won't be able to find your new video. You can move it later if you desire. ### Start the encode Select the `Start` button on the toolbar to make your new video. HandBrake will report its progress while it's working and alert you when it's finished. Then you will have a new video file at the `Destination` you specified. Congratulations! You just encoded your first video using HandBrake. It's now ready to watch on your devices. Once the file exists, name it the way the media server expects: see [Movies](/cloudfall/guides/jellyfin#movies) and [TV Shows](/cloudfall/guides/jellyfin#tv-shows). --- 8< --- Page: Tube Archivist URL: https://sterndocs.hackclub.com/cloudfall/guides/tubearchivist Source: content/cloudfall/guides/tubearchivist.md Author: Archer Synced from sources: 2026-10-20 (scripts/sync-guides.mjs) Copied from: Tube Archivist Docs, home page by Tube Archivist contributors, GPL-3.0 (Welcome line and Getting Started list copied verbatim; icons removed. Upstream commit bb7ee4d.) Copied from: Tube Archivist Docs, "Setting up Tube Archivist with Docker" by Tube Archivist contributors, GPL-3.0 (Copied verbatim; the custom-port subsections left out, links made absolute. Upstream commit bb7ee4d.) Welcome to the official Tube Archivist Docs. This is an up-to-date documentation of user functionality. ## Getting Started 1. [Subscribe](https://docs.tubearchivist.com/channels/#channels-overview) to some of your favourite YouTube channels. 2. [Scan](https://docs.tubearchivist.com/downloads/#rescan-subscriptions) subscriptions to add the latest videos to the download queue. 3. [Add](https://docs.tubearchivist.com/downloads/#add-to-download-queue) additional videos, channels or playlist - ignore the ones you don't want to download. 4. [Download](https://docs.tubearchivist.com/downloads/#download-queue) and let **Tube Archivist** do it's thing. 5. Sit back and enjoy your archived and indexed collection! ## Setting up Tube Archivist with Docker ### Overview **Tube Archivist** depends on three containers: 1. The **Tube Archivist** container running the main application 2. Redis for queue and cache storage 3. ElasticSearch for your index. > [!NOTE] > All environment variables are documented at [installation/Environment Variables](https://docs.tubearchivist.com/installation/env-vars/). > [!NOTE] > Also see [installation/Docker for Beginners](https://docs.tubearchivist.com/installation/docker-for-beginners/) explaining some core concepts of docker and docker compose. **Tube Archivist** requires Docker. Please make sure that Docker is installed and running on your computer before continuing. Also see: - [faq/How do I install this natively?](https://docs.tubearchivist.com/faq/#how-do-i-install-this-natively) - [faq/Where is the .exe/.rpm/.pkg/.msi/<insert installer here>?](https://docs.tubearchivist.com/faq/#where-is-the-exerpmpkgmsiinsert-installer-here). For minimal system requirements, the **Tube Archivist** stack needs around 2GB of available memory for a small testing setup and around 4GB of available memory for a mid to large sized installation. Minimum requirements for CPU are usually expected to be dual core with 4 threads, with better performance coming from quad core and higher, and more available threads. > [!NOTE] > For **arm64**: **Tube Archivist** is built as a multi-architecture (multi-arch) container, same for Redis. Elasticsearch should use the official image for arm64 support. Other architectures are not supported. > [!WARNING] > **Untested** > ARM64 builds are essentially untested, as none of the devs have access to any ARM64 devices. There are regular unstable builds, for both architecture platforms. Help with testing to verify things are working as expected, also on ARM64. Save the [docker-compose.yml](https://github.com/tubearchivist/tubearchivist/blob/master/docker-compose.yml) file from the **Tube Archivist** repository somewhere permanent on your system, keeping it named `docker-compose.yml`. You'll need to refer to it whenever starting this application. ### Install **Tube Archivist** > [!NOTE] > All you really _need_ to configure is the [`TA_HOST`](https://docs.tubearchivist.com/installation/env-vars/#ta_host) environment variable. #### Networking The main container serves the interface on port `8000` with Nginx. Nginx is packaged in the container and serves the static files and handles proxy requests to the backend. - For port collisions, see [Docker for Beginners/#networking](https://docs.tubearchivist.com/installation/docker-for-beginners/#networking). - Alternatively to modify the port, see [Environment Variables/#TA_PORT](https://docs.tubearchivist.com/installation/env-vars/#ta_port) The React TS based frontend is compiled and served by Nginx from the `static` folder. The Python Django based backend is served with `uvicorn` on the container internal port `8080`. - Only container internal. Nginx handles proxying requests to the backend - To modify, see [Environment Variables/#TA_BACKEND_PORT](https://docs.tubearchivist.com/installation/env-vars/#ta_backend_port) #### Volumes This container expects two volumes: - `/cache`: That is not really a _cache_ any more now in the classical sense but holds persistent data like artwork and more. - `/youtube`: Location for your downloaded video files. ### Install **Redis** > [!CAUTION] > **BE AWARE** > Sharing the same Redis container between different projects is _not_ supported. Redis functions as a cache and temporary link between the application and the file system. Redis is used to store and display messages and configuration variables. Redis is also responsible for keeping track of the queues. - Communicate by default over port `6379` - Needs a volume to allow persistence at `/data`. ### Install **ElasticSearch** > [!TIP] > **Elasticsearch Version** > **Tube Archivist** depends on Elasticsearch 8. Use `bbilly1/tubearchivist-es` to automatically get the recommended version, or use the official image with the version tag in the `docker-compose.yml` file. Use the official Elasticsearch image for **arm64**. Elasticsearch stores the video metadata and enables searchable functionality for all fields. Elasticsearch is also used to keep track of the download queue. - Needs to be accessible over the default port `9200` - Needs a volume to store persistent data linked to `/usr/share/elasticsearch/data` Follow the [documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html) for additional installation details and options. --- 8< --- Page: Navidrome URL: https://sterndocs.hackclub.com/cloudfall/guides/navidrome Source: content/cloudfall/guides/navidrome.md Author: Archer Synced from sources: 2026-10-20 (scripts/sync-guides.mjs) Copied from: Navidrome documentation, "Navidrome Overview" by Navidrome contributors, Apache-2.0 (Copied verbatim; app catalog image removed, links made absolute. Upstream commit bf37b95.) Copied from: Navidrome documentation, "Installing with Docker" by Navidrome contributors, Apache-2.0 (Copied verbatim; links made absolute. Upstream commit bf37b95.) Navidrome can be used as a standalone server, that allows you to browse and listen to your music collection using a web browser. It can also work as a lightweight Subsonic-API compatible server, that can be used with any [Subsonic compatible client](https://www.navidrome.org/docs/overview/#apps). ## Features - Very **low resource usage**. Runs well even on simple Raspberry Pi Zero and old hardware setups - Handles very **large music collections** - Streams virtually **any audio format** available - Reads and uses all your beautifully curated **metadata** - Great support for **compilations** (Various Artists albums) and **box sets** (multi-disc albums) - **Multi-user**, each user has their own play counts, playlists, favorites, etc.. - **Multi-library** support with user-specific access controls to separate different music collections - **Multi-platform**, runs on macOS, Linux and Windows. **Docker** images are also provided - Ready to use, official, **Raspberry Pi** binaries and Docker images available - Automatically **monitors your library** for changes, importing new files and reloading new metadata - **Themeable**, modern and responsive **Web interface** based on [Material UI](https://material-ui.com) and [React-Admin](https://marmelab.com/react-admin/) - **Compatible** with all Subsonic/Madsonic/Airsonic clients. See below for a list of tested clients - **Transcoding** on the fly. Can be set per user/player. **Opus encoding is supported** - Translated to **34 languages** ([and counting](https://www.navidrome.org/docs/developers/translations/)) - Full support for **playlists**, with option to auto-import `.m3u` files and to keep them in sync - **Smart**/dynamic playlists (similar to iTunes). More info [here](https://github.com/navidrome/navidrome/issues/1417) - Scrobbling to **Last.fm**, **ListenBrainz** and **Maloja** (via custom ListenBrainz URL) - **Sharing** public links to albums/songs/playlists - **Externalized authentication** to use your own authentication service instead of Navidrome's built-in one - [Jukebox mode](https://www.navidrome.org/docs/usage/features/jukebox) allows playing music on an audio device attached to the server, and control from a client > [!NOTE] > Navidrome [**does not support**](https://www.navidrome.org/docs/faq/#-can-you-add-a-browsing-by-folder-optionmode-to-navidrome) > browsing by folders, but simulates it based on the tags with a structure like: > `/AlbumArtist/Album/01-Song.ext` ## Installing with Docker [Docker images](https://hub.docker.com/r/navidrome/navidrome) are available for the _linux/amd64_, _linux/arm/v6_, _linux/arm/v7_ and _linux/arm64_ platforms. They include everything needed to run Navidrome. ### Using `docker-compose` : Create a `docker-compose.yml` file with the following content (or add the `navidrome` service below to your existing file): ```yaml services: navidrome: image: navidrome/navidrome:latest user: 1000:1000 # must own the data folder and be able to read music folder(s). See Permissions below ports: - "4533:4533" restart: unless-stopped environment: # Optional: put your config options customization here. Examples: # ND_LOGLEVEL: debug volumes: - "/path/to/data:/data" - "/path/to/your/music/folder:/music:ro" ``` Start it with `docker-compose up -d`. Note that the environment variables above are just an example and are not required. The values in the example are already the defaults ### Using `docker` command line tool: ```shell $ docker run -d \ --name navidrome \ --restart=unless-stopped \ --user $(id -u):$(id -g) \ -v /path/to/music:/music \ -v /path/to/data:/data \ -p 4533:4533 \ -e ND_LOGLEVEL=info \ navidrome/navidrome:latest ``` ### Permissions The configurations above are examples. The IDs in them will not always match your machine, so adjust them before you start the container. Navidrome needs: - read **and write** access to `/data`, where it creates its database and cache - read access to `/music` Both must be granted to the `UID:GID` you put in the `user` directive. Run `id -u` and `id -g` to see the IDs of your own account, and `ls -n /path/to/your/music/folder` to see which IDs own your music. Whatever numbers you pick, use the same ones in the `user` directive and in the commands below. The two folders fail in different ways, so the logs tell you which one is wrong. #### The data folder is not writable Navidrome cannot create its database, and the container stops at startup: ``` level=error msg="Error applying PRAGMA optimize" error="unable to open database file: no such file or directory" panic: runtime error: invalid memory address or nil pointer dereference ``` Create the data folder and give it to the same user you run the container as: ```shell mkdir -p /path/to/data sudo chown -R $(id -u):$(id -g) /path/to/data ``` #### The music folder is not readable Navidrome starts and the web interface works, but your library stays empty. The logs show: ``` level=error msg="Error starting watcher" error="open /music: permission denied" lib=/music/... level=warning msg="Scanner: Target folder does not exist." error="open .: permission denied" path=. ``` The folder does exist, despite what the second message says. The container user just cannot open it. Give that user read and execute access, either by changing the owner: ```shell sudo chown -R $(id -u):$(id -g) /path/to/your/music/folder ``` or, if other programs also use the folder, by opening it for reading: ```shell sudo chmod -R a+rX /path/to/your/music/folder ``` Two things people often try that do not work: - **`PUID` and `PGID` have no effect.** Those variables are a [linuxserver.io](https://docs.linuxserver.io/general/understanding-puid-and-pgid/) convention. Navidrome's image ignores them. Use the `user` directive instead. - **Removing the `user` directive is not a fix.** The container then runs as `root`, which can write anywhere, so the error goes away. **Do not do this in production.** Fix the folder ownership instead. ### Customization - The `user` argument should reflect the `UID:GID` that owns the data folder and can read the music library. See [Permissions](#permissions) above. - Remember to change the `volumes` paths to point to your local paths. `/data` is where Navidrome will store its DB and cache, `/music` is where your music files are stored. For [multi-library setups](https://www.navidrome.org/docs/usage/features/multi-library/), you may need to mount additional volumes for each library. - [Configuration options](https://www.navidrome.org/docs/usage/configuration/options/) can be customized with environment variables as needed. For `docker-compose` just add them to the `environment` section or the yml file. For `docker` cli use the `-e` parameter. Ex: `-e ND_SESSIONTIMEOUT=24h`. - If you want to use a [configuration file](https://www.navidrome.org/docs/usage/configuration/options/#configuration-file) with Navidrome running in Docker, you can create a `navidrome.toml` config file in the `/data` folder and set the option `ND_CONFIGFILE=/data/navidrome.toml`. - If you use the [Jellyfin API](https://www.navidrome.org/docs/usage/features/jellyfin/) and want clients to find the server on your network, you must use host networking. See [Docker setup for auto-discovery](https://www.navidrome.org/docs/usage/features/jellyfin/#docker). --- 8< --- Page: Immich URL: https://sterndocs.hackclub.com/cloudfall/guides/immich Source: content/cloudfall/guides/immich.md Author: Archer Synced from sources: 2026-10-20 (scripts/sync-guides.mjs) Copied from: Immich documentation, "Quick start" by Immich contributors, AGPL-3.0 (Copied verbatim from the immich-app/immich repository docs; site components replaced with their text, links made absolute. Upstream commit fff2bd7.) Copied from: Immich documentation, "Requirements" by Immich contributors, AGPL-3.0 (Copied verbatim from the immich-app/immich repository docs; site components replaced with their text, links made absolute. Upstream commit fff2bd7.) Copied from: Immich documentation, "Docker Compose [Recommended]" by Immich contributors, AGPL-3.0 (Copied verbatim from the immich-app/immich repository docs; site components replaced with their text, links made absolute. Upstream commit fff2bd7.) Copied from: Immich documentation, "Post installation steps" by Immich contributors, AGPL-3.0 (Copied verbatim from the immich-app/immich repository docs; site components replaced with their text, links made absolute. Upstream commit fff2bd7.) Here is a quick, no-choices path to install Immich and take it for a test drive. Once you've tried it, you might use one of the many other ways to install and use it. ## Requirements - A system with at least 6GB of RAM and 2 CPU cores. - [Docker](https://docs.docker.com/engine/install/) > For a more detailed list of requirements, see the [requirements page](https://docs.immich.app/install/requirements). ### Hardware - **OS**: Recommended Linux or \*nix 64-bit operating system (Ubuntu, Debian, etc). - Non-Linux OSes tend to provide a poor Docker experience and are strongly discouraged. Our ability to assist with setup or troubleshooting on non-Linux OSes will be severely reduced. If you still want to try to use a non-Linux OS, you can set it up as follows: - Windows: [Docker Desktop on Windows](https://docs.docker.com/desktop/install/windows-install/) or [WSL 2](https://docs.docker.com/desktop/wsl/). - macOS: [Docker Desktop on Mac](https://docs.docker.com/desktop/install/mac-install/). - Immich runs well in a virtualized environment when running in a full virtual machine. The use of Docker in LXC containers is [not recommended](https://pve.proxmox.com/wiki/Linux_Container), but may be possible for advanced users. If you have issues, we recommend that you switch to a supported VM deployment. - **RAM**: Minimum 6GB, recommended 8GB. - **CPU**: Minimum 2 cores, recommended 4 cores. - Immich runs on the `amd64` and `arm64` platforms. Since `v3`, the machine learning container on `amd64` requires the `>= x86-64-v2` [microarchitecture level](https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels). Most CPUs released since ~2012 support this microarchitecture. If you are using a virtual machine, ensure you have selected a [supported microarchitecture](https://pve.proxmox.com/pve-docs/chapter-qm.html#_qemu_cpu_types). If you are unable to support this instruction set, the last version to support `x86-64-v1` is `v2.7.5`. Note that this release is no longer supported, and you must run a matching `immich-server` version. - **Storage**: Recommended Unix-compatible filesystem (EXT4, ZFS, APFS, etc.) with support for user/group ownership and permissions. - The generation of thumbnails and transcoded video can increase the size of the photo library by 10-20% on average. > [!NOTE] > **RAM requirements** > For a smooth experience, especially during asset upload, Immich requires at least 6GB of RAM. > For systems with only 4GB of RAM, Immich can be run with machine learning features disabled. > [!TIP] > **Postgres setup** > Good performance and a stable connection to the Postgres database is critical to a smooth Immich experience. > The Postgres database files are typically between 1-3 GB in size. > For this reason, the Postgres database (`DB_DATA_LOCATION`) should ideally use local SSD storage, and never a network share of any kind. > Additionally, if Docker resource limits are used, the Postgres database requires at least 2GB of RAM. > Windows users may run into issues with non-Unix-compatible filesystems, see below for more details. ### Software Immich requires [**Docker**](https://docs.docker.com/get-started/get-docker/) with the **Docker Compose plugin**: - **Docker Engine**: This CLI variant is designed for Linux servers (or Windows via WSL2). - **Docker Desktop**: This GUI variant is **not recommended** for Linux, but is available for Windows or macOS. The Compose plugin will be installed by both Docker Engine and Desktop by following the linked installation guides; it can also be [separately installed](https://docs.docker.com/compose/install/). > [!NOTE] > Immich requires the command `docker compose`; the similarly named `docker-compose` is [deprecated](https://docs.docker.com/retired/#docker-compose-v1-replaced-by-compose-v2) and is no longer supported by Immich. ## Set up the server ### Step 1 - Download the required files Create a directory of your choice (e.g. `./immich-app`) to hold the `docker-compose.yml` and `.env` files. ```bash title="Move to the directory you created" mkdir ./immich-app cd ./immich-app ``` Download [`docker-compose.yml`](https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml) and [`example.env`](https://github.com/immich-app/immich/releases/latest/download/example.env) by running the following commands: ```bash title="Get docker-compose.yml file" wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml ``` ```bash title="Get .env file" wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env ``` You can alternatively download these two files from your browser and move them to the directory that you created, in which case ensure that you rename `example.env` to `.env`. ### Step 2 - Populate the .env file with custom values ```bash title="Default environmental variable content" # You can find documentation for all the supported env variables at https://docs.immich.app/install/environment-variables # The location where your uploaded files are stored UPLOAD_LOCATION=./library # The location where your database files are stored. Network shares are not supported for the database DB_DATA_LOCATION=./postgres # To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List # TZ=Etc/UTC # The Immich version to use. You can pin this to a specific version like "v2.1.0" IMMICH_VERSION=v3 # Connection secret for postgres. You should change it to a random password # Please use only the characters `A-Za-z0-9`, without special characters or spaces DB_PASSWORD=postgres # The values below this line do not need to be changed ################################################################################### DB_USERNAME=postgres DB_DATABASE_NAME=immich ``` - Populate `UPLOAD_LOCATION` with your preferred location for storing backup assets. It should be a new directory on the server with enough free space. - Consider changing `DB_PASSWORD` to a custom value. Postgres is not publicly exposed, so this password is only used for local authentication. To avoid issues with Docker parsing this value, it is best to use only the characters `A-Za-z0-9`. `pwgen` is a handy utility for this. - Set your timezone by uncommenting the `TZ=` line. - Populate custom database information if necessary. ### Step 3 - Start the containers From the directory you created in Step 1 (which should now contain your customized `docker-compose.yml` and `.env` files), run the following command to start Immich as a background service: ```bash title="Start the containers" docker compose up -d ``` ## Try the web app The first user to register will be the admin user. The admin user will be able to add other users to the application. To register for the admin user, access the web application at `http://:2283` and click on the **Getting Started** button. Follow the prompts to register as the admin user and log in to the application. Try uploading a picture from your browser. ## Review the database backup and restore process Immich has built-in database backups. You can refer to the [database backup](https://docs.immich.app/administration/backup-and-restore) for more information. > [!CAUTION] > The database only contains metadata and user information. You must setup manual backups of the images and videos stored in `UPLOAD_LOCATION`. ## Setup Server Backups Now that you have imported some pictures, you should setup server backups to preserve your memories. You can do so by following our [backup guide](https://docs.immich.app/administration/backup-and-restore). > [!NOTE] > A 3-2-1 backup strategy is still crucial. The team has the responsibility to ensure that the application doesn’t cause loss of your precious memories; however, we cannot guarantee that hard drives will not fail, or an electrical event causes unexpected shutdown of your server/system, leading to data loss. Therefore, we still encourage users to follow best practices when safeguarding their data. Keep multiple copies of your most precious data: at least two local copies and one copy offsite in cold storage. --- 8< --- Page: Syncthing URL: https://sterndocs.hackclub.com/cloudfall/guides/syncthing Source: content/cloudfall/guides/syncthing.md Author: Archer Synced from sources: 2026-10-20 (scripts/sync-guides.mjs) Copied from: Wikipedia, "Syncthing" by Wikipedia contributors, CC BY-SA 4.0 (Lead, Technology and Configuration and management sections copied verbatim. Revision of 2026-09-10.) Syncthing is a peer-to-peer file synchronization utility, designed to sync files between devices on a local network or between remote devices over the Internet. It runs on Windows, macOS, Linux, Android, iOS, *BSD and illumos. The software is free and open source, and its version 1.0 was released in 2019 after 5 years in beta. The Syncthing server runs in the background as a daemon and provides a graphical user interface to the user for configuring the shared folders and devices. The interface is accessed in a web browser using the localhost address http://127.0.0.1:8384. Data security and safety are built into its design with all Syncthing data transfers encrypted using TLS. ## Technology Syncthing is written in Go and implements its own, likewise free Block Exchange Protocol. Syncthing is a BYO cloud model, running on user-provided hardware. It supports IPv6 and, for those on IPv4 networks, NAT punching and relays. Connecting a device requires explicit approval (except where the Introducer feature is used), which increases the security of the mesh. All data, whether transferred directly between devices or via relays, is encrypted using TLS. Conflicts are handled by renaming the older file with a "sync-conflict" suffix (along with time stamp), enabling the user to decide how to manage two or more files of the same name that have been changed between syncing. GUI wrappers can use these files to offer the user a method of resolving conflicts without having to resort to manual file handling. Efficient syncing is achieved via compression of metadata and all transfer data, block re-use, and lightweight scanning for changed files once a full hash has been computed and saved. Syncthing offers send-only and receive-only folder types, in which updates from remote devices are not processed, various types of file versioning (trash can, simple or staggered versioning, and handing versioning to an external program or script), and file/path ignore patterns. Two different SHA256 hash implementations are currently supported, the faster of which is used dynamically after a brief benchmark on startup. Moving and renaming files and folders is handled efficiently, without re-downloading existing data. ## Configuration and management Syncthing provides a web-based interface for configuring and monitoring the status, via a web browser either locally (localhost at default port 8384) or remotely (and supports access via proxy server). The interface allows users to choose and manage the folders for sharing and also the devices part of the synchronization. Every computer in Syncthing has a unique Device ID which is used for adding new devices to the syncing network with approval. Syncthing is currently directly available for Windows, macOS, Linux, FreeBSD, OpenBSD and illumos platforms. Some platforms no longer have provided prebuilt versions and must be manually compiled. There are also community-contributed Syncthing wrapper programs such as SyncTrayzor for Windows (which runs as a taskbar tray utility), Syncthing-Fork for Android and MΓΆbius Sync for iOS. An official Android client was available on the Google Play Store until 2024. For more advanced users, it is also possible to edit the Syncthing configuration file directly without using the interface or to use Syncthing using a command-line interface. Links to Docker images are also provided on the community contributions page, as well as links to supported configuration management solutions such as Puppet, Ansible and others. Official documentation: [docs.syncthing.net](https://docs.syncthing.net/). --- 8< --- Page: Minecraft server URL: https://sterndocs.hackclub.com/cloudfall/guides/minecraft-server Source: content/cloudfall/guides/minecraft-server.md Author: Archer Synced from sources: 2026-10-20 (scripts/sync-guides.mjs) Copied from: Wikipedia, "Minecraft server" by Wikipedia contributors, CC BY-SA 4.0 (Lead copied verbatim. Revision of 2026-10-17.) Copied from: PaperMC Documentation, "Getting started" by PaperMC and contributors, BSD-2-Clause (Copied verbatim; links made absolute, screenshots removed. Upstream commit eb798eb.) Copied from: PaperMC Documentation, "Updating" by PaperMC and contributors, BSD-2-Clause (Copied verbatim; links made absolute, screenshots removed. Upstream commit eb798eb.) Copied from: PaperMC Documentation, "Next steps" by PaperMC and contributors, BSD-2-Clause (Copied verbatim; links made absolute, screenshots removed. Upstream commit eb798eb.) Copied from: PaperMC Documentation, "Adding plugins" by PaperMC and contributors, BSD-2-Clause (Copied verbatim; links made absolute, screenshots removed. Upstream commit eb798eb.) Copied from: itzg/docker-minecraft-server, "Intro" by Geoff Bourne (itzg) and contributors, Apache-2.0 (Copied verbatim from docs/index.md; badges removed, links made absolute. Upstream commit 057d9c3.) A Minecraft server is a player or business-owned multiplayer game server for the 2011 Mojang Studios video game Minecraft. In this context, the term "server" often refers to a network of connected servers, rather than a single machine. Players can start their own server either by setting one up on a computer using software provided by Mojang, or by using a hosting provider so they can have their server run on dedicated machines with guaranteed uptime. The largest server is widely accepted to be the minigame server Hypixel, and previously, Mineplex. Minecraft multiplayer servers are controlled by server operators, who have access to server commands such as setting the time of day, teleporting players, setting the world spawn, and changing players' gamemode. The server owner (or users that have access to the live server files) can also set up and install plugins to change the mechanics of the server, and can also set up restrictions concerning which usernames or IP addresses are allowed or disallowed to enter the game server. Multiplayer servers have a wide range of activities: with some servers having unique premises, rules, and customs. Player versus player (PvP) combat can be enabled to allow fighting between players. Custom mods and plugins (server side mods) can be used with modified servers to allow actions that are not normally possible in the vanilla (unmodded) form of the game. There also exists a modification of the server software that can allow crossplay between the Java and Bedrock editions of the game. ## Getting started ### Requirements > [!TIP] > Paper requires at least **Java 25** to run, which [is easy to download and install](https://docs.papermc.io/misc/java-install). | Paper Version | Recommended Java Version | |-------------------|--------------------------| | 1.7.10 to 1.11 | Java 8 | | 1.12 to 1.16.4 | Java 11 | | 1.16.5 | Java 16 | | 1.17 to 1.19 | Java 17 | | 1.20 to 1.21.11 | Java 21 | | 26.1+ | Java 25 | ### Downloading Paper Paper provides runnable server JARs directly from our [website's downloads page](https://papermc.io/downloads/paper). Click on the build number to download a file. ### Running the server To run the server you will need to either create a startup script or run a command in your terminal. You can generate a startup script using our [Startup Script Generator](https://docs.papermc.io/misc/tools/start-script-gen). You can also obtain the optimized terminal command to run the server there. If you're just looking for a short command: ```bash java -Xms4G -Xmx4G -jar paper.jar --nogui ``` Ensure you navigated your terminal to the directory of your server and that you have replaced `paper.jar` with the name of the JAR you have downloaded. The amount of RAM can be set by changing the numbers in the `Xmx` and `Xms` arguments. `--nogui` disables Vanilla's GUI, so you don't get double interfaces when using the command line. To configure your server, see the [Global Configuration](https://docs.papermc.io/paper/reference/global-configuration) and [Per World Configuration](https://docs.papermc.io/paper/reference/world-configuration) pages. ## Updating Updating Paper is an important part of running every server. With new features and fixes coming every day, we recommend updating at least once per week to keep your server patched for the latest bugs. Installing updates is very simple, but it's important to know how to do it correctly. > [!CAUTION] > **Don't replace any JAR in a running server** > Unless you know exactly what and why you're doing what you're doing, it's never a good idea to > replace any JAR in a running server, be that plugins, or Paper itself. ### Step 1. Backup > [!TIP] > If you are using a shared host, your host may provide a built-in way to back up. Consult their > documentation before continuing. This is the most important step, and yet the most frequently skipped. While it is unlikely that updating Paper itself will cause any issues requiring you to restore from a backup, plugin malfunctions or other accidents might! Updating is a great time to work in a backup. Having functioning backups is essential to every server, big or small. The main things to back up are: - The world folders - Server Configuration Files - Plugin Configuration Files & Plugin JARs You should aim to have backups from multiple times, and keep them in a safe place. A common approach is to keep rolling backups, so you always have a certain number of backups from a set amount of time. ### Step 2. Update plugins Just like it's important to update Paper, it's equally important to keep plugins up to date. You never know what plugin authors may be working on, be it bugfixes or new features. A little known feature of Paper servers is the `update` folder. Here's how you use it. 1. Create a folder called `update` within the `plugins` folder. 2. One by one, download plugins you would like to update and put them in the `update` folder. 3. Restart your server, do not remove or modify any plugins outside the `update` folder. By doing this, you are able to update all of your plugins at the same time without having the server off, or replacing plugin JARs while the server is running. You do not need to restart your server before updating Paper itself. This feature allows you to update both Paper and plugins all at the same time, without needing any additional downtime. ### Step 3. Update Paper > [!TIP] > If you are using a shared host, your host may provide a built-in way to update! Consult their > documentation before continuing. Updating Paper itself is very simple. 1. Download a new JAR from [our downloads page](https://papermc.io/downloads). 2. Stop your server. It is not recommended and may cause issues to replace your Paper JAR while the server is running. 3. Rename the downloaded file to match the name specified in the [start command](https://docs.papermc.io/paper/getting-started#running-the-server). 4. Replace your old Paper JAR file with the new renamed one. 5. Start your server. Watch the startup log to ensure everything goes to plan. If there are any plugin conflicts or issues, you will see them here. To minimize downtime caused by updates, some server owners will, rather than replacing their server JAR, upload a new one and set their start script to use the new one on the next restart. Both of these are valid update strategies. > [!CAUTION] > **Automatic Updates** > While it may be convenient to install updates automatically (and Paper's [downloads service](https://docs.papermc.io/misc/downloads-service) allows you > to with ease), doing so is not recommended by Paper due to the possibility of plugin conflicts or > other issues that you may not know about. Always be present during updates, and keep a careful watch > on your server's log after the fact. > > If you do choose to automatically install updates, ensure you have a functioning backup strategy in > place! ## Next steps ### Security #### Whitelisting If you want to restrict who can join your server, you can use the whitelist feature. This allows you to specify who can join your server, and stops anyone else from joining. You can use the whitelist from the server console, or by editing the `whitelist.json` file in your server directory. #### Permissions Permissions are a way to control what players can and cannot do on your server. You can use permissions to restrict who can use certain commands, or who can access certain areas of your server. It is common for plugins to use permissions to control who can use their features. You can use permission plugins such as [LuckPerms](https://luckperms.net/) to manage the permissions which players will be granted. ### Backups It's important to keep backups of your server. If something goes wrong, you can restore your server to a previous state. We cover how to do this in the [Updating](https://docs.papermc.io/paper/updating) guide. ### Making your server public If you want to make your server public, you will need to port forward your server. This allows people from outside your network to connect to your server. There is a guide made by [NordVPN](https://nordvpn.com/blog/open-ports-on-router/) which explains what port forwarding is and how to do it for your Paper server. ## Adding plugins Plugins are the most powerful way to extend the functionality of Paper beyond the configuration files. Functionality added by plugins can range from making milk restore hunger or dead bushes grow, to adding entirely new and original game modes or items. > [!CAUTION] > **Malicious Plugins** > Ensure you fully trust the source of any plugin before installing it. Plugins are given **full and > unrestricted** access to not only your server but also the machine that it runs on. Because of this, > it is imperative that plugins only be installed from trusted sources. Be careful! ### Finding plugins Before installing a plugin, you'll need to find what you want to install. The best place to find plugins is [Hangar](https://hangar.papermc.io), Paper's plugin repository, but you can also find plugins on [Modrinth](https://modrinth.com/discover/plugins?g=categories:paper) or [BukkitDev](https://dev.bukkit.org/bukkit-plugins). Many plugins may release on [GitHub](https://github.com). Instead of checking each site directly, you can also use a search engine. Searching for the function you desire, followed by `Paper plugin` will often yield good results. ### Installing plugins 1. Once you've found the plugin you'd like to install, download it. Ensure the file you have downloaded ends in `.jar`. Some plugins also distribute as `.zip` files, in which case you will need to extract the file and locate the `.jar` for your platform, often labeled `bukkit` or `paper`. 2. Once you have the plugin downloaded locally, locate the `plugins` folder from the root directory of your Paper server. 3. Drag and drop the plugin file (`.jar`) into the `plugins` folder. If you are using a shared hosting service, you may need to use their web panel or SFTP to upload the plugin; however, the procedure will be the same. 4. Restart your server. The plugin should load. 5. Check your work. Once the server has finished loading, run the `/plugins` command in-game or type `plugins` into the console. You should see your freshly installed plugin listed in green. If it is not listed or is colored red, continue to [troubleshooting](https://docs.papermc.io/paper/adding-plugins#troubleshooting). A plugin listed in red means that it is not currently enabled. For a freshly installed plugin, this often means that the plugin failed to load. ## itzg/docker-minecraft-server This docker image provides a Minecraft Server that will automatically download the latest stable version at startup. You can also run/upgrade to any specific version or the latest snapshot. See the _Versions_ section below for more information. To simply use the latest stable version, run docker run -d -it -p 25565:25565 -e EULA=TRUE itzg/minecraft-server where, in this case, the standard server port 25565 will be exposed on your host machine. > [!IMPORTANT] > **Persistent Data** > The Minecraft server will store its data in the container's `/data` directory. This directory can be [mounted](https://docs.docker.com/storage/volumes/) from the host machine or a managed volume. > > Using `docker run` add a `-v` option somewhere before the image name: > > ``` > ... -v /path/on/host:/data itzg/minecraft-server > ``` > > Using docker compose, add a `volumes` section to the service definition: > > ```yaml > services: > mc: > # ... image and environment section > volumes: > # attach the relative directory 'data' to the container's /data path > - ./data:data > ``` > [!NOTE] > If you plan on running a server for a longer amount of time it is highly recommended using a management layer such as [Docker Compose](#using-docker-compose) or [Kubernetes](https://docker-minecraft-server.readthedocs.io/en/latest/misc/deployment/#on-kubernetes) to allow for incremental reconfiguration and image upgrades. > [!NOTE] > Be sure to always include `-e EULA=TRUE` in your commands and container definitions, as Mojang/Microsoft requires EULA acceptance. By default, the container will download the latest version of the "vanilla" [Minecraft: Java Edition server](https://www.minecraft.net/en-us/download/server) provided by Mojang. The [`VERSION`](https://docker-minecraft-server.readthedocs.io/en/latest/versions/minecraft/) and the [`TYPE`](https://docker-minecraft-server.readthedocs.io/en/latest/types-and-platforms/) can be configured to create many variations of desired Minecraft server. ### Using [Docker Compose](https://docs.docker.com/compose/) 1. Create a new directory 2. Put the contents of the file below in a file called `compose.yaml` 3. Run `docker compose up -d` in that directory 4. Done! Point your client at your host's name/IP address and port 25565. ```yaml title="compose.yaml" services: mc: image: itzg/minecraft-server:latest pull_policy: daily tty: true stdin_open: true ports: - "25565:25565" environment: EULA: "TRUE" volumes: # attach the relative directory 'data' to the container's /data path - ./data:/data ``` To apply changes made to the compose file, just run `docker compose up -d` again. Follow the logs of the container using `docker compose logs -f`, check on the status with `docker compose ps`, and stop the container using `docker compose stop`. --- 8< --- Page: Pi-hole URL: https://sterndocs.hackclub.com/cloudfall/guides/pi-hole Source: content/cloudfall/guides/pi-hole.md Author: Archer Synced from sources: 2026-10-20 (scripts/sync-guides.mjs) Copied from: Wikipedia, "Pi-hole" by Wikipedia contributors, CC BY-SA 4.0 (Lead copied verbatim. Revision of 2026-08-27.) Copied from: Pi-hole documentation, "Prerequisites" by Pi-hole LLC and contributors, CC BY-SA 4.0 (Hardware, IP Addressing and Ports copied verbatim; links made absolute. Upstream commit 51512c2.) Copied from: Pi-hole documentation, "Docker" by Pi-hole LLC and contributors, CC BY-SA 4.0 (Quick-start section copied verbatim. Upstream commit 51512c2.) Copied from: Pi-hole documentation, "Installation" by Pi-hole LLC and contributors, CC BY-SA 4.0 (One-Step Automated Install copied verbatim. Upstream commit 51512c2.) Copied from: Pi-hole documentation, "Post-Install" by Pi-hole LLC and contributors, CC BY-SA 4.0 (First section copied verbatim. Upstream commit 51512c2.) Pi-hole is a Linux network-level advertisement and Internet tracker blocking application which acts as a DNS sinkhole and optionally a DHCP server, intended for use on a private network. It is designed for low-power embedded devices with network capability, such as the Raspberry Pi, but can be installed on almost any Linux system. As well as importing externally prepared blocklists, Pi-hole can be configured to block specific websites or apply parental controls. ## Prerequisites ### Hardware Pi-hole is very lightweight and does not require much processing power - Min. 2GB free space, 4GB recommended - 512MB RAM > [!NOTE] > A Pi-hole branded kit, including everything you need to get started, can be purchased from The Pi Hut, [here](https://thepihut.com/products/official-pi-hole-raspberry-pi-4-kit). Despite the name, you are not limited to running Pi-hole on a Raspberry Pi. Any hardware that runs one of the supported operating systems will do! ### IP Addressing Pi-hole needs a static IP address to properly function (a DHCP reservation is just fine). ### Ports | Service | Port | Protocol | Notes | | -------------------- | ------------- | --------- | -------------------- | | pihole-FTL | 53 (DNS) | TCP/UDP | If you happen to have another DNS server running, such as BIND, you will need to turn it off in order for Pi-hole to respond to DNS queries. | | pihole-FTL | 67 (DHCP) | IPv4 UDP | The DHCP server is an optional feature that requires additional ports. | | pihole-FTL | 547 (DHCPv6) | IPv6 UDP | The DHCP server is an optional feature that requires additional ports. | | pihole-FTL | 80 (HTTP)
443 (HTTPS) | TCP | If you have another webserver already listening on port `80`/`443`, then `pihole-FTL` will attempt to bind to `8080`/`8443` instead. If neither of these ports are available, `pihole-FTL`'s webserver will be unavailable until ports are configured manually (see configuration option `webserver.port`) | | pihole-FTL | 123 (NTP) | UDP | The NTP server is an optional feature that requires an additional port. | > [!NOTE] > The use of pihole-FTL on ports _67_ or _547_ is optional, but required if you use the DHCP functions of Pi-hole. > The use of port _123_ is required when using pihole-FTL as NTP-Server. ## Docker The easiest way to get up and running with Pi-hole on Docker is to use our quick-start `docker-compose.yml` template. Copy the below [Docker Compose](https://docs.docker.com/compose/) example and customize as needed ```yaml # More info at https://github.com/pi-hole/docker-pi-hole/ and https://docs.pi-hole.net/ services: pihole: container_name: pihole image: pihole/pihole:latest ports: # DNS Ports - "53:53/tcp" - "53:53/udp" # Default HTTP Port - "80:80/tcp" # Default HTTPs Port. FTL will generate a self-signed certificate - "443:443/tcp" # Uncomment the below if using Pi-hole as your DHCP Server #- "67:67/udp" # Uncomment the line below if you are using Pi-hole as your NTP server #- "123:123/udp" environment: # Set the appropriate timezone for your location from # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones, e.g: TZ: 'Europe/London' # Set a password to access the web interface. Not setting one will result in a random password being assigned FTLCONF_webserver_api_password: 'correct horse battery staple' # If using Docker's default `bridge` network setting the dns listening mode should be set to 'ALL' FTLCONF_dns_listeningMode: 'ALL' # Volumes store your data between container upgrades volumes: # For persisting Pi-hole's databases and common configuration file - './etc-pihole:/etc/pihole' # Uncomment the below if you have custom dnsmasq config files that you want to persist. Not needed for most starting fresh with Pi-hole v6. If you're upgrading from v5 you and have used this directory before, you should keep it enabled for the first v6 container start to allow for a complete migration. It can be removed afterwards. Needs environment variable FTLCONF_misc_etc_dnsmasq_d: 'true' #- './etc-dnsmasq.d:/etc/dnsmasq.d' cap_add: # See https://docs.pi-hole.net/docker/configuration/#note-on-capabilities # Required if you are using Pi-hole as your DHCP server, else not needed - NET_ADMIN # Required if you are using Pi-hole as your NTP client to be able to set the host's system time - SYS_TIME # Optional, if Pi-hole should get some more processing time - SYS_NICE restart: unless-stopped ``` Run `docker compose up -d` to build and start Pi-hole (on older systems, the syntax here may be `docker-compose up -d`) The equivalent command for `docker run` would be: ```bash docker run --name pihole -p 53:53/tcp -p 53:53/udp -p 80:80/tcp -p 443:443/tcp -e TZ=Europe/London -e FTLCONF_webserver_api_password="correct horse battery staple" -e FTLCONF_dns_listeningMode=all -v ./etc-pihole:/etc/pihole -v ./etc-dnsmasq.d:/etc/dnsmasq.d --cap-add NET_ADMIN --restart unless-stopped pihole/pihole:latest ``` ## One-Step Automated Install Those who want to get started quickly and conveniently may install Pi-hole using the following command: ```bash curl -sSL https://install.pi-hole.net | bash ``` > [!NOTE] > [Piping to `bash` is a controversial topic](https://pi-hole.net/2016/07/25/curling-and-piping-to-bash/), as it prevents you from [reading code that is about to run](https://github.com/pi-hole/pi-hole/blob/master/automated%20install/basic-install.sh) on your system. > > If you would prefer to review the code before installation, we provide these alternative installation methods. ## Making your network take advantage of Pi-hole Once the installer has been run, you will need to [configure your router to have **DHCP clients use Pi-hole as their DNS server**](https://discourse.pi-hole.net/t/how-do-i-configure-my-devices-to-use-pi-hole-as-their-dns-server/245) which ensures all devices connected to your network will have content blocked without any further intervention. If your router does not support setting the DNS server, you can [use Pi-hole's built-in DHCP server](https://discourse.pi-hole.net/t/how-do-i-use-pi-holes-built-in-dhcp-server-and-why-would-i-want-to/3026); just be sure to disable DHCP on your router first (if it has that feature available). As a last resort, you can manually set each device to use Pi-hole as its DNS server. --- 8< --- Page: Devlogs and hours URL: https://sterndocs.hackclub.com/cloudfall/devlogs-and-hours Source: content/cloudfall/devlogs-and-hours.md Author: Archer Software hours come from Hackatime, unfortantely we run into situations where we can't use hackatime. That's what devlogs are for. You only get rewarded hours for the hours we see you work. That's why we created [lapse](https://Lapse.hackclub.com). Use lapse to log your hours, and enter the url into the devlogs on the site. You may need to create a project first before creating devlogs. ## How hours are counted Hackatime watches your editor and reports which project you're working on. It only tracks hour you've worked since setting it up, which is why [getting set up first](/cloudfall/getting-started) matters so much. What counts: - Time in your editor on the project you submit. - Time spent on the parts that aren't code, when you're editing files configs, compose files, documentation. What doesn't: - Time before the plugin was installed. - Time on a different project, even a related one. - Reading, planning, and thinking away from the keyboard. Real work, uncounted work. > [!IMPORTANT] > At most **30%** of the project can be AI-assisted, and you only get credit for > hours you actually worked. This is checked, and it's the fastest way to have a > submission rejected outright. ## Devlogs A devlog is a short post about what you just did. Write one when you finish something tracked by [lapse](https://lapse.hackclub.com), not on a schedule: - **What you built.** One or two sentences. - **A link.** A link to a video of you working. Good devlogs are short, specific and frequent. "Got the transcoder working turns out the container needed `/dev/dri` passed through for hardware decoding" is worth ten times "worked on video stuff today". They also make reviews easier and faster, when you've written eight devlogs, your project description writes itself. If you ever need any help with devlogs you should check the [slack channel](https://hackclub.slack.com/channels/ysws-cloudfall) --- 8< --- Page: Submitting your project URL: https://sterndocs.hackclub.com/cloudfall/submitting Source: content/cloudfall/submitting.md Author: Archer Submissions go through the program's own pages on stern. The join button in the header leads there. This page is what to have ready before you start filling that form in. ## The checklist - **It replaces something proprietary.** Name the subscription or paid product in your project description. - **It's new.** Built during this round. You can't resubmit a project, or the hours behind it, from another YSWS. NO DOUBLE DIPPING - **Hours are tracked.** In Hackatime or Lapse, on the project you're submitting. - **It's open.** Public GitHub repo, permissive licence, README with images, and it stays up permanently. - **It runs.** A live link a reviewer can open. Self-hosted only? Then a repo and a Docker container see [Package it so it runs](/cloudfall/packaging). - **It's yours.** Not a tutorial followed step for step, not someone else's project with the colours changed. At most 30% AI-assisted. If you built a tutorial please reach out in the slack for advice on how to make it yours. ## Before you submit, in this order 1. **Clone it fresh and start it.** `/tmp`, no cached env, no local database. This catches the uncommitted file. 2. **Open your own live link** in a private window. 3. **Read your README as a stranger.** Does it say what this replaces, in the first sentence? 4. **Check your Hackatime total** against the project you're about to submit. 5. **Check the licence file exists.** Not "MIT" in the README an actual `LICENSE` file. 6. **Check the header.** If it says the round is closed, submissions aren't being accepted; ask in the channel about the next one. ## What happens next A reviewer opens your links and runs down [the same checks](/cloudfall/review). If something's missing, it comes back with notes, and fixing and resubmitting is expected, not a strike against you. > [!TIP] > Submit before the last day. A submission that comes back with notes on the > final afternoon leaves you no time to fix it; the same notes a week out cost > you an hour. --- 8< --- Page: What reviewers check URL: https://sterndocs.hackclub.com/cloudfall/review Source: content/cloudfall/review.md Author: Archer Six checks, every submission. Miss one and it comes back with notes; fix it and resubmit. Nothing here is a judgement call about whether your project is impressive these are the things that are either true or not. ## Replaces something proprietary It stands in for something people pay for, or something closed you'd rather have open. **Name it in your project description.** Hardware counts, as long as it's beneficial to a homelab or on-prem setup even indirectly. An antenna that pulls in public radio channels and streams them is a CloudFALL project, but a generic aliexpress antenna in a jellyfin lab is not. Hardware should come from you. ## Built new, during this round No resubmitting a project from another YSWS. A project you started earlier can inspire this one; it can't _be_ this one. ## Hours tracked Every hour in Hackatime/Lapse, linked to the project you submit. Untracked time can't be counted, and at most 30% of the work can be AI-assisted. ## Open source, permanently - Public GitHub repo. - A permissive licence, as a `LICENSE` file. - A README with images. - It stays up. Deleting the repo after review is not how this works. ## It runs A live link a reviewer can open and use. If it's self-hosted only, ship a repo and a Docker container so the reviewer can start it themselves. See [Package it so it runs](/cloudfall/packaging). ## It's your own work Not a tutorial followed step for step. Not somebody else's project with the colours changed. Using libraries, base images and other people's Compose files is normal engineering passing off someone else's project as yours is not. But something only you can build/only you want. ## If it comes back You'll get notes naming the specific check that failed. Fix that thing and resubmit; there's no penalty for a resubmission. If the notes don't make sense, ask in **#ysws-CloudFALL** reviewers are in there, and "I don't understand this note" is a completely reasonable message. --- 8< --- Page: FAQ URL: https://sterndocs.hackclub.com/cloudfall/faq Source: content/cloudfall/faq.md Author: Archer ## Do I need to own a server? No. An old laptop, a Raspberry Pi, or the desktop nobody uses is enough see [Self-hosting basics](/cloudfall/self-hosting-basics). You can also develop against a hosted service and ship a container someone else can run. ## Can I work in a team? Ask in **#ysws-CloudFALL** before you plan around it. Hours are tracked per person, so a team submission needs to be clear about who did what. ## Does installing an existing tool count? Not on its own somebody already built Jellyfin. Build something around the problem: the missing client, the migration tool, the glue between services, or a subscription nobody has replaced yet. [Pick a project](/cloudfall/pick-a-project) goes into this. ## How much AI help can I use? At most 30% of the project, and you only get credit for hours you actually worked. It's checked. and No claude cannot share the hours it earned with you! ## My hours are wrong / Hackatime stopped reporting Say so in the channel while it's recent. It's fixable then and effectively not fixable at submission time. ## Can I submit something I started before the round? No. It has to be built new during this round, and you can't bring hours from a previous project or another YSWS. No double dipping ## What if my project is hardware? That's in scope, as long as it's useful to a homelab or on-prem setup, even indirectly. Same rules: open source means schematics and firmware too, and the documentation has to be good enough that someone else could build it. ## Does the round end at a specific time? The countdown in the header is the authority it reads the program directly. When it runs out, submissions close, note some execptions may be made so you should always ask before assuming it's over. ## Something on this page is wrong Fix it. Every page here is a markdown file, and **Suggest an edit** at the bottom of a page opens a pull request against it. [How to edit these docs](/cloudfall/contributing). --- 8< --- Page: How to edit these docs URL: https://sterndocs.hackclub.com/cloudfall/contributing Source: content/_shared/contributing.md Author: Archer If a page here is wrong, unclear, or missing the thing you spent an hour working out, you can fix it. These docs live in one public repo **[AD-Archer/stern-docs](https://github.com/AD-Archer/stern-docs)** alongside the docs for every other Archer program on Stern. It's markdown inside of a content folder. ## The fast way, from the browser 1. Scroll to the bottom of the page that's wrong. 2. Click **Suggest an edit**. GitHub opens that page's markdown file in an editor. 3. Make the change. If you don't have write access, GitHub forks the repo for you automatically that's expected. 4. Write one line about what you changed and click **Propose changes**, then **Create pull request**. That's it. A maintainer reviews it, and when it merges the site updates itself. ## The local way ```bash git clone https://github.com/AD-Archer/stern-docs cd stern-docs pnpm install pnpm dev # http://localhost:3000 ``` Each program's pages live in `content//` CloudFALL's in `content/cloudfall/`, and every other program in a folder beside it. Pages that belong to no single program, like this one, live in `content/_shared/` and are served under every program. Edit a `.md` file, save, and the page reloads. ## What a page looks like ```markdown --- title: Getting started description: One sentence, used in search results and on the share card. group: start order: 1 --- Body text, in markdown. ``` | Field | What it does | | ------------- | ---------------------------------------------------------------------------------------------------------------- | | `title` | Heading, sidebar label, browser tab, share card | | `description` | The lede under the title, plus search and social previews | | `group` | Which section of the sidebar it appears in must match an `id` in `docs.json` | | `order` | Position within the section; ties break alphabetically | | `hidden` | `true` keeps it out of the nav and search, but the URL still works good for a draft you want to share for review | | `author` | Who wrote the page. Falls back to the site's author | | `sources` | Where copied text came from: a list of `label`, `href`, `author`, `note`. Rendered at the foot of the page | Filenames become URLs: `content/cloudfall/getting-started.md` is `/cloudfall/getting-started`. A folder's `index.md` is the folder's own page. ## Things markdown gives you here Callouts, using GitHub's own alert syntax so they look right in the pull request diff too: ```markdown > [!NOTE] > Useful context that isn't a warning. > [!WARNING] > The thing that will cost someone an afternoon. ``` Code blocks with a filename label: ````markdown ```yaml title="docker-compose.yml" services: app: build: . ``` ```` Tables, task lists, footnotes anything GitHub-flavoured markdown supports. ## A few notes - **Write for the person who's stuck**, not for the person who already knows. - **Be specific.** Port numbers, exact commands, real file names. - **Don't put dates or deadlines in prose.** They come from the program itself and show in the header and sidebar; a hardcoded date is a page that lies later. - **Keep it short.** If a page needs eight headings, it's probably two pages. - **Write it yourself.** Pages here are written by people who've done the thing. Generated prose reads fine and says nothing, and it gets rejected. ## Adding a whole new program's docs Make a folder under `content/`, add a `docs.json` and an `index.md`, and the site does the rest routes, navigation, search, share cards, and a palette pulled from that program's own artwork. --- 8< --- Page: Who we are URL: https://sterndocs.hackclub.com/cloudfall/about Source: content/cloudfall/about.md Author: Archer Copied from: cloudfall.hackclub.com, "Who we are", "Never run a server before?" and "Where teens make cool stuff." by Archer (Copied verbatim from src/App.svelte and src/lib/data.js (WHO, HACK_CLUB) in AD-Archer/cloudFALL) Copied from: Hack Club YSWS Catalog, the CloudFall entry by Hack Club (Copied verbatim from data.yml in hackclub/YSWS-Catalog, shown at ysws.hackclub.com) - run by teenagers - free to enter - open source only A Hack Club YSWS, part of the [Archer](https://hackclub.enterprise.slack.com/archives/C0BHZLZF8BX) program. Made by teenagers, for teenagers. Content served live from [Stern](https://stern.hackclub.com/a/cloudfall/home). ## Never run a server before? You don't have to, using our slack channel and the docs we can teach you how to turn an old device into a server, and how to selfhost. Let's get away from paying for things we don't own The docs are open to everyone to learn, only teens 13-18 can compete but anyone can follow along. [Read the docs](/cloudfall/self-hosting-basics) ## Where teens make cool stuff. Hack Club is the world's largest nonprofit movement of teenagers making cool projects. Clubs in a thousand schools, hackathons on trains and in ferry terminals, and dozens of You Ship We Ship programs like this one, all of it run by and for teenagers. [What is Hack Club?](https://hackclub.com) ## In the Hack Club YSWS Catalog Create an open source solution to subscriptions like the gym, Netflix, Spotify and receive a server for yourself. CloudFall challenges you to replace a subscription you pay for, like the gym, Netflix, or Spotify, with an open source solution of your own. Log your coding time with Hackatime, post devlogs as you build, then ship your project for review and spend your approved hours on prizes in the shop, including a server for yourself. 1. Join #ysws-cloudfall and sign in with your Hack Club account on Stern. 2. Link Hackatime so your coding hours count themselves, and post devlogs as you build. 3. Ship your project for review with a repo, demo, and a couple of screenshots. 4. Spend your approved hours on prizes in the shop. - Online-only - Project types: Software, Websites --- 8< --- Page: Credits URL: https://sterndocs.hackclub.com/cloudfall/credits Source: content/_shared/credits.md Author: Archer TODO: one or two lines, by a person, on the rule this page exists for: every sentence on this site is hand-written by someone named, or copied verbatim from a source named at the foot of the page. | What | Source | By | Terms | | --- | --- | --- | --- | | Hack Club flag and icon | [hackclub.com/brand](https://hackclub.com/brand) | Hack Club | Official marks, used unmodified | | IBM Plex Sans, Sans Condensed and Mono | [github.com/IBM/plex](https://github.com/IBM/plex) | IBM | SIL Open Font License 1.1 | | Program name, dates, artwork and round status in the header | [stern](https://stern.hackclub.com) | Hack Club | Read live from stern's public API | | The sky band, the hand-drawn horizon and the mascot's poses | [AD-Archer/cloudFALL](https://github.com/AD-Archer/cloudFALL) | Archer | Drawn for the CloudFALL site by Shimo, reused here | | This site | [AD-Archer/stern-docs](https://github.com/AD-Archer/stern-docs) | Archer | Every change is a pull request | | The text of each page | The **Sources** block at the foot of that page | | | | Guides copied from Wikipedia, HandBrake and Pi-hole | [Wikipedia](https://en.wikipedia.org), [HandBrake Documentation](https://handbrake.fr/docs/), [Pi-hole documentation](https://docs.pi-hole.net) | Their contributors | CC BY-SA 4.0. Those pages are shared under the same licence | | Jellyfin install and naming guides | [jellyfin.org/docs](https://jellyfin.org/docs/) | Jellyfin contributors | CC BY-ND 4.0, copied whole and unchanged | | Docker concept guides | [docs.docker.com](https://docs.docker.com) | Docker, Inc. and contributors | Apache-2.0 | | Paper server guides | [docs.papermc.io](https://docs.papermc.io) | PaperMC and contributors | BSD-2-Clause | | Minecraft in Docker | [itzg/docker-minecraft-server](https://github.com/itzg/docker-minecraft-server) | Geoff Bourne and contributors | Apache-2.0 | | Immich install guide | [docs.immich.app](https://docs.immich.app) | Immich contributors | AGPL-3.0 | | Navidrome guides | [navidrome.org/docs](https://www.navidrome.org/docs/) | Navidrome contributors | Apache-2.0 | | Tube Archivist guides | [docs.tubearchivist.com](https://docs.tubearchivist.com) | Tube Archivist contributors | GPL-3.0 | | Hardlinks guide | [TRaSH Guides](https://trash-guides.info) | TRaSH-Guides contributors | MIT | | The BitTorrent protocol specification | [BEP 3](https://www.bittorrent.org/beps/bep_0003.html) | Bram Cohen | Public domain | | Self-hosting introduction | [Self-Hosting Guide](https://github.com/mikeroyal/Self-Hosting-Guide) | Mike Royal | CC BY 4.0 | | Keeping the guides current | [scripts/sync-guides.mjs](https://github.com/AD-Archer/stern-docs/blob/main/scripts/sync-guides.mjs), run weekly | | Regenerates every guide from its sources and opens a pull request when upstream changed |