Dealroom
Two-party async contract negotiation platform with weighted compromise algorithm.
Features
- Contract Negotiation — Structured clause-by-clause negotiation workflow
- Weighted Compromise — Algorithm suggests fair compromises based on party firmness and option bias
- Contract Skills — Built-in templates (NDA, DPA, MSA, etc.) plus premium skills for your own instance
- Bilingual Contracts — English and Castilian Spanish; the contract language is chosen when the deal is created and both parties negotiate in it
- Two-Level Admin — Platform admins manage marketplace; supervisors monitor deals
- Self-Hostable — AGPL-licensed sovereign kit for running on your own hardware (see below)
Hosted and the kit
- Hosted (dealroom.todo.law) charges per
contract. Drafting and negotiating are free. Each contract is paid once,
when it is first downloaded or when its signature starts; every skill,
premium ones included, is covered by that price. Agents pay per contract
with prepaid credits sold in packs of ten (see
docs/agent-api.md, "Paying per contract"). There is no monthly plan. - The kit (self-hosted) has no caps. Premium skills are sold only for the kit: 60 a year each in the kit (in your currency) on the todo.law storefront, installed and activated offline with a licence file.
The hosted build is Vercel production (VERCEL_ENV=production, or
AUTH_COOKIE_DOMAIN=.todo.law); the rules live in src/lib/hosted.ts and
src/config/features.ts. The earlier free-pilot limits (edit window, record
ceilings) were retired on 11 October 2026.
Note: the earlier dual-brand system (todo.law + northend.law) was retired in May 2026; the codebase now ships a single brand (
src/config/brand.tsdocuments the rationale and the restore path).
Tech Stack
- Framework: Next.js 16 (App Router)
- Language: TypeScript
- API: tRPC
- Database: PostgreSQL + Prisma
- Auth: NextAuth (magic link, invite code, Google OAuth)
Getting Started
Prerequisites
- Node.js 20+
- PostgreSQL database
- Resend account (for magic link emails)
Installation
# Install dependencies
npm install
# Set up environment variables
cp .env.example .env
# Push database schema
npx prisma generate && npx prisma db push
# Seed initial data
npx prisma db seed
# Start development server
npm run dev
Open http://localhost:3000 to access the app.
Self-Hosting (Sovereign Kit)
Law firms can run Dealroom entirely on their own hardware with the
Docker-based sovereign kit — app + PostgreSQL + migrator (+ optional Caddy
TLS), published on port 8486, health-gated via /api/health:
cd deploy/sovereign
cp .env.example .env # fill in secrets
docker compose up -d
See deploy/sovereign/README.md for the full runbook (backups, restore, cron wiring, hardening checklist). docs/deployment.md covers the hosted/Vercel path.
Environment Variables
DATABASE_URL=postgresql://...
NEXTAUTH_SECRET=...
NEXTAUTH_URL=http://localhost:3000
RESEND_API_KEY=...
EMAIL_FROM=noreply@yourdomain.com
GOOGLE_CLIENT_ID=...
GOOGLE_CLIENT_SECRET=...
SKILLS_DIR=/path/to/skills # Optional: premium skills directory
STRIPE_SECRET_KEY=... # Optional: in-app billing (ignored on hosted dealroom.todo.law)
Administration
Create Platform Admin
npm run admin:create -- --email=admin@example.com --name="Admin Name"
Access the platform admin portal at /admin.
Create Supervisor
npm run supervisor:create -- --email=supervisor@lawfirm.com --name="Jane Smith"
Or create via the admin portal at /admin/supervisors.
Supervisors access their portal at /supervise and can only view deals assigned to them.
Documentation
| Document | Description |
|---|---|
| deployment.md | Hosted (Vercel) and self-hosted postures, environment variables |
| administration.md | Two-level admin system, deal lifecycle, signing |
| lawyer-involvement.md | Three stages of lawyer involvement (EN) |
| intervencion-abogado.md | Tres fases de intervención de abogado/a (ES) |
| agent-api.md | Agent Negotiation REST API reference |
| skills-and-licensing.md | Skill packages, licensing, activation, i18n |
Project governance: SECURITY.md · CONTRIBUTING.md · NOTICES.md · CHANGELOG.md
Project Structure
src/
├── app/ # Next.js App Router pages
│ ├── (admin)/ # Platform admin portal
│ ├── (supervisor)/ # Supervisor portal
│ ├── (dashboard)/ # User dashboard
│ └── api/ # API routes
├── components/ # React components
├── config/
│ ├── brand.ts # Brand router
│ ├── brands/ # Brand config (todo.ts; single brand since May 2026)
│ └── features.ts # Feature flags
├── lib/ # Shared utilities
└── server/
├── routers/ # tRPC routers
└── services/ # Business logic
prisma/
├── schema.prisma # Database schema
└── seed.ts # Seed data
skills/ # Built-in contract templates
docs/ # Documentation
Key Concepts
Deal Flow
- Create — Initiator creates deal, selects skill and jurisdiction
- Invite — Respondent receives invitation link
- Submit — Both parties submit clause preferences and firmness levels
- Negotiate — Algorithm suggests compromises; parties can also propose changes to open fields (negotiable parameters)
- Agree — Parties accept final terms
- Sign — Contract generated for signing
Compromise Algorithm
stake = ((5-flexibility)/5 × 0.6) + (|bias| × 0.4)
Each party sets a firmness level (1–5) per clause; the UI shows firmness while the database stores flexibility (6 − firmness). The party with higher stake wins the clause; equal stakes trigger a balanced compromise. A global fairness pass rebalances if one party wins disproportionately.
Administration Levels
| Role | Portal | Access |
|---|---|---|
| Platform Admin | /admin | Manage skill catalog, customers, supervisors |
| Supervisor | /supervise | Monitor assigned deals only |
| User | /deals | Own negotiations only |
License
Copyright (c) 2025-2026 Rindogatan LLC
This project is licensed under the GNU Affero General Public License v3.0.
Under AGPL §13, if you run a modified Dealroom as a network service you must
offer its Corresponding Source to your users. The /licenses page carries
that offer (the footers no longer link to it since 2026-10-01); point it at
your fork with NEXT_PUBLIC_SOURCE_URL at build time, and add a visible
link if your deployment needs one. Third-party attribution lives in
NOTICES.md.