Skip to main content

Shared Packages

All Unify applications share common infrastructure through packages in the monorepo. This ensures consistency, reduces duplication, and makes cross-app features possible.
packages/
├── database/     # Supabase types, client, schemas
├── identity/     # Applicant management, profiles
├── extraction/   # Document extraction (OCR, AI)
├── ai/           # Shared LLM utilities
└── ui/           # React component library

@unify/database

Shared database types and Supabase client configuration.

What It Provides

  • TypeScript types generated from Supabase schema
  • Supabase client initialization with proper configuration
  • Zod schemas for runtime validation
  • Privacy-aware patterns for handling PII

Key Patterns

Verified Fields

Track the source and evidence for every piece of applicant data:
interface VerifiedField<T> {
  value: T;
  verified: boolean;
  verifiedAt?: string;
  verificationSource?: 'user' | 'admin' | 'system_ocr' | 'partner_api';
  evidenceDocumentId?: string;
}

Privacy Proxy

Separate queryable metadata from encrypted sensitive values:
// Queryable (in applicant_profiles)
has_ssn: boolean;
citizenship_status: 'citizen' | 'permanent_resident' | 'other';

// Encrypted (in applicant_pii)
ssn_encrypted: string; // AES-256 encrypted

@unify/identity

Unified applicant identity management across all applications.

What It Provides

  • Applicant linking across Terra, Pathfinder, and external systems
  • Profile management with verification tracking
  • History tracking for all applications and interactions

Core Schema

// Core linking table
interface Applicant {
  id: string;
  workosId?: string;      // Authenticated user
  sessionId?: string;     // Anonymous session
  email?: string;
  displayName?: string;
  createdAt: string;
}

// Non-PII, fully queryable
interface ApplicantProfile {
  applicantId: string;
  householdSize: number;
  monthlyIncomeCents: number;
  needsFlags: NeedsFlags;
  citizenshipStatus: string;
  verificationScore: number; // 0-100
}

// Encrypted sensitive data
interface ApplicantPii {
  applicantId: string;
  firstName: string;
  lastName: string;
  ssnEncrypted?: string;
  dateOfBirth?: string;
}

Usage

import { getApplicantByEmail, createApplicant } from '@unify/identity';

// Find or create applicant
const applicant = await getApplicantByEmail('user@example.com');

// Get full profile with history
const profile = await getApplicantProfile(applicant.id);

@unify/extraction

Document extraction service for OCR and AI-powered data extraction.
This package is planned for the Foundation Phase. Documentation will be expanded as implementation progresses.

Planned Capabilities

Document TypeExtracted Fields
PaystubsEmployer name, gross pay, net pay, pay period, YTD totals
Government IDName, date of birth, ID number, expiration, address
Bank StatementsAccount holder, account number, balance, transactions
Proof of AddressName, address, date, document type
Utility BillsAccount holder, service address, amount due, due date

Planned Interface

import { extractDocument } from '@unify/extraction';

const result = await extractDocument(file, {
  type: 'paystub',
  options: {
    extractEmployer: true,
    extractPayPeriod: true,
    extractYtd: true,
  }
});

// Returns typed extraction result
result.data.employerName;    // "Acme Corp"
result.data.grossPay;        // 250000 (cents)
result.data.payPeriod;       // { start: "2024-01-01", end: "2024-01-15" }
result.confidence;           // 0.95

Integration Points

  • Terra: Auto-fill form fields from uploaded documents
  • Sentinel: Analyze documents for fraud indicators
  • Airtable: Exposed via API for external systems

@unify/ai

Shared AI/LLM utilities for all applications.
This package is planned for the Intelligence Layer Phase. Documentation will be expanded as implementation progresses.

Planned Capabilities

Chat/Completion

import { chat } from '@unify/ai';

const response = await chat([
  { role: 'system', content: 'You are a benefits program expert.' },
  { role: 'user', content: 'What documentation is typically required for rental assistance?' }
], {
  model: 'claude-sonnet',
  temperature: 0.3,
});

Embeddings

import { embed } from '@unify/ai';

const embedding = await embed('Emergency rental assistance program for low-income families');
// Returns: number[] (1536 dimensions)

RAG (Retrieval-Augmented Generation)

import { rag } from '@unify/ai';

const answer = await rag({
  query: 'What income limits do similar programs use?',
  documents: existingProgramDocs,
  options: {
    maxTokens: 1000,
    citeSources: true,
  }
});

Translation

import { translate, translateBatch } from '@unify/ai';

// Single translation
const spanish = await translate('Your application has been approved', 'es');

// Batch translation for all program messaging
const translations = await translateBatch(messagingVariants, ['es', 'vi', 'zh', 'ko']);

@unify/ui

Shared React component library based on Shadcn UI.

What It Provides

  • Radix UI primitives with Tailwind styling
  • CVA (Class Variance Authority) for component variants
  • Consistent design system across all applications

Usage

import { Button, Card, Input, Dialog } from '@unify/ui';

function MyComponent() {
  return (
    <Card>
      <Input placeholder="Enter your email" />
      <Button variant="primary">Submit</Button>
    </Card>
  );
}

Design Tokens

TokenValueUsage
backgroundslate-50Page backgrounds
cardwhiteCard backgrounds
borderslate-200Borders and dividers
primary#0F172APrimary actions
mutedslate-500Secondary text

Package Dependencies


Adding a New Package

  1. Create the package directory:
mkdir -p packages/my-package/src
  1. Add package.json:
{
  "name": "@unify/my-package",
  "version": "0.0.1",
  "main": "./src/index.ts",
  "types": "./src/index.ts",
  "scripts": {
    "build": "tsc",
    "test": "vitest"
  }
}
  1. Add to app dependencies:
{
  "dependencies": {
    "@unify/my-package": "workspace:*"
  }
}
  1. Import in your app:
import { myFunction } from '@unify/my-package';