# Tinker Tickets [![Lint](https://code.lotusguild.org/LotusGuild/tinker_tickets/actions/workflows/lint.yml/badge.svg)](https://code.lotusguild.org/LotusGuild/tinker_tickets/actions?workflow=lint.yml) [![Security](https://code.lotusguild.org/LotusGuild/tinker_tickets/actions/workflows/security.yml/badge.svg)](https://code.lotusguild.org/LotusGuild/tinker_tickets/actions?workflow=security.yml) A feature-rich PHP-based ticketing system designed for tracking and managing data center infrastructure issues with enterprise-grade workflow management and a retro terminal aesthetic. **Documentation**: [Wiki](https://wiki.lotusguild.org/en/Services/service-tinker-tickets) **Design System**: [web_template](https://code.lotusguild.org/LotusGuild/web_template) — shared CSS, JS, and layout patterns for all LotusGuild apps ![Tinker Tickets walkthrough: dashboard, kanban, ticket detail with SLA timer, comments, dependencies, activity timeline, command palette and workflow designer](docs/img/demo.gif) ## Why this exists Running a six-node Proxmox/Ceph cluster generates a steady stream of small problems: a drive with SMART warnings, a link that flaps, a certificate about to expire. Off-the-shelf helpdesks are heavyweight for that, and a plain todo list loses the history. Tinker Tickets is a small, opinionated ticketing system built for exactly this: tickets are created **automatically by monitoring** (and by hand), deduplicated so a repeating alert updates one ticket instead of flooding the queue, and every change is audited. ```mermaid flowchart LR hw["hwmonDaemon
SMART, Ceph, temps"] -->|Bearer API| tt gd["GANDALF
network regressions"] -->|Bearer API| tt mcp["MCP server
Claude Code / agents (OAuth)"] --> tt ui["Web UI
people"] --> tt tt{{"Tinker Tickets
PHP + MariaDB"}} -->|webhook| mx["Matrix notifications"] tt --> audit[("Audit log
timeline per ticket")] ``` ## Gallery **Dashboard**: live stat cards, priority and status breakdowns, team workload and a filterable queue. ![Dashboard](docs/img/dashboard.png) **Kanban view** with per-column counts and priority-coloured cards: ![Kanban board](docs/img/kanban.png) **Ticket detail** with a live P1/P2 SLA timer, full metadata and a tabbed workspace: ![Ticket with SLA banner](docs/img/ticket-sla.png) | Comments (Markdown, @mentions) | Dependencies (blocks / relates to) | |---|---| | ![Comments](docs/img/ticket-comments.png) | ![Dependencies](docs/img/ticket-dependencies.png) | **Activity timeline**, derived from the audit log (creation, assignment, status changes, comments): ![Activity timeline](docs/img/ticket-activity.png) **Command palette** (`Ctrl+K`) jumps to pages, saved filters and recently viewed tickets: ![Command palette](docs/img/command-palette.png) **Admin tools:** | Workflow designer | API keys (scoped, revocable) | |---|---| | ![Workflow designer](docs/img/admin-workflow.png) | ![API keys](docs/img/admin-api-keys.png) | | **Audit log** | **Recurring tickets** | | ![Audit log](docs/img/admin-audit-log.png) | ![Recurring tickets](docs/img/admin-recurring.png) | **Light theme** (the whole app follows the [web_template](https://code.lotusguild.org/LotusGuild/web_template) theme toggle): ![Dashboard, light theme](docs/img/dashboard-light.png) Screenshots are generated with Playwright against a throwaway local instance seeded with fictional demo data (`scripts/demo/`). ## Styling & Layout Tinker Tickets uses the **LotusGuild Terminal Design System**. For all styling, component, and layout documentation see: - [`web_template/README.md`](https://code.lotusguild.org/LotusGuild/web_template/src/branch/main/README.md) — full component reference, CSS variables, JS API - [`web_template/base.css`](https://code.lotusguild.org/LotusGuild/web_template/src/branch/main/base.css) — unified CSS (`.lt-*` classes) - [`web_template/base.js`](https://code.lotusguild.org/LotusGuild/web_template/src/branch/main/base.js) — `window.lt` utilities (toast, modal, CSRF, fetch helpers) - [`web_template/php/layout.php`](https://code.lotusguild.org/LotusGuild/web_template/src/branch/main/php/layout.php) — PHP base layout template **Key conventions:** - All `.lt-*` CSS classes come from `base.css` — do not duplicate them in `assets/css/` - All `lt.*` JS utilities come from `base.js` — use `lt.toast`, `lt.modal`, `lt.api`, etc. - CSP nonces: every `