Use spawnkit.config.ts or spawnkit.config.json at the project root for the title, description, genre, dimension, and media paths. New kits detect either format. Update your chosen file before building; the build creates spawnkit.config.json in dist/.
Place a cover at a path such as public/media/cover.webp and set coverPath to media/cover.webp. Paths in the listing are relative to the build root, with no leading slash and no public/ prefix.
| Item | Requirement |
|---|
| Title | 1–64 characters. |
|---|
| Description | 10–500 characters. Explain what the player does. |
|---|
| Cover | PNG, JPEG, WebP, or SVG; up to 1 MiB. |
|---|
| Optional trailer | MP4 or WebM; up to 2 MiB and 60 seconds. Start on gameplay. |
|---|
| Optional game facts | Objective, controls, supported devices, and creator name. |
|---|
Keep one configuration source; duplicate formats cause a build error. You can also review and edit the listing in the dashboard upload flow.
From your game project, run the checks and build command. Use pnpm test too if the project includes that script.
pnpm lint
pnpm build
pnpm preview
Open the preview URL and play the game. Check controls, artwork, audio, and resizing. When you are ready, stop preview with Ctrl+C.
Create a ZIP of the contents of dist/. index.html must sit at the top level of the ZIP, alongside the game's assets. Do not zip the outer dist folder or your whole source project. Use the PowerShell or Bash packaging examples.
my-game.zip
├── index.html
├── assets/
├── media/
└── spawnkit.config.json
Open Upload game and sign in if prompted. This creates a new hosted project. To replace a release of an existing project, see Publishing an update.
- In Game files, choose your ZIP. If it includes a listing, the form imports its details and media.
- In Details, check the title, description, genre, and 2D or 3D selection.
- In Media, review your cover and optional gameplay clip.
- Choose Deploy game and follow the build output.
- Once deployment succeeds, open the returned game URL and test the hosted game.
The expanded browser build must stay below 20 MiB and contain fewer than 1,996 files. The ZIP selection limit is 64 MiB, but that does not increase the expanded deployment limit.
| Problem | Next step |
|---|
Missing index.html | Zip the contents of dist/, not the containing folder. |
|---|
| Archive too large | Reduce large textures, audio, or unused files, rebuild, and create a fresh ZIP. |
|---|
| Cover or trailer rejected | Check its file type and size. Replace it in the Media step. |
|---|
| Build failed | Read the build output for the first actionable error. Fix it, rebuild locally, and retry. |
|---|
| Game deploys with a media warning | Open the game to verify it works. Correct the rejected listing media before relying on its preview. |
|---|
The CLI uploads source, rather than a browser-build ZIP. Keep package.json, game.config.json, and pnpm-lock.yaml in the project. Hosted builds install public npm dependencies with lifecycle scripts disabled; the build itself runs without external network access.
pnpm dlx @spawnkit/cli login --site https://spawnkit.cloud
pnpm dlx @spawnkit/cli auth status --json
pnpm dlx @spawnkit/cli link --project YOUR_PROJECT_ID
pnpm dlx @spawnkit/cli deploy --env production --dry-run --json
pnpm dlx @spawnkit/cli deploy --env production --yes --json
Replace YOUR_PROJECT_ID with the project you intend to update. Review the dry run before running the final command. Source and built artifacts are limited to 2,000 files and 20 MiB.
With the CLI, Ctrl+C stops watching the output without cancelling the remote deployment. Use the returned deployment and project IDs to inspect it or reconnect to logs.
pnpm dlx @spawnkit/cli status DEPLOYMENT_ID --project YOUR_PROJECT_ID --json
pnpm dlx @spawnkit/cli logs DEPLOYMENT_ID --project YOUR_PROJECT_ID --follow --json
Inspect status before submitting another build. When retrying the same operation, keep its --request-id. Failed, cancelled, and superseded deployments exit nonzero. Rollback restores retained artifacts; it does not undo database migrations.
For automation, --json writes the final result to stdout and build progress to stderr. Failures return a JSON error on stderr and exit nonzero. Use the returned IDs and statuses rather than parsing progress messages.