Troubleshooting
Each heading is a symptom, and the first sentence under it is the usual cause. The fix follows.
The safety check refused my version
The take of your version showed something the content policy does not allow, or its address, or one its entry page names, is on a list of known malware and phishing. The reason is in the CLI's output and on the space's Files tab; the live version, if there is one, keeps serving.
- A sign-in, password, payment or wallet form is refused even in a game. Use Sign in with Velven for accounts.
- Betting for money, or anything that can be cashed out, is refused. Play money that never leaves the game is fine.
- If the reason is wrong, press Ask for review on the Files tab, once per version, and a person at Velven looks at it.
The check could not judge my version
The take showed a black screen, a loading screen, or a start screen it never got past, so there was nothing to judge. What it saw is on the Files tab and in the CLI's output.
Add a start hint to velven.json and publish again: the check presses it before it looks. velven.json has the forms.
{ "start": { "click": "Play" } }{ "start": { "key": "Space" } }{ "start": { "click": [640, 400] } }A space that needs a long load, a sign-in or a second player to show anything can still be judged by a person: press Ask for review.
Publishing answers too_large or too_many_files
A version holds at most 100 MB and 2,000 files, or 50 MB and 1,000 without an account; the message names the largest files. Limits.
- Publish the build's output folder, not the project:
./dist,./buildor the export folder, never the folder withnode_modulesand sources. - Leave source maps, raw assets and test files out with a
.velvenignorefile. - Ship compressed builds: a
.bror.gzfile is served as the file inside it.
velven publish --prod answers sign_in_required
You are not signed in, so the CLI publishes to an unlisted page, where every publish is checked and then live, and production needs an account. Run velven login, then publish again from the same folder: the page becomes yours and --prod works. In CI, set VELVEN_TOKEN.
My hosted space is blank, or a file answers 404
A path in the page does not match a file in the version, usually because of a build setting.
- Paths are matched exactly, capitals included:
Assets/logo.pngis notassets/logo.png. - The space has its own address, so paths from the root, such as
/assets/game.js, work, and so do relative ones. - A page that routes in the browser, with addresses like
/level/3, needs"spa": trueinvelven.json. - A build that needs
SharedArrayBuffer, such as a threaded Godot 4 or Unity export, does not run on Velven. Export it without threads. How Velven serves your files.
Scores from a preview are not on the board
Previews and velven dev write to your space's sandbox, never the live space, so what you test never shows publicly. Velven.sandbox is true there. Clear the test data with velven reset.
Every score answers server_only
Your board's trust is server, the default, so Velven takes its scores only from your own server, never from the page.
For a page that posts its own scores, add "trust":"client" to the board in the page's block, deploy, and press Check my page now, under For developers on the Leaderboards tab of the space's edit page. To keep the board on server, post from your own function instead, as Server scores shows. On a space Velven hosts, add it to the board in velven.json instead and publish a version that goes live.
<script type="application/velven+json">{"boards":[{"key":"main","trust":"client"}]}</script>Note: On localhost the SDK takes a page's score on a server board, with a console note, so this shows up only on Velven. Add ?velven_strict=1 to the local address to see it there too.
Scores answer no_board
Velven has no board with that key for your space, usually because it has not read the page's block since you added it.
On a space Velven hosts, Velven never reads the page's block: declare the board in velven.json and publish a version that goes live (velven publish --prod). A preview uses the live space's boards. The rest of this section is for a page on another host.
Velven reads the block when the space is listed, on its background check every 6 hours, and when you press Check my page now. The button is under For developers on the Leaderboards tab of the space's edit page; it says what it found. If the board is still missing, check these:
- The key in the call matches the block. A call that names no board uses
main. - The block is in the page's HTML as served, not added by a script after load.
- The block is valid JSON. On the first score call, the SDK warns in the console, once, when the page has no block or one that does not parse.
You can also write boards without a deploy, through the REST API.
The proof check answers 409 unverified
Velven fetched your live page and did not find the proof tag naming your handle, usually because the deploy is not live yet or the host's cache still serves the old page.
Wait a minute, then check again. If it still fails, check these:
- The tag is in the page's HTML as served. Use View Source, not the browser's inspector: a tag added by a script after load does not count.
- The tag is in the
<head>of the URL you listed, the page Velven lands on after redirects. contentis your own handle, the one you are signed in as, such as@mara. Case does not matter.- For a move to another host, the tag is on the new page, and on a claimed space it names the space's owner.
The proof tag has the steps for each host.
Listing answers 422 unframeable
Your page's headers refuse to let velven.ai show it in a frame, with X-Frame-Options or a Content-Security-Policy whose frame-ancestors does not name velven.ai.
Every space plays inside the Velven page, so the fix is on your host. The answer's instruction and snippet name the change; Allow Velven to frame your page has it for each host. Deploy, then list the space again.
Note: A listed space whose host starts refusing frames leaves Velven until the header is back. Its page and its edit page show you the fix and a Check again button, which puts it back as soon as the page allows framing.
ready() takes 7 seconds outside Velven
In a frame that is not Velven's, such as another game portal or a blog, the SDK waits up to 7 seconds for Velven to answer before it settles on site.
Shorten the wait with data-probe-timeout on the script tag, or probeTimeoutMs in a bundle. The floor is 3 seconds, since inside Velven the page around your space can take that long to start on a slow phone.
<script src="https://velven.ai/sdk/v1.js" data-probe-timeout="3000"></script>In a top-level window and on localhost, ready() resolves at once. Timing has every wait.
The clip is stuck on Getting ready
A new space stays Getting ready, visible only to you, until Velven has recorded its clip, which usually takes a few minutes.
If recording fails for good, the tile says Unable to capture the clip and the space stays Getting ready. Fix it on the Clip tab of the space's edit page:
- Press Choose a video to use a clip of your own. Its first frame becomes the thumbnail, and the space goes live at once.
- Or press Record again, with a note on what the clip should show, such as “start after the title screen”. You can ask 2 times per space.
An agent can ask for a retake too, with POST /api/spaces/recapture.