Documentation

Build on Holoforge

Everything you need to create, publish, and grow browser-based 3D games.

01

Quick Start

Build a world in 30 seconds

Open Studio, click AI Scene in the top bar, type a scene description, pick your AI provider, and hit Generate. The world appears instantly.

Sculpt by hand

Switch to the Sculpt tool (S key) to push, pull, flatten, or crease geometry. Use symmetry mirrors for organic shapes. The Mask Brush lets you protect areas while sculpting the rest.

Play mode

Press P to enter first-person play mode. WASD to move, Space to jump, Esc to exit. Great for testing your world before publishing.

02

Publishing Games

Prepare your ZIP

Package your game as a ZIP file with index.html at the root. Any assets (JS, CSS, images) should be relative paths.

my-game.zip/
├── index.html   ← entry point
├── main.js
└── assets/
    ├── sprite.png
    └── audio.mp3

Upload & publish

Go to Publish in the nav, fill in your game info, drag in your ZIP, and hit Publish. Your game is live at holoforge-web.vercel.app/g/<slug> instantly.

Visibility

Public games appear in Browse. Unlisted games are accessible via direct link only. Private games are only visible to you.

03

AI Scene Generator

Supported providers

Scene generation: Claude (Anthropic), GPT-4o (OpenAI), Gemini (Google), Mistral, Grok (xAI), Command R+ (Cohere), DeepSeek. 3D model generation: Meshy AI, Tripo3D. Your API keys are stored only in your browser — never on Holoforge servers.

Prompt tips

Be specific about atmosphere, lighting, and materials. The AI understands fog density, ambient light intensity, and material types like neon, glass, metal, and ice.

Example prompts

Try these to get started:

"Foggy mountain valley with glowing cyan crystals"
"Volcanic island — lava-red terrain, pulsing neon formations"
"Sunken ruins — dark teal fog, pale icosahedra floating like jellyfish"
"Neon city rooftop — metallic boxes, spinning torus lights, heavy haze"
04

Holoforge SDK

Installation

The SDK gives your game access to player accounts, leaderboards, storage, marketplace, and server events.

import { HoloforgeSDK } from "holoforge-sdk"

const hf = new HoloforgeSDK()

Get current player

Returns the authenticated Holoforge user if the game is being played while logged in.

const user = await hf.user()
// { id, username, avatarUrl? }

Leaderboards

Submit and retrieve scores for your game. Scores are scoped to your game ID automatically.

await hf.leaderboard.submit({ score: 1337, player: "Runner01" })
const top = await hf.leaderboard.top(10)
// [{ rank, player, score, ts }, ...]

Storage + Marketplace + Server

Use per-player storage, runtime marketplace purchases, and server-side authoritative actions.

await hf.storage.set("checkpoint", { level: 3, hp: 82 })
const checkpoint = await hf.storage.get("checkpoint")

const catalog = await hf.market.catalog({ q: "sword", sort: "popular" })
await hf.market.purchase("item_abc123")

await hf.server.event("score.add", { amount: 100 })
05

REST API

List games

Returns all public games with optional filtering.

GET /api/games?q=neon&tag=Racing&sort=plays

// Response
{ games: [...], total: 42 }

Get game

Returns a single game record by slug ID.

GET /api/games/:id

// Response
{ game: { id, title, author, plays, cdnUrl, ... } }

Increment plays

Call this when a player loads your game to increment the play counter.

POST /api/games/:id?action=play

Submit a score

POST a score to a game's leaderboard. player defaults to 'Anonymous' if omitted.

POST /api/leaderboard/:gameId

// Body
{ score: 1337, player: "Player1" }

// Response
{ ok: true, rank: 4 }

Get top scores

Returns the top N scores for a game (default 10, max 100).

GET /api/leaderboard/:gameId?n=10

// Response
{ scores: [{ rank, player, score, ts }, ...] }

AI Scene Generator

Generate scene commands from a natural language prompt.

POST /api/generate

// Body
{
  prompt: "foggy mountain valley",
  provider: "anthropic",
  model: "claude-sonnet-4-6",
  skillPreset: "threejs-visualizations", // optional
  apiKey: "sk-ant-..."
}

// Response
{ commands: [{ cmd: "addObj", type: "terrain", ... }, ...] }

Ready to build?

Open Studio and describe your first world.