Freestyle SDK
Learn more at docs.freestyle.sh
Installation
npm install freestyle
CLI Usage
The Freestyle SDK includes a command-line interface for managing your Freestyle resources.
Setup
Set the environment variable with your API key:
export FREESTYLE_API_KEY="your-api-key"
Or create a .env file in your project directory:
FREESTYLE_API_KEY=your-api-key
Commands
Virtual Machines
freestyle vm create --name my-vm
freestyle vm create --snapshot <snapshot-id>
freestyle vm create --domain myapp.example.com --port 3000
freestyle vm create --ssh
freestyle vm create --snapshot <snapshot-id> --ssh
freestyle vm list
freestyle vm ssh <vmId>
freestyle vm ssh <vmId> --delete-on-exit
freestyle vm exec <vmId> "ls -la"
freestyle vm delete <vmId>
Serverless Deployments
freestyle deploy --code "export default () => 'Hello World'"
freestyle deploy --file ./my-function.js
freestyle deploy --repo <repoId>
freestyle deploy --dir ./dist
freestyle deploy --dir . --build
freestyle deploy --dir . --build --build-command "npm run build" --build-out-dir dist
freestyle deploy --code "..." --env API_KEY=secret --env DEBUG=true
Serverless Runs
freestyle run --code "console.log('Hello!')"
freestyle run --file ./script.js
Utilities
freestyle --help
freestyle vm --help
SDK Usage
import { freestyle, VmSpec } from "freestyle";
import { VmNodeJs } from "@freestyle-sh/with-nodejs";
const { repoId } = await freestyle.git.repos.create({
source: {
url: "https://github.com/freestyle-sh/freestyle-base-nextjs-shadcn",
},
});
const repo = freestyle.git.repos.ref({ repoId });
const { name, sha } = await repo.branches.create({
name: "feature/something",
});
const { commit } = await repo.commits.create({
message: "Add new feature",
branch: "feature/something",
files: [
{ path: "README.md", content: "# My Project" },
{ path: "logo.png", content: base64Image, encoding: "base64" }
],
author: { name: "John Doe", email: "john@example.com" }
});
const { vm } = await freestyle.vms.create({
spec: new VmSpec().with("node", new VmNodeJs()),
gitRepos: [{ repo: repoId, path: "/repo" }],
});
await vm.fs.writeTextFile("/repo/api/hello.js", "...");
await vm.exec("ls /repo");
await vm.node.runCode({ code: "console.log('hello')" });
const { deploymentId } = await freestyle.serverless.deployments.create({
repo: repoId,
});
const { record } = await freestyle.domains.verifications.create({
domain: "example.com",
});
console.log(record);
await freestyle.domains.verifications.complete({
domain: "example.com",
});
await freestyle.domains.mappings.create({
domain: "example.com",
deploymentId: deploymentId,
});
for (let i = 0; i < 10; i++) {
freestyle.serverless.runs.create({
code: `export default () => {
fetch("https://example.com/api/hello")
.then(res => res.json())
})
`,
});
}
await freestyle.serverless.runs.create({
code: `export default async () => {
const res = await fetch("https://api.freestyle.sh/some-path");
return await res.text();
}`,
egress: {
allow: {
domains: {
"api.freestyle.sh": [
{
transform: [
{
headers: {
"X-Freestyle-Admin-Key": "abc",
"X-Freestyle-User-Id": "123",
},
},
],
},
],
"*": [],
},
},
},
});
await freestyle.serverless.deployments.create({
code: "export default () => new Response('ok')",
egress: {
allow: {
domains: {
"api.freestyle.sh": [
{
transform: [
{
headers: {
"X-Freestyle-Admin-Key": "abc",
"X-Freestyle-User-Id": "123",
},
},
],
},
],
"*": [],
},
},
},
});