A litigation hold management tool for creating, issuing, tracking, and managing legal holds. Built for non-technical legal professionals — in-house counsel, legal ops teams, and paralegals.
./start.sh # macOS/Linux
start.bat # WindowsThis installs everything, seeds sample data, starts the app, and opens your browser.
Default login: admin@acmecorp.com / admin123
docker compose upThen open http://localhost:8501.
Or deploy manually using the included Dockerfile.railway and railway.json.
- Hold Management — Create, update, release, and suspend litigation holds with full metadata (matter name, trigger event, scope, date ranges)
- Custodian Database — Manage custodians with contact info, department, title, and data source mapping
- Hold Notices — Generate and send hold notices to custodians via email (real SMTP or simulation mode)
- Acknowledgment Tracking — Custodians log in and acknowledge holds; track status per custodian (pending, notified, acknowledged, overdue)
- Automated Reminders — Schedule recurring reminders for non-responsive custodians
- Dashboard — View active holds, acknowledgment rates, and overdue custodians at a glance
- Audit Log — Immutable record of all system actions for defensibility
- Role-Based Access — Admin and custodian roles with appropriate permissions
- Email Modes — Toggle between real SMTP delivery and simulation mode for testing
lhm_app/ # FastAPI backend
models/ # SQLAlchemy ORM models
schemas/ # Pydantic request/response schemas
routers/ # API route handlers
services/ # Business logic layer
lhm_frontend/ # Streamlit frontend
pages/ # Multi-page app views
data/sample/ # Synthetic seed data
tests/ # pytest test suite
With the API running, visit http://localhost:8000/docs for interactive Swagger documentation.
pip install -e ".[dev]"
pytest- Backend: Python 3.11+, FastAPI, SQLAlchemy 2.0, Pydantic v2
- Frontend: Streamlit
- Database: SQLite (production-ready for PostgreSQL)
- Auth: JWT with bcrypt password hashing
- Email: SMTP with simulation fallback
- Testing: pytest
| Variable | Default | Description |
|---|---|---|
DATABASE_URL |
sqlite:///./data/legal_hold.db |
Database connection string |
SECRET_KEY |
(dev default) | JWT signing key — change in production |
EMAIL_MODE |
simulation |
smtp or simulation |
SMTP_HOST |
SMTP server hostname | |
SMTP_PORT |
587 |
SMTP server port |
SMTP_USER |
SMTP username | |
SMTP_PASSWORD |
SMTP password | |
SMTP_FROM |
legalholds@example.com |
Sender email address |
API_BASE_URL |
http://localhost:8000 |
Backend URL for frontend |
MIT License — Copyright (c) 2026 Noam Raz and Pleasant Secret Labs