Attachments & Media
Every channel supports some form of inbound and outbound media — photos, videos, audio, documents. The inbox renders them inline with channel-appropriate controls.
What renders inline
| Type | Messenger | Telegram | Viber | |||
|---|---|---|---|---|---|---|
| Image | ✓ thumbnail + lightbox | ✓ | ✓ | ✓ | ✓ | ✓ |
| Video | ✓ click-to-play | ✓ | ✓ | ✓ | ✓ | — |
| Audio (voice note) | ✓ inline player | ✓ | ✓ | — | ✓ | ✓ |
| Sticker | ✓ rendered bare | ✓ | ✓ | — | ✓ | ✓ |
| GIF | ✓ bare + autoplay | ✓ | ✓ | — | ✓ | — |
| Document (PDF) | ✓ link-out | ✓ | ✓ | — | ✓ | ✓ |
| Location | ✓ static map | — | ✓ | — | ✓ | ✓ |
| Contact card | ✓ formatted | — | ✓ | — | ✓ | — |
Inbound media is downloaded into your school's storage on receive and served via signed URLs from the conversation. We don't hot-link to Meta / WeChat URLs because those expire fast (Meta tokens are ~5 min, WeChat media is 3 days).
Sending attachments
The composer has a paperclip icon. Drag-and-drop also works.
- Image / video / document — uploaded to your school's private chat-media storage, then handed to the channel's send endpoint as a hosted-media reference.
- WhatsApp media size cap — 16 MB for image/video, 5 MB for stickers, 100 MB for documents.
- WeChat media size cap — 2 MB images, 10 MB voice, 10 MB video. WeChat needs an extra
media_idstep (upload to WeChat first); Kinderpedia handles it transparently. - Filename + caption — the upload dialog lets you add a caption that goes alongside the media bubble.
WeChat media proxying
WeChat's media URLs are scoped to the OA's access_token and refuse to serve to anyone else. For inbound WeChat media, we proxy the bytes server-side and re-serve them to the inbox via short-lived per-attachment URLs, so the OA token never reaches the browser.
Voice messages
Inbound voice notes get an inline audio player with a play/pause control and a waveform-ish progress bar. Click-and-drag the progress bar to scrub.
For outbound voice messages, you can record directly in the composer (microphone icon) — the recording is encoded and uploaded as a audio attachment on supported channels.
Forwarded / quoted messages
Inbound messages that quote another message render with a small "reply pill" above the bubble showing the quoted message's snippet. Click the pill to scroll the thread to the quoted message.
What about PDFs and Office docs?
Inbound documents render as a link-out bubble (icon + filename + size + open button). Clicking opens the file in a new tab via its signed URL. If the document is a PDF, we set Content-Disposition: inline so it previews in-browser; for other types you'll get a download prompt.
Retention
Attachments live on S3 indefinitely (no auto-purge). Deleting an outbound message via the bubble menu removes it from the thread view but keeps the underlying file on S3 — for audit/legal hold purposes. A future "compliance purge" command will do hard removal on request.