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, Fuul, and Turtle 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.22.1
- npm 11.20.0 (pinned in the repository)
- 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 install --global npm@11.20.0
npm ci
cp .env.example .env
# Fill in required values (see below)
npm run devThe app will be available at http://localhost:3000.
Core 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>) | Direct subgraph URI override per chain; optional when using a catalog. SUBGRAPH_URL_* is server-only and preferred; NUXT_PUBLIC_SUBGRAPH_URI_* remains supported. |
The server reads RPC_URL_<chainId> and subgraph configuration at startup. Subgraph endpoints come from direct per-chain URLs or the configured catalog. 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/gnOpt-in subgraph catalog
A fork can use direct subgraph endpoints or an optional catalog. Both modes keep browser requests on /api/internal/proxy/subgraph/<chainId> and resolve upstream URLs on the server. Restart the server after configuration changes. The repository fork setup guide covers the wider fork configuration.
Direct endpoints without Euler subgraph defaults
SUBGRAPH_CATALOG_URL=
SUBGRAPH_CATALOG_DISABLED=true
RPC_URL_1=https://rpc.operator.example
SUBGRAPH_URL_1=https://subgraph.operator.example/mainnet/gnProvide your own SUBGRAPH_URL_<chainId> for every chain that needs discovery. Remove or replace inherited SUBGRAPH_URL_* and NUXT_PUBLIC_SUBGRAPH_URI_* values: copied Euler URLs are explicit overrides, so disabling defaults does not disable those URLs. SUBGRAPH_CATALOG_DISABLED=true disables catalog defaults and prevents the server SDK from using bundled subgraph defaults; explicit URLs still work. Subgraph reads for an unmapped chain are unavailable. Use SUBGRAPH_DISABLED_<chainId>=true to disable that chain even when an explicit URL exists.
Your own catalog with optional overrides
SUBGRAPH_CATALOG_URL=https://operator.example/catalog.json
SUBGRAPH_CATALOG_DISABLED=false
RPC_URL_1=https://rpc.operator.example
# Leave SUBGRAPH_URL_* and NUXT_PUBLIC_SUBGRAPH_URI_* unset,
# except for intentional endpoint overrides.Resolution order is SUBGRAPH_DISABLED_<chainId>=true, then SUBGRAPH_URL_<chainId>, then NUXT_PUBLIC_SUBGRAPH_URI_<chainId>, then the configured catalog. Remove inherited per-chain URLs before expecting the catalog to supply those chains. Missing, retired, invalid, or incompatible records are unavailable and never revive a bundled endpoint. The official Euler catalog provides Euler-operated endpoints. Set SUBGRAPH_CATALOG_URL to that URL to use it, or supply your own catalog URL for a fork.
With no catalog opt-in or explicit disable, an unmapped browser request retains its missing-proxy behavior, while the server SDK can use bundled subgraph defaults. Use one of the explicit fork configurations above to avoid that compatibility behavior. Lite uses SDK 4.4.0 for its catalog resolver and shared account/factory queries through withSubgraphQueries, including support for optional catalog build provenance. Lite supplies server-only environment settings, proxy transport, opaque source identity and cache policy. Imported records can omit sourceCommit or startBlock; supplied values remain validated, and the SDK enforces deployment identity and pagination consistency.
These controls isolate subgraph endpoint selection, not every external data source. Configure RPCs, V3, labels, swap and pricing services, ABIs, and deployment sources separately. Catalog membership does not activate a chain or change lifecycle, ONCHAIN_SDK_CHAINS, or those other source settings.
API 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, Turtle), social links, policy URLs, titles, and more via
NUXT_PUBLIC_CONFIG_*environment variables. - Curated Earn vaults: by default the app reads Euler's published labels from the Euler Data API and shows the EulerEarn vaults those labels list. A fork can point the app at its own label files instead, with chain-specific
earn-vaults.json(Label file format), to restrict which EulerEarn vaults are shown.
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. Values exposed through Nuxt's public runtime configuration are delivered to the browser and must be treated as public. Lite reads the NUXT_PUBLIC_SUBGRAPH_URI_* compatibility alias only on the server; use SUBGRAPH_URL_* for new subgraph configuration. 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.