Opinionated React Native crypto x AI chat app boilerplate with embedded wallet support, conversational AI, and dynamic UI component injection.
mallory/
βββ apps/
β βββ client/ # React Native app (iOS, Android, Web)
β βββ server/ # Backend API (Node.js + Express)
βββ packages/
β βββ shared/ # Shared types and utilities
βββ package.json # Workspace configuration
- π Authentication: Google OAuth via Supabase
- π¬ AI Chat: Streaming conversations with Claude
- π° Embedded Wallet: Grid-powered smart contract wallets
- π Client-Side Signing: Secure transaction signing (keys never leave device)
- π± Cross-Platform: iOS, Android, and Web from single codebase
- π¨ Modern UI: Beautiful, responsive design with Reanimated
- π·οΈ Version Tracking: Automatic version display with git commit hash
- π€ AI Streaming: Claude integration with Server-Sent Events and extended thinking
- π§ AI Tools: Web search (Exa), user memory (Supermemory), and 20+ Nansen data APIs
- π° x402 Payments: Server-side implementation for premium data access
- π Wallet Data: Price enrichment via Birdeye API
- π Secure Auth: Supabase JWT validation
- π Production Ready: Comprehensive testing infrastructure
- π Synchronized Versioning: Single command updates all packages
- π·οΈ Automatic Releases: GitHub releases created on version tags
- π Generated Changelogs: Commit history automatically compiled
- Node.js 18+ or Bun
- Git
- Expo CLI (optional, included in dependencies)
git clone https://github.com/darkresearch/mallory.git
cd mallory
bun install# Copy from template
cp apps/client/.env.example apps/client/.env
# Required variables:
EXPO_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
EXPO_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
EXPO_PUBLIC_BACKEND_API_URL=http://localhost:3001
EXPO_PUBLIC_GRID_API_KEY=your-grid-api-key
EXPO_PUBLIC_GRID_ENV=sandbox# Copy from template
cp apps/server/.env.example apps/server/.env
# Required variables:
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
ANTHROPIC_API_KEY=sk-ant-your-key
BIRDEYE_API_KEY=your-birdeye-key
GRID_API_KEY=your-grid-api-key
# Optional (for AI tools):
EXA_API_KEY=your-exa-key
SUPERMEMORY_API_KEY=your-supermemory-keybun run dev# Terminal 1 - Backend
bun run server
# Terminal 2 - Client (Web)
bun run clientThe client will be available at:
- Web: http://localhost:8081
- API: http://localhost:3001
See apps/client/README.md for detailed client documentation.
Key Commands:
cd apps/client
# Web
bun run web
# iOS (requires Mac + Xcode)
bun run ios
# Android (requires Android Studio)
bun run androidSee apps/server/README.md for detailed server documentation.
API Endpoints:
POST /api/chat- AI chat streaming with tool callingGET /api/wallet/holdings- Wallet holdings with price dataGET /health- Health check
AI Tools:
searchWeb- Web search via Exa (always available)addMemory- User memory via Supermemory (optional)nansen*- 20+ Nansen API endpoints for blockchain analytics (requires x402 payments)
Mallory uses Grid for embedded wallets:
- Non-Custodial: User private keys never exist - Grid uses secure enclaves and MPC
- Email-Based Auth: Simple OTP verification flow
- Session Secrets: Generated client-side, passed to backend only when needed for signing
- Smart Contract Wallets: Spending limits and programmable transactions
- Production Ready: Sandbox and production environments
- x402 Integration: Automatic micropayments for premium data APIs
Grid's architecture means neither the client nor server ever has access to user private keys, making it truly non-custodial while still providing seamless transaction signing.
The packages/shared directory contains TypeScript types and utilities shared between client and server:
import type { ChatRequest, HoldingsResponse } from '@darkresearch/mallory-shared';
import { X402PaymentService } from '@darkresearch/mallory-shared';Mallory has comprehensive test coverage: unit tests, integration tests, and E2E tests.
Run tests:
cd apps/client
# Fast tests (unit + integration)
bun test
# E2E tests (requires backend running)
bun run test:e2e
# AI-powered tests (optional - expensive)
# These use Claude to verify response completeness and test 200k+ token conversations
bun test __tests__/e2e/chat-message-flow.test.ts # ~5-10 min, ~$1-2
bun test __tests__/e2e/long-context.test.ts # ~10-20 min, ~$2-3CI/CD:
- Regular tests run on every PR
- AI tests only run when
[run-ai-tests]is in commit message:git commit -m "fix: improve streaming [run-ai-tests]"
See apps/client/tests/CHAT_STATE_TESTS.md for full testing documentation.
- Web: Deploy to Vercel, Netlify, or any static host
- iOS: Deploy via Expo EAS or native build
- Android: Deploy via Expo EAS or native build
See apps/client/README.md for details.
- Recommended: Railway, Render, Fly.io
- Node.js: Any Node.js 18+ hosting
See apps/server/README.md for details.
Mallory uses synchronized semantic versioning across all packages.
Include [release: v*.*.*] in your PR title:
feat: add new wallet feature [release: v0.2.0]
When merged to main, the version automatically bumps and a GitHub release is created! π
bun scripts/sync-version.js 0.2.0
git add . && git commit -m "chore: bump version to 0.2.0"
git tag v0.2.0 && git push && git push --tagsSee VERSION.md for details.
Contributions welcome! Please read CONTRIBUTING.md first.
Apache License 2.0 - see LICENSE for details.
- π§ Email: [email protected]
- π Issues: GitHub Issues
- π Docs: Full Documentation
Built with:
- Expo - React Native framework
- Grid (Squads) - Embedded wallets
- Anthropic - Claude AI with extended thinking
- Exa - AI-powered web search
- Supermemory - User memory & RAG
- Supabase - Auth & database
- Birdeye - Solana market data
- Nansen - Blockchain analytics (via x402)
- Faremeter - x402 payment protocol
- streamdown-rn - React Native markdown streaming
Made with β€οΈ by Dark