Get started with Aperture
Last validated:
During the alpha testing period, Aperture by Tailscale is available at no additional cost with any Tailscale account, including free accounts created during Aperture signup. Request access at aperture.tailscale.com.
Requirements
Before deploying Aperture, ensure your environment meets these requirements.
-
One or more LLM provider accounts
You need API keys for any LLM providers to route through Aperture. Aperture supports the following providers:
- OpenAI (GPT-4o, o1, o3-mini, and other models)
- Anthropic (Claude Sonnet, Claude Opus, and other models)
- Google (Gemini models)
- OpenRouter (provides access to open source models such as DeepSeek, Qwen, and others)
- OpenAI-compatible APIs (for example, llama.cpp and other self-hosted endpoints)
Aperture requires API keys from provider developer platforms. Consumer and business subscription plans — such as Claude Pro or Claude Max, ChatGPT Plus, Pro, or Team, or Gemini Advanced — do not provide API keys and are not compatible with Aperture.
-
A Tailscale account
The Aperture server runs on a Tailscale network (tailnet). When you sign up for Aperture, the process creates a free Tailscale account for you if you don't already have one.
Aperture uses Tailscale identity to authenticate users automatically. When a client connects, the proxy identifies the user by their login name and device. This enables API access without distributing keys to individual users because Aperture centrally manages provider credentials and injects them when forwarding requests.
-
Client connectivity
Clients can connect to Aperture in two ways:
- From inside the tailnet (recommended): Clients on the same tailnet as Aperture get full per-user identity, zero-key authentication, and granular access controls. Install Tailscale on each client device to join the tailnet.
- From outside the tailnet: Clients that are not in the tailnet can use the ts-unplug tool, which creates a lightweight tailnet device and proxies local traffic to the Aperture instance. Each ts-unplug instance authenticates as a single tailnet identity. If each person runs their own ts-unplug, they get individual user attribution. Refer to enable Aperture without a tailnet for setup instructions.
Sign up
Aperture by Tailscale is a managed service that Tailscale hosts and maintains. To create an Aperture instance, visit aperture.tailscale.com and complete the sign-up process. If you don't have a Tailscale account, the sign-up process creates a free one for you.
After you have access to Aperture, follow the remaining sections on this page to configure providers and test your setup, then proceed to grant user access and connect LLM clients.
Configure Aperture settings
To configure Aperture settings, go to the Aperture dashboard. The Aperture dashboard is available to devices in the same tailnet at http://ai/ui. If you connect through ts-unplug, access the interface at http://localhost:<PORT_NUMBER>/ui/.
- Open the Settings page of the Aperture dashboard.
- Update the Aperture configuration to include the LLM providers and models you plan to use.
- Configure any additional settings.
The following example configures Aperture with access to Anthropic's Claude Sonnet 4.5 and Claude Opus 4.5 models.
{
"providers": {
"anthropic": {
"baseurl": "https://api.anthropic.com",
"apikey": "YOUR_ANTHROPIC_API_KEY",
"models": [
"claude-sonnet-4-5",
"claude-opus-4-5",
],
"authorization": "x-api-key",
"compatibility": {
"anthropic_messages": true,
}
}
}
}
If you don't customize the Aperture configuration, Aperture uses the default configuration. Refer to the Aperture configuration reference for details on all available settings.
Test your Aperture configuration
After configuring providers, test your connection using curl commands from a device connected to the tailnet. If you connect through ts-unplug, use http://localhost:<PORT_NUMBER> instead of http://ai.
Test Anthropic API format:
curl -s http://ai/v1/messages \
-H "Content-Type: application/json" \
-d '{
"model": "claude-haiku-4-5-20251001",
"max_tokens": 25,
"messages": [{"role": "user", "content": "respond with: hello"}]
}'
Test OpenAI API format:
curl -s http://ai/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "respond with: hello"}]
}'
Test OpenAI Responses API format:
curl -s http://ai/v1/responses \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"input": [{"role": "user", "content": "respond with: hello"}]
}'
If the requests succeed, Aperture is correctly routing to your configured providers. Visit the Aperture dashboard at http://ai/ui/ to see the requests in your usage history.
Next steps
After configuring and testing Aperture:
- Grant users access to models so they can send requests.
- Set up your LLM clients to route traffic through Aperture.
- (Optional) Set spending limits to control costs.
If your team members are not in the tailnet, they can connect to Aperture using ts-unplug. Refer to enable Aperture without a tailnet for setup instructions.
Enable Aperture without a tailnet
You can use Aperture from a device that is not on the same tailnet as the Aperture deployment using the ts-plug and ts-unplug tools.
The ts-plug and ts-unplug tools are under active development. Refer to the ts-plug repository for the latest status.
Each ts-unplug instance authenticates as a single tailnet identity. If each person runs their own ts-unplug, Aperture attributes the activity to individual users. If multiple people share a single ts-unplug instance, all activity appears under a single identity.
To set up ts-unplug on a device:
- Clone the
ts-plugrepository from GitHub. - Build the
ts-unplugapplication:- Run
make ts-unplug. - Run
make install.
- Run
- Run the
ts-unplugcommand to link to the Aperture proxy instance. Use the fully qualified domain name (FQDN) of the Aperture proxy and an available and accessible port number (for example, port9996).
ts-unplug -dir ./state -port <PORT_NUMBER> ai.<YOUR_TAILNET_ID>.ts.net
Next, approve the device in the Machines of the admin console for the tailnet hosting Aperture. After you approve it, users on that device can access Aperture from http://localhost:<PORT_NUMBER>.