Publishing the site
The site is a static folder. There is nothing to run on the server for the pages themselves.
Build the folder
node tools/build-dist.mjs
This writes dist/: the pages, the three pure engine files the lab and the home page re-run in the browser (battery, hooks, config), a sitemap, a robots.txt and the security headers. The address comes from site in site/assets/js/config.js. node tests/dist.mjs serves dist/ the way a plain static host would and checks every page.
site/serve.mjs (what launch.bat runs) does the same on the fly for local use. A static host does not run it, which is why the build copies those engine files next to the pages.Netlify
Connect the repository. netlify.toml already says: build with node tools/build-dist.mjs, publish dist. Nothing else to set. Cloudflare Pages and GitHub Pages work the same way: build command above, publish directory dist.
The domain
Add the domain in the host's settings, then create at your registrar:
| Type | Name | Value |
|---|---|---|
| CNAME | www | the target the host gives you (for Netlify, <your-site>.netlify.app) |
| A or ALIAS | @ (the bare domain) | the host's apex address, or a redirect to www |
The host issues the HTTPS certificate once the DNS answers. A change at the registrar can take from minutes to a day.
What a static host does not do
An organism writes data/<id>/status.json, feed.json and series.json as it runs, and the pages read them. A static host serves the folder as built, so:
- Without an organism published, the pages show the demo organism, labelled as simulated. That is the honest state of a site whose coin has not launched.
- To show a real organism, its public files have to be reachable. The simplest way: set
PUBLISH_GIT=1in the runner's.env. Every 10 minutes the runner pushes the public files (status.json,feed.json,series.jsonand the listorganisms.json, neverstate.json, the journal or any control file) to a branch calleddataof the repository, as ONE commit that is amended and force-pushed, so the repository does not grow. The site, when it is not on localhost, reads them fromdataRemoteinconfig.js(the branch's raw address, readable from any browser, refreshed by GitHub every 5 minutes). No server, no redeploy of the site. - The other way: run
node site/serve.mjsandnode engine/runner.mjson a small server and put the domain on it. - The runner never needs to be reachable from the internet. It makes outgoing calls only (the chain's RPC, the model API).
The numbers on the site
The strip under the home hero and the plate on the token page show live numbers read from the chain by each visitor's browser: what sits at the burn address and the share of the supply it is, the market cap and the price (from the curve or the Uniswap v4 pool), the fees the wallet has claimed, and what the wallet holds. They refresh every 30 seconds, need no runner and no server of ours, and work on a static host as soon as ca is set. Add ?ca=0x... to the home or token address to look at any Pons coin the same way. Without a coin, the strip shows the demo organism and says so.
Before the coin exists
Fill in ca and buy in site/assets/js/config.js when the coin launches, rebuild, and the token page shows the address, the explorer link and the trade link. Until then it says the address is to be announced.
What never goes in the folder
The .env (it holds the wallet key and the model key), node_modules, the data of a running organism if it holds anything you do not want public (it is meant to be public). tests/dist.mjs fails if an API key appears anywhere in dist/.