Self-hosting
Team plan
On the Team plan, you can run TimetoTest on your own server. Your team's projects, tests, tasks, conversations, reports, screenshots, recordings, memory and connectors move to it. We keep only your account, team membership, billing and licence.
Requirements
- A Linux server where you can run commands as root. The install command uses
sudo. - Docker. If it is missing, the installer installs it from get.docker.com.
- 4 vCPUs, 8–16 GB of RAM and 40 GB of free disk.
- Ports 80 and 443 open to your team on your own network. Nothing needs to be open to the internet.
- Outbound HTTPS to
apis.timetotest.afloattech.comfor check-ins and certificates, toghcr.ioand Docker Hub for images, to Let's Encrypt, and to your model endpoint. - A team admin on the Team plan to run the install.
Install
Generate an install command
In TimetoTest, open Team. Under Self-hosting, choose the address your team will use, such as
acme.team.timetotest.tech. We suggest one from your team name. Then click Generate install command. Only admins of a team on the Team plan see this. The command works once and expires after an hour.Run it on your server
On the Linux server, run the command it shows:
Terminalcurl -fsSL https://timetotest.tech/install.sh | sudo bash -s -- --token ttt_dpb_…To use your own model, add your model endpoint. Any OpenAI-compatible endpoint works, such as Azure OpenAI, a Bedrock gateway or vLLM:
Terminalcurl -fsSL https://timetotest.tech/install.sh | sudo bash -s -- --token ttt_dpb_… \ --llm-base-url https://llm.example.internal/v1 \ --llm-key "$LLM_KEY" \ --llm-model your-modelWithout it, the instance uses our hosted models. Prompts and page content are sent to us for model calls, and usage counts against your team's plan, as in the cloud. To switch later, set
LLM_BASE_URL,LLM_API_KEYandLLM_MODELin/opt/timetotest/.envand runttt-dp restart.Check and finish
Open the login link the installer prints. It works once, for 15 minutes. If it expires, run
ttt-dp login-linkon the server for a new one.On your instance, open Team. Self-hosting shows how many records and files we copied. Check that your projects and history are there, then click Finish migration and confirm with Delete TimetoTest's copy. We then delete our copy of your team's data and send your team members to your instance.
In TimetoTest, Team then shows your instance's address and its last check-in.
Install options
| Flag | Use |
|---|---|
--llm-base-url, --llm-key, --llm-model | Your OpenAI-compatible model endpoint, its key and the model to use. |
--domain | Serve the instance on your own domain instead of a team.timetotest.tech address. Without --tls-cert and --tls-key, the instance gets a certificate itself, which needs the domain reachable from the internet on ports 80 and 443. |
--tls-cert, --tls-key | Certificate and key for that domain. |
--database-url | Use your own MySQL 8 database. |
--private-ip | The address your team reaches the server on. We detect it by default. |
After install
The instance is installed in /opt/timetotest. Manage it with ttt-dp:
| Command | Use |
|---|---|
ttt-dp status | Show containers, licence and migration status. |
ttt-dp logs [service] | Follow the logs of app, web, caddy, mysql, redis or storage. Default: app. |
ttt-dp restart | Restart every container. |
ttt-dp upgrade [version] | Move to a TimetoTest version. Default: the latest. |
ttt-dp login-link | Print a new one-time sign-in link for the team admin, when the first one has expired. |
ttt-dp backup | Save the database, media and settings to /opt/timetotest/backups. |
ttt-dp renew | Renew the certificate. This also runs daily on its own. |
Licence
Each check-in renews the licence for 7 days. If your instance cannot reach us, it keeps working until the licence expires.
If the licence expires or is revoked, the instance becomes read-only. Your data stays viewable and exportable, but new tasks and new members are blocked.
Members
Invite people in TimetoTest as usual, from Team. They sign in to your instance with the same login.
Troubleshooting
The instance address, such as acme.team.timetotest.tech, is public DNS that points at the server's private IP. Some routers and DNS resolvers block these answers as DNS rebinding protection. If the address does not resolve on your network, allow team.timetotest.tech in that protection, or install with --domain on your own domain.