Start using Tabslip #
Tabslip forwards AI API calls and keeps signed receipts on your computer. You can ask your coding agent to connect a project or follow the steps below. The FAQ answers common setup questions.
Install #
curl -fsSL https://raw.githubusercontent.com/vincentsch/tabslip/main/install.sh | shIf the installer prints a PATH command, run it first. Then check the version:
tabslip --versionThe installer needs a POSIX shell and curl. It uses sha256sum or shasum to
check the download. It supports Linux, macOS and Windows through Git Bash.
Release binaries do not need Go or another runtime.
Try it without a key #
tabslip demoOpen the printed Page URL. The demo sends eight simulated calls and a signed supplement through the gateway. It makes no external requests and prints ready-to-run export and verify commands. Use its printed data directory for receipt commands, while the demo is still running. Ctrl+C removes this temporary directory. To keep the receipts instead:
tabslip demo --data-dir ./demo-dataEach demo chooses a free port. For SDK checks, replace the preset URLs below
with its printed OpenAI URL ending in /demo/v1 or Anthropic URL ending in
/demo. Use the synthetic key demo. Preset routes such as /openai/v1
belong to serve; they do not select the demo upstream.
Connect your app #
After installing, start the gateway:
tabslip serveOpen http://127.0.0.1:4545. The Calls page updates live. Click a call to open
its paper receipt. Spend shows totals. Setup has connection URLs and lets you
choose whether to store prompts and answers. The theme button remembers your
choice. --open opens the page on
startup.
Change your client's base URL, keeping its existing key and model:
| Provider | Client base URL at the default port |
|---|---|
| OpenAI | http://127.0.0.1:4545/openai/v1 |
| OpenRouter | http://127.0.0.1:4545/openrouter/v1 |
| Ollama | http://127.0.0.1:4545/ollama/v1 |
| Anthropic | http://127.0.0.1:4545/anthropic |
These snippets make provider calls that may cost money. Python OpenAI reads
OPENAI_API_KEY from the environment:
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:4545/openai/v1")
response = client.chat.completions.create(
model="gpt-4.1", messages=[{"role": "user", "content": "Hello"}])
print(response.choices[0].message.content)Node OpenAI uses the same key variable:
import OpenAI from 'openai';
const client = new OpenAI({baseURL: 'http://127.0.0.1:4545/openai/v1'});
const response = await client.chat.completions.create({
model: 'gpt-4.1', messages: [{role: 'user', content: 'Hello'}]});
console.log(response.choices[0].message.content);Anthropic reads ANTHROPIC_API_KEY. Its SDK appends /v1/messages, so leave
/v1 out of the base URL:
from anthropic import Anthropic
client = Anthropic(base_url="http://127.0.0.1:4545/anthropic")
response = client.messages.create(model="claude-sonnet-4-6", max_tokens=64,
messages=[{"role": "user", "content": "Hello"}])
print(response.content[0].text)import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({baseURL: 'http://127.0.0.1:4545/anthropic'});
const response = await client.messages.create({model: 'claude-sonnet-4-6',
max_tokens: 64, messages: [{role: 'user', content: 'Hello'}]});
console.log(response.content);Save the URL in your project's normal environment or SDK configuration. Tabslip forwards the client's credentials and does not retry provider calls. Keep Tabslip running while your app uses its URL, including after reboot. Installation does not add a service. To stop using Tabslip, restore the original URL first. See custom upstreams, Docker and remote pages through SSH.
A saved environment file needs to be loaded by your app in each fresh shell.
For example, if your project already uses a POSIX .env file:
set -a
. ./.env
set +aKeep keys in their existing source. Add the base URL to that configuration,
or keep the SDK option shown above in your code. The examples use explicit
SDK options; Python OpenAI and Node OpenAI also accept OPENAI_BASE_URL.
See runnable examples for curl and environment files.
For receipt fields, see receipts; for problems, see
troubleshooting.
More install options #
The installer verifies SHA-256 checksums before replacing the binary.
INSTALL_DIR selects its destination (default ~/.local/bin);
TABSLIP_VERSION selects a release tag. From a checkout:
TABSLIP_VERSION=v0.1.0 sh install.shFor native Windows, download your architecture's .exe and checksums.txt
from Releases. In PowerShell,
for an amd64 download in the current directory:
Get-FileHash -Algorithm SHA256 .\tabslip-windows-amd64.exe
Get-Content .\checksums.txt | Select-String 'tabslip-windows-amd64.exe'
.\tabslip-windows-amd64.exe --version
.\tabslip-windows-amd64.exe demoCompare the full hash before running the executable. Use the arm64 filename on ARM Windows. A checksum detects changed downloads; confirm the publisher separately.
With GitHub CLI installed, check the download's build provenance separately from the installer's checksum comparison:
gh attestation verify tabslip-<os>-<arch> --repo vincentsch/tabslipReplace <os> with linux, darwin or windows, and <arch> with amd64
or arm64. Add .exe for Windows, for example tabslip-windows-amd64.exe.
See release checks for the publication and provenance procedure.
Source installation needs the Go version in go.mod.
GOTOOLCHAIN=auto can download the toolchain:
go install github.com/vincentsch/tabslip/cmd/tabslip@latestA source install reports dev. Go installs in GOBIN or $(go env GOPATH)/bin.
See CONTRIBUTING.md to build from a checkout.