-
Notifications
You must be signed in to change notification settings - Fork 121
feat: freestyle deploy docs #3030
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
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, { | ||
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> |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
There was a problem hiding this comment.
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:This will ensure the deployment code functions correctly when executed.
Spotted by Diamond

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.