A self-hosted, vendor-neutral full-stack application for managing error cases, support tickets, project assignments, and personnel logistics — deploy it under your own company brand.
What is XteVision Error Tracker and who is it for?
XteVision Error Tracker (xtevision-error-tracker v1.2.6) is a vendor-neutral, fully offline, self-hosted full-stack web application for managing error cases, support tickets, project assignments, and personnel logistics. It is designed to be re-branded and run by any company — manufacturing, automation, or service organizations — on their own hardware with no external cloud dependency.
data-lang-* attributes for EN/DE/ZH/… translation on the client sideThe application ships without any third-party branding. Rename the product, swap the logo, and set your own company name, public server URL, and API key in the configuration. All brand strings live in a small set of places (see Deployment) so a single company can re-brand the platform in minutes.
High-level design and communication flow
┌─────────────────────────────────────────────────────────────────┐
│ Browser (Client) │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ Vanilla HTML/CSS/JS (SPA) │ │
│ │ ┌────────┐ ┌──────────┐ ┌────────┐ ┌────────┐ ┌──────┐ │ │
│ │ │ Login │ │ Projects │ │ Cases │ │Tickets │ │People│ │ │
│ │ └────────┘ └──────────┘ └────────┘ └────────┘ └──────┘ │ │
│ └───────────────────────────────────────────────────────────┘ │
└──────────────────────────────┬──────────────────────────────────┘
│ HTTP/REST API
┌──────────────────────────────┴──────────────────────────────────┐
│ LAN Server — Express.js (port 5003) │
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌──────────────┐ │
│ │ Auth │ │Tickets │ │ Cases │ │People │ │ AI (translate │ │
│ │ │ │ sync │ │ CRUD │ │ CRUD │ │ + similar) │ │
│ └────────┘ └────────┘ └────────┘ └────────┘ └──────────────┘ │
└──────────────────────────────┬──────────────────────────────────┘
│
┌──────────┴──────────┐
│ MySQL 8.0 (mysql2) │
│ error_tracker │
│ 8 core tables │
└─────────────────────┘
┌──────────────────────────────────────────────────────────┐
│ Public Server (ticket intake) │
│ HTTPS form → stores tickets → synced by LAN server │
└──────────────────────────────────────────────────────────┘mysql2 — parameterized queries throughoutXteVision Error Tracker is designed for self-hosted, fully offline operation:
error_trackerFrontend, backend, and infrastructure technologies
| Layer | Technology | Purpose |
|---|---|---|
| Runtime | Node.js | Server runtime |
| Framework | Express.js 4.x | Web server + API routes |
| Database | MySQL 8.0 (via mysql2) | Primary data store |
| Auth | JWT (jsonwebtoken) + bcryptjs | Password hashing + sessions |
| File uploads | multer (disk storage) | Case & ticket attachments |
| Translation | Ollama local LLM (aya-expanse:8b) | Client-side UI translation |
| AI search | Ollama (nomic-embed-text:latest) | Embeddings + similar-case search |
| Frontend | Vanilla HTML/CSS/JS + Font Awesome | No-framework single-page app |
Get XteVision Error Tracker running on your server
Install dependencies and start the server. The server serves static files from the project root and exposes APIs on /api/*.
# 1. Install dependencies
npm install
# 2. Start the server (port 5003)
npm start
# or: node server.js
http://your-server-ip:5003
The LAN server runs on port 5003 by default. Connect from your internal network.
error_tracker database and apply the schema from backup.sqldb.js and routes/auth.js with your own database password, JWT secret, and (if used) public-server API key — move these to a .env filecomponents.json and new_parameters/*.txt to match your equipment and fault taxonomyindex.html and start adding projects, cases, and ticketsDirectory layout and module organization
xtevision-error-tracker/ ├── server.js # Main Express server: routes, auth, uploads, AI, static ├── db.js # MySQL connection singleton ├── routes/ │ ├── auth.js # User registration and login endpoints │ ├── users.js # User listing endpoint (for dropdowns) │ └── tickets.js # Ticket CRUD, public-server sync, push-to-public ├── index.html # Main SPA — login, projects, tasks, cases, tickets ├── register.html # Public user registration page ├── register.js # Client-side registration logic ├── styles.css # Full stylesheet — dark/light theme, responsive, animations ├── components.json # Hierarchical component taxonomy ├── new_parameters/ # Dropdown option lists (integrators, fault types, …) ├── backup.sql # Full MySQL dump of the database └── license.txt # Proprietary license agreement
| File | Purpose |
|---|---|
| server.js | Main Express server — all API routes, auth middleware, file uploads, translation AI, AI knowledge assistant, static file serving |
| db.js | MySQL connection singleton |
| routes/auth.js | User registration and login endpoints |
| routes/users.js | User listing endpoint (for dropdowns) |
| routes/tickets.js | Ticket CRUD, public-server sync, push-to-public logic |
| index.html | Main SPA — login, projects, tasks, cases, tickets tabs |
| register.html | Public user registration page |
| register.js | Client-side registration logic |
| styles.css | Full stylesheet — dark/light theme, responsive layout, animations |
| components.json | Hierarchical component taxonomy (RAM, IFC system, Doser system, Applicator, etc.) |
| new_parameters/*.txt | Dropdown option lists (integrators, fault types, sub-types, personnel, etc.) |
| backup.sql | Full MySQL dump of the database |
| license.txt | Proprietary license agreement |
Key tables and their purpose
| Table | Purpose | Key Fields |
|---|---|---|
| users | Auth users | id, username, email, password_hash, full_name, role |
| tasks | Projects/tasks | id, pm_number, pm_name, integrator, capture_date, start_at, finished_at |
| projects | Higher-level project groupings | id, project_number, project_name |
| error_cases | Detailed error reports (~40 fields) | case_id, system info, error description, root cause, severity, resolution, lessons learned |
| case_attachments | File attachments linked to error cases | case_id, file_path, original_filename, file_type |
| tickets | Support tickets | id, public_id, customer_name, subject, description, source, status, linked_case_id, sync_required |
| ticket_attachments | File attachments linked to tickets | |
| personell_arrangement | Personnel deployment records | project_number, integrator, personnel, trip_start_date, trip_return_date, duration_days, work_description, show_flag |
Key platform capabilities
Track hardware/software errors across industrial equipment with ~40 fields, root-cause analysis, severity tracking, resolution documentation, and lessons learned.
Accept support tickets from external customers via a public form, then manage, link, and resolve them internally with sync to your public server.
Manage project assignments and field deployments — trip dates, durations, work descriptions — linked to projects and error cases.
Periodic sync pushes local status updates and imports new public tickets, with attachments downloaded and stored locally.
Generates embeddings for a ticket's subject/description and finds top-N similar error cases via cosine similarity.
Client-side translate links trigger a local LLM; supports multiple target languages via data-lang-* attributes.
Case and ticket attachments stored with timestamped filenames via multer, served through two static mounts.
Equipment structure, fault types, and personnel lists are driven by simple config files (components.json, new_parameters/*.txt).
Full dark/light theme support with responsive layout and animations, all in a single stylesheet.
In-depth feature documentation
JWT-based authentication with the following mechanisms:
authenticateToken checks the Authorization: Bearer <token> header.env file rather than left hardcoded in routes/auth.js and db.js.uploads/case_<id>/ with timestamped filenamesuploads/ (synced from public server) and web_tickets/uploads/ (public form uploads)express.static mounts for /uploads cover both directoriesPOST /api/translate → Ollama aya-expanse:8bPOST /api/ai/find-similar-cases — generates embeddings for a ticket's subject/description using nomic-embed-text, then finds top-N similar error cases via cosine similarityroutes/tickets.js exports syncTicketsFromPublicServer() which:
sync_required = 1) to the public servercustomer_name + subject + created_at)Status updates to tickets automatically set sync_required = 1 for pushback.
https://error-tracker.example.com)Local LLM–powered knowledge assistant
All AI features run against a local Ollama instance, keeping customer data fully on-premise:
aya-expanse:8b for client-side UI translationnomic-embed-text:latest for similar-case search| Feature | Description |
|---|---|
| Endpoint | POST /api/ai/find-similar-cases |
| Embedding model | nomic-embed-text:latest |
| Matching | Top-N similar error cases via cosine similarity |
| Storage | Embeddings stored in the database for reuse |
Run and manage the platform on your server
mysql2)# Install dependencies
npm install
# Start the server (port 5003)
npm start
# or: node server.js
| Setting | Location | Description |
|---|---|---|
| Database password | db.js | MySQL connection credentials |
| JWT secret | routes/auth.js | Session signing secret — rotate to your own value |
| Public server URL | routes/tickets.js | Your own intake domain (replace placeholder) |
| Public push API key | routes/tickets.js | Rotate to your own secret before going live |
| Product name / logo | index.html | White-label branding — set your own company name |
Re-branding checklist: Set your own product name and logo in index.html, replace the public server URL with your own domain, and rotate the JWT secret and public-server API key. Then move all secrets into a .env file.
# 1. Stop the server
npm stop
# 2. Back up your data and config
cp backup.sql /tmp/et-backup.sql
cp db.js /tmp/et-db.bak
# 3. Install the new version, then restore config
npm install
# 4. Restart
npm start
Always back up backup.sql (your data) and db.js / routes/auth.js (your credentials) before upgrading.
Version history and release notes
data-lang-* attributesCommon issues and solutions
db.js credentials. Ensure the error_tracker database exists. Re-apply the schema from backup.sql.db.js.aya-expanse:8b / nomic-embed-text:latest) is pulled. AI features are optional — the core tracking works without it.routes/tickets.js. Check network connectivity and that sync_required = 1 is set on status updates.uploads/ directory exists and has write permissions. Check the upload API route and that the multer middleware is configured.