Documentation

Set up your first film.

Connect your product and choose who the film is for. Thespis finds the story, records the app and makes a narrated 4K film in the cloud. Review it before you share it.

What you need

A GitHub repositoryYou install the Thespis GitHub App on it.
A branch to record fromOften a demo branch. Pushes to it start runs.
A runnable productVite and Next.js apps are detected automatically. Other Node apps can use a declared port or a start command in advanced setup.
Demo dataSeeded data so every run shows the same thing.
Approved account accessSubmit the Request access form before creating a Production or Scale organization.

1. Create your account

01

Request access

Choose Production or Scale and submit the work email you will use to sign in.

02

Sign in

Use Google or GitHub with the approved email. Both providers can link to the same account.

03

Create an organization

Give your workspace a name. This is where your team, products and films live.

04

Invite your team

Create an invitation link for each teammate and choose their role. Roles are listed under Reference.

2. Connect a repository

Open Repositories in the app and start the GitHub App installation. Pick your repositories on GitHub, and you return to the app with them connected. You never paste IDs or tokens.

Your default branch is selected for you. Open Set up demo to choose the audience. Branch and brand settings are available when you need them.

Demo branchThe branch whose pushes start a run.
App configurationOptional. An existing thespis.yml can describe a custom startup process. Most Vite and Next.js apps do not need one.
Brand kitOptional. Your colors, fonts, and narration voice.

3. Set up your demo

Open Repositories, then Set up demo. Keep Choose for me selected, choose a film format and save. You can add one sentence about what viewers should understand. The next run reads the app, selects useful scenes and writes the narration. You do not need to write a script or add configuration files for a supported app.

Marketing filmA concise story built around a useful customer result. Use it on your website, in a launch or during a sales conversation.
Team guideA more detailed explanation of setup, the workflow and available settings. Use it for onboarding, training and sharing product knowledge internally.
Optional product briefTell us what matters. For example: explain how a small team sends its first invoice and checks the result.
Your reviewThe finished film includes a summary of the chosen scenes. Check the master before approving it. Update the brief or choose Write my own for exact control.

Thespis chooses from pages it can actually open and results the running app can return. It reads the product README for context. For an API product, a checked-in OpenAPI file can identify simple GET requests to show as clear result panels. A sign-in wall needs a demo workspace with sample data before it can be recorded.

For a precise interaction or a request with input, choose Write my own. Add the words you want spoken and the steps to show:

App walkthroughOpen a page, click a component, enter text, focus the camera or check that a result is visible. Find controls by visible text, input label, test ID or CSS selector.
API resultSend GET or POST to your running app. Set the expected HTTP status and select up to six scalar JSON fields to show, such as invoice.total or items.0.name.
RuntimeExisting runtime configuration is reused when present. Otherwise Thespis detects Vite and Next.js dev scripts, including a single app in an apps or packages directory. When several apps are present, choose the app directory in advanced setup. Other Node apps need a declared listening port.
Saved setupEach queued run saves a copy. Editing a walkthrough affects future runs. You can switch back to repository files at any time.

API scenes show real responses in a readable result panel, with narration and component framing. For example, POST /invoices with sample line items can show the new invoice number, total and status. An unexpected status or missing field stops the run. Timing is an observation from that capture, not a performance benchmark.

API capture runs against the local app started from your repository. It supports JSON responses up to 128 KiB, a 15-second request limit and selected scalar fields. It does not follow redirects or send authentication headers. Use a seeded demo environment with sample data. It does not yet record command-line tools or arbitrary external services.

Managed films use native 4K at 60 fps. Your brand kit selects the voice and styling. Review the completed master before approving it.

4. Make a film

Open Runs, choose your product and click Make film in cloud. Marketing film and Team guide ask Thespis to choose a fresh story for that audience. Use saved story keeps your existing walkthrough. The exact release and setup are saved with the run.

Discovery, recording, narration and rendering all happen in the cloud. Keep working or close your laptop while the film is made. Longer films take more processing time. Runs shows the actual elapsed time and queue state. If capacity is busy, your run waits and starts when a slot opens.

Push to your demo branch. That starts a run automatically, using the exact commit you pushed. You can also queue one from the Runs view.

Thespis then starts your app, waits for it to answer, performs the walkthrough, and produces the complete film.

