PACTA
Contract Lifecycle Management System

PACTA is a local-first contract management platform designed for organizations that require full control over their data. Distributed as a single binary with zero external dependencies, it runs entirely on your machine β no cloud, no third-party servers, no data leaving your infrastructure.
πͺπΈ Leer en espaΓ±ol β
Features
- Contract Management β Full CRUD operations with soft delete, version tracking, and status workflows
- Hybrid Registration β Email code verification (via local SMTP) or admin approval with company assignment
- Party Management β Centralized registry of clients, suppliers, and authorized signers
- Approval Workflows β Structured supplement approvals with draft, approved, and active states
- Document Attachments β Link supporting documents directly to contracts and parties
- Notifications & Alerts β Automated reminders for expiring contracts and upcoming renewals
- Audit Trail β Immutable log of all operations for compliance and accountability
- Role-Based Access Control β Granular permissions across admin, manager, editor, and viewer roles
- Multi-Company Support β Single company and parent + subsidiaries modes with complete data isolation
- Admin Approval Dashboard β Pending user approvals with company assignment and email notifications
- Setup Wizard β Guided initial configuration for admin user, clients, and suppliers
- Dark/Light Theme β System-aware theme toggle with persistent preferences
- Zero External Dependencies β Single static binary, embedded SQLite, no database server required
Quick Start
1. Download
Get the latest release for your platform from the Releases page.
2. Install
3. Run
./pacta
The application starts on http://127.0.0.1:3000 and opens your browser automatically.
4. Set Up
On first run, PACTA opens a Setup Wizard in your browser. Navigate to /setup (or wait for the automatic redirect) to configure:
- Create admin account β Choose your email and password
- Add clients β Register your organization's clients (optional, can be skipped)
- Add suppliers β Register suppliers (optional, can be skipped)
Once setup is complete, you'll be redirected to the login page. Use the credentials you created to log in.
Note: The setup wizard only appears on first run. If you need to reconfigure, delete the SQLite database file and restart PACTA.
| OS |
Architecture |
Format |
Guide |
| Linux |
amd64 |
.tar.gz, .deb |
Linux Guide β |
| Linux |
arm64 |
.tar.gz, .deb |
Linux Guide β |
| macOS |
amd64 |
.tar.gz |
Extract and run ./pacta |
| macOS |
arm64 |
.tar.gz |
Extract and run ./pacta |
| Windows |
amd64 |
.tar.gz |
Windows Guide β |
Architecture
PACTA follows a minimalist, self-contained architecture:
ββββββββββββββββββββββββββββββββββββββββββββββββ
β pacta (single Go binary) β
β β
β ββββββββββββββββββββββββββββββββββββββββββ β
β β Embedded React + TypeScript frontend β β
β β (Vite build, statically generated) β β
β ββββββββββββββββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββ β
β β SQLite database (pure Go, no CGO) β β
β β ββ SQL migrations (auto-applied) β β
β ββββββββββββββββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββ β
β β HTTP server (:3000) β β
β β βββ GET /* β static frontend β β
β β βββ /api/* β REST API (chi router) β β
β ββββββββββββββββββββββββββββββββββββββββββ β
β β
β All data stays local. No internet required. β
ββββββββββββββββββββββββββββββββββββββββββββββββ
Technology Stack
| Layer |
Technology |
| Backend |
Go 1.25, chi router |
| Database |
SQLite (modernc.org/sqlite, pure Go) |
| Frontend |
React 19, TypeScript, Vite, Tailwind CSS |
| UI Components |
shadcn/ui |
| Animations |
Framer Motion |
| Auth |
Cookie-based sessions, bcrypt |
| Packaging |
GoReleaser, NFPM (.deb) |
API Reference
| Method |
Path |
Auth |
Description |
POST |
/api/auth/register |
No |
Register new user |
POST |
/api/auth/login |
No |
Authenticate user |
POST |
/api/auth/logout |
Yes |
Destroy session |
GET |
/api/auth/me |
Yes |
Get current user |
GET |
/api/contracts |
Yes |
List contracts |
POST |
/api/contracts |
Yes |
Create contract |
GET |
/api/contracts/{id} |
Yes |
Get contract by ID |
PUT |
/api/contracts/{id} |
Yes |
Update contract |
DELETE |
/api/contracts/{id} |
Yes |
Soft delete contract |
GET |
/api/clients |
Yes |
List clients |
POST |
/api/clients |
Yes |
Create client |
GET |
/api/suppliers |
Yes |
List suppliers |
POST |
/api/suppliers |
Yes |
Create supplier |
Changelog
For a complete history of changes, please see the full changelog β
Development
See the Development Guide for prerequisites, local setup, and contribution guidelines.
Quick start for developers:
# Terminal 1: Build frontend
cd pacta_appweb
npm ci && npm run build
# Terminal 2: Run Go server
cd ..
go run ./cmd/pacta
Security
- Local-only binding β Server listens on
127.0.0.1 only
- httpOnly, SameSite=Strict cookies β Prevents XSS token theft
- bcrypt password hashing β Cost factor 10
- Parameterized SQL queries β No SQL injection vectors
- Server-side session management β Full control over session lifecycle
- Role-based authorization β Enforced at the API handler level
License
MIT License. See LICENSE for details.