Skip to content

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.com for check-ins and certificates, to ghcr.io and 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

  1. 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.

  2. Run it on your server

    On the Linux server, run the command it shows:

    Terminal
    curl -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:

    Terminal
    curl -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-model

    Without 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_KEY and LLM_MODEL in /opt/timetotest/.env and run ttt-dp restart.

  3. Check and finish

    Open the login link the installer prints. It works once, for 15 minutes. If it expires, run ttt-dp login-link on 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

FlagUse
--llm-base-url, --llm-key, --llm-modelYour OpenAI-compatible model endpoint, its key and the model to use.
--domainServe 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-keyCertificate and key for that domain.
--database-urlUse your own MySQL 8 database.
--private-ipThe 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:

CommandUse
ttt-dp statusShow containers, licence and migration status.
ttt-dp logs [service]Follow the logs of app, web, caddy, mysql, redis or storage. Default: app.
ttt-dp restartRestart every container.
ttt-dp upgrade [version]Move to a TimetoTest version. Default: the latest.
ttt-dp login-linkPrint a new one-time sign-in link for the team admin, when the first one has expired.
ttt-dp backupSave the database, media and settings to /opt/timetotest/backups.
ttt-dp renewRenew 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.