A browser-based tool that converts publication data from XLSX spreadsheets into XML files and uploads them to an Amazon S3 bucket for ingestion by TEP (The Everyone Project).
Runs entirely client-side — no server component, no data passes through any intermediate server. The compiled output is plain static HTML/CSS/JS that can be hosted anywhere or opened directly from the filesystem.
| Document | Audience | Description |
|---|---|---|
| docs/README_user.md | End users | How to configure the app, upload a spreadsheet, interpret validation errors, and understand the results screen |
| docs/README_technical.md | Developers / maintainers | Architecture, data flow, field schema, XML output format, localStorage keys, S3 structure, debug mode |
TEPUploader/
│
├── README.md ← this file
├── CLAUDE.md ← guidance for AI coding assistants
├── package.json ← npm dependencies and build scripts
├── vite.config.js ← Vite build configuration
├── svelte.config.js ← Svelte compiler configuration
├── jsconfig.json ← editor path aliases
├── .nvmrc ← pins Node.js version (24) for nvm users
├── index.html ← single HTML entry point
│
├── docs/
│ ├── README_user.md ← end-user guide
│ ├── README_technical.md ← technical / developer reference
│ └── samples/
│ ├── generate_sample_xlsx.py ← script to regenerate the sample spreadsheet
│ ├── sample_input.xlsx ← sample input spreadsheet (5 rows, inc. one bad row)
│ ├── sample_broadcast.xml ← example XML output for a broadcast row
│ └── sample_ondemand.xml ← example XML output for an on-demand row
│
├── src/
│ ├── main.js ← application entry point (mounts Svelte root)
│ ├── app.css ← global design system (CSS variables, layout, components)
│ ├── config.js ← COLUMN_CONFIG field schema + RECORD_VALIDATOR
│ ├── stores.js ← all shared Svelte state (writable stores)
│ │
│ ├── App.svelte ← root shell: nav bar, section routing, step routing
│ │
│ ├── components/
│ │ ├── StepIndicator.svelte ← progress bar shown above every wizard step
│ │ ├── Settings.svelte ← AWS credentials modal
│ │ └── ErrorReview.svelte ← TEP error review tab (placeholder — future)
│ │
│ ├── steps/ ← one component per wizard step, in order:
│ │ ├── FileSelection.svelte ← step 1: pick an XLSX file
│ │ ├── SheetSelection.svelte ← step 2: choose a sheet (multi-sheet workbooks)
│ │ ├── ColumnMappingReview.svelte ← step 3: verify/correct column→field mappings
│ │ ├── ValidationReport.svelte ← step 4: review rows that failed validation
│ │ ├── UploadProgress.svelte ← step 5: upload loop with progress bar
│ │ └── ResultsSummary.svelte ← step 6: final counts and retry/start-over
│ │
│ └── lib/ ← pure logic modules (no Svelte, independently testable)
│ ├── spreadsheet.js ← XLSX adapter (ExcelJS); swap library here only
│ ├── mapping.js ← header-row detection + column auto-mapping
│ ├── pipeline.js ← orchestrates lib calls and writes to stores
│ ├── validation.js ← field-level and record-level validation
│ ├── xml.js ← DOM-based XML generation + debug preview
│ ├── dedupe.js ← SHA-256 hashing + local hash cache
│ ├── s3.js ← all S3 operations (upload, remote dedup check)
│ ├── learnedAliases.js ← persist user-confirmed column mappings to localStorage
│ └── debug.js ← log() utility, activated by ?debug=true
│
└── dist/ ← compiled output (generated by `npm run build`)
nvm use # switch to Node 24 (requires nvm)
npm install # install dependencies
npm run dev # start dev server at http://localhost:5173
npm run build # build to dist/
Append ?debug=true to the dev URL to enable verbose console logging and an XML preview screen before any upload.
docs/samples/ contains a ready-to-use sample spreadsheet and XML files for testing. To regenerate the spreadsheet:
python3 docs/samples/generate_sample_xlsx.py
Requires Python 3 and openpyxl (pip install openpyxl).