Skip to main content
Tesslate OpenSail

Overview

Every OpenSail project is a real git repository. You can import from GitHub, GitLab, or Bitbucket; push commits back; open PRs; and watch branches all from inside the studio. The agent has read access to git state through its git tools and write access through the shell, so it can create commits and push on your behalf (with approval).

Three providers

GitHub, GitLab, Bitbucket, all with OAuth and a unified API.

Import or init

Clone an existing repo, or start blank and push to a new remote.

Agent-aware git

git_status, git_log, git_blame, git_diff are built-in agent tools.

In-container ops

Every git command runs inside the project container, so .gitignore, LFS, and hooks all work.

Connecting a provider

1

Open Settings

Go to Settings, then Git Providers.
2

Connect

Click Connect on GitHub, GitLab, or Bitbucket. You’ll be redirected to the provider’s OAuth consent page.
3

Authorize

OpenSail requests the minimum scopes needed for the provider:
  • GitHub: repo, user:email, read:user
  • GitLab: api, read_user
  • Bitbucket: repository, account
4

Done

The token is stored encrypted in GitProviderCredential and refreshed automatically when it expires.
You can connect more than one provider. OpenSail matches the right credential to the repo based on the host in the clone URL.

Importing a repo

1

Create a new project

Dashboard, then New Project.
2

Pick Import

Choose GitHub, GitLab, or Bitbucket as the source.
3

Choose a repo

Browse your repos (including orgs you belong to). Filter by org, search by name.
4

Pick a branch

Default branch is auto-selected. Override if you want to start from a feature branch.
5

Create

OpenSail clones into a new project container and runs setup.
The clone happens in a background task. The UI shows progress while the container initializes.

Branching and committing

The Git panel shows the current branch, ahead/behind count, uncommitted changes, and remotes. Buttons:
  • Create branch
  • Commit (stages and commits tracked changes)
  • Push
  • Pull
  • Switch branch

Agent-side git

The agent has four read-only git tools built in:
ToolUse
git_statusWhat’s staged, what’s modified, what’s untracked
git_logCommit history for the current branch
git_blamePer-line authorship on a file
git_diffUnified diff for working tree or between refs
Writes go through the shell (bash_exec). This means normal git hooks, LFS, and .gitignore rules all apply. The approval system gates destructive commands: git push --force, git reset --hard, and similar are gated in Ask Before Edit mode.

Multi-provider support

OpenSail abstracts the three providers behind a single API:
ProviderClone URLOAuth
GitHubhttps://github.com/user/repo.gitGitHub App
GitLabhttps://gitlab.com/user/repo.git (and self-hosted)GitLab OAuth
Bitbuckethttps://bitbucket.org/user/repo.gitBitbucket OAuth
When the agent or the UI runs git clone or git push, the credential matcher looks at the host and selects the right stored token automatically.

Pushing to a new remote

Starting from a blank template and want to create a new remote?
1

Pick a provider

Git panel, then Create Remote. Pick GitHub, GitLab, or Bitbucket.
2

Name the repo

Enter the name and visibility (public or private).
3

Create and push

OpenSail calls the provider API to create the repo with your token, wires it as origin, and pushes the initial branch.

Pull requests

PRs are not created automatically on push. Open them from the provider UI. OpenSail’s Git panel has a Open on GitHub/GitLab/Bitbucket button that takes you straight to the compare view for the current branch.
PR automation (creating PRs from the studio, commenting, approving) is on the roadmap. Today you manage PRs on the provider site.

Merging and syncing

The Git panel shows behind count when the remote has moved ahead. Click Pull to fast-forward or merge. Conflicts surface in Monaco with inline markers.
Open the terminal and run git fetch origin && git merge origin/main. The agent can also do this on request.
Monaco highlights conflict markers. Edit to resolve, save, then commit. The agent can also handle small conflicts: paste the conflict output and ask for help.

.gitignore and large files

Standard .gitignore works. The default template adds node_modules, dist, .env, .tesslate/cache. The Tesslate config file (.tesslate/config.json) is committed so the graph travels with the repo. For large files, use Git LFS. git lfs install inside the terminal once, then git lfs track normally. The CSI volume has plenty of room for LFS objects; they persist with the workspace snapshot.

Secrets, tokens, and safety

Never commit secrets. .env is in the default .gitignore. Use environment variables in project settings or a secrets manager connector (see Connectors (MCP)).
OAuth tokens for connected providers are encrypted at rest and never exposed to the agent. When the agent runs git commands, it sees only pre-populated credential helpers, not the raw token.

Revoking a provider

1

Settings, Git Providers

Find the connected provider.
2

Disconnect

Click Disconnect. The token is deleted from GitProviderCredential.
3

Revoke upstream

Visit the provider’s OAuth apps list and revoke the OpenSail app to be extra safe.

Troubleshooting

Token likely expired or the repo scopes changed. Reconnect the provider and retry.
Make sure the OAuth app has access to that org. On GitHub, check the GitHub App installation and grant access to the org.
Configure git config user.name and git config user.email inside the project terminal. The agent will also ask if the author is missing before committing.
Large repos take longer. You can shallow-clone with --depth=1 via the terminal. The default clone gets full history.

Best practices

Branch per feature

The agent works best with a clean branch. Start a branch per task, PR when done.

Commit the config

Check in .tesslate/config.json. Teammates and forks get the same graph.

Let the agent read, you write

Ask the agent to run git_diff before writing a commit message. It writes better messages when it sees the diff.

Use hooks

Pre-commit hooks run normally (inside the container). Use them to enforce linting and tests.

Creating Projects

Import from git as part of project creation.

Code Editor

Where conflicts get resolved.

Using Agents

Let the agent drive commits and branches.

API Keys

Run git operations through the external agent API.