Skip to content
Try Oyster locally

Try Oyster on your computer

Run Oyster on your own machine with one command, no account, and open your first App. About five minutes.

Run Oyster on your laptop and open your first App. No Cloudflare account, Docker or payment. You need Node 24 or newer and Git.

TERMINAL
npx @fungi.computer/oyster try

That creates ./my-oyster, installs it, starts Oyster on http://127.0.0.1:8787, builds the Oyster desktop (Tourtois) from its public source, installs a one-page Hello App and opens your browser, already signed in through a one-time link. You land on the desktop with Hello in the launcher. It prints your owner key once and saves it in my-oyster/.oyster-owner; you only need the key to sign in again at /login. Open Hello. You will see:

Hello from my first Oyster App

That is a real Oyster App, built from a git commit and running on your machine. Press Ctrl-C to stop.

Where Hello lives. try keeps the App’s source in my-oyster/hello-app, an ordinary git repository with one commit. To change it, edit my-oyster/hello-app/bundle/index.html, commit the edit, then stop Oyster and run npx @fungi.computer/oyster try my-oyster again. It packs the new commit and reinstalls Hello; open Hello to see the change. Oyster builds only committed source. Run the same command from my-oyster (or npx @fungi.computer/oyster try my-oyster) to start it again; nothing is scaffolded twice. To use another folder or port, run npx @fungi.computer/oyster try <folder> --port 8788. Add --no-open to keep the browser closed.

If port 8787 is taken, the command says so and stops; pick another with --port.

What it does under the hood

try runs these steps for you. They use pnpm 11 and openssl; npm works too (skip the pnpm-workspace.yaml line).

TERMINAL
mkdir my-oyster && cd my-oyster
printf 'allowBuilds:
esbuild: true
workerd: true
"@google/genai": false
"@mongodb-js/zstd": false
exifreader: false
node-liblzma: false
protobufjs: false
' > pnpm-workspace.yaml
pnpm add @fungi.computer/oyster@0.12.0 @fungi.computer/computer@0.6.1 react@^19.2.0 react-dom@^19.2.0
pnpm add -D wrangler
cp node_modules/@fungi.computer/oyster/examples/standalone/{worker.ts,wrangler.jsonc} .
export OYSTER_OWNER_KEY=$(openssl rand -hex 24); echo "$OYSTER_OWNER_KEY" > .oyster-owner
npx wrangler dev --local --enable-containers=false --ip 127.0.0.1 --port 8787 --local-upstream oyster.test --upstream-protocol https --var OYSTER_OWNER_KEY:$OYSTER_OWNER_KEY --var OYSTER_ORIGIN:https://oyster.test

Wrangler is an ordinary dependency of my-oyster; try just runs it for you. Once it prints Ready on http://127.0.0.1:8787, install the Hello App from a second terminal in my-oyster. Make a one-page App and commit it:

TERMINAL
export OYSTER_OWNER_KEY=$(cat .oyster-owner) OYSTER_URL=http://127.0.0.1:8787
mkdir -p hello-app/bundle
echo '{"name":"hello-app","private":true,"fungi":{"app":{"displayName":"Hello","capabilities":[]}}}' > hello-app/package.json
echo '<!doctype html><title>Hello</title><h1>Hello from my first Oyster App</h1>' > hello-app/bundle/index.html
git -C hello-app init -q && git -C hello-app add . && git -C hello-app -c user.name=Me -c user.email=me@example.invalid commit -qm Hello

Save this as install-hello.mjs and run node install-hello.mjs. It prints installed hello: 201.

JS
import { execFileSync } from "node:child_process";
import { resolve } from "node:path";
import { installRelease, packRelease } from "@fungi.computer/oyster/pack";
const source = resolve("hello-app");
const commit = execFileSync("git", ["-C", source, "rev-parse", "HEAD"], {
encoding: "utf8",
}).trim();
const directory = resolve("release");
await packRelease({
appId: "app_hello",
sourceDirectory: source,
sourceRevision: `git:${commit}`,
recipe: {
kind: "bundled-html",
entry: "bundle/index.html",
assets: {
maxManifestBytes: 65_536,
maxObjects: 16,
maxObjectBytes: 1_048_576,
maxTotalBytes: 4_194_304,
},
assetBase: "./",
backend: null,
maxOutputBytes: 4_194_304,
},
outDirectory: directory,
});
const response = await installRelease({
directory,
url: process.env.OYSTER_URL,
key: process.env.OYSTER_OWNER_KEY,
installationId: "hello",
});
console.log(`installed hello: ${response.status}`);

Then open http://127.0.0.1:8787/login, paste the key from .oyster-owner, and open hello.

Next: the detailed guide covers MCP, Git, the seven starter Apps and deploying to Cloudflare. Not sure Oyster fits? Read Is Oyster for you?.