Santiago Paz, homeCV download (PDF, 159 KB)
All work

Contract Lens

A deployed multi-tenant SaaS where an LLM extraction pipeline turns PDF and DOCX contracts into typed, structured data that drives a deadline and alert system.

trycontractlens.com (opens in a new tab)

The Contract Lens landing page: "Upload a contract. Get the facts and the deadlines back." A demo below reads a sample service agreement into a contract record.

Layers built

  1. Data model
  2. Encryption
  3. AI extraction
  4. Web app
  5. Deploy

Role

Sole engineer: the full-stack product, from the multi-tenant data model to the AI extraction pipeline.

Stack

Next.js, React, TypeScript, Prisma, PostgreSQL, Tailwind CSS, Vercel AI SDK, GPT-4o-mini and DeepSeek R1.

Highlights

  • Versioned prompt configs with two-model routing by task shape: GPT-4o-mini for cheap classification and routing, DeepSeek R1 for reasoning-heavy extraction. Results stream live to a 4-step upload wizard.
  • Multi-tenant data model with 5 roles (owner to viewer) and permission checks that scope every contract, task, and alert query to the caller's organization.
  • AES-256-GCM encryption at rest for sensitive contract fields (summary, conditions, and the stored file itself).
  • Deadline-alert and task system with email invitations, on a bilingual (DE/EN) landing page.

Overview

Contract Lens is a deployed SaaS that helps small German law firms manage contracts with AI assistance. Uploaded PDFs and DOCX files run through an extraction pipeline. A classifier routes each document to a type-specific extractor, and the extractor's output is schema-validated. The structured data then appears in a contract editor alongside deadline alerts, role-based multi-tenancy, and encryption at rest for sensitive fields.

The product thesis is an AI that extracts rather than chats: no prompting required from the user. Prompt configurations are versioned in the repository so extraction changes stay traceable, and routing runs through the AI Gateway, which makes the model choice a string rather than an application-code dependency.