> For the complete documentation index, see [llms.txt](https://docs.cstplus.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.cstplus.org/documentation/getting-started/getting-started.md).

# Getting started

CST+ runs as a set of Node.js services managed by systemd. All processing happens locally on your server: no cloud dependency, no external database, no containers required.

### Supported operating systems

| OS     | Versions                     |
| ------ | ---------------------------- |
| Ubuntu | 22.04 LTS, 24.04 LTS         |
| Debian | 11 (Bullseye), 12 (Bookworm) |

Both x86\_64 (Intel/AMD) and aarch64 (ARM64) are supported. 32-bit systems are not supported.

> CST+ is tested on Ubuntu 24.04 LTS. If you have a choice, use it.

### Hardware minimums

| Resource | Minimum        | Recommended                               |
| -------- | -------------- | ----------------------------------------- |
| CPU      | 2 cores        | 4+ cores                                  |
| RAM      | 1 GB           | 2 GB or more                              |
| Disk     | 20 GB          | 100 GB+ (depends on your content library) |
| Network  | 10 Mbps upload | 100 Mbps+ for multiple channels           |

**Per-channel cost at runtime is very low.** Once content is rendered, each active channel uses roughly 1-2% of one CPU core and about 54 MB of RAM for the playback loop. Most of the CPU budget goes to the one-time render step.

Disk usage is mostly your content. A single rendered 720p channel with 8 hours of content occupies roughly 10-25 GB depending on source quality.

### Software requirements

CST+ installs its own dependencies automatically. You do not need to pre-install anything except `curl`. The installer handles the rest.

What gets installed:

* **ffmpeg** (6.0 or newer): used for rendering and the live playback loop
* **Node.js 20 LTS**: the runtime for all CST+ services

If ffmpeg or Node are already present on the system, the installer will use them as long as they meet the version requirements.

### Network ports

The following ports are used by CST+ services. Make sure they are open in your firewall if you plan to expose them externally.

| Port | Service                        | Access                                   |
| ---- | ------------------------------ | ---------------------------------------- |
| 3000 | Admin panel                    | Your browser (or behind a reverse proxy) |
| 8080 | Stream edge (HLS, Xtream, EPG) | Viewers and IPTV apps                    |
| 4455 | Control plane API              | Localhost only (not exposed externally)  |
| 4456 | Edge admin                     | Localhost only (not exposed externally)  |

Ports 4455 and 4456 are internal and bound to `127.0.0.1`. You do not need to open them.

### Root access

The installer requires root (or `sudo`) to:

* Install system packages (ffmpeg, Node.js, curl)
* Register systemd services
* Write to `/opt/cstplus/` and `/usr/local/bin/`

After installation, the services run under the root user. A future version will support running under a dedicated system user.

### VPS and cloud compatibility

CST+ works on any KVM or dedicated VPS. Containers (LXC/OpenVZ) and shared hosting are not supported due to systemd requirements.

Tested and confirmed working on:

* Hetzner Cloud (CX series)
* Contabo VPS
* DigitalOcean Droplets

### Optional: GPU acceleration

If your server has an NVIDIA GPU, CST+ can use NVENC for the render step. This shortens render time significantly for high-resolution channels. GPU acceleration is optional and off by default. The playback loop never uses the GPU regardless of this setting.

### Optional: external API keys

Two external services are supported but not required:

* **MaxMind GeoLite2**: for accurate geo-blocking by country. Without a key, CST+ falls back to a free IP lookup service. The fallback works, but the first request for a new IP may slip through before the result is cached.
* **TMDB (The Movie Database)**: for automatic program metadata (titles, descriptions, posters) on your EPG. Without a key, the EPG is populated from your filenames.

Both keys are entered in Settings after installation. Nothing breaks if they are absent.

### Fleet mode (multiple servers)

Running more than one server requires a separate CST+ license per node. Edge nodes do not need a paid license key: the primary server generates a fleet token and the edge node installs license-free using that token. Requires one primary server and at least one edge node, both on a supported OS with outbound network access to each other.

### License requirement

CST+ requires an active subscription license to operate. The license is bound to your server hardware at first activation. To move the license to a different server, contact support to reset the hardware binding.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.cstplus.org/documentation/getting-started/getting-started.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
