Repository navigation
Reading Long Tickets
Everything FreeITSM does to keep a ticket readable once the email chain has got away from it. All of it comes from discussion #104, and all of it is configured in one place: Tickets β Settings β General.
For developers: Reading Long Tickets β Developer Guide covers the three automatic behaviours, and Ticket AI Reading β Developer Guide covers the summary and the briefing.
Nothing here ever deletes, hides or replaces anything. Every message stays in the page, in full, the whole time β the most any of it does is fold something away behind one tap.
That is not politeness, it is the design constraint. Deciding where quoted history ends is genuinely hard: every mail client marks a quoted chain differently, plenty do not mark it at all, and a forwarded message can look identical to a reply. Any approach is right most of the time and wrong some of the time. So a wrong judgement about what is noise has to cost you a click, never a fact.
| What it does | Default | |
|---|---|---|
| Shorten long messages | A message taller than a limit you set is clipped, with Show more. | On, ~12 lines |
| Fold older messages | Beyond N recent messages, the rest go behind one "{n} older messages" line. | On, 6 shown |
| Flag repeats | A message that has arrived before is folded away, with a note saying which one it matches. | On |
| AI summary | A few lines at the top: where things stand, what was asked, what has been done, who owes the next move. | Off |
| Read it for me | A briefing on a ticket you have never seen. | Off |
The last two are off because, unlike the first three, they cost money β they use your own AI provider's key. A feature that starts billing you when you upgrade is not a good surprise.
A long email is clipped after roughly the number of lines you choose, with a Show more link. Three things you can adjust:
- The newest message is always shown in full. It is the one you opened the ticket to read. You can switch this off if you would rather everything behaved the same way.
- Quoted history is shortened separately. A two-line reply with a thousand lines of chain underneath it is short by any line count and still unreadable.
- What you open stays open, on that device, so scrolling back to a ticket does not mean expanding the same message again. This is remembered in your browser and never leaves it.
Why "about" 12 lines? The limit is applied to how tall the message actually renders, not how many lines of source it has. A vendor notification laid out in tables can be a handful of lines of code and render the height of your desk. Stating the setting in lines keeps it something you can reason about; measuring the rendered height is what makes it match what you actually scroll past.
Shortening a long message does nothing for a ticket that is long because it holds eighty short ones β every message is under the limit and the ticket is still unreadable.
So the most recent messages stay as they are and everything before them folds behind a single line: "14 older messages". Click it to open them all. The count is stated so nobody has to wonder what is behind it, and the messages are in the page the whole time β this moves them, it does not drop them.
Set how many recent messages stay open under Recent messages to keep open.
A long ticket is more often the same message five times than one long message: a resend, a distribution list delivering twice, a bounce carrying the original back, an auto-reply quoting the lot.
A message that has arrived before is folded away with a line saying which earlier one it matches and when:
Identical to the message from Mon 31.08.2026 22:28 Nearly identical to the message from Mon 31.08.2026 22:28
"Nearly identical" catches the case an exact comparison misses β somebody resending with one line added at the bottom. Very short messages are never flagged: "Thanks" is not a duplicate of "Thanks" in any sense worth acting on.
It only ever points something out. Nothing is deleted, hidden or merged, and the message opens with one tap.
Off until you turn it on. When it is on, a short summary sits at the top of each ticket: where things stand, what was asked, what has been done, and who owes the next move.
It always shows when it was written, how much it read, and how many messages have arrived since. That last one matters more than it looks: a summary that quietly describes a ticket as it was five messages ago reads exactly like one that is current, which is worse than having no summary at all. When the conversation has moved on, the panel says so.
Every version is kept. Pressing Refresh writes a new one and never overwrites the old β a later reading really can be worse than an earlier one, and without a history that loss would be silent. History shows every version ever written for that ticket.
Set Refresh automatically after this many new messages and FreeITSM rewrites the summary once the conversation has moved that far ahead of it.
Two things stop this running away with your bill:
- It only ever happens when somebody opens the ticket. There is no background job, deliberately β a nightly sweep of your open queue would charge you for summaries of tickets nobody looked at.
- Two people opening the same ticket at once cannot cause two charges.
0 means never, and the Refresh button is then the only thing that spends anything.
It is told never to infer a cause, a fix or a resolution that nobody wrote down β a summary that invents a fix reads exactly like one that did not β and to say so plainly when something is unclear, rather than papering over it.
You can also stop it reading internal notes, if notes on your desk hold things that should not leave it. Either way the summary is staff-only and is never shown to a requester.
Off until you turn it on. A button on the ticket that reads the whole thing and briefs you: the short version, how it got here, what is unresolved, and what it would do next.
It is allowed to make suggestions, and is required to label them as suggestions β that last section always opens with "These are suggestions, not conclusions." It is also told to separate what the ticket says from what it is inferring, every time, because the thing that goes wrong here is somebody acting on a confident guess.
Once written, it is kept. Opening it again is instant and costs nothing; Read again writes a fresh one when you want it, and earlier briefings stay in History.
Both AI features share the Tickets AI provider, configured once at Tickets β Settings β Reply cleanup β the same one the reply cleanup and merge summary already use. One API key for the module.
If a summary does get cut off before it finishes, the panel says so rather than serving you half an answer as though it were whole.
Tickets β Settings β General
| Setting | Default |
|---|---|
| Shorten long messages | on |
| Shorten after about N lines | 12 |
| Always show the newest message in full | on |
| Shorten quoted history | on |
| Remember which messages you opened | on |
| Fold older messages | on |
| Recent messages to keep open | 6 |
| Flag messages that arrived before | on |
| Keep an AI summary | off |
| Refresh it after N new messages | 0 (never) |
| Messages a summary reads | 60 |
| Let it read internal notes | on |
| Offer "Read it for me" | off |
- Reading Long Tickets β Developer Guide
- Ticket AI Reading β Developer Guide
- AI Providers β provider, model, key, and the thinking switch
- Merging Tickets β the other way a thread gets long
- Tickets
FreeITSM β an open-source IT Service Management platform Β· github.com/edmozley/freeitsm Β· MIT licence
- Installation
- β° Scheduled tasks (cron jobs)
- Architecture
- π§ͺ Developer tests
- AI Providers
- Internationalisation (i18n)
- Timezones & Time Handling
- π Date & Time Formats
- Theming & Dark Mode
- ποΈ Recent β getting back to what you were doing
- β¨οΈ Command palette (βK)
- π Searching inside tickets
- π Attached documents
-
MobileβFriendly
- β³ π« Mobile: Tickets
- β³ π» Mobile: Assets
- β³ π Mobile: Calendar
- β³ π Mobile: Knowledge
- β³ π¦ Mobile: Service Status
- β³ πΌ Mobile: Watchtower
- β³ π§© Mobile: Problem Management
- β³ π Mobile: Change Management
- β³ πΏ Mobile: Software
- β³ β Mobile: Tasks
- β³ π Mobile: Forms
- β³ π Mobile: Contracts
- β³ π Mobile: Domains
- β³ π Mobile: People
- β³ π Mobile: Projects
- β³ π Mobile: LMS
- β³ πΊοΈ Mobile: CMDB
- β³ πΊοΈ Mobile: Network Mapper
- β³ π§ Mobile: Process Mapper
- β³ βοΈ Mobile: Workflow
- β³ π₯οΈ Mobile: System
- β³ π Mobile: Reporting
- β³ π Mobile: System Wiki
- β³ π Mobile: Self-Service Portal
- β³ π§° Mobile: Techniques & Tricks
-
Security
- Layer 1 β which modules you can enter
- β³ π§© Module Access Control
- β³ π οΈ Module Access β Developer Guide
- Layer 2 β what you can administer
- β³ π Roles & Permissions
- β³ π οΈ Roles β Developer Guide
- β³ π€ Why capabilities are constants
- Layer 3 β the System module
- β³ π Admin Access Control
- Hardening
- β³ π Security review response 2026-08
- β³ π‘οΈ Security hardening 2026-08
- β³ π οΈ Security hardening 2026-08 β Developer Guide
- β³ π‘οΈ Round three β plain English
- β³ π οΈ Round three β Developer Guide
- β³ π‘οΈ CSRF protection (S4) β Developer Guide
- Single Sign-On (SSO)
- ποΈ LDAP & Active Directory
- π CardDAV contact sync
- Browser Extension
- API Reference
-
π REST API β how it works
- β³ π« REST API: Tickets
- β³ π» REST API: Assets
- β³ π΄ REST API: Problems
- β³ π REST API: Changes
- β³ π REST API: Knowledge
- β³ β REST API: Tasks
- β³ ποΈ REST API: CMDB
- β³ π REST API: Contracts
- β³ ποΈ REST API: Calendar
- β³ πΏ REST API: Software
- β³ π REST API: Domains
- β³ π¦ REST API: Service Status
- β³ βοΈ REST API: Morning Checks
- β³ π REST API: Forms
- β³ βοΈ REST API: Workflow
- β³ π·οΈ REST API: Cost centres
- β³ πΊοΈ REST API: Network Mapper
- β³ π§ Using the API docs page
- β³ π OpenAPI specification
- β³ β OpenAPI: kept correct
- β³ π οΈ Maintaining the catalogue
- Watchtower
-
Tickets
- β³ π Rota copy and paste β Developer Deep Dive
- β³ β Checklists & SOPs
- β³ βοΈ Mandatory fields
- β³ π·οΈ Ticket categories
- β³ π₯ Assigning tickets to a team, and escalation
- β³ π’ One board across every company
- β³ Mailbox Authentication
- β³ π€ Email send log
- β³ Basic IMAP mailboxes
- β³ Email rendering & images
- β³ SLA Management
- β³ WhatsApp channel
-
β³
βοΈ Telegram channel - β³ β CSAT company scope and filters β Developer Guide
- β³ π₯ Microsoft Teams channel
- β³ π¨οΈ Mattermost channel
- β³ π¬ Web chat channel
- β³ π£ Slack channel
- β³ π Linking tickets
- β³ β Record previews
- β³ π Ticket notes: internal or shared
- β³ ποΈ Canned responses
- β³ βοΈ Limiting replies to particular senders
- β³ π¨ Telling the analyst a ticket is theirs
- β³ βοΈ Email signatures
- β³ π The public web address
- β³ π’ Ticket numbering
- β³ π Raising a ticket for someone else
- β³ π Merging tickets
- β³ π Confidential tickets
- β³ π₯ Portal managers
- β³ π Who has seen a ticket
- β³ π Reading long tickets
- β³ β Splitting tickets
- β³ β Selecting several tickets
- β³ ποΈ The folder pane
- β³ π½ Just my tickets, or no closed ones
- β³ π οΈ Snoozing tickets β Developer Guide
- β³ π₯ Collision detection
- β³ β±οΈ Time tracking
- β³ π Scheduled work in your own calendar
- Problem Management
- Tasks
- π Projects
-
Assets
- β³ π’ Moving an asset between companies
- β³ π Shared asset locations
- β³ π§βπΌ Assigning assets to analysts
- β³ π Warranty and lease alerts
- β³ π Saved table views
- β³ π¨οΈ Recording anything, and importing it
- β³ π·οΈ QR asset labels
- β³ π Who holds what, and handover documents
- β³ π₯οΈ The inventory agent (PowerShell)
- β³ ποΈ Proxmox VE servers
- β³ βοΈ VMware Cloud Director servers
- β³ π Linking equipment to tickets
- β³ βοΈ Follow-up tasks on a ticket
- Knowledge
- Change Management
- Calendar
- Morning Checks
- Reporting
- Software
-
Forms
- β³ π¨ The form designer β Developer Guide
- β³ π Layout & the grid β Developer Guide
- β³ ποΈ Collections β grouping submissions
- β³ π Submissions as PDFs
- β³ β‘ What happens next β a form's own actions
- β³ π οΈ Sections & conditional logic β Developer Guide
- β³ π οΈ Lookup fields β Developer Guide
- β³ π‘οΈ Catalogue request approvals
- People
- Domains
- Contracts
- Service Status
- π Notifications
- π¨ War Room
- Self-Service Portal
- LMS
- Process Mapper
- CMDB
- Network Mapper
- Workflows
- Issue trackers (Jira, Azure DevOps)
- System
-
Overview
- β³ π Progress tracker
- β³ Concepts & vocabulary
- β³ Email routing & mailboxes
- β³ Settings: global vs per-company
- β³ Users & self-service
- β³ Staff cross-company access
- β³ π’ One board across every company
- β³ Worked examples
- β³ Pitfalls & gotchas
- β³ Scope: what it's for
- β³ π οΈ Developer Guide (make a module multi-company)
- β³ ποΈ Case study: CMDB (a linked graph)
- β³ π§ͺ Test harness (prove it's isolated)
- What this is
-
π Bugs resolved
- β³ πΌοΈ Logo and courses broke on Apache with PHP-FPM
- β³ π’ Chat tickets ignored your ticket numbering
- β³ π Dates shown as a dash, or in server time
- β³ π Assets β Users showed people from other companies
- β³ π Restricted analysts could read other modules' data
- β³ πΌοΈ Replies with a picture in the thread failed to send
- β³ π Reply attachments never reached the customer
- β³ π οΈ Outbound email attachments β Developer Guide
- β³ π A global SSO provider was missing from the portal
- β³ π Behind a proxy, the SSO redirect said http
- β³ βοΈ The portal tagline moved when you saved it
- β³ π¨ The portal settings screen forgot what you saved
- β³ π‘οΈ The approvals inbox said "Error" and nothing else
- β³ π A table's answers were missing from the PDF
- β³ β A single-select column let you tick every option
- β³ π The portal ignored a form's field widths
- β³ π The tasks board stopped taking clicks
- β³ ποΈ #121 The index list is out of date after upgrading
- β³ π #133 The calendar subscription was empty
- β³ π #131 Tasks always reopened on the board
- β³ π₯ #129 Every page returned HTTP 500 after upgrading
- β³ π³ #127 A PHP warning above the System page
- β³ π #126 Notes stamped with the server's clock
- β³ π Storing every date in UTC
- β³ πͺ The portal was down for everyone signed in
- β³ βοΈ #120 Workflow notes could never be written
- β³ βοΈ #123 Three errors when running Database Verification
- β³ π #122 The description box was a stub in the corner
- β³ π£ Demo data deleted real accounts
- β³ π #117 Sign-in redirected to the wrong address
- β³ π¨ #108 The priority dot was invisible
- β³ β±οΈ #116 Time logged from the right-click menu
- β³ π #114 API keys refused by our own guard
- β³ ποΈ #110 Assigning a task told nobody
- β³ πͺ #107 Signed out while still working
- β³ π #103 "Share with Requester" reached nobody
- β³ π #102 Search found nothing for hyphens
- β³ πͺ #101 Source code editor opened behind
- β³ βοΈ #88 Subtasks could not be ticked off
- β³ π» #84 Asset deep link selected nothing
- β³ π« #79 A new ticket arrived with no status
- β³ π§ #79 A ticket from email did not say so
- β³ π #78 Bell opened to nothing
- β³ π¬ #77 Mail only collected from Inbox
- β³ π #74 The default password could not be changed
- β³ π¦ #70 Renaming an impact level
- β³ π€ #67 App-only mailboxes could not send
- β³ π #45 Verify only ever worked for Microsoft
- β³ π #45 IMAP reported as not authenticated
- β³ βοΈ An email template stopped escaping itself
- β³ π The portal dashboard showed the wrong time
- β³ π’ The folder said 99 and the list showed 96