TableTamer is a polished CSV workbench for the browser. Drop in a CSV file and it turns into a searchable, sortable, editable table with column controls, pagination, theme support, clipboard export, and local session persistence.
TableTamer is currently a client-first React application served by a lightweight Express wrapper.
What works today:
- π Drag-and-drop CSV upload
- π§ͺ Example dataset loading
- π Global table search
βοΈ Column sortingβοΈ Column resizing- ποΈ Column visibility management
- βοΈ Inline cell editing
- π€ Cell text transforms: uppercase, lowercase, title case, clear
- π Pagination with configurable page sizes
- πΎ Session restore via
localStorage - π€ Export filtered visible data as CSV or JSON
- π Copy filtered visible data to clipboard
- π Light and dark theme toggle
- β¨οΈ Keyboard shortcuts for common actions
- π‘οΈ Error boundary protection in the UI
- π¦ Production server protections such as Helmet, compression, CORS, and rate limiting
What it is not today:
- It is not a multi-user or collaborative system.
- It does not currently expose a meaningful public API.
- It includes database-related packages and scaffolding, but the active app flow is centered on in-browser CSV handling.
The repository is split into a small server layer and a browser app:
client/: React SPA built with Viteserver/: Express server for production delivery and middlewareshared/: shared TypeScript schema/typespublic/: favicons and static site assetsscreenshots/: project screenshots used in docs
The appβs core state lives in client/src/context/TableContext.tsx, which owns CSV ingestion, filtering, sorting, pagination, editing, exports, clipboard behavior, and persisted session restore.
- βοΈ React 18
- π§ TypeScript
- β‘ Vite 7
- π§ Wouter for routing
- π TanStack Table for table mechanics
- π TanStack Query installed for async/query infrastructure
- π¨ Tailwind CSS
- π§© shadcn/ui style component architecture
- π§± Radix UI primitives
- π
next-themesfor theme management - πΌοΈ Lucide React icons
- π§Ύ PapaParse for CSV parsing and CSV export generation
- π½ Browser
localStoragefor session persistence - π Clipboard API with fallback support for copy operations
- π Express 4
- ποΈ
compression - πͺ
helmet - π
cors - π₯
express-rate-limit - πͺ΅ Winston logging
- π§
tsxfor local development runtime - π¦
esbuildfor bundling the production server entry
- β»οΈ PM2 ecosystem config included for process management
- π§ Node.js 18+ supported
- π§° Husky + lint-staged configured for local workflow hygiene
The repository also includes packages for forms, validation, charts, sessions, Drizzle ORM, and other UI primitives. Some of these are currently unused in the active CSV workflow, but they are present in the repo and may support future work.
git clone https://github.com/hexawulf/tabletamer.git
cd tabletamernpm installCopy the example file:
cp .env.example .envCurrent environment values supported by the app:
PORT: server port, defaults to5000NODE_ENV:developmentorproductionLOG_FILE_PATH: Winston log destinationALLOWED_ORIGINS: comma-separated CORS allowlistDATABASE_URL: present for DB tooling/scaffolding
npm run devnpm run buildnpm run startnpm run dev # start the app in development mode
npm run build # build the client and bundle the server
npm run start # run the production server from dist/
npm run check # run TypeScript checks
npm run lint # lint client, server, and shared code
npm run format # format project files with Prettier
npm run db:push # push Drizzle schema changes- Drag a
.csvfile onto the upload area, or click to browse - Use the built-in example dataset if you just want to test the UI quickly
- Search across all visible data
- Sort by clicking a column header
- Resize columns by dragging the header handle
- Toggle visible columns from the Columns dialog
- Click any cell to open the editor
- Save direct text changes
- Apply text transforms before saving
- Export the current filtered and visible data to CSV
- Export the current filtered and visible data to JSON
- Copy the current filtered and visible data to the clipboard
TableTamer supports keyboard shortcuts for fast navigation and control:
| Action | Shortcut |
|---|---|
| Focus search | Ctrl/Cmd + F |
| Open column manager | Ctrl/Cmd + M |
| Export CSV | Ctrl/Cmd + E |
| Toggle theme | Ctrl/Cmd + D |
| Show shortcuts dialog | Ctrl/Cmd + K |
| Next page | β |
| Previous page | β |
| Clear search | Esc |
- Helmet is enabled in production
- API-prefixed routes are rate-limited
- Response compression is enabled
- CORS can be restricted with
ALLOWED_ORIGINS - Server startup and request flow are logged through Winston
See SECURITY_AUDIT.md for prior security cleanup notes.
Potential next steps that would fit the current codebase well:
- Column reordering
- Better type-aware rendering and sorting
- Advanced per-column filters
- Undo/redo for edits
- Richer table summaries and lightweight visualizations
- Removal of unused package/dependency surface
Contributions are welcome. If you are making changes, keep the app working, keep the docs honest, and prefer small, testable improvements over speculative feature sprawl.
Basic flow:
- Fork the repo
- Create a branch
- Make and verify your changes
- Open a pull request
- Author: 0xWulf
- Email:
dev@0xwulf.dev - Repository: github.com/hexawulf/tabletamer
This project is licensed under the MIT License.
You can also read the standard MIT license text at opensource.org/licenses/MIT.
