Skip to content

jongbonga/Pouls

Repository files navigation

Pouls

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.

Features

  • 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.

Supported sources

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).

Run

npm install
npm run dev       # http://localhost:5173
npm run build     # production bundle in dist/
npm run preview   # serve the built bundle locally

Enter 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.

Privacy & security

  • 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.

Project structure

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

Tech stack

Vue 3 · Pinia · PrimeVue (Aura) · Tailwind CSS v4 · viem · lightweight-charts · Chart.js · Vite 6.

Extending

  • More EVM chains for Beefy: add an entry to CHAINS in 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 in ROUTES in src/App.vue, and add an address matcher to detectAddressType in src/lib/format.js.

License

Released under the MIT License.

About

No description, website, or topics provided.

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors