The widget

A hosted swap interface you theme from a config object and wire to the wallet your user already connected. It can be on a page the same day.

It is running right here

Not a screenshot. This is the production widget, the same iframe you would embed.

Preview · live quotes · swaps run in the app

Two pieces, that is all

your appwallet connectedWIDGEThosted iframebridge:readythe widget loadsbridge:init · walletthe wallet they already connectedwallet:sendTransactionyour user taps swaptxHashsigned in your wallet · no second prompt

The iframe

Hosted at app.ravn.exchange/widget/v1 with your origin as a query parameter. We maintain it. You never ship or update swap UI code.

The connector

@ravnexchange/widget-connector bridges the iframe to the wallet connection your page already has. Your user is never asked to connect twice.

Ten fields, no CSS

The whole theme is a config object on createRavnWidgetBridge. Nothing to override, nothing to keep in sync when we ship an update.

FieldControls
primaryColorAccent, buttons, active states
secondaryColorSupporting accent
backgroundOuter surface
cardBackgroundInset panels
textPrimaryMain reading colour
textSecondaryLabels and secondary copy
successSettled and confirmed states
errorFailure and rejection states
borderRadiusCorner radius in px. 0 for square
fontFamilyAny family already loaded on your page

Nothing is held back

Same routing engine as the API. The widget gets the same venues and the same prices as the API.

Same venues

Every venue, raced in parallel, ranked on net output after gas.

Same chains

Native Bitcoin, native Solana and 15 EVM networks.

Same pricing

0 bps from us on retail. Set your own fee on your key and we pay it out.