A lightweight, privacy-first UX testing platform for web applications. Embeddable SDK with real-time analytics dashboard.
UXTest enables task-based usability testing on any website. The SDK injects a floating widget that guides users through predefined tasks while collecting completion metrics.
Live Demo:
- Dashboard: ux-test-platform-dashboard.vercel.app
- API: uxtest-backend.onrender.com
- Multi-task testing — Define sequential tasks with progress tracking
- Cross-page persistence — Sessions survive page navigations
- Privacy-first — No mouse tracking, keystrokes, or PII collection
- Offline support — Events queued locally when offline
- Chrome Extension — One-click test activation on any site
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Chrome Ext │ │ Target Site │ │ Dashboard │
│ / Bookmarklet │────▶│ + SDK Widget │ │ (React) │
└─────────────────┘ └────────┬────────┘ └────────▲────────┘
│ │
│ Events (AJAX) │ REST API
▼ │
┌────────────────────────────────┴────────┐
│ Backend (Node.js + SQLite) │
└─────────────────────────────────────────┘
# Install dependencies
npm install
# Build SDK
npm run sdk:build
# Start development servers
npm run devOpens:
- Backend API: http://localhost:3001
- Dashboard: http://localhost:5173
├── sdk/ # Embeddable JavaScript SDK
│ ├── src/uxtest.js # Core logic, widget, AJAX
│ └── dist/ # Bundled output (~8KB)
├── backend/ # Express API server
│ ├── src/routes/ # REST endpoints
│ ├── src/services/ # Business logic
│ └── src/db/ # SQLite database
├── dashboard/ # React analytics UI
│ └── src/pages/ # Test management views
├── extension/ # Chrome Extension (MV3)
└── demo/ # Local test page
<script src="https://uxtest-backend.onrender.com/sdk/uxtest.min.js"></script>
<script>
UXTest.init({
projectId: 'my-project',
testId: 'test-123',
variant: 'A',
endpoint: 'https://uxtest-backend.onrender.com'
});
</script>- Load
extension/folder inchrome://extensions(Developer mode) - Click extension icon on target website
- Select test and click "Start Test"
| Method | Endpoint | Description |
|---|---|---|
POST |
/events |
Batch event ingestion |
GET |
/tests |
List all tests |
GET |
/tests/:id |
Get test with tasks |
POST |
/tests |
Create new test |
GET |
/analytics/:testId |
Get computed metrics |
{
"events": [{
"sessionId": "uuid",
"testId": "test-123",
"type": "task_completed",
"payload": { "taskIndex": 0, "duration": 5420 },
"timestamp": 1704067200000,
"url": "https://example.com"
}]
}| Metric | Description |
|---|---|
| Completion Rate | Percentage of completed sessions |
| Abandon Rate | Percentage of abandoned sessions |
| Avg Completion Time | Mean task completion time (ms) |
| Median Time | 50th percentile completion time |
| Time Distribution | Histogram of completion times |
The SDK implements a resilient AJAX strategy:
- Primary:
fetch()with 5s timeout via AbortController - Fallback:
XMLHttpRequestfor older browsers - Unload:
navigator.sendBeaconfor guaranteed delivery - Retry: Exponential backoff with jitter (max 3 attempts)
- Offline: Events persisted to localStorage
services:
- type: web
name: uxtest-backend
buildCommand: npm install && npm run sdk:build
startCommand: npm run backend:start{
"rewrites": [{ "source": "/(.*)", "destination": "/index.html" }]
}npm run dev # Start all services
npm run backend:dev # Backend only (port 3001)
npm run dashboard:dev # Dashboard only (port 5173)
npm run sdk:build # Rebuild SDK bundle- SDK: Vanilla JavaScript, IIFE bundle, esbuild
- Backend: Node.js, Express, sql.js (SQLite)
- Dashboard: React, Vite, Recharts
- Extension: Chrome Extensions Manifest V3
- Deployment: Vercel (frontend), Render (backend)
MIT