Frame docs · Get started
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.
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
sudorun as the administrator. Never pipe a script from the internet straight into a shell: download it, read it, then run it.
Set it up
Step 1: Point your domain at the server
At your DNS provider, add an
Arecord namedframe(or@for the bare domain) with the server's IPv4 address, and optionally anAAAArecord with its IPv6 address. On Cloudflare DNS, set the record to DNS only (grey cloud). Check it:dig +short frame.example.comshould print the server's IP. This can take a few minutes.Step 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.
Terminalssh [email protected] # or the user your provider createdsudo apt update && sudo apt upgrade -ysudo apt install -y ufwsudo ufw allow OpenSSHsudo ufw allow 80,443/tcpsudo ufw enableStep 3: Download the installer, read it, run it
Terminalcurl -fsSLO https://github.com/Crow-Tech-Pte-Ltd/frame/releases/latest/download/install.shless install.sh # read it (press q to quit)sudo sh install.shThe installer picks the release for your CPU, checks its SHA-256 checksum against the release's
SHA256SUMSbefore installing anything, and sets up a locked-down systemd service. It creates/etc/frame/frame.confand never touches your data in/var/lib/frame.Step 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./etc/frame/frame.confFRAME_DOMAIN=frame.example.comFRAME_PUBLIC_URL=https://frame.example.com[email protected]FRAME_NAME="Our Frame"New servers are invite-only, so strangers who find the address can't sign up. Leave
FRAME_TRUSTED_PROXIESunset: phones connect to Frame directly.Step 5: Start it
Terminalsudo sh install.sh --reconfigure # lets Frame use ports 80/443 because FRAME_DOMAIN is setsudo systemctl start framesystemctl status frame # should say "active (running)"The first HTTPS request fetches the certificate, which takes a few seconds. Then open
https://frame.example.com/healthzin a browser: it should sayok.Step 6: Create your admin account
On its first start, the server writes a one-time link to its log:
Terminalsudo journalctl -u frame | grep "admin account"OutputCreate 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.Step 7: Connect the app and invite friends
In the Frame app, type
frame.example.comwhen 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.
Next
- Back up the database and
secrets.jsonevery night, and copy them off the server. - Don't need the admin panel on the internet? Keep it private.
- Read the security checklist, and upgrade when a release is announced.
For AI tools: this page as Markdown, the page index and all pages in one file.