I build CSVJetty, an embedded CSV importer for React. I’ve published a shadcn registry item that adds a contact-import card and an account-free demo to your project.
The importer handles CSV upload, column mapping, validation, and inline correction. The example expects a name and email, with an optional company field.
The integration source is MIT licensed. The importer interface runs through the hosted CSVJetty service; production use requires an account and public importer key.
Install
In a React or Next.js project with shadcn already configured:
npx shadcn@latest add https://www.csvjetty.com/r/contact-csv-import.json The registry declares the csvjetty npm dependency and shadcn Card and Table dependencies.
Try it without an account
For a Next.js App Router page:
"use client"; import { ContactCsvImportDemo } from "@/components/contact-csv-import-demo"; export default function ContactsPage() { return ( <main className="mx-auto max-w-3xl p-6"> <ContactCsvImportDemo /> </main> ); } Save this as contacts.csv:
Full Name,Work Email,Organization Alex Chen,alex@example.com,Acme Sam Rivera,not-an-email,Example Inc Upload it, match the columns, and correct the invalid email. The demo displays the latest received batch in your browser. It does not save contacts to a database.
You can also try the hosted demo before installing.
Connect it to your application
The installed ContactCsvImport component accepts a public importerKey and an onData callback. That callback is where your application saves the records.
The callback can await your API request. Throwing an error reports a failed save; returning row-level errors lets you identify records your backend rejected.
Your backend still needs to authenticate requests, validate records, and handle repeated deliveries safely.
The registry provides the contact-import integration and preview. Your application supplies persistence.
Source and integration instructions · Callback documentation
If you try it, I’d be interested in where the mapping or correction flow gets confusing.
