Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 95 additions & 0 deletions site/public/llms-full.txt

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions site/public/llms.txt

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

136 changes: 136 additions & 0 deletions site/src/content/docs/deploy/freestyle.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
# Freestyle

Deploy Rivet Actors to [Freestyle.sh](https://freestyle.sh/), a cloud platform for running AI-generated code with built-in security and scalability.

Freestyle provides built-in security for running untrusted AI-generated code, making it ideal for AI agent applications. Using Rivet, it is easy to deploy your vibe-coded or user-provided RivetKit backends straight to Freestyle.

<CardGroup>
<Card title="Freestyle + Rivet" href="https://github.com/rivet-dev/rivetkit/tree/main/examples/freestyle" target="_blank">
Complete example of deploying Rivet actors to Freestyle.sh.
</Card>
</CardGroup>

## Setup

<Steps>
<Step title="Install packages">

Install RivetKit + Hono and create your registry:

```bash
npm install rivetkit hono
```

</Step>

<Step title="Configure serverless driver">

Update your server code to run the registry through Deno.

```typescript {{"title":"server.ts"}}
import { registry } from "./registry";
import { createEngineDriver } from "npm:rivetkit/engine";
import { upgradeWebSocket } from "hono/deno";

const { fetch } = registry.start({
// Lets us serve the registry via our Deno.serve
// as supported by Freestyle.
disableDefaultServer: true,
getUpgradeWebSocket: () => upgradeWebSocket,

// Provide RivetKit address of our server
overrideServerAddress: `${process.env.FREESTYLE_ENDPOINT ?? "http://localhost:8080"}/api`,
});

// Freestyle uses Deno under the hood for web deployments
// @ts-ignore
Deno.serve(fetch);
```

**Configuration Requirements:**

- `endpoint` - Rivet API endpoint (use "api.rivet.gg" for Rivet Cloud)
- `namespace` - Your Rivet namespace for actor isolation
- `inspector.enabled` - Enable debugging and monitoring

</Step>

<Step title="Deploy to Freestyle">

Deploy your application to Freestyle with the correct configuration. Create a deployment script or add this to your existing deployment process:

```typescript
const FREESTYLE_DOMAIN = "my-domain.style.dev"; // Change to your desired Freestyle domain

const res = await freestyle.deployWeb(buildDir, {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It appears the freestyle object is being used without being defined or imported. Consider adding an import statement for the Freestyle SDK at the top of the file:

import { freestyle } from "@freestyle-sh/sdk";
// or however the SDK is properly imported

This will ensure the deployment code functions correctly when executed.

Spotted by Diamond

Fix in Graphite


Is this helpful? React 👍 or 👎 to let us know.

This comment came from an experimental review—please leave feedback if it was helpful/unhelpful. Learn more about experimental comments here.

envVars: {
FREESTYLE_ENDPOINT: `https://${FREESTYLE_DOMAIN}`,
RIVET_RUNNER_KIND: "serverless",
// For self-hosted instances:
// RIVET_ENDPOINT: "http://127.0.0.1:6420",
RIVET_ENDPOINT: "api.rivet.gg",
},
timeout: 60 * 5, // Increases max request lifetime on the runner
entrypoint: "server.ts", // File which starts serverless runner
domains: [FREESTYLE_DOMAIN],
build: false,
});
```

Details on `buildDir` and other settings are available on [Freestyle docs](https://docs.freestyle.sh/web/web).

Run this deployment script to push your application to Freestyle.

**Deployment Configuration:**

- `timeout: 60 * 5` - Set timeout to 5 minutes for actor operations - it's important to keep this high!
- `entrypoint: "server.ts"` - Entry point file with your serverless setup
- `domains` - Your Freestyle domain(s)
- `build: false` - Disable build if you're pre-building your assets

</Step>

<Step title="Configure runner">

Update the runner configuration on the Rivet side to connect with your Freestyle deployment. Create a configuration script and run it after your Freestyle deployment is live:

```typescript
import { RivetClient } from "rivetkit/client";

const rivet = new RivetClient({
endpoint: "api.rivet.gg",
token: process.env.RIVET_API_TOKEN,
});

const FREESTYLE_DOMAIN = "my-domain.style.dev"; // Change to your desired Freestyle domain
const RIVET_NAMESPACE = "my-rivet-namespace"; // Change to your Rivet namespace

await rivet.runnerConfigs.upsert("freestyle-runner", {
serverless: {
url: `https://${FREESTYLE_DOMAIN}/start`,
runnersMargin: 1,
minRunners: 1,
maxRunners: 1,
slotsPerRunner: 1,
// Must be shorter than Freestyle request `timeout` config
requestLifespan: 60 * 5 - 5,
},
namespace: RIVET_NAMESPACE,
});
```

Execute this configuration script to register your Freestyle deployment with Rivet.

**Runner Configuration:**

- `url` - Freestyle deployment URL with `/start` endpoint
- `runnersMargin` - Buffer of runners to maintain
- `minRunners/maxRunners` - Scaling limits
- `slotsPerRunner` - Concurrent actors per runner
- `requestLifespan` - Request timeout (slightly less than Freestyle timeout)

Once executed, Rivet will be connected to your Freestyle serverless instance.

</Step>

</Steps>
11 changes: 11 additions & 0 deletions site/src/sitemap/mod.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion site/tailwind.config.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading