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 (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.

