Media and attachments
Each variant can carry media alongside the text. Images attached to a publishable scope are sent to LinkedIn or X when the variant publishes; non-image files stay with the post for team context.
Think of attachments in two groups:
| Attachment | What happens |
|---|---|
| Images on a LinkedIn variant | Published with that LinkedIn post. |
| Images on an X opening tweet or thread tweet | Uploaded to X and attached to that tweet. |
| Documents, audio, video, or other files | Stored with the post as internal reference material. They do not publish yet. |
| Post-level attachments through the API | Stored for context unless a variant/tweet scope is provided. |
Upload a file
- Open the variant's tab on the post detail page.
- Add images in the media strip below the editor, or use Other files for reference files when that section is shown.
- Pick a file and wait for the upload to finish before scheduling or publishing.
The file uploads straight to storage and then appears with its name and preview. Use the preview to inspect it, the external-link icon to open the stored file, or the trash button to remove it. Deleting an attachment also deletes the stored file. Every upload is recorded in the post's activity log as an attachment_added entry.
Uploads in the app are scoped to the variant or tweet you are editing. Through the API you can also attach at the post level by omitting variant_id and tweet_id. The API flow is presign -> PUT the bytes -> register the attachment; see the API reference for the .../attachments/presign/ and .../attachments/ endpoints.
What publishes
LinkedIn and X publish text plus supported images:
| Platform | Image behavior |
|---|---|
| Publishes JPEG, PNG, or GIF images attached to the LinkedIn variant. One image becomes a media post; multiple images become a multi-image post. | |
| X (Twitter) | Publishes images attached to the opening tweet or any follow-up tweet. Each tweet validates its own image set before the first tweet is posted. |
Non-image files are still useful for briefs, source files, screenshots, legal notes, exports, or creative references a teammate needs while writing and reviewing. See Publishing for exactly what each platform receives.
Platform image limits
Each platform enforces its own counts, formats, and sizes. WriteMars checks these when you register the file, and again at publish time.
| Rule | X (Twitter) | |
|---|---|---|
| Images per scope | Up to 4 per tweet, or 1 GIF on its own | Up to 20 per variant |
| Formats | JPEG, PNG, WebP, GIF | JPEG, PNG, GIF |
| Per-image size | 5 MB | 8 MB |
| GIF pixel budget | ≤ 1280×1080, ≤ 350 frames, ≤ 300M total pixels | ≤ 36,152,320 pixels (width × height × frames) |
Any file also has to fit the server's overall upload cap (15 MB by default), whether or not it publishes.
GIFs get an extra preflight: WriteMars reads the file's dimensions and frame count before it will register, because LinkedIn and X both silently drop an over-budget GIF instead of returning an error. If a GIF is too large it is rejected up front with a plain-language reason (for example, roughly how many frames would fit at that size), so you can resize it rather than watch a "published" post show no animation.
Gotchas
- Storage must be configured on the server. On a self-hosted instance without an S3 bucket, uploads fail immediately with
s3_not_configured. The hosted app athttps://writemars.comhas storage configured. - Only images publish today. Video and documents can be uploaded for context, but they are not sent to LinkedIn or X yet.
- X image rules are per tweet. A tweet can carry up to four images, or one GIF by itself. Older X connections may need to reconnect before image upload works because media publishing requires the
media.writepermission. - LinkedIn image rules are per post. WriteMars supports up to 20 images on one LinkedIn variant.
- Publish errors are written for humans. When a platform rejects media, the failure explains what happened and what to do next, rather than surfacing the raw API error.
- Attachments do not block deleting the variant. Stored files are cleaned up when the attachment row is removed.