CSV Health solves a common first-mile data problem: a CSV can look usable while hiding missing values, duplicated records, type inconsistencies, malformed rows, invalid dates, or numerical anomalies.
It is useful because anyone can open the site, choose a file, and receive a practical quality report without installing Python, creating an account, or learning a profiling tool.
Its privacy-first approach is simple: the file is parsed, profiled, previewed, and exported entirely inside the browser. CSV contents are never uploaded to CSV Health, and the application has no backend, analytics, trackers, accounts, or cloud storage.
Your data stays on your device. CSV Health processes files entirely inside your browser.
- Drag-and-drop and file-picker input for CSV files up to 25 MB
- Generated sample dataset for an immediate, no-file trial
- Dataset overview: file metadata, rows, columns, completeness, duplicates, detected indicators, and parser errors
- Deterministic type inference for text, number, boolean, date, empty, and mixed columns
- Column statistics: missing and unique counts, examples, common values, numeric summaries, and date ranges
- Indicators for missing values, repeated rows, empty rows and columns, constants, mixed types, date inconsistencies, IQR outliers, high-cardinality text, and structural parser errors
- Scannable indicator totals, severity and category filters, and an accessible show-all control
- Searchable, sortable column table with numeric and categorical charts
- Local preview of the first 100 rows
- Privacy-conscious Markdown and JSON reports that omit full rows and example values
- Responsive, keyboard-accessible interface with visible focus states and non-color severity labels
- Unit, integration, and Playwright end-to-end coverage
Findings are indicators for review, not proof that a value is wrong.
Requirements: Node.js 22.13 or newer and npm.
git clone https://github.com/aminhanifm/CSV-Health.git
cd CSV-Health
npm ci
npm run devOpen the local URL printed by Vite.
CSV Health is a static React application built with Vite and strict TypeScript.
src/
components/ Accessible React views and controls
data/ Embedded generated sample data
exporters/ Privacy-conscious Markdown and JSON reports
profiling/ Pure parsing, inference, statistics, and issue detection
test-fixtures/ Shared test setup
types/ Reusable profile and report contracts
e2e/ Essential Playwright user journeys
public/samples/ Generated, non-sensitive sample CSV
Papa Parse reads CSV text into a normalized matrix. Pure functions then infer types, calculate statistics, and create review indicators. React only consumes the resulting DatasetProfile; it does not contain profiling rules. Exporters map the profile to a deliberately smaller report contract that excludes source rows and example values.
No server, database, authentication layer, external API, web worker upload, or persistence service exists.
npm run format # Prettier check
npm run lint # ESLint
npm run typecheck # strict TypeScript
npm test # Vitest + React Testing Library
npm run build # production bundle
npm run test:e2e # Playwright; install Chromium first if neededInstall the end-to-end browser locally with:
npx playwright install chromiumGitHub Actions runs formatting, linting, type checking, unit/integration tests, a production build, and the essential Chromium journeys.
- Comma-delimited text with Papa Parse delimiter detection
- Quoted fields, embedded commas, escaped quotes, CRLF or LF line endings, and a UTF-8 BOM
- A required first row used as the header row
- Blank headers receive stable names such as
Unnamed column 3; duplicate headers receive numeric suffixes - Short rows are padded for analysis; extra fields are reported and ignored beyond the header width
- Empty cells plus case-insensitive
NA,N/A, andnullare treated as missing - ISO
YYYY-MM-DD, ISO date-time,YYYY/MM/DD, and unambiguous month-firstMM/DD/YYYYdate checks - Plain, scientific-notation, and comma-grouped numbers
- Excel workbooks (
.xlsx,.xls) and other spreadsheet formats - Files larger than 25 MB; this browser-safety limit is configurable in
src/App.tsx - Encodings other than those the browser can read reliably; UTF-8 is recommended
- Locale-specific numbers such as
1.234,56 - Day-first dates such as
31/01/2026; ambiguous dates should be standardized to ISO before analysis - Streaming/chunked profiling for very large datasets
- Editing, cleaning, or rewriting the source CSV
- Saved projects, accounts, collaboration, cloud uploads, or AI-generated conclusions
CSV Health reads a selected File with browser APIs and keeps the parsed matrix in React memory for the current page session. It does not call fetch for user data, send telemetry, print CSV contents to the console, or persist rows to local storage. Selecting Start over, refreshing, or closing the tab releases the application’s reference to the data.
The on-screen column details include limited examples because they are explicitly useful during local review. Exported reports omit those examples, common-value text, and the row preview. Reports contain aggregate statistics, issue descriptions, file name, and file size; review those metadata before sharing a report.
See SECURITY.md for private vulnerability reporting.
- Profiling is synchronous after file reading and may briefly occupy the main thread on files near the size limit.
- Type inference is heuristic and intentionally conservative; a mixed classification may be legitimate.
- IQR outliers are statistical review signals, not domain-aware mistakes.
- Duplicate detection trims leading and trailing whitespace before comparing complete rows.
- Date support favors deterministic, documented formats over broad locale guessing.
- The first release does not calculate schema drift across multiple files.
- Move heavy profiling to a browser Web Worker while preserving local-only processing
- Add configurable missing-value tokens and inference thresholds
- Add delimiter/encoding controls for unusual inputs
- Add an optional local schema definition and validation mode
- Improve charting for distributions and long-tail categorical columns
- Add translated interface copy
These are possible future directions, not commitments. Excel support, automatic file modification, user accounts, teams, a backend, cloud storage, and AI chat remain outside the MVP.
Issues and pull requests are welcome. Start with CONTRIBUTING.md, follow the Code of Conduct, and use the repository issue forms. Profiling changes should include deterministic unit tests and must not introduce network transmission of CSV contents.
Suggested repository topics:
csv, data-quality, data-profiling, privacy, react, typescript, open-source, data-analysis
CSV Health is available under the MIT License.
