M0: foundation — monorepo, PostGIS schema, deck query, app shell
Greenfield scaffold for Linkder, a swipe-to-hire marketplace for local
professional services.
- pnpm/turbo monorepo: apps/web, packages/{shared,db}
- Postgres 16 + PostGIS via docker compose (ports 5442/6389 to avoid
clashing with other local stacks)
- Drizzle schema, 23 tables, geography(Point,4326) with GiST indexes
- Domain core in packages/shared: integer-cent money, status transition
graphs, deck ranking weights, cancellation policy — 46 unit tests
- Deck query: filtering in Postgres on the GiST index, ranking in JS so
the weights stay tunable — 18 integration tests against a seeded DB
- Deterministic seed placing pros at known distances, including three
that must NOT appear on a deck (out of radius, unverified, away)
- Next.js 15 app shell with a working swipe deck
- CI: typecheck, lint, test, build against live postgres+redis
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
# ---- Core ----
|
||||
NODE_ENV=development
|
||||
NEXT_PUBLIC_APP_URL=http://localhost:3000
|
||||
|
||||
# ---- Database (Postgres 16 + PostGIS) ----
|
||||
DATABASE_URL=postgresql://linkder:linkder@localhost:5442/linkder
|
||||
|
||||
# ---- Redis (pub/sub for SSE chat + BullMQ queues) ----
|
||||
REDIS_URL=redis://localhost:6389
|
||||
|
||||
# ---- Auth.js v5 ----
|
||||
# generate with: openssl rand -base64 32
|
||||
AUTH_SECRET=
|
||||
AUTH_URL=http://localhost:3000
|
||||
AUTH_GOOGLE_ID=
|
||||
AUTH_GOOGLE_SECRET=
|
||||
|
||||
# ---- Phone OTP (Twilio Verify) ----
|
||||
TWILIO_ACCOUNT_SID=
|
||||
TWILIO_AUTH_TOKEN=
|
||||
TWILIO_VERIFY_SERVICE_SID=
|
||||
|
||||
# ---- Stripe Connect ----
|
||||
STRIPE_SECRET_KEY=
|
||||
STRIPE_WEBHOOK_SECRET=
|
||||
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=
|
||||
# Platform commission in basis points (1500 = 15%)
|
||||
PLATFORM_FEE_BPS=1500
|
||||
|
||||
# ---- Didit (ID verification) ----
|
||||
DIDIT_API_KEY=
|
||||
DIDIT_WORKFLOW_ID=
|
||||
DIDIT_WEBHOOK_SECRET=
|
||||
|
||||
# ---- Cloudflare R2 (S3-compatible object storage) ----
|
||||
R2_ACCOUNT_ID=
|
||||
R2_ACCESS_KEY_ID=
|
||||
R2_SECRET_ACCESS_KEY=
|
||||
R2_BUCKET=linkder-uploads
|
||||
R2_PUBLIC_URL=
|
||||
|
||||
# ---- Resend (transactional email) ----
|
||||
RESEND_API_KEY=
|
||||
EMAIL_FROM=noreply@linkder.app
|
||||
|
||||
# ---- Launch market (city-scoped MVP) ----
|
||||
NEXT_PUBLIC_CITY_NAME=Barcelona
|
||||
NEXT_PUBLIC_CITY_LAT=41.3874
|
||||
NEXT_PUBLIC_CITY_LNG=2.1686
|
||||
Reference in New Issue
Block a user