Messages & conversation
Internal notes, attachments, mentions, replies, reactions, chat commands, translation, and editing rules inside a ticket thread.
Every ticket is a conversation thread shared between your team and the customer. This page covers what each side can do inside that thread. For who can reply in which status, see Ticket statuses.
Messages and Markdown
Messages support full Markdown (bold, italic, underline, strikethrough, lists, code blocks, and more) and are limited to 10,000 characters. URLs in messages get rich previews: Joely fetches the page's Open Graph metadata server-side and renders a preview card (videos like YouTube embed directly in the thread). A link to an MP4, WebM or MOV file shows a play tile that opens the video in a player; the video itself is only loaded once you press play. Up to 3 links per message get a preview; links inside code are never previewed.
Staff can remove a preview they don't want with the cross in its corner: the preview disappears for everyone, the customer included, while the link itself stays in the message text. Removing one requires Edit own messages on your own messages, Delete any message on any message, or Approve or reject pending AI messages on a pending AI draft. Customers cannot remove previews.
Select text in any message editor and a formatting toolbar appears above the selection (below it on touch devices): Bold, Italic, Underline, Strikethrough, Quote, and Code. Each tooltip shows the matching keyboard shortcut (Ctrl/Cmd+B, I, U, Shift+S, Shift+B and E). A button whose formatting already covers the whole selection shows as active, and clicking it removes the formatting.
- Underline is written
++text++.__text__stays bold, as in standard Markdown. A++right after a letter or a digit is never an underline, soC++andi++stay as typed. - Code wraps the selection in backticks, or removes them when the selection already is inline code. A selection spanning several lines becomes one code block.
- Inside inline code, the bold, italic, underline and strikethrough buttons are disabled: formatting is not rendered inside code.
- Staff also get Rephrase and Translate in the toolbar, see Translation and AI correction.
Internal notes
Staff can post internal notes: messages that customers never see, anywhere. They are excluded from the portal thread, portal unread counts, and customer notifications.
- Posting one requires the Send internal notes permission.
- A reply to an internal note is always internal itself, so a private thread can never leak into the public conversation.
- Only staff can be @mentioned in an internal note.
File attachments
Both staff and customers can attach files to messages:
- Up to 5 files per message, 10 MB each.
- Allowed: images (except SVG), documents (PDF, Office), plain text and config files, archives, audio/video, common code files, and GTA/FiveM modding assets (RPF archives,
.ydr/.ytd/.ymapand other RAGE resources,.metadata files,.dll/.asimod libraries). - Blocked: executables, installers, shell and server-side scripts, macro-enabled documents, and HTML pages. File contents are checked against the declared type, so renaming a blocked file does not get it through — and a file whose content cannot be identified at all is refused too, unless its extension is a text format that legitimately has no signature (
.txt,.log,.lua,.cfg,.meta…). - A project-wide toggle can disable file uploads entirely; it applies to staff and customers alike.
Images render inline in the thread with a lightbox preview. Code, config and text files open in a read-only viewer with line numbers, where you can copy the content or download the file: Lua (.lua), JavaScript and TypeScript (.js, .ts), JSON (.json), SQL (.sql), server configs (.cfg), XML and GTA data files (.xml, .meta) and YAML (.yml, .yaml) are syntax-highlighted, logs and plain text (.log, .txt) are shown as is, and Markdown files (.md) open formatted, with a switch to their highlighted source (the formatted view shows no embedded HTML or images; web and email links open in a new tab, other links do nothing); files above 512 KB, or that turn out not to be text, are offered as a download instead.
Videos (.mp4, .webm, .mov) show as a play tile and open in a video player, with a download button. The file is only downloaded when you open the player, never while scrolling the thread. A video your browser cannot decode (for example a MOV recorded in HEVC, which Chrome and Firefox do not play) is offered as a download instead. Other files, AVI videos included, are offered as downloads.
Editing and deleting
| Action | Staff | Customers |
|---|---|---|
| Edit | Own messages, with Edit own messages; sent AI replies, with Approve or reject pending AI messages | Own messages, except on Closed tickets |
| Delete | Own messages with Delete own messages, or any message with Delete any message | Own messages, except on Closed tickets |
A message shows the (edited) label only after its text was actually changed; approving an AI draft or removing a link preview never adds it. Saving an edit without changing anything does nothing. An AI reply corrected by staff keeps its AI badge, with (corrected by staff) next to it instead of "(edited)", on the dashboard and the portal alike, and at the end of the edited Discord DM, which stays signed with the assistant's name (see Correcting a sent AI reply).
The project owner can always delete any message. When a staff member deletes a message, the matching Discord DM notification the customer received is deleted too. Edits and deletions propagate in real time to everyone viewing the ticket. A pending AI draft cannot be deleted, not even by the owner: dismiss it with Reject instead (requires Approve or reject pending AI messages).
Replying to a message
Any message can be quoted as a threaded reply, showing an excerpt of the original with a scroll-to-original shortcut. You cannot reply to system messages or to pending AI drafts, and customers cannot reply to internal notes (they never see them).
Emoji reactions
Staff and customers can react to messages with emojis; reactions are visible to both sides and update in real time. Reacting twice with the same emoji removes your reaction. System messages and pending AI drafts cannot receive reactions. Your most-used emojis appear first in the picker.
@Mentions
Type @ to mention someone with autocomplete:
- Staff can mention team members with access to the ticket, the customer, and ticket participants. Two groups are available:
@team(every staff member) and@all(staff plus the customer and participants, public messages only). - Customers can mention staff and other participants, but not the
@teamgroup. - Mentioned users are notified in real time and see a badge on the ticket. See Notifications.
Chat commands
Staff can type / in the reply form to trigger commands with autocomplete:
/closecloses the ticket (requires Change ticket status)./assign @nameassigns the ticket to a team member (requires Assign tickets)./ai [instruction]generates an AI reply draft from the conversation history, optionally steered by your instruction — e.g./ai give the installation instructions(requires Use AI to generate response suggestions). The draft appears in the thread as a pending message to review, edit, and approve before it is sent, exactly like the Ask AI button, and counts toward the monthly AI response quota. The aliases/iaand/kiwork in any language. An instruction can be up to 500 characters; without one, the command behaves like the Ask AI button. While a draft is already pending on the ticket, the command is refused: use Refine on the draft instead (see Refining a draft).
Built-in commands can be enabled or disabled per project. Staff with the Manage chat command settings permission can also create custom commands: reusable reply templates (up to 2,000 characters) triggered by /name. Templates support dynamic variables filled in when the command is used: {customer_name}, {ticket_id}, {project_name}, and {staff_name}.
Each custom command has a visibility. Everyone in the project is the default and makes the command available to every member, and it requires the Create and edit commands shared with the whole project permission on top of Manage chat command settings. Only me keeps the command private to the member who created it: nobody else sees it, in the commands settings or in the / autocomplete, and only its creator can edit or delete it. Command names stay unique across the whole project, private ones included, and a custom command cannot take a name already declared by a workflow command, even one whose workflow is a draft or disabled.
Create command on the Commands page asks which kind to create: a Text reply (the custom commands above) or Run a workflow, which opens the workflow editor on a new workflow started by that command. Each option needs its own permission, Manage chat command settings or Create, update, and delete automation workflows; the one you cannot use is shown disabled with the reason.
Translation and AI correction
- Translation (Team plan and higher): translate any message into your language in one click. The translation is shown only to you and is not stored; the original message is untouched.
- Conversation translation (Team plan and higher): translate the whole thread at once from the languages button on the ticket page. Each message switches to a side-by-side view (original on the left, translation on the right) and new messages are translated automatically while the mode is on. Pick any target language from the bar above the conversation. Available on both the staff dashboard and the customer portal, and translations are never stored.
- In both translation modes, inline code and fenced code blocks are left untranslated: commands, identifiers, and snippets reach the reader exactly as written.
- Draft translation (Team plan and higher): translate your reply before sending it, from the languages icon in the reply box (the whole draft, or the selected part). The draft is translated by the AI, never by your browser's built-in translation: formatting, mentions, links and code are kept, and a classic translation service takes over if the AI is unavailable. The reply box is locked while it runs; click the spinning icon to cancel and keep your draft as it was. It does not count toward the monthly AI response quota.
- AI correction (Team plan and higher): one-click polish of your draft before sending. See AI assistant.
- On a selection: in the staff reply box, and when editing your own message, the selection toolbar offers Rephrase (the AI correction) and Translate for the highlighted passage only. Its formatting and mentions are kept, the rest of the draft is untouched, and the toast's Undo restores the whole draft. A selection over 10,000 characters cannot be sent to the AI.
Draft translation and AI correction both require the Send messages permission and access to the ticket. Rephrase and Translate stay visible on a plan without them and open the upgrade prompt; Rephrase is hidden when AI is disabled for the project.
None of these features counts toward the monthly AI response quota.
Read state
- Joely tracks how far each person has read in every ticket. Staff can see when the customer has read their messages.
- Opening a ticket scrolls to the first unread message, marked with a "New" separator line.
- Any message can be marked as unread from its context menu to bring the ticket back into your unread queue, except a pending AI draft: the customer has not received it yet, so it is not part of the conversation. For staff this requires access to the ticket (View all tickets or being assigned).
System messages
Joely posts automatic system messages for ticket events: status changes, scheduled closures and deletions, customer closure requests, and (visible to staff only) assignment changes. System messages cannot be replied to or reacted to.