Production-oriented monorepo with a modular, scalable architecture. It contains multiple Next.js applications, backend services, Soroban smart contracts, and shared packages used across the ecosystem.
- Node.js (ESM)
- pnpm (workspaces)
- Turborepo (task orchestration and caching)
- TypeScript
- Next.js (App Router)
- React (via Next.js)
- Tailwind CSS
- Husky + lint-staged (Git hooks)
- Supabase (Database/Auth)
- Stellar + Soroban (smart contracts and clients)
- Observability package scaffold (future OpenTelemetry integration)
- Node.js LTS (recommended: 20.x)
- pnpm (recommended: latest stable)
- Git
Verify:
node -v
pnpm -v
git --version-
apps/- Next.js applicationslanding/,b2c/,merchant/,pos/
-
services/- backend processesindexer/,workers/
-
packages/- shared librariesshared/,ui/,api-client/,stellar-soroban/,crossmint/,defindex/,observability/,config/
-
contracts/- smart contractssoroban/(buffer/bridge/perks)
-
infra/- infrastructure (e.g., Supabase migrations, scripts) -
docs/- architecture notes and runbooks
- Clone and enter the repository:
git clone <repo-url>
cd redi- Install dependencies:
pnpm install- Configure environment variables
Copy the template and fill in required values:
cp .env.example .envEach Next app uses its own local env file:
- Copy
apps/<app>/.env.local.exampletoapps/<app>/.env.local - Fill in public variables as needed (
NEXT_PUBLIC_*)
Example:
cp apps/b2c/.env.local.example apps/b2c/.env.localSecurity notes:
- Do not commit
.envor.env.localfiles. - Never place secrets (e.g., Supabase Service Role key) in
NEXT_PUBLIC_*variables.
Next.js apps:
landing: 3000b2c: 3001merchant: 3002pos: 3003
Backend services (reference; adjust to implementation):
indexer: 4101workers: 4102
Frontend API base (reference):
NEXT_PUBLIC_API_URL: defaulthttp://localhost:4000
Run all available dev tasks:
pnpm exec turbo devExample (B2C):
pnpm --filter @redi/b2c devExample (Landing):
pnpm --filter @redi/landing devpnpm exec turbo buildpnpm exec turbo lintpnpm exec turbo typecheckpnpm exec turbo testpnpm -r list --depth -1-
Applications and services consume internal packages via workspace names:
@redi/shared,@redi/ui, etc.
-
Rule: packages under
packages/*must not import fromapps/*. -
Add dependencies in the correct workspace:
Root (repository tooling):
pnpm add -Dw <package>Specific workspace:
pnpm --filter @redi/b2c add <package>
pnpm --filter @redi/shared add -D <package>- A root
tsconfig.base.jsonprovides shared defaults. packages/*/tsconfig.jsonextends the base to ensure consistency.
- The repository uses ESM. Keep imports/exports consistent.
- For Node-executed TypeScript compiled to JavaScript, follow the project policy regarding emitted
.jsextensions where applicable.
Husky is used to enforce quality checks locally.
Install hooks (one-time setup after pnpm install):
pnpm exec husky installRecommended hooks:
pre-commit: runlint-stagedon staged filespre-push: runtypecheck(and tests when available) across the monorepo
Example .husky/pre-commit:
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
pnpm exec lint-stagedExample .husky/pre-push (Turbo-based):
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
pnpm exec turbo typecheck
pnpm exec turbo test- Create a branch from
main. - Keep changes scoped and modular (prefer shared packages over duplicated code).
- Ensure the following pass before opening a PR:
pnpm exec turbo lint
pnpm exec turbo typecheck
pnpm exec turbo build- Add or update documentation under
docs/when behavior or architecture changes.
packages/uiis intended to host shared UI components.packages/sharedis intended for domain types, schemas, and pure utilities.packages/configis intended for centralized configuration and env validation.- Smart contracts live under
contracts/soroban/and are consumed viapackages/stellar-soroban.