All articles
solanawalletlocalwalletdesktoprenttaurisecuritybuilders

LocalWallet: multi-wallet Solana vault on your Mac

LocalWallet by Berkay Öztünç (@whitemoondev) is a local Solana wallet manager: Argon2id + XChaCha20-Poly1305 vault, bulk balances, Token/Token-2022 rent reclaim, fund-and-close empty wallets, collect SOL, stake view/unstake. MIT, Tauri, Apple Silicon. How it works and how to use it.

devrels.xyz/a/228short link

berkayoztunc/LocalWallet is a local Solana wallet manager for people who hold more than one key: encrypted vault on disk, bulk balance and token inventory, rent reclaim from empty SPL / Token-2022 accounts, and consolidation flows — with signing kept in Rust so the UI never receives private keys.

Author: Berkay Öztünç (github.com/berkayoztunc, X @whitemoondev). Same builder as Orquestra. Stack: Tauri + Rust backend, MIT license, CI badge, releases as macOS Apple Silicon DMG (unsigned).

Who it is for

Fit
Good fitNot the tool
Many wallets (trading, airdrops, old bot keys)Single daily driver (use Phantom / etc.)
Rent cleanup after mints / farmsFull dApp hot wallet / arbitrary program IX
Consolidate scattered SOLWindows/Linux (roadmap only)
Keys encrypted locally, not in an extensionHardware / seed phrase import (not yet)

Scope is deliberate: transfers and account closures — not a browser-connected dApp signer for every protocol.

Features (operator view)

  • Encrypted vault — one master password (Argon2id + XChaCha20-Poly1305)
  • Bulk SOL balances — batched RPC so large wallet sets are not N sequential calls
  • Token inventory — SPL Token + Token-2022 accounts, balances, reclaimable rent
  • Close unused accounts — zero-balance ATA rent reclaim; local sign; no third-party skimming fee
  • Fund → close → return — rescue wallets too empty to pay their own close fees
  • Collect all SOL — drain to one destination with preview + retype confirm
  • Send SOL — single transfers with quote before sign
  • Stake — list stake accounts; unstake/withdraw when ready; browse validators (optional Stakewiz directory)
  • Menu bar — optional total SOL / USD (Coingecko price optional)
  • Settings — RPC, commitment, priority fee, concurrency, explorer (Solana Explorer / Solscan / Orb)

Security model

  • Decrypt → sign → zeroize in Rust; UI gets pubkeys, balances, signatures only — no “export private key” path
  • Vault file: Argon2id (64 MiB, 3 passes) + XChaCha20-Poly1305; fresh nonce every save; tests assert no plaintext key material in the file
  • Wrong password fails AEAD — no recovery; backup the vault and remember the password
  • Network: chain traffic only to your RPC; optional Stakewiz (validator names) and Coingecko (price) — neither sends addresses or keys

Unaudited. README is explicit: third-party review has not happened. Use owned wallets, practice on devnet, one low-value mainnet wallet before bulk import.

Install and first run

bash
# DMG from GitHub Releases (Apple Silicon)
# https://github.com/berkayoztunc/LocalWallet/releases
# Gatekeeper: unsigned build
xattr -dr com.apple.quarantine /Applications/LocalWallet.app

# Or build
git clone https://github.com/berkayoztunc/LocalWallet.git
cd LocalWallet && npm install
npm run tauri dev    # or: npm run tauri build
cargo test --manifest-path src-tauri/Cargo.toml
  1. Set master password (acknowledge no recovery).
  2. Import keys: base58 secret (Phantom/Solflare export) and/or JSON byte arrays (id.json) — one per line or comma-separated.
  3. Set RPC (public OK for a few wallets; use Helius/QuickNode/Triton or devnet for real sets). Use Test on the endpoint field.
  4. Scan tokens → close empties or Fund & close → Collect all SOL.

Data dir: ~/Library/Application Support/com.localwallet.app/ vault.bin (encrypted), settings.json, optional menubar.json (cleartext last totals while menu bar enabled — disable to delete).

Technical gotchas the app encodes

Empty wallet cannot close its own ATAs

Close needs a fee payer. A swept wallet has reclaimable rent inside token accounts but cannot pay fees first. Solana also rejects funding below rent-exempt minimum, and fee validation runs before instructions — so “exact min + fee from the close” does not work in one shot.

Fund & close lends rent-exempt minimum + fees, closes, then drains to destination across three confirmed transactions so the loan returns with the rent.

Locked close authority

If mint/creator set close_authority ≠ you, CloseAccount fails with owner mismatch. LocalWallet marks these locked, excludes rent from totals, and skips burning fees on doomed txs. Spam airdrops often use this.

Stake cooldown

Deactivate waits until epoch boundary (~2–3 days) before withdraw. UI disables withdraw until inactive and surfaces missing stake vs withdraw authority.

Roadmap (upstream)

  • Windows / Linux builds
  • Signed + notarized macOS
  • Auto-update
  • Delegate new stake from the app (today: view / unwind)
  • SPL token sweeping (today: SOL collect)
  • Seed phrase + hardware wallet import

Links

Summary

LocalWallet is Berkay Öztünç’s open-source desktop vault for multi-wallet Solana ops: encrypted local keys, bulk inventory, serious rent reclaim (including fund-and-close), SOL consolidation, and stake unwind — not a general dApp browser wallet. Install from Releases or build with Tauri; respect the unaudited warning and the no-recovery password model. If you run bots or airdrop farms, this is the class of tool that turns “I know I have dust rent somewhere” into a signed, previewed batch.

Keep reading

Get new articles in your inbox

Technical deep-dives on Solana tooling, infrastructure, and ecosystem. No noise.

LocalWallet: multi-wallet Solana vault on your Mac | devrels.xyz