Watch progress in Runs. A failed run shows a stable failure category and the next action to take. Retries reuse eligible cached media, which reduces repeated work.

5. Review, approve, and share

A finished run waits for a person. Watch it, then approve it. Approved films appear in Demos, where your team can play them or download the 4K file.

The Demos catalog stays private. Owners and admins can publish one approved release through a separate external link. The stable link follows the current shared version, while a version link continues to open the release it was created for.

PasscodeRequire a passcode before the viewer receives playback access.
ExpirationStop the link at a chosen date and time.
Allowed embed sitesLimit embedded playback to listed hostnames. Direct watch links remain available.
RevokeStop new watch, embed, and version access. Playback already opened ends when its short-lived media link expires.
Call to actionAdd one HTTPS button below the film.
Viewer totalsSee views, starts, completions, watch time, and button clicks without storing raw viewer addresses.
Publishing an external demo copies only the approved delivery files and public presentation details. Repository names, commits, run identifiers, organization records, and private file locations are not included in the public response. External playback requires the organization's paid account access to remain active.

Repository configuration (optional)

This file tells Thespis how to start your application and which voice to narrate with. Put it at the root of your demo branch.

thespis.yml
version: 1
name: your-product
run: npm run dev
port: 3000
ready:
  path: /
  timeoutMs: 120000
env:
  DATABASE_URL: postgres://demo:demo@localhost:5432/demo
narration:
  mode: programme
  takes: 2
  voice:
    gender: female
    age: middle-aged
    accent: american
    tone: warm professional
    language: en
  delivery:
    pace: 0.96
script: demo/product.script.json

Use fake values in env. Never put real secrets in this file.

Custom walkthroughs (optional)

The walkthrough is a JSON file listing the scenes you want in the film. Each scene has a title, the words to narrate, and the steps to perform.

demo/product.script.json
{
  "version": 1,
  "viewport": { "width": 1920, "height": 1080 },
  "captureScale": 2,
  "delivery": { "profile": "studio" },
  "quality": {
    "narration": "required",
    "minimumCameraShots": 1,
    "minimumNarrationTailMs": 900,
    "minimumDetailScale": 1,
    "maximumEyeTraceShift": 0.75
  },
  "scenes": [
    {
      "id": "overview",
      "title": "The dashboard",
      "narrate": "Every invoice and payment, in one place.",
      "minMs": 6000,
      "steps": [
        { "action": "goto", "url": "/", "ready": { "selector": "[data-testid=invoice-list]" }, "dwellMs": 1200 },
        { "action": "click", "target": { "selector": "[data-testid=invoice-row]" }, "ready": { "selector": "[data-testid=invoice-detail]" } },
        { "action": "assert", "target": { "selector": "[data-testid=invoice-detail]" } }
      ]
    }
  ]
}
quality.narrationUse required when every scene must include spoken narration.
quality.minimumCameraShotsStop the run when the walkthrough does not produce enough directed shots.
quality.minimumNarrationTailMsKeep room after each sentence so the voice is not cut against the next scene.
quality.minimumDetailScaleAn optional quality requirement. Leave it at 1 so a large dialog or panel can stay fully in frame. The camera only pushes in when the whole active component fits.
quality.maximumEyeTraceShiftLimit how far a camera move may carry the eye between two consecutive reframes; cuts dissolve and are exempt.
gotoOpen a path in your app.
clickClick an element.
readyOn a goto or click, wait for the finished interface state before recording.
typeType text into a field.
hoverGuide attention to an element without clicking it.
assertWait until an element is visible or hidden.
waitPause for a set time.
Target elements with data-testid. It survives redesigns, and a selector that no longer matches stops the run instead of recording the wrong thing.

Operations

Owners and admins can open Operations to see the selected organization's queue depth, stalled work, recent failures, success rate, delivery time, latest successful output, and account activity. The view polls while it is open and never combines data from different organizations.

A run that fails shows a stable category and a useful next step. Raw service errors, storage names, provider identifiers, and internal account identifiers are not returned to the customer app.

Plans and billing

Production costs USD $500 per month. Scale costs USD $1,500 per month. Enterprise starts at USD $25,000 per year. Request Production or Scale access from the website. Contact us for Enterprise or a capacity change while direct online checkout remains closed.

Existing online subscriptions can open the billing portal from Billing. Your current plan, repository allowance, render usage, concurrency, API-key allowance, and retention appear in the app.

Reference

thespis.yml fields

versionAlways 1.
nameA name for the product.
runThe command that starts your app.
cwdWorking directory. Defaults to the repository root.
portThe port your app serves on.
captureScaleSet to 2 with a 1920 by 1080 viewport for native 3840 by 2160 capture.
readyPath and timeout used to check the app is up.
envEnvironment values for your app. Fake values only.
narration.voiceDescribe the voice with gender, age, accent, tone, and language.
narration.deliverySet the speaking pace from 0.7 to 1.2.
narration.modeUse programme for one continuous performance, or scene for separate scene recordings.
narration.takesGenerate and compare one to three complete programme takes.
narration.pronunciationDictionariesOptional dictionary and version IDs for product names and specialist terms.
scriptPath to your walkthrough JSON.
outputWhere artifacts are written. Defaults to .thespis/out.

Team roles

ownerEverything, including billing, external sharing, and removing other owners.
adminOperations, external sharing, team, billing, keys, repositories, brand kits, and runs.
editorRepository settings, brand kits, and running or cancelling runs.
reviewerRead everything, and approve finished runs.
viewerRead only.

Retention

Run history is kept for 90 days. The newest approved film for each repository is kept until you replace it, so your current private film never expires. The current external version is also kept. A superseded external version remains available through its version link for 90 days. Revoke or expire the external demo to stop new access sooner.

Run states

queuedCapacity is reserved and the render is waiting to start.
capturingThe application is running and the walkthrough is being recorded.
uploadedCapture is complete and the verified source states are ready.
renderingThe film is being produced, packaged, and checked.
needs_reviewThe film is private and ready for a reviewer.
publishedAn authorized reviewer approved the film.
failedThe run stopped with a stable failure category and can be retried.
cancelledA team member stopped the run.

API access

Everything in the app is also available over the API at https://api.thespis.dev. Create a key in the app under API keys. The token is shown once, so copy it straight into your secret manager.

Using a key
export THESPIS_API_KEY="your-token"

curl --fail-with-body \
  --header "Authorization: Bearer $THESPIS_API_KEY" \
  https://api.thespis.dev/v1/organizations/YOUR_ORG_ID/repositories

Common endpoints

GET /v1/organizations/:org/repositoriesList your connected repositories.
GET /v1/organizations/:org/operationsRead queue health and delivery latency as an owner or admin.
POST /v1/organizations/:org/repositories/:repository/runsQueue a run. Needs an Idempotency-Key header.
GET /v1/organizations/:org/repositories/:repository/runsList runs and their status.
POST /v1/organizations/:org/repositories/:repository/runs/:run/approveApprove a run waiting for review.
GET /v1/organizations/:org/repositories/:repository/runs/:run/artifacts/:artifactGet a short-lived artifact download link.
GET /v1/organizations/:org/external-demosList external demos, versions, settings, and viewer totals.
POST /v1/organizations/:org/repositories/:repository/runs/:run/external-demoCreate a stable external demo or publish an approved run as its current version.
PATCH /v1/organizations/:org/external-demos/:externalDemoChange presentation settings, passcode, expiration, embed sites, or status.
Run records use outputAvailable and gifAvailable. Request a finished file through the artifact endpoint. Superseded run files expire after 90 days; the newest successful film for each repository remains available. Storage object names are not returned.

Key scopes

repositories:readList and inspect repositories.
repositories:writeChange repository settings.
brand_kits:readList and inspect brand kits.
brand_kits:writeCreate, update, and delete brand kits.
analytics:readRead monthly run and render totals.
runs:readList runs and read usage.
runs:createQueue a run.
runs:cancelCancel a run that has not finished.
runs:approveApprove a run waiting for review.
artifacts:readGet download links for finished films.
external_demos:readRead external demo settings, versions, and viewer totals.
external_demos:writePublish, update, revoke, or restore external demos.
Give a key the fewest scopes it needs. For automation tied to one product, restrict the key to that repository as well.
Public watch and embed pages obtain short-lived playback access from the public demo routes. Never place an organization API key in a webpage or embed code.