Sign In

Deploying to Freestyle

Deploy RivetKit app to 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.

Setup

Install packages

Install RivetKit and Hono and create your registry:

npm install rivetkit hono
Command Line

Configure serverless driver

Update your server code to run the registry serverless with Deno.

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);
server.ts

Deploy to Freestyle

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

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.dev",
	},
	timeout: 60 * 5, // Increases max request lifetime on the runner
	entrypoint: "server.ts", // File which starts serverless runner
	domains: [FREESTYLE_DOMAIN],
	build: false,
});
TypeScript

Details on buildDir and other settings are available on Freestyle docs.

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

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:

import { RivetClient } from "rivetkit/client";

const rivet = new RivetClient({
	endpoint: "api.rivet.dev",
	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,
});
TypeScript

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.

Suggest changes to this page