Transparency
Site audit
A self-run review of this site: what is in place, what is missing, and what we are fixing next. Published here so you do not have to take our word for it. Secrets, keys and infrastructure internals are deliberately left out.
Security
B+
Performance
A-
SEO and sharing
A-
Accessibility
B
Operations and reliability
C+
Data correctness
A-
Method
- Live HTTP checks of every public page: response headers, time to first byte, HTML and script weight.
- A read of the full application source: authentication, key storage, the keeper, the reserve ledger and the operator endpoints.
- Rendering checks for metadata, sitemap, robots and social previews.
- Not included: a smart-contract audit of the launch protocol, a review of any issuer, or a penetration test by a third party.
Security
Auth and key handling are sound. The keeper cannot reach anyone's balance. The remaining gap is a Content-Security-Policy.
- Pass
Transport and browser hardening headers
HSTS, X-Frame-Options DENY, X-Content-Type-Options nosniff, Referrer-Policy strict-origin-when-cross-origin and Permissions-Policy are set on every response.
- Pass
Wallet auth is per-request signatures
Yield claims and key management require a message signed by the wallet with a timestamp, valid for ten minutes. No session cookie, no address trusted from a request body.
- Pass
API keys stored as SHA-256 only
The plaintext key is shown once at mint and never persisted. Revocation is immediate and keeps the claim record.
- Pass
Keeper is a spender, not an owner
The treasury can hold fees and swap them into the backed asset. It cannot mint, cannot reach locked liquidity and cannot touch a holder's balance.
- Pass
Purchases are read from chain, not from the client
Every reserve row cites the claim tx and the swap tx. A row without both is not credited.
- Partial
Issuer risk is disclosed, not controlled
The reserve holds third-party tokens. Their custody, oracle and redemption terms are shown on every asset card; they are not ours to enforce.
- Gap
No Content-Security-Policy
Issuer favicons and token images are loaded from arbitrary origins, which makes a strict CSP hard. A nonce-based policy is planned.
Performance
Every public page is server-rendered from a snapshot; nothing waits on an RPC in the request path.
- Pass
Server-rendered HTML
Markets, reserve and token pages render on the server. The client bundle is limited to the launch form, the catalogue filter, the comparison table and the wallet button.
- Pass
Self-hosted fonts
Instrument Sans and DM Mono are served from the same origin with font-display swap.
- Partial
Third-party icons
Issuer icons come from a favicon service. A cached copy per issuer would remove the dependency.
SEO and sharing
Titles, descriptions and a generated Open Graph image on every route.
- Pass
Metadata
Every page sets a title and inherits the site description. The OG image is generated at build time.
- Partial
Per-token share cards
Token pages use the site-wide card. A per-token image with the backing asset and NAV is planned.
Accessibility
Semantic tables and lists, visible focus, reduced-motion respected. Colour contrast on faint text is at the limit.
- Pass
Reduced motion
The hero chart and every transition are disabled under prefers-reduced-motion.
- Pass
Decorative graphics are hidden
The chart, rails and avatars carry aria-hidden or empty alt.
- Partial
Faint text contrast
The faint colour on white sits just above 4.5:1. Mono labels at 11px are small; nothing critical is set in them alone.
Operations and reliability
Two steps in the money path are manual, and it is better to say so than let someone find out.
- Gap
Asset purchases are executed by the keeper, not a contract
The keeper swaps claimed ETH into the backed asset through the issuer's on-chain venue. If the venue is closed or the issuer gates the address, the claim is booked and the purchase waits.
- Gap
Yield is booked when the issuer pays it
Accrual shown on the site is an estimate from the stated rate. The ledger only credits what actually landed.
- Partial
Trade volume depends on the indexer
Trades are mirrored from chain logs by a scheduled job. Price and market cap do not depend on it.
Data correctness
The reserve is a ledger, not a balance. Every number on the site is the sum of rows that cite a transaction.
- Pass
Integer micro-USD everywhere
No floating point in the ledger. Cost, NAV and yield are integers; display rounds, storage does not.
- Pass
NAV is the issuer's number
The site does not price assets itself. When an issuer feed is stale, the page says so instead of guessing.
- Partial
Snapshot data in this build
This deployment renders from a static snapshot shaped like the API. Live figures land when the indexer is wired in.