The preview plugin ends the download-to-look cycle: clicking an attachment's filename opens it in a popup viewer right on the page, wherever attachments appear: issues, wiki pages, documents, the files module, forums, and news. A small download icon next to each previewable attachment keeps one-click download. File types that can't be previewed keep their normal click-to-download behavior.
What previews
| Type | Behavior |
|---|---|
| Images (jpg, jpeg, png, gif, webp) | Shown in a lightbox, sized to the viewport |
| Rendered in the browser's built-in PDF viewer inside the popup. A download fallback appears if the browser can't render PDFs | |
| Text (txt) | Shown in a tall panel, always safely escaped |
| Extended text formats (md, csv, log, json, xml, yml | Markdown renders formatted. CSV shows as a table, up to the first 500 rows. The rest show as plain text. Controlled by a settings toggle, on by default |
Office formats (docx/xlsx/pptx) don't preview yet. They keep their standard download behavior.
Gallery navigation
When a page section has several previewable attachments, the popup gains ‹ › arrows, ←/→ keyboard navigation, and a counter ("2 of 5") cycling through them. images, PDFs, and text alike. Esc, the ×, or clicking the backdrop closes the popup.
Settings (Administration → Plugins → Preview → Configure)
| Setting | What it does | Default |
|---|---|---|
| Extended text formats | Adds md/csv/log/json/xml/yml to the previewable set | On |
| Text size cap | Larger text files show the first portion with a "truncated, download for full file" notice | 1 MB |
There are no per-project options and no new permissions. The plugin follows your existing access rules.
Access control (why there's nothing to configure)
Preview enforces exactly the same authorization as downloading: if a user can download an attachment, they can preview it. If they can't, preview returns the same not-found/forbidden result as core Redmine. No new access paths are introduced, which is why this plugin needs no permission setup.

