diff --git a/app/components/chat/attachment.hbs b/app/components/chat/attachment.hbs
index d4017c6..04065ce 100644
--- a/app/components/chat/attachment.hbs
+++ b/app/components/chat/attachment.hbs
@@ -1,14 +1,13 @@
-{{! A loader while the file is being made, a download link when it is ready }}
-
- {{#if @document.url}}
-
- {{@document.name}}
-
- {{else if @late}}
-
- Dit duurt langer dan verwacht. Vernieuw de pagina om opnieuw te kijken.
-
- {{else}}
- {{@document.name}} wordt gemaakt
- {{/if}}
-
\ No newline at end of file
+{{! One row of the bijlagen overview: its name, what it holds, and how to
+ get it. The service is synchronous per turn: a bijlage already has its
+ file when the message is served. The file service serves
+ /files//download. }}
+
diff --git a/app/components/chat/attachment.js b/app/components/chat/attachment.js
new file mode 100644
index 0000000..b5c860f
--- /dev/null
+++ b/app/components/chat/attachment.js
@@ -0,0 +1,21 @@
+import Component from '@glimmer/component';
+
+// One row of the bijlagen overview: what it is, and where to get it.
+export default class ChatAttachment extends Component {
+ // The file service serves every bijlage at /files//download.
+ get href() {
+ return `/files/${this.uuid}/download`;
+ }
+
+ get uuid() {
+ return String(this.args.document.uri || '').split('/').pop();
+ }
+
+ // What the document holds, in Dutch, so the overview explains itself.
+ get what() {
+ const format = this.args.document.format || '';
+ if (format.includes('turtle')) return 'De specificatie van het rapport als Turtle-bestand';
+ if (format.includes('csv')) return 'De resultaten van het rapport als CSV-bestand';
+ return 'Bestand';
+ }
+}
diff --git a/app/components/chat/types/assistant-message.hbs b/app/components/chat/types/assistant-message.hbs
index 16031de..778e0d3 100644
--- a/app/components/chat/types/assistant-message.hbs
+++ b/app/components/chat/types/assistant-message.hbs
@@ -1,6 +1,31 @@
{{! Rendered markdown. Assistant content only; the user's own text stays
- plain. The value is sanitized (DOMPurify) and marked safe in the js class. }}
-
{{this.html}}
-{{#each @message.attachments as |document|}}
-
-{{/each}}
\ No newline at end of file
+ plain. The value is sanitized (DOMPurify) and marked safe in the js class.
+ Attachments get their own tab, "bijlagen"; the text refers the user there. }}
+{{#if this.attachments.length}}
+