Euler Lite
euler-lite is an open-source frontend codebase for Euler V2. It packages lending, borrowing, portfolio, rewards, and optional product pages into a self-hosted interface that operators can configure and theme.
Use Euler Lite as a starting codebase rather than assuming it supports every deployment or workflow. It uses the Euler V2 SDK; verify the repository revision, configured chains, data sources, transaction plans, and contracts for your deployment.
Product scope
Euler UI exposes the core flows a lending frontend needs:
- Lend: deposit assets into selected Euler vaults to earn yield.
- Borrow: open and manage debt positions against accepted collateral.
- Portfolio: track positions and performance.
- Rewards: show supported Merkl, Incentra, and Fuul reward programs.
- Multichain: configure networks represented in the app's supported chain registry and wallet setup. An unknown chain can require code, registry, address, and data-source changes.
- Optional pages: toggle Earn, Lend, Explore, entity branding, vault-type labels, reward integrations, policy links, and social links through configuration.
Prerequisites
- Node.js 24+ (24.14.1 recommended)
- npm
- Git
- A Reown Project ID (formerly WalletConnect), obtainable at reown.com
Quick start
git clone https://github.com/euler-xyz/euler-lite
cd euler-lite
npm ci
cp .env.example .env
# Fill in required values (see below)
npm run devThe app will be available at http://localhost:3000.
Required environment variables
| Variable | Description |
|---|---|
APPKIT_PROJECT_ID (or NUXT_PUBLIC_APP_KIT_PROJECT_ID) | Reown (WalletConnect) project ID. |
NUXT_PUBLIC_APP_URL | Your app's public URL. |
RPC_URL_<chainId> | RPC endpoint per chain (e.g. RPC_URL_1 for Ethereum). |
SUBGRAPH_URL_<chainId> (or NUXT_PUBLIC_SUBGRAPH_URI_<chainId>) | Subgraph URI per chain. SUBGRAPH_URL_* is server-only and preferred; NUXT_PUBLIC_SUBGRAPH_URI_* remains supported. |
The server reads RPC_URL_<chainId> and the matching subgraph setting at startup. Environment variables alone do not establish complete support for an unknown chain; verify the app registry, wallet configuration, contract addresses, SDK adapters, and data sources.
# Ethereum Mainnet
RPC_URL_1=https://your-rpc-endpoint.com
SUBGRAPH_URL_1=https://your-subgraph-host/euler-mainnet/latest/gn
# Arbitrum
RPC_URL_42161=https://your-arbitrum-rpc.com
SUBGRAPH_URL_42161=https://your-subgraph-host/euler-arbitrum/latest/gnAPI endpoints
| Variable | Default | Description |
|---|---|---|
V3_API_URL (or EULER_SDK_V3_API_URL) | https://v3.euler.finance | Euler V3 upstream used by the internal server proxy and SDK configuration. |
EULER_SDK_V3_API_KEY | — | Optional server-side V3 API key forwarded as X-API-Key. |
SWAP_API_URL (or NUXT_PUBLIC_SWAP_API_URL) | — | Euler swap API. |
PYTH_API_KEY | — | Optional server-side API key sent as Bearer authentication by the internal update proxy (/api/internal/pyth/updates) to its hard-coded https://hermes.pyth.network upstream. |
SDK data-source controls
| Variable | Default | Description |
|---|---|---|
SERVER_VAULT_CACHE_SOURCE | fallback | Server snapshot builder adapter chain: fallback, onchain, or v3. |
NUXT_PUBLIC_BROWSER_VAULT_SOURCE | fallback | Browser fast SDK adapter chain: fallback, onchain, or v3. Plan-time SDK reads remain onchain. |
DISABLE_SERVER_VAULT_CACHE | false | Disable internal server vault snapshots and let the browser use the configured RPC pipeline. |
DEPRECATED_CHAINS | — | Comma-separated chain IDs shown collapsed in the chain selector and skipped by warm-cache cycles. |
ONCHAIN_SDK_CHAINS | — | Chain selection for configured onchain SDK reads; verify current syntax in the repository. |
EVAULT_FETCH_CHUNK_CHAINS | — | Chain selection for chunked EVault fetching; verify current syntax in the repository. |
The current implementation routes these server functions under internal paths such as /api/internal/v3, /api/internal/pyth/updates, and /api/internal/vaults. Treat internal routes as implementation details and verify them against the pinned repository revision before building integrations around them.
Customization
Euler UI is designed to be rebranded with minimal code changes:
- Theme colors: edit the
THEME CONFIGURATIONsection at the top ofassets/styles/variables.scss. Accent, status, chart, and graph palettes (plus their light/dark overrides and derived shadows/glows) all flow from these CSS custom properties. - Logo: the logo renders as an inline SVG using
currentColor, so it follows the accent color by default. SetNUXT_PUBLIC_CONFIG_LOGO_URLto use a custom logo, with the built-in Euler logo as fallback. - Favicon: replace
favicon.icoandfavicon.svginpublic/favicons/. - Token icons: drop overrides into
assets/tokens/<symbol>.png. Icons otherwise resolve from a unified server-side token list aggregating the Euler SDK list, DefiLlama, Uniswap, and Merkl. - Branding and feature flags: toggle pages (Earn, Lend, Explore), entity branding, vault-type labels, reward integrations (Merkl, Incentra, Fuul), social links, policy URLs, titles, and more via
NUXT_PUBLIC_CONFIG_*environment variables. - Curated Earn vaults: point the app at your own labels repository with chain-specific
earn-vaults.jsonfiles to restrict which EulerEarn vaults are shown. With the defaulteuler-xyz/euler-labelsrepository, entries selected by the configured labels and discovery logic may appear. Verify the filtering behavior against the pinned Euler Lite and labels revisions.
See the repository README for the full list of NUXT_PUBLIC_CONFIG_* flags and SDK data-source controls.
Security boundaries
Keep RPC credentials, API keys, signer material, and other secrets in server-only variables and a secret manager. Any NUXT_PUBLIC_* value is delivered to the browser and must be treated as public. Review which server endpoints proxy privileged upstreams, restrict CORS to intended origins, configure a content-security policy, rate-limit exposed endpoints, and avoid embedding unrestricted provider keys in client bundles.
Self-hosting also makes the operator responsible for dependency updates, domain and TLS configuration, wallet/app identifiers, policy links, monitoring, logging, incident response, and validation of every enabled chain and transaction flow.
Build and deployment
npm run build
npm run preview # preview locallyThe repository includes a Dockerfile with Doppler integration for runtime secret injection:
docker build --build-arg APP_PORT=3000 -t euler-lite .
docker run -p 3000:3000 \
-e DOPPLER_TOKEN=your-doppler-token \
-e DOPPLER_PROJECT=euler-lite \
-e DOPPLER_CONFIG=production \
euler-liteTo run without Doppler, pass the required environment variables directly and override the default CMD:
docker run -p 3000:3000 \
-e V3_API_URL=https://v3.euler.finance \
-e EULER_SDK_V3_API_KEY=your-v3-api-key \
-e SWAP_API_URL=https://swap.euler.finance \
-e APPKIT_PROJECT_ID=your-project-id \
-e RPC_URL_1=https://your-rpc.com \
-e SUBGRAPH_URL_1=https://your-subgraph.com \
euler-lite node .output/server/index.mjsRepository
Source, issue tracker, and full configuration reference: github.com/euler-xyz/euler-lite.