Real-time payment analytics for Stellar.
A lean, production-grade stack for measuring and improving cross-border payment reliability.
- Backend: Rust analytics engine (Axum, SQLx)
- Frontend: Next.js dashboard
- Mobile: React Native (Expo) — current status
- Contracts: 1 integrated Soroban contract (
payraider), deployed to testnet - SDKs: TypeScript + Python clients
- DB: SQLite (WAL mode) — see Database below
No database server to install — SQLite runs in-process and the file is created on first start.
- Run backend
cd backend
cp .env.example .env
# DATABASE_URL already defaults to sqlite:./payraider.db
# set STELLAR_RPC_URL etc. as needed
cargo run- Run frontend
cd frontend
npm install
npm run devSQLite only. This is a compile-time property, not a configuration one:
sqlx is built with only the sqlite feature, backend/src/database.rs uses
SqlitePool/SqliteConnectOptions directly, and every migration is written in
SQLite-flavoured SQL.
Setting a postgresql:// DATABASE_URL does not switch databases — it
fails to parse as SqliteConnectOptions and the backend refuses to start.
Adding Postgres support is a code change. Whether to make it is being tracked
in issue #1876.
The backend integrates with payraider via SNAPSHOT_CONTRACT_ID.
contracts/.env.testnet is generated by
deploy-contracts-testnet.sh — prefer reading it over copying IDs from here.
| Contract | Env var | Testnet ID (historical) |
|---|---|---|
| PayRaider | PAYRAIDER_CONTRACT_ID / SNAPSHOT_CONTRACT_ID |
CAPHQZ4BBT43HU5EUSJAOPKWB66HGLTN4AKJUALV3R2RXS4A6IOXWUTL |
Other contract crates under contracts/ are archived and not built in CI.
See contracts/archive/README.md.
scripts/check_folder_size.sh(fails if any folder >200MB).github/workflows/enforce-folder-size.yml
| Path | Contents |
|---|---|
backend/ |
Rust analytics engine — REST, GraphQL and WebSocket API |
frontend/ |
Next.js dashboard |
mobile/ |
React Native (Expo) app — current status |
contracts/ |
Soroban contracts (Rust, no_std) |
sdk/ |
TypeScript and Python API clients |
docs/ |
Project documentation |
scripts/ |
Build, deploy and maintenance scripts |
tests/ |
Cross-cutting / end-to-end tests |
k8s/, terraform/ |
Deployment manifests and infrastructure as code |
elk/, monitoring/ |
Logging and observability stack configs |
- History has been cleaned to reduce clone size.
- Use
git lfsfor large binaries. - For full operational details, see
docs/and module READMEs.
sdk/ ships four packages: typescript, python, react, and mcp-server.
Neither the mobile app nor the web frontend currently consumes any of them.
The mobile app makes API calls via its own internal axios-based apiClient
(mobile/src/services/api.ts); the frontend has its own src/lib/api-client.ts.
The TypeScript SDK is published publicly ("publishConfig": {"access": "public"})
but its correctness against the real backend API is therefore untested by any
internal usage.
Known gaps:
@payraider/sdk(typescript): public, but not imported by mobile or frontend.@payraider/react: wraps the TypeScript SDK, also not consumed internally.@payraider/mcp-server: a separate product surface (AI-agent tooling); candidate for extraction into its own repository. Seesdk/mcp-server/README.md.
The storage library situation in mobile is intentionally kept simple:
react-native-mmkv (encrypted, MMKV-based) for general key-value storage,
react-native-keychain for the MMKV encryption key and auth tokens,
and react-native-biometrics for biometric prompts. All three are actively used.