Bulk phone-number dedup & vendor-delivery tracking
Phone Vault is a data-operations platform built by eSparks IT Solutions to turn bulk vendor CSV and Excel uploads into one clean, deduplicated phone-number master list. A Go/Gin API normalizes every number to real E.164 format with a genuine phone-number parsing library, then runs a three-tier deduplication check — within the uploaded file, against the master dataset, and against what that vendor has delivered before — before anything is migrated out of staging. The Next.js dashboard covers upload, staged review, vendor management, and date-ranged per-vendor reporting with CSV export. The stack is intentionally simple: a single Go API, a single Next.js frontend, and PostgreSQL as the only datastore, run via Docker Compose behind Nginx.
Without cross-referencing against what was already delivered, a vendor gets credited again for a number they sent last month.
One file has +91, another has a leading 0, another has spaces — comparing numbers as plain strings misses obvious duplicates.
Without a staging step, duplicate or bad rows get mixed into the master list with no way to tell which upload they came from.
A dedup pipeline that doesn't actually normalize phone numbers first isn't a dedup pipeline — it's a false sense of security.
The outcomes that actually move the needle
Within-file, against the master list, and against what a vendor has already delivered — each checked separately.
Built on a genuine phone-number parsing library, not a strip-non-digits shortcut, so formatting differences never hide a duplicate.
Every upload is categorized before it can reach the master table, and migration into it is an explicit, reviewable action.
Chunked, cancelable uploads and extended request timeouts, sized for uploads in the hundreds of thousands of rows.
A per-vendor report shows exactly how many of their delivered numbers were actually new.

What we designed, built and shipped
Bulk CSV & Excel upload, chunked and cancelable, with real-time progress
Real E.164 phone normalization (libphonenumber), not string stripping
Three-tier dedup: within-file, against master, against vendor history
Staging → master review flow with per-vendor duplicate/dispute reporting
Every choice made for a reason — not just what's trendy
| Layer | Technology | Why |
|---|---|---|
| API | Go 1.25 + Gin | Low-memory footprint for high-volume file processing |
| Web | Next.js 15 + React 18 | Dashboard for uploads, review, vendors and reports |
| Database | PostgreSQL 17 | Single datastore; schema applies idempotently on boot |
| Phone parsing | libphonenumber (Go port) | Real E.164 normalization, not string stripping |
| Excel handling | excelize | Genuine .xlsx parsing, converted to CSV before processing |
| Auth | JWT access + refresh tokens over bcrypt | Stateless sessions sized for an internal tool |
| Deployment | Docker Compose, Nginx-fronted | Containers bind to localhost only in production |
| Logging | zap (structured, Go) | Structured logs instead of unstructured console output |
One API, one database — every upload is normalized and checked in three passes before it can reach the master table.

Every uploaded file is parsed in-process, normalized to E.164, and run through the three-tier dedup pipeline before anything touches the master table in PostgreSQL — the product's only datastore.
CSV or Excel, in parallel chunks, with cancelable progress.
Every number is parsed to E.164 before anything else happens.
Within-file, against master, against that vendor's history.
Results are categorized as unique, self-duplicate, master-duplicate or vendor-duplicate.
Reviewed unique rows move into the authoritative list, individually or as a group.
Pull a per-vendor report or export any result set to CSV.
The API, web app and database each run in their own health-checked container, with production containers bound to localhost behind an Nginx TLS reverse proxy.
We'll walk through an upload, the three-tier dedup, and a vendor report — on a call.
Phone Vault turns a folder of vendor CSV and Excel exports into one clean, deduplicated master list — with a record of who delivered which number, and whether it was actually new. Here is everything the platform does.
Bulk upload, real phone normalization, and three-tier deduplication — nothing reaches the master table without being checked.
Vendor-level reporting, search, and the day-to-day admin tools a data-operations team actually needs.
Let's discuss how we can help you achieve similar results for your business
Explore our other data platform projects

eSparks IT Solutions built a browser-operated data platform for planning, running, monitoring, and validating real-time migrations between heterogeneous databases. Five relational engines (SQL Server, PostgreSQL, MySQL, Oracle, Db2) migrate in either direction; MongoDB is supported as a CDC source. Its Java 21 and Spring Boot 3 control plane orchestrates jobs, while a React interface supports operation through the browser. For real-time CDC, the data plane uses Debezium, Kafka, and a JDBC sink, with PostgreSQL in the stack and deployment via Docker Compose or Kubernetes (Strimzi). The platform includes end-to-end integrity validation with drift detection, custom Java SMTs, AES-GCM secret encryption, Prometheus/Grafana, and JWT/RBAC security. SQL Server, PostgreSQL, MySQL and MongoDB migrations are live-verified end-to-end — including a production programme that moved roughly 960 million rows across 405 tables from SQL Server to PostgreSQL with zero rows missing at validation; Oracle and Db2 connectors are implemented and tested at the unit/config level, pending live verification.
A production-grade Linux appliance that boots straight into a full-screen Windows RDP session — no desktop, no shell, no login prompt — backed by a self-healing watchdog and an infinite reconnect loop. On machines with Secure Boot and a TPM 2.0 chip the whole disk is encrypted (LUKS2, AES-256) with the key sealed in the machine's own TPM, and the encrypted install has been attack-tested against disk theft and boot tampering. Lost or stolen machines are wiped remotely, crypto-erasing the disk on encrypted installs. Optional per-account policy adds lock-screen password rules with a three-strike lockout, Windows-server certificate pinning, USB-storage and clipboard blocking, and memory hardening. New machines can be required to wait for administrator approval (on by default for new accounts), operating-system security patches can roll out through canary machines, and signed kernel updates roll back on their own if they fail to start. It ships as a reproducible ISO with a graphical installer and pairs with a Next.js fleet manager that provisions, monitors, secures and remotely controls the machines and the AWS, Azure and VPS Windows servers they connect to.
CallIntell turns recorded phone calls into reviewed, structured CRM records without anyone listening to the call. A six-stage queue-backed pipeline fetches the recording, transcribes it with speaker labels and word-level timestamps on serverless GPU, strips personal identifiers before any text reaches a language model, matches the call to its CRM record, and generates a schema-validated synopsis — outcome, commitments, objections, price discussed — with every point linked to the second of audio it came from. Spoken follow-up phrases such as “call me in ten days” are resolved into dated CRM tasks in the customer's own time zone, with the verbatim wording kept alongside. Anything the system is not confident about routes to a human review queue rather than being guessed, and CRM writes are idempotent so a retry cannot duplicate a note or a task. Built on Next.js, BullMQ on Redis, PostgreSQL with Drizzle, WhisperX with diarization, Microsoft Presidio redaction and Claude, with passkey and TOTP sign-in, an append-only audit log, per-company isolation and usage metering. Deployed and running the first customer workflow; not yet opened as a public product.