# Quickstart

> Run Frame on a small Linux server with your own domain: point the domain, run the installer, set four lines of config, create your admin account and invite your friends.

Source: https://crow.sg/apps/frame/docs/quickstart/

The simplest always-on setup: a small virtual server (a VPS) with Debian or Ubuntu and a domain name. Frame gets and renews its own HTTPS certificate, so you need no other web server. Allow about 15 minutes. Prefer Docker, or running at home without open ports? See [Pick a setup](https://crow.sg/apps/frame/docs/#pick-a-setup).

## Before you start

- A VPS with **Debian 13** or **Ubuntu 24.04 LTS** and your SSH key on it. Any provider works; about €4–6 a month gets 2–4 GB of RAM, 40 GB or more of disk and plenty of traffic.
- A domain you can add DNS records to. This guide uses `frame.example.com`: replace it with yours everywhere.
- Commands that start with `sudo` run as the administrator. Never pipe a script from the internet straight into a shell: download it, read it, then run it.

## Set it up

1. **Point your domain at the server**

   At your DNS provider, add an `A` record named `frame` (or `@` for the bare domain) with the server's IPv4 address, and optionally an `AAAA` record with its IPv6 address. On Cloudflare DNS, set the record to **DNS only** (grey cloud). Check it: `dig +short frame.example.com` should print the server's IP. This can take a few minutes.

2. **Update the server and open the firewall**

   Allow SSH and web traffic, and nothing else. If your provider also has a firewall in its control panel, allow TCP 22, 80 and 443 there too.

   ```sh
   ssh root@frame.example.com        # or the user your provider created
   sudo apt update && sudo apt upgrade -y
   sudo apt install -y ufw
   sudo ufw allow OpenSSH
   sudo ufw allow 80,443/tcp
   sudo ufw enable
   ```

3. **Download the installer, read it, run it**

   ```sh
   curl -fsSLO https://github.com/Crow-Tech-Pte-Ltd/frame/releases/latest/download/install.sh
   less install.sh                   # read it (press q to quit)
   sudo sh install.sh
   ```

   The installer picks the release for your CPU, checks its SHA-256 checksum against the release's `SHA256SUMS` before installing anything, and sets up a locked-down systemd service. It creates `/etc/frame/frame.conf` and never touches your data in `/var/lib/frame`.

4. **Configure it**

   Open the file with `sudo nano /etc/frame/frame.conf`. Every line is commented out: remove the `#` and fill in at least these four. Save with Ctrl+O, Enter, then exit with Ctrl+X.

   ```ini title="/etc/frame/frame.conf"
   FRAME_DOMAIN=frame.example.com
   FRAME_PUBLIC_URL=https://frame.example.com
   FRAME_ACME_EMAIL=you@example.com
   FRAME_NAME="Our Frame"
   ```

   New servers are invite-only, so strangers who find the address can't sign up. Leave `FRAME_TRUSTED_PROXIES` unset: phones connect to Frame directly.

5. **Start it**

   ```sh
   sudo sh install.sh --reconfigure     # lets Frame use ports 80/443 because FRAME_DOMAIN is set
   sudo systemctl start frame
   systemctl status frame               # should say "active (running)"
   ```

   The first HTTPS request fetches the certificate, which takes a few seconds. Then open `https://frame.example.com/healthz` in a browser: it should say `ok`.

6. **Create your admin account**

   On its first start, the server writes a one-time link to its log:

   ```sh
   sudo journalctl -u frame | grep "admin account"
   ```

   ```text output
   Create your admin account: https://frame.example.com/admin/setup#t=…
   ```

   Open it and choose your name, a username, your e-mail or phone number and a password. That is your normal Frame account and also the admin of the web panel at `https://frame.example.com/admin/`. Then open **Security** in the panel and turn on two-factor authentication. More in [First run & admin account](https://crow.sg/apps/frame/docs/first-run/).

7. **Connect the app and invite friends**

   In the Frame app, type `frame.example.com` when it asks **Where's your Frame?** and sign in with the same details. Invite friends from the app, or from **Invites → New invite** in the admin panel. See [Connect the apps & invite](https://crow.sg/apps/frame/docs/connect/).

## Next

- [Back up](https://crow.sg/apps/frame/docs/backups/) the database and `secrets.json` every night, and copy them off the server.
- Don't need the admin panel on the internet? [Keep it private](https://crow.sg/apps/frame/docs/private-admin/).
- Read the [security checklist](https://crow.sg/apps/frame/docs/security/#checklist), and [upgrade](https://crow.sg/apps/frame/docs/upgrading/) when a release is announced.
