<html lang="en">
<head></head>
<body>

<form id="mainForm" method="post" action="https://stackblitz.com/run" target="_self">
<input type="hidden" name="project[files][README.md]" value="# Rivet Platform for RivetKit

Example project demonstrating Rivet cloud platform deployment with [RivetKit](https://rivetkit.org).

[Learn More →](https://github.com/rivet-dev/rivetkit)

[Discord](https://rivet.dev/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-dev/rivetkit/issues)

## Getting Started

### Prerequisites

- Node.js
- Rivet CLI (`npm install -g @rivet-dev/cli`)
- Rivet Cloud account

### Installation

```sh
git clone https://github.com/rivet-dev/rivetkit
cd rivetkit/examples/rivet
npm install
```

### Configuration

Set up your environment variables:

```sh
export RIVET_ENDPOINT=https://api.rivet.dev
export RIVET_SERVICE_TOKEN=your_service_token
export RIVET_PROJECT=your_project_id
export RIVET_ENVIRONMENT=your_environment
```

### Development

```sh
npm run dev
```

This will start the RivetKit server locally at http://localhost:8080.

### Testing the Client

In a separate terminal, run the client script to interact with your actors:

```sh
npm run client
```

### Deployment

Deploy to Rivet Cloud:

```sh
rivet deploy
```

Your Rivet Actors will be deployed as Rivet actors with automatic scaling and management.

## License

Apache 2.0
">
<input type="hidden" name="project[files][package.json]" value="{&quot;name&quot;:&quot;starter&quot;,&quot;version&quot;:&quot;2.0.21&quot;,&quot;private&quot;:true,&quot;scripts&quot;:{&quot;dev&quot;:&quot;tsx --watch src/server.ts&quot;,&quot;check-types&quot;:&quot;tsc --noEmit&quot;,&quot;build&quot;:&quot;tsc&quot;,&quot;client&quot;:&quot;tsx scripts/client.ts&quot;},&quot;devDependencies&quot;:{&quot;@types/node&quot;:&quot;^22.13.9&quot;,&quot;tsx&quot;:&quot;^3.12.7&quot;,&quot;typescript&quot;:&quot;^5.5.2&quot;},&quot;dependencies&quot;:{&quot;rivetkit&quot;:&quot;https://pkg.pr.new/rivet-dev/rivet/rivetkit@1784d8f4835dfe0620f43e819ff860dd7dd02821&quot;},&quot;stableVersion&quot;:&quot;0.8.0&quot;}">
<input type="hidden" name="project[files][tsconfig.json]" value="{
	&quot;compilerOptions&quot;: {
		/* Visit https://aka.ms/tsconfig.json to read more about this file */

		/* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
		&quot;target&quot;: &quot;esnext&quot;,
		/* Specify a set of bundled library declaration files that describe the target runtime environment. */
		&quot;lib&quot;: [&quot;esnext&quot;],
		/* Specify what JSX code is generated. */
		&quot;jsx&quot;: &quot;react-jsx&quot;,

		/* Specify what module code is generated. */
		&quot;module&quot;: &quot;nodenext&quot;,
		/* Specify how TypeScript looks up a file from a given module specifier. */
		&quot;moduleResolution&quot;: &quot;nodenext&quot;,
		/* Specify type package names to be included without being referenced in a source file. */
		&quot;types&quot;: [&quot;node&quot;],
		/* Enable importing .json files */
		&quot;resolveJsonModule&quot;: true,

		/* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */
		&quot;allowJs&quot;: true,
		/* Enable error reporting in type-checked JavaScript files. */
		&quot;checkJs&quot;: false,

		/* Ensure that each file can be safely transpiled without relying on other imports. */
		&quot;isolatedModules&quot;: true,
		/* Allow &#39;import x from y&#39; when a module doesn&#39;t have a default export. */
		&quot;allowSyntheticDefaultImports&quot;: true,
		/* Ensure that casing is correct in imports. */
		&quot;forceConsistentCasingInFileNames&quot;: true,

		/* Enable all strict type-checking options. */
		&quot;strict&quot;: true,

		/* Skip type checking all .d.ts files. */
		&quot;skipLibCheck&quot;: true,
		&quot;outDir&quot;: &quot;dist&quot;
	},
	&quot;include&quot;: [&quot;src/**/*&quot;]
}
">
<input type="hidden" name="project[files][turbo.json]" value="{
	&quot;$schema&quot;: &quot;https://turbo.build/schema.json&quot;,
	&quot;extends&quot;: [&quot;//&quot;]
}
">
<input type="hidden" name="project[files][scripts/client.ts]" value="import { createClient } from &quot;rivetkit/client&quot;;
import type { registry } from &quot;../src/registry.js&quot;;

// Get endpoint from environment variable or default to localhost
const endpoint = process.env.RIVETKIT_ENDPOINT ?? &quot;http://localhost:8080&quot;;
console.log(&quot;🔗 Using endpoint:&quot;, endpoint);

// Create RivetKit client
const client = createClient&lt;typeof registry&gt;(endpoint);

async function main() {
	console.log(&quot;🚀 Rivet Client Demo&quot;);

	try {
		// Create counter instance
		const counter = client.counter.getOrCreate(&quot;demo&quot;);

		// Increment counter
		console.log(&quot;Incrementing counter &#39;demo&#39;...&quot;);
		const result1 = await counter.increment(1);
		console.log(&quot;New count:&quot;, result1);

		// Increment again with larger value
		console.log(&quot;Incrementing counter &#39;demo&#39; by 5...&quot;);
		const result2 = await counter.increment(5);
		console.log(&quot;New count:&quot;, result2);

		// Create another counter
		const counter2 = client.counter.getOrCreate(&quot;another&quot;);
		console.log(&quot;Incrementing counter &#39;another&#39; by 10...&quot;);
		const result3 = await counter2.increment(10);
		console.log(&quot;New count:&quot;, result3);

		console.log(&quot;✅ Demo completed!&quot;);
	} catch (error) {
		console.error(&quot;❌ Error:&quot;, error);
		process.exit(1);
	}
}

main().catch(console.error);
">
<input type="hidden" name="project[files][src/registry.ts]" value="import { actor, setup } from &quot;rivetkit&quot;;

export const counter = actor({
	state: { count: 0 },
	actions: {
		increment: (c, x: number) =&gt; {
			c.state.count += x;
			return c.state.count;
		},
	},
});

export const registry = setup({
	use: { counter },
});
">
<input type="hidden" name="project[files][src/server.ts]" value="import { registry } from &quot;./registry&quot;;

registry.start();
">
<input type="hidden" name="project[description]" value="generated by https://pkg.pr.new">
<input type="hidden" name="project[template]" value="node">
<input type="hidden" name="project[title]" value="starter">
</form>
<script>document.getElementById("mainForm").submit();</script>

</body></html>