Condenser — Reference
The complete reference for the web front-end: its architecture, how it talks to the stack, the main views, configuration, and how signing works. For a gentle introduction, start with the Quick guide.
Condenser (blurt/condenser) is the React.js web interface to Blurt. It is a server-side-rendered single-page app: a Koa server renders the first response, and the browser hydrates and takes over.
Architecture
browser ◄──► Koa SSR server ──► RPC proxy ──► nexus-go / blurtd
React (first paint, (one URL) (social / consensus)
Redux + saga sessions)- React renders the UI. Redux holds application state; redux-saga runs all side effects — the RPC reads, transaction signing, and broadcasts.
- react-router resolves routes on both server and client (
ResolveRoute,RootRoute). - Koa is the SSR server: it renders the initial HTML, serves assets, and manages server sessions (keyed by
SDC_SESSION_SECRETKEY). - blurtjs (
@blurtfoundation/blurtjs) is the chain client and crypto library — it builds, signs, and broadcasts transactions. - i18n: the UI is translated into many locales through
Translatorand thelocales/catalogs.
The app code lives under src/app (components/, redux/, utils/, client_config.js, routing, and locales).
How it talks to the stack
Condenser never talks to a database or holds chain state; it uses one RPC endpoint and lets the RPC proxy fan the calls out:
- Browser calls go to
SDC_CLIENT_BLURTD_URL; SSR server calls go toSDC_SERVER_BLURTD_URL. Both point at the RPC proxy. - Social reads (feeds, communities, profiles, discussions) resolve to nexus-go; consensus reads and broadcasts go to blurtd.
- Drafts use a draft API endpoint (
SDC_DRAFT_API_ENDPOINTS), served by nexus-go. - Images are fetched through an image proxy (
SDC_IMAGE_PROXY_PREFIX) and uploaded to an image service (SDC_UPLOAD_IMAGE_URL).
Signing and accounts
Keys never leave the user's device. Condenser signs transactions client-side with blurtjs and then broadcasts them through the proxy to blurtd. Users sign in with a posting key or through a keychain extension (e.g. WhaleVault); the front-end never sees or stores private keys server-side. The worst a compromised front-end can do is show wrong data — it cannot move funds without the user's key.
Main views
- Feeds — trending, hot, new, promoted, and per-community timelines.
- Post & comments — the discussion view with threaded replies and voting.
- Editor — markdown post/comment composer, with community targeting.
- Communities — community home pages, subscriber and role views.
- Profile — account pages (blog, posts, replies, wallet summary).
- Wallet views — balances, history, and transfers (the standalone wallet app is the dedicated tool).
- Notifications, search, settings.
Configuration
Condenser is configured with SDC_* environment variables (mapped in config/custom-environment-variables.json). The ones that wire it to a network:
| Variable | Purpose |
|---|---|
SDC_SESSION_SECRETKEY | server session secret; must stay constant across restarts |
SDC_CLIENT_BLURTD_URL | RPC endpoint the browser uses (the RPC proxy) |
SDC_SERVER_BLURTD_URL | RPC endpoint the SSR server uses |
SDC_USE_APPBASE | use the appbase JSON-RPC calling convention |
SDC_CHAIN_ID | chain id to sign against |
SDC_ADDRESS_PREFIX | public-key address prefix (BLT) |
SDC_DRAFT_API_ENDPOINTS | draft API (nexus-go) |
SDC_ALT_API_ENDPOINTS | alternative RPC endpoints |
SDC_IMAGE_PROXY_PREFIX / SDC_UPLOAD_IMAGE_URL | image proxy and upload service |
SDC_PRICE_INFO_URL | price feed for wallet displays |
SDC_COAL_URL / SDC_NSFW_URL / SDC_PHISHING_URL | moderation/safety lists |
WALLET_URL / DAPPS_URL / SPECIAL_POSTS_URL | links to the wallet app and related surfaces |
Base defaults live in config/default.json / config/production.json; the SDC_* variables override them at runtime.
Build and run
Condenser builds the React bundle and runs the Koa server (npm run build, then npm run production; npm start for development). It ships as a Docker image (registry.gitlab.com/blurt/blurt/condenser, plus an -arm64 variant). Provide a stable SDC_SESSION_SECRETKEY and point the SDC_*_BLURTD_URL variables at your RPC endpoint. See the repository for the current build and deployment details.
Where it fits
Condenser is the flagship read/write UI at the top of the stack. It consumes nexus-go and blurtd through the proxy — the same fusion every other page in this manual describes, seen from the browser's side: one URL in, the right backend serving each call.
