The console is now **qapi console**, served at https://qapi.blackbeard.observer. The papi logo and the upstream licence stay: this is a fork of polkadot-api/papi-console, not a rewrite, and the sidebar link points at our fork rather than theirs. Deployment follows architecture/deployment-gitea-actions.md — the workflow is the source of infra truth, and one-time host provisioning is an operator script: script/infra-setup.sh dns -> the Cloudflare CNAME to bl.thgttg.com cert -> Let's Encrypt, DNS-01, ECDSA edge -> gitea_ci, scoped sudoers, webroot, vhosts .gitea/workflows/deploy.yaml build (pnpm) -> rsync the bundle -> reload The roles run in that order because certbot uses a DNS-01 challenge and nginx fails its config test on a missing ssl_certificate — which would block every reload on a SHARED proxy, not just this vhost. The same reasoning bounds what CI may do: the sudoers drop-in grants rsync into one webroot, restorecon on it, a config test and a reload. No certbot, no /etc/letsencrypt, no sites-available write, no useradd. Two vhosts, per architecture/reverse-proxies.md: the public one on the https tier at 127.0.0.1:14443 behind the stream SNI router that owns TCP 443 (binding 443 directly is undetectable by `nginx -t` and ends with nginx silently serving stale certificates), and a qapi.internal one for mesh clients, which stays disabled until someone mints its internal certificate. There is no application host and no upstream: the console is a static SPA that opens WebSockets straight from the browser to the chains' own RPC endpoints. The build gate is `pnpm build` (tsc -b + vite build) plus a check that the signers-common patch is applied to the copy node actually resolves. Without that patch every signing attempt dies with `Unkown signer` in a browser, after deploy, in front of a user — and a lockfile drift is all it would take. `pnpm lint` is deliberately not in the gate: it is broken upstream and was before this fork touched anything (typescript-eslint 8.69 refuses to load against the TypeScript 7.0 this repo resolves). Live and verified: the public name answers 200 with this console's title over the WAN address, serving the Let's Encrypt certificate for it, and the whole deploy path — rsync as gitea_ci through the scoped sudoers, restorecon, config test, reload, fetch — has been run by hand end to end. Refs #3 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
87 lines
2.8 KiB
JSON
87 lines
2.8 KiB
JSON
{
|
|
"name": "qapi-console",
|
|
"private": true,
|
|
"version": "0.0.4",
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"build": "tsc -b && vite build",
|
|
"lint": "eslint .",
|
|
"preview": "vite preview",
|
|
"postinstall": "papi"
|
|
},
|
|
"prettier": {
|
|
"semi": false
|
|
},
|
|
"dependencies": {
|
|
"@acala-network/chopsticks-core": "^1.5.1",
|
|
"@ledgerhq/hw-transport-webusb": "^6.35.0",
|
|
"@monaco-editor/react": "^4.7.0",
|
|
"@paraspell/sdk": "14.3.4",
|
|
"@polkadot-api/descriptors": "file:.papi/descriptors",
|
|
"@polkadot-api/forklift": "^0.5.1",
|
|
"@polkadot-api/json-rpc-provider-proxy": "^0.4.1",
|
|
"@polkadot-api/metadata-builders": "^0.15.1",
|
|
"@polkadot-api/observable-client": "^0.19.1",
|
|
"@polkadot-api/react-builder": "^0.6.1",
|
|
"@polkadot-api/react-components": "^0.4.2",
|
|
"@polkadot-api/signers-common": "^0.3.1",
|
|
"@polkadot-api/substrate-bindings": "^0.21.1",
|
|
"@polkadot-api/tx-creator": "^0.2.0",
|
|
"@polkadot-api/tx-utils": "^0.6.1",
|
|
"@polkahub/ui-components": "^0.9.1",
|
|
"@radix-ui/react-accordion": "^1.2.20",
|
|
"@radix-ui/react-dialog": "^1.1.23",
|
|
"@radix-ui/react-label": "^2.1.15",
|
|
"@radix-ui/react-popover": "^1.1.23",
|
|
"@radix-ui/react-radio-group": "^1.4.7",
|
|
"@radix-ui/react-scroll-area": "^1.2.18",
|
|
"@radix-ui/react-select": "^2.3.7",
|
|
"@radix-ui/react-slot": "^1.3.3",
|
|
"@radix-ui/react-tabs": "^1.1.21",
|
|
"@radix-ui/react-toggle": "^1.1.18",
|
|
"@radix-ui/react-toggle-group": "^1.1.19",
|
|
"@radix-ui/react-tooltip": "^1.2.16",
|
|
"@react-rxjs/core": "^0.10.8",
|
|
"@react-rxjs/utils": "^0.9.7",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"idb-keyval": "^6.3.0",
|
|
"lucide-react": "^1.41.0",
|
|
"polkadot-api": "^3.1.0",
|
|
"polkahub": "^0.9.1",
|
|
"react": "^19.2.8",
|
|
"react-dom": "^19.2.8",
|
|
"react-portal": "^4.3.0",
|
|
"react-router-dom": "^7.18.3",
|
|
"react-svg": "^19.1.5",
|
|
"react-virtuoso": "^4.18.13",
|
|
"react18-json-view": "^0.2.10",
|
|
"rxjs": "^7.8.2",
|
|
"save-as": "^0.1.8",
|
|
"tailwind-merge": "^3.6.0",
|
|
"tailwindcss-animate": "^1.0.7",
|
|
"uplot": "^1.6.32",
|
|
"uuid": "^14.0.2"
|
|
},
|
|
"devDependencies": {
|
|
"@eslint/js": "^10.0.1",
|
|
"@tailwindcss/vite": "^4.3.3",
|
|
"@types/node": "^26.4.1",
|
|
"@types/react": "^19.2.18",
|
|
"@types/react-dom": "^19.2.7",
|
|
"@types/react-portal": "^4.0.7",
|
|
"@vitejs/plugin-react": "^6.1.1",
|
|
"eslint": "^10.10.0",
|
|
"eslint-plugin-react-hooks": "7.1.1",
|
|
"eslint-plugin-react-refresh": "^0.5.6",
|
|
"globals": "^17.12.0",
|
|
"prettier": "^3.9.6",
|
|
"tailwindcss": "^4.3.3",
|
|
"typescript": "^7.0.2",
|
|
"typescript-eslint": "^8.69.0",
|
|
"vite": "^8.2.2"
|
|
},
|
|
"packageManager": "pnpm@11.22.0+sha512.1ff870c4c6133dfd88fb2afc46dd13d47f09c9794b438c6fdb47ca98caf3bc16381ee0be93a091b8e3824cf01f889f46d7d9e20910fb0be1ab0fb5baa80dd621"
|
|
}
|