> ## Documentation Index
> Fetch the complete documentation index at: https://aceup.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# PUBLISHING

# Ace Up docs — publishing

This repo is the **source of record** and the **live git source** for the Ace Up
docs site. Written 2026-09-11.

## Live

**[https://aceup.mintlify.site](https://aceup.mintlify.site/index.md)** · project `app.mintlify.com/xhuntr/aceup` ·
account `nextrongear@gmail.com` (GitHub `nxsdevv`) · plan `hobby`

41 pages across two tabs — **Players** (30) and **Venue owners** (11).

## How to update it

**Push to `main`. That is the whole workflow.** The deployment's git source is
`nxsdevv/aceup-docs`, so a push rebuilds the site.

One wrinkle: **studio's git cannot reach GitHub.** `git push` and even
`git ls-remote` hang indefinitely from this box — not fail, hang, and
`GIT_TERMINAL_PROMPT=0` does not make them fail fast. Plain HTTPS is fine
(`api.github.com` answers in 0.2 s; `info/refs` correctly returns 401), so it is
git's transport specifically, not the network and not credentials. xhuntr's git
works normally. So:

```bash theme={"dark"}
cd /root/server2 && rsync -az --delete aceupdocs/ xhuntr:/root/server2/aceupdocs/
ssh xhuntr 'cd /root/server2/aceupdocs && git push origin main'
```

Verify with the GitHub MCP (authenticated as `nxsdevv`), which does work here.

> Every repo on these machines is private, permanently. `nxsdevv/aceup-docs` is
> private — do not change that.

## The git source

Repointed 2026-09-11 from Mintlify's auto-created `mintlify-community/docs-xhuntr-4ad3ccd2`
to `nxsdevv/aceup-docs` using `deployment.updateGitSourceItem` through the admin
MCP. The Mintlify GitHub App already had access to `nxsdevv` — proven before
trusting it, by `checkout` returning this repo's own HEAD sha as its base.

Rollback, if ever needed:

```js theme={"dark"}
await deployment.updateGitSourceItem({ index: 0, gitSource: { type: "github",
  owner: "mintlify-community", repo: "docs-xhuntr-4ad3ccd2",
  deployBranch: "main", contentDirectory: "", isPrivate: true }},
  { subdomain: "aceup" });
```

## The admin MCP (for config and nav, which are not in this repo's control path)

`https://mcp.mintlify.com`, JSON-RPC over HTTP, OAuth token in **xhuntr's**
`~/.claude/.credentials.json` (scopes include `docs:write`, `nav:write`,
`config:write`, `deployment:write`). The token is not tied to that box — it
works over plain HTTP from anywhere. Helper scripts on xhuntr: `/tmp/mcli.py`
(generic caller), `/tmp/publish.py`, `/tmp/republish.py`.

Three gotchas that cost real time:

1. **Cloudflare 1010-blocks a bare Python user-agent.** Send `User-Agent: node`.
2. **`checkout` is required before any editor tool**, and a session goes stale
   once `save` merges it — the next `update_config` then fails with
   `no_editor_metadata`. Pass a fresh `branch` to `checkout` on every run.
3. **`create_node` on a path that already exists silently attaches to the
   existing file** instead of seeding your content. This is what left the
   homepage as an empty `index.mdx` serving a `/` → `/` redirect loop while
   every status check said 200. Use `write_page` after creating, and verify.

`docs.json` is **not** writable via `write_page`. Site config goes through
`update_config`; navigation only through `create_node` / `update_node`.

Do not confuse this with `app.mintlify.com/xhuntr/aceup/products/mcp` — that is
an MCP server Mintlify auto-generates *from* the published docs for readers' AI
tools. It needs no setup and publishes nothing.

## Images

`images/screens/` holds 30 WebP screenshots of the **real built Mini App**,
captured by the Gate F Playwright walk — not design mockups. Downscaled to 780px
and converted from PNG (7.8 MB → 1.4 MB). Brand assets in `images/brand/`.

All references are **repo-relative** (`/images/...`). An earlier pass hotlinked
them from `aceup.xhuntr.com` because the admin MCP has **zero asset operations**
(verified by searching the SDK); that was undone once the repo was connected,
since hotlinking produced CORS console noise and tied the docs to the casino
server being up. Leftover unused copies at `rhbot/miniapp/public/docs` and
`rhbot/miniapp/dist/docs` can be deleted whenever convenient.

## Content rules baked into these pages

Do not undo these in an edit pass:

* **Mainnet framing.** Every money page reads as if mainnet is live — the user's
  explicit choice. It was **not** live when written (Gate H blocked on bankroll
  funding, cold addresses, token rotation), which is why a pre-launch banner is
  set in `docs.json`. **Remove the banner when mainnet goes live.**
* **"Robinhood Chain"** / **"ETH on Robinhood Chain"**. Never "Robinhood ETH" or
  "Robinhood Ethereum". The not-affiliated disclaimer is on `money/chains.mdx`,
  `help/security.mdx` and `help/faq.mdx`.
* **The edges are printed** — 0.380% main, 6.0% Perfect Pairs, 4.8% 21+3.
* **No loss-chasing copy.** No deposit prompt after a loss, no "approaching your
  limit" nudges, nothing that encourages another hand.
* **Owners and managers cannot play at their own venue** — in the owner section,
  the tables page and the FAQ.
* Nothing from `.env`, no wallet addresses in copy, key handling described only
  as "encrypted at rest".

## Where the facts came from

Every number was read out of the running code, not the design artifacts —
`rhbot/docs/ARTIFACT-GAPS.md` exists because the build and the artifacts disagree
on nearly every screen, and it says the build wins.

| Fact | Source |
| - | - |
| Limits, holds, timers, shares, minimums | `rhbot/src/config.ts` |
| House edge 0.380%, side-bet paytables and edges | `rhbot/src/http/routes.ts` `/rules` |
| Rule set (6 decks, S17, 3:2, DAS, split 4, no surrender) | `rhbot/packages/blackjack-core/rules.ts` |
| Commit/reveal/verify, HMAC-SHA256 + unbiased Fisher–Yates | `rhbot/packages/blackjack-core/{fairness,shuffle}.ts` |
| 7 bot commands, menu button, descriptions | `rhbot/src/bots/instances.ts` |
| Weekly close, carry-forward, payout threshold, round-down | `rhbot/src/revshare/` |
| Self-exclusion 1/7/30/90, no early lift | `rhbot/src/compliance/`, `/self/pause` |
| Voice: WebRTC P2P, STUN/TURN, gate reasons, report | `rhbot/src/voice/voice.ts` |
| Owner tables editable but not creatable | `/venue/tables/:id` in routes.ts |
| Age 21, terms v2 | `config.termsVersion` + its comment |

**The published numbers are the live numbers.** `config.ts` parses money policy
as `int(NAME, fallback, …)`, so a `.env` override would diverge silently from the
code default — exactly how the XHuntr docs shipped wrong prices. Checked by
counting keys in rhbot's `.env` without opening it: `MIN_DEPOSIT_LAMPORTS`,
`MIN_DEPOSIT_GWEI`, `AUTO_WITHDRAW_DAILY_LAMPORTS`, `AUTO_WITHDRAW_DAILY_GWEI`,
`WITHDRAW_HOLD_MIN`, `DAILY_ROUND_CAP`, `OWNER_SHARE_DEFAULT_PCT`,
`PAYOUT_MIN_LAMPORTS`, `TABLE_BET_SECONDS` are all **absent**, so the fallbacks
are what the service runs. Re-check after any `.env` change.

Three claims verified against the build rather than the design prose:

* Group card **is** edited in place — `src/telegram/groupcard.ts:106`.
* No game audio exists (ARTIFACT-GAPS G1 is `OPEN`). No page mentions sounds.
* The public verify page is a **four-field verifier form**, not a whole-table
  round viewer. An earlier draft said otherwise and was corrected.

## Open at handover

* [ ] **Remove the pre-launch banner** when mainnet is live (`banner` in `docs.json`).
* [ ] **Recapture `12-wallet-deposit.webp`** on mainnet — it shows "Solana devnet"
  from the pilot and carries an honest `<Info>` caption on `money/deposit.mdx`
  that should go with it.
* [ ] Custom domain: the user chose to stay on `aceup.mintlify.site` for now.
  The pattern, when wanted, is
  `vercel dns add xhuntr.com docs.aceup CNAME cname.mintlify.builders`
  plus the two TXT records Mintlify issues for the cert.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.