Skip to content

Quickstart

Get Tessera running in 5 minutes with Docker.

Prerequisites

  • Docker and Docker Compose
  • An OpenAPI spec, GraphQL schema, or dbt manifest (optional, for sync)

Start Tessera

# Clone the repository
git clone https://github.com/ashita-ai/tessera.git
cd tessera

# Start with Docker Compose
docker compose up -d

# Check it's running
curl http://localhost:8000/health

Tessera is now running at http://localhost:8000.

Authentication

For local development, the easiest option is to disable authentication:

# In your .env or docker-compose.override.yml
AUTH_DISABLED=true

For production or to test authentication, set a bootstrap API key:

BOOTSTRAP_API_KEY=your-secret-api-key

Use this key in the Authorization: Bearer header for API requests.

Access the Web UI

Open http://localhost:8000 in your browser.

With AUTH_DISABLED=true, you can access the UI without logging in. Otherwise, create an admin user via the API or use the bootstrap API key.

Create Your First Contract

Option A: From an OpenAPI Spec

The fastest path if you have an existing OpenAPI spec:

# 1. Create a team
curl -X POST http://localhost:8000/api/v1/teams \
  -H "Content-Type: application/json" \
  -d '{"name": "platform-team"}'

Save the returned id as TEAM_ID.

# 2. Import your OpenAPI spec
curl -X POST http://localhost:8000/api/v1/sync/openapi \
  -H "Content-Type: application/json" \
  -d "{
    \"spec\": $(cat openapi.yaml | python3 -c 'import sys,json,yaml; json.dump(yaml.safe_load(sys.stdin), sys.stdout)'),
    \"owner_team_id\": \"TEAM_ID\",
    \"auto_publish_contracts\": true
  }"

This creates one asset per endpoint, extracts request/response schemas, and publishes contracts. Tessera will detect breaking changes on subsequent imports.

Option B: Manual Contract

Create an asset and contract directly:

# 1. Create a team
curl -X POST http://localhost:8000/api/v1/teams \
  -H "Content-Type: application/json" \
  -d '{"name": "platform-team"}'

Save the returned id as TEAM_ID.

# 2. Create an asset
curl -X POST http://localhost:8000/api/v1/assets \
  -H "Content-Type: application/json" \
  -d '{
    "fqn": "api.users_service.get_users",
    "owner_team_id": "TEAM_ID"
  }'

Save the returned id as ASSET_ID.

# 3. Publish a contract
curl -X POST "http://localhost:8000/api/v1/assets/ASSET_ID/contracts?published_by=TEAM_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "schema": {
      "type": "object",
      "properties": {
        "user_id": {"type": "integer"},
        "email": {"type": "string"},
        "created_at": {"type": "string", "format": "date-time"}
      },
      "required": ["user_id", "email"]
    },
    "compatibility_mode": "backward"
  }'

Register as a Consumer

Another team can register as a consumer of your contract:

curl -X POST http://localhost:8000/api/v1/registrations \
  -H "Content-Type: application/json" \
  -d '{
    "contract_id": "CONTRACT_ID",
    "consumer_team_id": "CONSUMER_TEAM_ID"
  }'

If authentication is enabled, add -H "Authorization: Bearer YOUR_API_KEY" to all requests.

Option C: Sync from dbt

If you have a dbt project, you can sync your models:

# Generate your manifest
cd your-dbt-project
dbt compile

# Upload to Tessera
curl -X POST http://localhost:8000/api/v1/sync/dbt/upload \
  -H "Content-Type: application/json" \
  -d "{
    \"manifest\": $(cat target/manifest.json),
    \"owner_team_id\": \"TEAM_ID\",
    \"auto_publish_contracts\": true
  }"

This creates assets for each model, source, seed, and snapshot; extracts column schemas; and publishes contracts.

What's Next?