Skip to main content

Local Development Setup

This guide walks you through running every Novatip repository locally so you can develop end-to-end without touching any deployed infrastructure.


Prerequisites​

ToolVersionInstall
Node.js>= 18nodejs.org
Ruststable`curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs
Stellar CLIlatestInstall guide
Docker + Composelatestdocker.com
Freighter extensionlatestfreighter.app

Step 1 - Clone All Repositories​

mkdir novatip-app && cd novatip-app
git clone https://github.com/novatip/novatip-contracts
git clone https://github.com/novatip/novatip-sdk
git clone https://github.com/novatip/novatip-backend
git clone https://github.com/novatip/novatip-web
git clone https://github.com/novatip/novatip-docs

Resulting structure:

novatip-app/
novatip-contracts/
novatip-sdk/
novatip-backend/
novatip-web/
novatip-docs/

Step 2 - Start Infrastructure​

cd novatip-backend
docker compose up -d postgres redis
docker compose ps
# postgres running (healthy)
# redis running (healthy)

Step 3 - Build the SDK​

The backend and web app both import from @novatip/sdk. Build it first.

cd novatip-sdk
npm install
npm run build

Step 4 - Set Up the Backend​

cd novatip-backend
npm install
cp .env.example .env

Minimum required values for local dev:

DATABASE_URL=postgresql://novatip:novatip@localhost:5432/novatip
JWT_SECRET=local-dev-secret-change-me
TIP_SPLITTER_CONTRACT_ID=C...

Apply migrations and start:

npm run db:generate
npm run db:migrate
npm run dev
# Listening on http://localhost:3001

Step 5 - Set Up the Frontend​

cd novatip-web
npm install
cp .env.example .env.local
NEXT_PUBLIC_API_URL=http://localhost:3001/api/v1
NEXT_PUBLIC_STELLAR_NETWORK=testnet
NEXT_PUBLIC_TIP_SPLITTER_CONTRACT_ID=C...
npm run dev
# Available at http://localhost:3000

Step 6 - Deploy the Contract to Testnet​

6a. Create and fund a testnet identity​

stellar keys generate my-identity --network testnet
stellar keys fund my-identity --network testnet

6b. Configure and deploy​

cd novatip-contracts
cp .env.example .env
# Set NETWORK=testnet, SOURCE=my-identity, ADMIN=G..., USDC_TOKEN=C...

make build
./scripts/deploy.sh
cat .contract-id

Paste the contract ID into novatip-backend/.env and novatip-web/.env.local as TIP_SPLITTER_CONTRACT_ID / NEXT_PUBLIC_TIP_SPLITTER_CONTRACT_ID.

6c. Register a test jar​

# In .env set OWNER=G..., SLUG=@testcreator, RECIPIENT=G...
./scripts/create-jar.sh

Step 7 - Connect Freighter to Testnet​

  1. Open Freighter and switch to Testnet in the network selector
  2. Fund your testnet account via Stellar Friendbot
  3. Get testnet USDC from the Circle testnet faucet or a testnet DEX

Step 8 - Verify the Full Flow​

  1. Open http://localhost:3000/@testcreator
  2. Click Connect Wallet and approve in Freighter
  3. Select $1 and click Send tip
  4. Approve the transaction in Freighter
  5. Confirm the success screen with confetti appears
  6. Open http://localhost:3000/dashboard
  7. The tip should appear in the recent feed within ~6 seconds

Useful Commands​

# Contracts
make test # Rust test suite
make build # compile to WASM
make lint # clippy
make fmt # rustfmt

# SDK
npm run build # compile to dist/
npm run typecheck # tsc --noEmit
npm test # jest

# Backend
npm run db:studio # Prisma Studio - visual DB browser
npm run db:migrate # apply new migrations

# Frontend
npm run typecheck # tsc --noEmit
npm run lint # eslint + next lint

Troubleshooting​

TIP_SPLITTER_CONTRACT_ID not set - Get it from .contract-id after running deploy.sh and paste it into both .env files.

Freighter shows wrong network - Switch to Testnet in the Freighter extension settings.

Database connection refused - Run docker compose up -d postgres redis and wait for health checks to pass.

Indexer not picking up events - Do not leave INDEXER_START_LEDGER=0 in production. Set it to the current ledger sequence:

curl https://soroban-testnet.stellar.org \
-X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getLatestLedger","params":{}}' \
| jq .result.sequence

Port conflicts - Backend defaults to 3001, frontend to 3000, PostgreSQL to 5432, Redis to 6379. Change in .env and docker-compose.yml.