Security
Local-first and non-custodial. Your keys never leave your device.
Architecture
Subslot is a Chrome extension (Manifest V3) that runs entirely in your browser. There are no backend servers, no databases, and no accounts. Everything happens locally:
- Private keys are encrypted and stored in
chrome.storage.local - Transactions are signed in the extension's service worker
- The only external communication is with Solana RPC, the Jupiter API, the Helius API, the Jito Block Engine, and DexScreener
Key Encryption
All private keys are encrypted at rest using industry-standard cryptography:
- Password derivation: Your password is run through PBKDF2 with 100,000 iterations and a random salt to derive an encryption key.
- Encryption: The private key is encrypted with AES-256-GCM using the derived key and a random IV (initialization vector).
- Storage: The encrypted blob, salt, and IV are stored together in Chrome's local storage. The password itself is never stored.
- Decryption: When you unlock, your password re-derives the key and decrypts. If the password is wrong, decryption fails.
Non-Custodial by Design
No custodial backend ever holds your keys. Signing happens on-device, keys are derived only from your password, and nothing about your wallet is synced to a server. If you lose your password and your backups, no one — including us — can recover your funds.
dApp Signing
Subslot registers as a Solana Wallet Standard wallet, so any dApp can detect it and request a connection. Every connection and every signature raises an explicit approval popup — nothing is ever signed silently. You see what you are approving before it is signed, and you can reject it. See Connect to dApps.
Memory Management
When your wallet is unlocked, decrypted private keys are held in the service worker's memory — not in Chrome storage. This memory is:
- Process-isolated — Other extensions and web pages cannot access it
- Cleared on lock — Auto-lock or a manual lock wipes all decrypted keys
- Cleared on service worker restart — If Chrome suspends the service worker, the keys are gone
Auto-Lock
Configurable inactivity timeout (default: 15 minutes). When triggered:
- All decrypted private keys are deleted from memory.
- The side panel switches to the lock screen.
- No transactions can be signed until you re-enter your password.
Transaction Signing
All transactions are signed locally in the service worker:
- The extension builds the transaction (swap, send, trigger order, launch, etc.).
- It is signed with your decrypted private key in memory.
- The signed transaction is sent to the blockchain via your RPC endpoint.
- At no point does the private key or an unsigned transaction leave the extension's process — private keys never touch the network.
Content Security Policy
Extension pages enforce a strict CSP:
script-src 'self'— Only scripts bundled with the extension can execute. No inline scripts, no external scripts.object-src 'self'— No external plugins or objects.
This prevents XSS attacks, malicious script injection, and code tampering.
Network Communication
The extension communicates only with these external services:
- Solana RPC (Helius or custom) — Balance queries, transaction submission, account info
- Jupiter API — Swap quotes, token search, trigger-order management
- Helius API — Transaction history and token metadata
- Jito Block Engine — Bundle submission (when using the Jito engine)
- DexScreener API — Token prices, market data, 24h changes
- Analytics — Optional, anonymous feature-usage events; off in one tap
No private keys or wallet balances are ever sent to any of these services.
No Personal Data
Subslot collects no personally identifiable information. The only telemetry is optional, anonymous usage analytics, which you can turn off in one tap under Privacy in Settings. Your keys, password, and balances are never collected.
Balance Hiding
Toggle the eye icon in the wallet card to hide all balance displays. Useful when:
- Screen sharing or streaming
- Trading in public
- Someone is looking over your shoulder
Best Practices
- Use a strong, unique password — at least 8 characters with mixed case and numbers
- Back up your private key immediately after creating or importing a wallet
- Set auto-lock to 5 or 15 minutes
- Never share your password or private keys with anyone
- Use the balance-hiding feature when screen sharing
- Keep Chrome and the extension updated for the latest security patches
- Consider separate wallets for trading (small amounts) and storage (large amounts)