Filed under Enterprise Data Systems

One registry.
Every company you deal with,
entered once, correctly.

Master Contact Directory is the system of record for people and companies across your organization — resolved against duplicates, matched to a verified email pattern, and stamped with an audit trail that never gets edited quietly.

Duplicate entries
0 filed
Every mutation
logged
Access without
2FA — never
registry / contacts — page 001Synchronized
Search by name, company, or email pattern…
All group holdingsStatus: Client · 340
Entry
Company & domain
Email — resolved
Relevance
AR
Alexander Radu
Chief Investment Officer
Apex Capital Partners
apex-capital.eu
alex.radu@apex-capital.eu
✓ VERIFIED
Holding A
EL
Elena Lupescu
Managing Director, Infrastructure
Novalis Energy Holdings
novalis-energy.com
e.lupescu@novalis-energy.com
✦ PATTERN · 94%
Energy Group
VM
Victor Marinescu
Head of Legal & Compliance
Veritas Legal Partners
veritas-legal.ro
victor@veritas-legal.ro
✓ VERIFIED
Corporate
Section Index

What's kept in this registry, and how.

Each entry below is a real capability of the directory, indexed the way a registrar would file it — not a features list, a set of things the system actually does when a record is created, matched, or queried.

A

Trigram company resolution

Every new company name is checked against the registry with Postgres pg_trgm before it's filed — a typo, an added “SRL,” or a shortened legal name resolves to the existing entry instead of forking it.

B

Email pattern synthesis

Once two or more verified addresses share a convention — first.last@, flast@ — the directory proposes the same pattern for a new contact, marked “guessed” until someone confirms it.

C

Group company relevance

One contact can matter to several business units at once. Relevance is tagged per holding, so a search scoped to one entity never surfaces someone else's prospect list.

D

Token-gated quick add

Field staff and partners submit cards through a revocable, expiring link — no dashboard credentials issued, no standing account to deprovision later.

E

Immutable mutation log

Create, edit, delete, import, export — each is written once to an append-only ledger with a before/after snapshot. The log itself cannot be altered, even by an administrator.

F

Soft delete, with recovery

Nothing disappears on the first click. Deleted records move to a recovery shelf with the reason and the person responsible, restorable until someone purges them on purpose.

Data & Security

Locked the way a registrar's office is locked — not just the front door.

Every control below exists because a directory of people and companies is, by nature, a directory of things worth protecting.

Two-factor authentication

Required for every administrator, with a seven-day grace window on first sign-in and enforcement at the middleware layer, not just the login screen.

Row Level Security

Postgres RLS restricts every table to the server's service role. There is no path from a browser directly to the data, even if a client key leaks.

Append-only audit log

UPDATE and DELETE are revoked on the audit table at the database level — not a convention, a grant that doesn't exist to break.

Rate limiting, per surface

Login attempts, quick-add tokens, imports, and exports each carry their own sliding-window limit, enforced in Redis ahead of the database.

Scoped, revocable tokens

Quick-add links can expire, cap their use count, and restrict by IP — and revoking one takes effect on the next request, not the next deploy.

Session-level control

Administrators can see every active session across the team and force a sign-out on any of them, immediately.

Record Intelligence

The directory corrects itself before a duplicate gets filed.

Paste a signature, a business card photo's text, or a line from an email — the directory extracts a structured entry, checks it against every existing company and contact, and shows you the match before anything is saved. Nothing is written until a person confirms it.

  • Company name normalized and matched by domain, then by fuzzy name
  • Existing contact flagged before a second copy is created
  • Email pattern proposed only once it has real precedent to draw on
Incoming entry — under review
Company, as pasted
Novalis Energy Hldg.
Resolved to registry
Novalis Energy Holdings
Email — not provided
left blank
Pattern proposed · 94%
e.lupescu@novalis-energy.com

A prospect at this domain is already filed. Register anyway, or open the existing entry?

Built On

A relational ledger underneath, not a spreadsheet with a UI.

Next.js Server Actions handle every write. Prisma keeps the schema honest. Supabase Postgres holds the data — and its own row-level policies, in case anything ever tries to reach it directly.

Next.js (App Router) — Server Actions & edge middleware, no separate API layer to drift out of sync

Prisma ORM — Typed schema, versioned migrations, one source of truth for the data model

Supabase Postgres — Session pooling plus pg_trgm for the fuzzy company matching above

Upstash Redis — Sliding-window rate limits for login, tokens, import, and export

schema.prismacompanies

// resolved by domain, then by trigram name match

model Company {

id String @id @default(uuid())

name String

normalizedName String @map("normalized_name")

domain String?

deletedAt DateTime? @map("deleted_at")

contacts Contact[]

@@index([normalizedName])

}

MASTER CONTACT DIRECTORY • REGISTRY OF RECORD •

The registry is open.

Sign in with your enterprise credentials, or ask an administrator to file you in.