I made a 3D game with Three.js. How do I share it and get players?
A Three.js game is a web page, so any static host can run it. Build it with a bundler such as Vite, upload the output folder, and test it on a phone, because 3D games tend to struggle on phones before they struggle on computers. Then list the link on Foundplay, with a short clip that shows the 3D.
Updated October 10, 2026. Written by Foundplay, a game discovery platform for free browser games. Foundplay also sells Boost, a paid promotion for games, and this guide says where it fits. The advice before that part works without it. All guides
Build and host it
Bundle the game with a tool like Vite: npm run build writes the finished files to a folder, usually dist. Upload that folder to a static host such as GitHub Pages, Netlify, Vercel or Cloudflare Pages. A project page on GitHub Pages lives under a sub-path like /your-repo/, and assets at /assets/... will 404 there. Set Vite's base option to match, or use relative paths, and the blank page goes away.
Don't test by double-clicking index.html. Loaders fetch files, and browsers block that from a file address. Use the dev server, or run npm run preview on the build.
Make the first load small
- Compress meshes in glTF files with Draco or meshopt, and use the matching Three.js loaders to read them.
- Use compressed texture formats such as KTX2 where you can, or smaller JPEG and WebP images for flat color maps.
- Show a loading bar. Three.js has a
LoadingManagerthat reports progress for everything the loaders fetch. - Start loading the heavy level after the menu appears, not before.
Tune it for phones
- Cap the pixel ratio:
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))saves a lot of work on dense screens. - Cut shadows, lights and post-processing first. They cost the most for the least visible change.
- Merge meshes or use
InstancedMeshto lower the number of draw calls. - Pause rendering when the tab is hidden, using the
visibilitychangeevent. - Use touch and pointer events for controls. Orbit-style controls suit a viewer, not most games.
- Test on a mid-range Android phone, not only the newest iPhone.
Phones can also lose the graphics context when memory runs low. The WebGL guide shows how to handle that.
Show the 3D in the cover and the clip
3D is hard to read in a still. Record a clip where the camera moves, or the player turns a corner, so depth shows. Take the cover from real play, with the subject large and the horizon visible. A rendered mockup that doesn't match the game sets the wrong expectation.
Where 3D players and builders hang out
The Three.js forum and Discord server, and subreddits such as r/threejs and r/webgl, are full of people who like seeing finished projects. Read their rules for posts that show finished work. For players rather than builders, use the genre communities for the kind of game it is.
How Foundplay can help
Foundplay is a game discovery platform for free browser games. It doesn't host games: every listing sends players to the creator's own site.
The free listing
Listing a game is free. Paste the link where people play it at /submit, check the details and publish. The game goes live right away, and Play sends players to your own site.
Mark whether the game works on phones, since many visitors browse on one. The source link field can hold your repository.
Boost, the paid option
Foundplay sells Boost, so it has a reason to want you to buy it. The free listing works without it.
A 3D game's first load is the part to measure, and Starter gets strangers through it. Your own analytics show whether they stayed. Foundplay counts the click on Play.
The Starter plan costs $5 for 50 plays in 3 days, which works out to 10¢ a play. Where it shows: its genre pages and search results.
A play is a counted click on Play from a sponsored spot, the same way public play counts work: once per game per network a day. Every sponsored spot is labelled Sponsored, and the share of plays not delivered by the end of the plan's days is refunded automatically. Foundplay can't see what players do after the click. Fan games and copies of commercial games can't be boosted. A game has to be listed before it can be boosted. List it first, or start a Boost and add your play link there, and Foundplay lists the game for free as part of the same flow.
For scale, Foundplay's own visit counter shows an average of 4,500+ visitors a day over the last three full days, and 600+ games are listed. It updates every few minutes.
More free ways to find players are in the full guide.
Questions
- How do I host a Three.js game for free?
- Use a static host: GitHub Pages, Netlify, Vercel or Cloudflare Pages. Build the project, upload the output folder, and check each host's current free limits, especially for large model and texture files.
- Why is my Three.js game a blank page after I deploy?
- Often the files are requested from the wrong path, for example
/assets/...on a site that lives under a sub-path, or with different capitals than the file on disk. Open the browser console and check the failed requests. - Does Three.js work on phones?
- Current phone browsers support WebGL, so yes. The challenge is speed and memory. Lower the pixel ratio, cut effects and test on a real phone.
- Should I use WebGPU instead of WebGL?
- Three.js has WebGPU support, but support differs between browsers and devices. Offer a WebGL fallback, and check current compatibility tables before you require WebGPU.