Pouls (French for "pulse") is a client-side dashboard that tracks the live pulse of your crypto net worth — DeFi positions, staking, and plain wallet holdings — across Solana, Ethereum & other EVM chains, Tron, Cardano, Cosmos, and Polkadot, from nothing but public wallet addresses.
No backend. No API keys. No private keys or seed phrases — ever. Everything runs
in your browser against public, CORS-enabled APIs and on-chain RPCs, and your
addresses never leave localStorage.
⚠️ Read-only portfolio tracker, not financial advice. Values are best-effort snapshots from public data and may lag or differ from the protocols' own UIs.
- One address in, full picture out. Paste a Solana, EVM (
0x…), Tron (T…), Cardano (addr1…/stake1…), Cosmos (cosmos1…), or Polkadot address — Pouls detects the chain from the address format and fans out to every relevant source. - Multiple wallets & portfolios. Group several addresses into named portfolios and switch between them. Adding a wallet only fetches that wallet, then re-aggregates.
- Net-worth chart with 1M / 3M / 6M / 1Y ranges and PnL since your last investment, reconstructed from price history (no historical balance API needed).
- Allocation donut by protocol, and All / DeFi / Assets tabs with collapsible per-protocol cards showing each position's value, APY, earned yield, cost basis, and PnL.
- 9 display currencies (USD, EUR, GBP, JPY, CNY, CAD, AUD, CHF, ZAR) and a dark / light theme.
| Source | Network(s) | Tracks | Data |
|---|---|---|---|
| Kamino | Solana | Lending, multiply, leverage, CLMM, earn vaults, staking | Official Kamino portfolio API (already priced in USD) |
| Solana wallet | Solana | Native SOL + SPL tokens | Jupiter Ultra balances API + DefiLlama prices |
| Beefy | 14 EVM chains | Auto-compounding & concentrated-liquidity (CLM) vaults | Beefy registry + live on-chain share balances via Multicall3 (viem) |
| EigenLayer | Ethereum | Restaked positions (incl. withdrawals) | On-chain DelegationManager via viem + DefiLlama prices |
| Yala | Ethereum | YU Pool deposits + USDC rewards | On-chain via viem |
| EVM wallet | 6 EVM chains | Native coin + major ERC-20s | On-chain Multicall3 (viem) + DefiLlama prices |
| Tron | Tron | TRX + major TRC-20s, staking | TronGrid + Binance prices |
| Cardano | Cardano | ADA (UTxO across the stake account + staking rewards) | pool.pm + Binance price |
| Cosmos Hub | Cosmos | ATOM balance, staked, rewards | cosmos.directory LCD + Binance price |
| Polkadot | Polkadot | DOT balance + staked | Public JSON-RPC (relay chain + Asset Hub) |
Prices come from Binance and DefiLlama; fiat conversion from
open.er-api.com. On-chain reads use viem's fallback() transport across several
public RPCs, so a single flaky endpoint won't break a read — if all RPCs for a
chain fail, the UI shows a warning rather than a misleading $0.
To keep a single refresh from re-fetching the same address-independent data once per wallet, registry and price responses are de-duplicated and briefly cached (see src/lib/http.js).
npm install
npm run dev # http://localhost:5173
npm run build # production bundle in dist/
npm run preview # serve the built bundle locallyEnter one or more wallet addresses. They're saved to localStorage and reloaded
on your next visit; use Refresh to re-fetch. The build in dist/ is fully
static — host it anywhere (GitHub Pages, Netlify, an S3 bucket) with no server.
- Pouls only ever takes public addresses. It has no field for, and no use for, private keys or seed phrases.
- There is no backend: requests go straight from your browser to public APIs and RPCs. Those providers see the addresses you query (the same as any block explorer) but nothing else.
- Portfolios, addresses, and the net-worth history are stored only in your
browser's
localStorage. Clear it to wipe everything.
src/
lib/
kamino.js # Kamino portfolio API + normalization
solanaWallet.js # native SOL + SPL token balances
beefy.js # Beefy registry + on-chain multicall pricing (14 EVM chains)
eigen.js # EigenLayer restaking (on-chain)
yala.js # Yala YU Pool (on-chain)
evmWallet.js # native + ERC-20 wallet holdings (6 EVM chains)
tron.js # Tron TRX + TRC-20
cardano.js # Cardano ADA via pool.pm
cosmos.js # Cosmos Hub ATOM via LCD
polkadot.js # Polkadot DOT via JSON-RPC
prices.js # Binance + DefiLlama price helpers
currency.js # fiat selector + USD→X conversion
history.js # net-worth curve from price history
http.js # shared dedupe + short-TTL fetch cache
format.js # USD/token/percent formatters + address detection
components/
WalletInput.vue
PortfolioBar.vue
NetWorthChart.vue # lightweight-charts net-worth curve
AllocationDonut.vue # allocation by protocol
AppSection.vue # collapsible per-protocol position card
CurrencySelect.vue
ThemeToggle.vue
stores/portfolio.js # Pinia: portfolios, wallets, history (localStorage)
composables/useTheme.js
App.vue # orchestration, aggregation, error handling
main.js # PrimeVue (Aura) setup
Vue 3 · Pinia · PrimeVue (Aura) · Tailwind CSS v4 · viem · lightweight-charts · Chart.js · Vite 6.
- More EVM chains for Beefy: add an entry to
CHAINSin src/lib/beefy.js — any Beefy-supported chain with a Multicall3 deployment and a public RPC works. - More wallet chains: add a reader in
src/lib/, register it inROUTESin src/App.vue, and add an address matcher todetectAddressTypein src/lib/format.js.
Released under the MIT License.