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 linkberkayoztunc/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
| Good fit | Not the tool |
|---|---|
| Many wallets (trading, airdrops, old bot keys) | Single daily driver (use Phantom / etc.) |
| Rent cleanup after mints / farms | Full dApp hot wallet / arbitrary program IX |
| Consolidate scattered SOL | Windows/Linux (roadmap only) |
| Keys encrypted locally, not in an extension | Hardware / 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
# 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- Set master password (acknowledge no recovery).
- Import keys: base58 secret (Phantom/Solflare export) and/or JSON byte arrays (
id.json) — one per line or comma-separated. - Set RPC (public OK for a few wallets; use Helius/QuickNode/Triton or devnet for real sets). Use Test on the endpoint field.
- 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
Unlike MetaMask/Coinbase flows that bind to one EVM wallet app, Clerk’s Solana strategy lets users pick any Solana wallet that can sign messages. Same Clerk session, orgs, and MFA model as email login.
Not just another closed wallet. Salmon’s pitch is a thin self-custodial core plus selected integrations (Powerups) so Solana protocols can turn wallet distribution into measurable activation.
OSS-first shelf for Solana NFT builders: standards and working tools only — then re-check every link before you ship on it.
Get new articles in your inbox
Technical deep-dives on Solana tooling, infrastructure, and ecosystem. No noise.
