Thanks for helping build the Stellar wallet that lives in WhatsApp.
git clone https://github.com/chillwur/GFMiHashport.git
cd GFMiHashport
pnpm install
cp apps/frontend/.env.example apps/frontend/.env.local
cp apps/backend/.env.example apps/backend/.env
pnpm dev:infra # starts local Postgres + Redis via Docker Compose
pnpm devThe .env.example credentials already match the docker-compose.yml services, so the backend
can connect to DATABASE_URL/REDIS_URL with no further configuration. Data persists across
restarts in named Docker volumes; run pnpm dev:infra:down to stop the containers.
For contract work you additionally need Rust (stable) with the wasm32v1-none target and, ideally, the stellar CLI:
rustup target add wasm32v1-none
cargo install --locked stellar-cliapps/frontend— Next.js landing page/dashboardapps/backend— Fastify WhatsApp webhook + Stellar services; the chat grammar issrc/lib/commands.ts, chain access issrc/services/stellar.tscontracts/hashport-account— Soroban smart account (Rust)
Run the same checks CI runs:
pnpm lint
pnpm typecheck
pnpm test
pnpm build
# if you touched the contract:
pnpm contracts:test
pnpm contracts:buildpnpm install sets up a Husky pre-commit hook that runs lint-staged on your staged files —
ESLint + Prettier on staged .ts/.tsx files under apps/*, and cargo fmt --check on staged
.rs files under contracts/*. It only touches what you staged, so it stays fast; it's not a
substitute for the full checks in "Before you open a PR" above.
In exceptional cases you can skip it with git commit --no-verify, but fix any resulting lint
issues before opening the PR — CI still runs the full checks.
- Branches:
feat/<topic>,fix/<topic>,docs/<topic>. - Commits: Conventional Commits (
feat:,fix:,chore:,docs:,test:). - New chat commands need: parser case in
lib/commands.ts, handler inservices/router.ts, tests intest/commands.test.ts, and a line inHELP_TEXT. - Never commit secrets.
.envfiles are gitignored; only.env.examplefiles belong in the repo. If a change adds an env var, document it in the workspace's.env.exampleand the root.env.examplemap. - Default to testnet in all examples, tests, and defaults.
- Logging: Use Fastify's structured logger (
app.log). Avoid logging raw secrets (tokens, keys, passwords). Sensitive properties and headers (likeAuthorization, Stellar keys, and WhatsApp tokens) are automatically redacted in the logger configuration. Default log levels aredebugin development andinfoin production, configurable via theLOG_LEVELenvironment variable.
Use the issue templates. For anything security-sensitive (key handling, webhook auth, contract auth), do not open a public issue — email the maintainers instead.