A bilingual e-signature dashboard where teams upload documents, add signers, set per-signer identity checks and track signing status, on real auth with per-user persistence.

Documents hub: drag-and-drop upload, status cards and the latest documents

All documents: searchable, paginated table with status and on-chain register badges

Document detail: signing status, blockchain registration and participants

Signing view: the participant menu and the signature area
// OVERVIEW
Adamo Sign is an e-signature dashboard I built for Adamo. A team uploads a document, adds the people who need to sign, chooses which identity checks each signer must clear, and then follows the document through draft, pending, signed and on-chain-registered states. It runs in Spanish and English. The frontend is the bulk of the work: 128 components including 42 hand-built SVG icons across 14 routes, on Next.js 15 and React 18, with the component layer on shadcn/ui and Radix, forms on React Hook Form and Zod, and copy on next-intl.
The auth and data are real. Sign-in goes through Auth.js with bcrypt-hashed passwords and JWT sessions, middleware redirects anyone without a session to the login page, and a registration endpoint creates new accounts. Documents live in Postgres through Prisma. The list, detail and signing pages are Server Components that read each user's own records, and create and delete go through REST route handlers, so one account never sees another's files.
Two passes shaped the codebase. The four document tables (all, drafts, pending, trash) started as near-identical copies, so I collapsed them into one variant-driven table and a single container, which cut about 950 lines and fixed a delete that updated a toast but not the list. The second pass was localization: I moved every hardcoded string into next-intl and kept the English and Spanish catalogs locked at 397 keys with zero gaps, so neither locale leaks the other. 22 Vitest tests cover the validation schemas and helpers, and type-check, ESLint and the production build all run clean.
The live demo signs in with one click from a pre-filled account, so the whole flow is clickable without any setup. It is deployed on Vercel with a Neon Postgres.
// KEY FEATURES
Auth.js credentials with bcrypt-hashed passwords and JWT sessions; Next.js middleware guards every dashboard route and a registration endpoint creates accounts.
List, detail and signing pages are Server Components that read the signed-in user's own records through Prisma; create and delete run through REST route handlers scoped to that user.
Spanish and English through next-intl on every screen, form error and toast; the two catalogs stay at 397 keys with zero parity gaps.
Upload a file, add signers, pick the identity checks each signer must pass, and track documents through draft, pending, signed and registered states.
The all, drafts, pending and trash views share a single variant-driven table and container with controlled selection and separate mobile and desktop layouts, which removed about 950 lines.
// RELATED WORK