Walty is a self-custodial crypto wallet and payment platform for EVM networks. It is designed so that anyone can pay with crypto, and any business can accept payments without intermediaries.
Choose how you use it: as a person (pay, send, manage assets) or as a business (accept payments, generate QR codes, manage your team).
- Generate payment requests with a USD amount, payable in USDC or USDT on Polygon
- The customer receives a QR code or link and pays from Walty or any compatible wallet
- Automatic on-screen confirmation when the payment is detected on-chain
- Split payments: multiple partial transfers can be combined into a single request
- Business dashboard with payment history and real-time status
- Operator team with roles: manager, cashier, waiter
- Invite links with expiration
- Refund requests with owner approval flow
- Full audit log of all team activity
- Non-custodial crypto wallet: your keys never leave your device
- Create or recover a wallet with a 24-word seed phrase
- Pay business payment requests by scanning a QR code or following a link
- Send native tokens and ERC-20s to contacts or addresses
- View your portfolio across multiple EVM networks from a single screen
- Swap tokens with real-time quotes
- Address book and ENS name resolution
Ethereum, Arbitrum, Base, Optimism, and Polygon.
Business payment requests settle on Polygon (USDC / USDT).
- Seed phrase generated locally (BIP-39, 24 words)
- Browser-side encryption: AES-GCM + PBKDF2 (210k iterations)
- The server never sees keys or seeds — signing happens client-side only
- Automatic lock after inactivity
- PIN-encrypted wallet backup export and import
- JWT in HttpOnly cookie — inaccessible to JavaScript
- Strict per-request nonce CSP
- No tracking or analytics by default
Recommended local setup (full stack with Docker):
git clone https://github.com/ignaciogarcia-dev/walty.git
cd walty
cp .env.example .env
docker compose up --build
xdg-open http://localhost:3000Database migrations run automatically on container startup.
For detailed setup and troubleshooting, see docs/getting-started.md.
Environment configuration is documented in .env.example. Most setups only need:
Required
DATABASE_URLJWT_SECRETSERVER_PEPPER
Recommended
ALCHEMY_API_KEY
Optional
ZEROX_API_KEYANKR_API_KEYONEINCH_API_KEYCOINGECKO_API_KEYCOINGECKO_API_BASE_URLCOOKIE_SECURE
| File | Purpose |
|---|---|
| docs/README.md | Documentation index |
| docs/getting-started.md | Setup and local run guide |
| docs/development.md | Development workflow and scripts |
| docs/architecture.md | Codebase architecture and data flow |
| docs/roadmap.md | Priorities and contribution directions |
| CONTRIBUTING.md | Rules for opening issues and PRs |
| CODE_OF_CONDUCT.md | Community behavior expectations |
Common commands:
pnpm lint
pnpm build
pnpm db:migrate
pnpm db:studioThe recommended workflow for most contributions is documented in docs/development.md.
Walty can be self-hosted with Docker. PostgreSQL runs as part of the stack, and database migrations are applied automatically on startup.
cp .env.example .env
docker compose up --buildSee .env.example for all available variables.
Walty uses an issue-first contribution model to keep work predictable and reviewable.
Core rules:
- Non-trivial changes start with a GitHub issue before code is written.
- One issue should map to one pull request whenever possible.
- Pull requests must include linked issue, scope, and validation notes.
- Small docs/typo fixes can go directly to PR.
Start here:
- Open or pick an issue (
bug,feature,proposal,good first issue). - Wait for scope confirmation on larger features/refactors.
- Comment that you are taking the issue.
- Open a PR linked to that issue (
Closes #123). - Iterate with review until merge.