Live: https://fluxora-website.vercel.app
The public site for Fluxora, a continuous payment streaming primitive for Soroban.
Static output, no backend, no runtime chain calls. It is meant to still be the right site in a year when an integrator arrives from a docs link.
npm install
npm run dev # local
npm run build # -> dist/
| page | contents |
|---|---|
/ |
What Fluxora is, the stream lifecycle, what you build on it, a quickstart against the deployed contract, what has been verified and how, known limitations, and status |
/abi/ |
Function surface, the Stream struct, invariants I1–I5, accrual semantics including pause and cliff, and error codes |
/limitations/ |
KNOWN-LIMITATIONS.md reproduced in full |
Every number on the site comes from src/data/contract.ts, and every value
there was taken from the contracts repository or a live network query. Nothing
is estimated. If a figure could not be verified it does not appear.
The ABI page does not transcribe the contract. src/data/generated/interface.rs
is the verbatim output of
stellar contract info interface --id <CONTRACT> --network testnet
and src/data/parseInterface.ts parses it at build time. The function
signatures rendered on the page are the ones the chain reports. Hand-written
encoding against this contract is exactly what broke the previous frontend, so
the site does not do it.
src/data/generated/KNOWN-LIMITATIONS.md is vendored from the contracts repo,
minus only its title line, which the page supplies.
To refresh after a contract change, re-run the command above into
src/data/generated/interface.rs, re-copy the two markdown files, and update
the hashes in src/data/contract.ts.
Ground: the marine chronometer and its almanac — the instrument built to hold exact time continuously, well enough to settle a position. Same pair of ideas as the contract.
Five tokens. Two accents, each with exactly one job, so colour carries meaning: brass is movement (accrual, and only accrual), verdigris is proof (verified facts, and only verified facts). Dark mode is the same instrument illuminated at night, not a second palette.
Type: Libre Caslon Display for display — the Nautical Almanac was set in Caslon, which is a better fit for the almanac direction than a contemporary variable serif; IBM Plex Sans for body; IBM Plex Mono for every quantity, with tabular figures so digits do not jitter while the gauge accrues. All three are self-hosted, so no network request can blank the text.
The one bold element is the settlement gauge in the hero. It shows both
halves of the thesis at once: a figure that visibly moves, and the identity
vested + refundable = deposited that visibly stays true while its terms
change. It is client-side arithmetic over fixed numbers, labelled as an
illustration inside the component itself so the disclaimer cannot be separated
from the figure by a layout change.
Motion is spent there and nowhere else. Under prefers-reduced-motion the gauge
settles to a static mid-schedule value with the identity satisfied, rather than
freezing mid-transition.
- AA contrast verified for every foreground/background pair in both themes, including 12px labels — which are normal-size text by WCAG, not large.
- The signature element works at 380px rather than degrading; the illustration disclaimer stays legible and unclipped there.
- One
h1per page, headings in order, visible focus on every focusable, skip link, no horizontal overflow.
Vercel is the live target — https://fluxora-website.vercel.app. Deploys from
this directory with vercel deploy --prod; settings are in vercel.json.
GitHub Pages is also wired up via .github/workflows/deploy.yml and works once
Pages is enabled with source "GitHub Actions" in repository settings.
Vercel serves from the domain root; GitHub Pages serves this as a project site
under /Fluxora-Website/, which needs a base. astro.config.mjs reads
DEPLOY_TARGET and applies the base only for pages. Getting this wrong is
silent and total — every internal link and asset URL resolves to the wrong
place — so the Pages workflow sets DEPLOY_TARGET: pages explicitly and
everything else (Vercel, local dev) defaults to root.
Set SITE_URL to override the canonical/OG origin for a non-default domain.