GitHub `<img>` tags lose `alt`, replaced with auth-gated silo URLs
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 59.6k
- Forks
- 5.8k
- Avg merge
- 1d 22h
- Merged PRs (30d)
- 49
Description
Affected: Plane Cloud, official GitHub integration. See also: meta-issue on destructive overwrite (issue 01).
Symptom
Inline HTML <img> tags pointing at GitHub-hosted assets are destroyed by a GH→Plane import + Plane→GH round-trip.
Input (GH markdown):
<img width="746" height="253" alt="Screenshot of chart"
src="https://github.com/user-attachments/assets/<uuid>" />
Plane stored HTML (image mirrored into Plane's silo asset store, wrapped in an anchor pointing at a 5-minute AWS presigned URL):
<a target="_blank" href="https://private-user-images.githubusercontent.com/.../?jwt=...&X-Amz-Expires=300...">
<image-component src="<plane-asset-uuid>" width="746" height="253"></image-component>
</a>
Pushed back to GH markdown:
[](https://private-user-images.githubusercontent.com/.../?jwt=...)
Four distinct issues
<img>HTML form is destroyed. GitHub renders native HTML<img>tags inline; the round-trip converts to markdown image syntax which loses HTML attributes.altattribute dropped.widthandheightsurvive in the stored HTML butaltdoes not. This is a real accessibility regression for screen-reader users on both sides of the sync.- Silo URL requires Plane workspace auth. The
silo.plane.so/api/assets/...URL is gated behind Plane authentication. It breaks for any GitHub viewer not signed into that Plane workspace — i.e. essentially everyone reading the issue on GitHub. - AWS fallback expires after 5 minutes. The anchor's
hrefis an AWS presigned URL withX-Amz-Expires=300. Within minutes of the round-trip, even the fallback link errors.
Impact
Images embedded in issues become unviewable on GitHub within minutes of any Plane→GH push. The original GH-hosted asset URL that humans pasted is gone from the body and cannot be recovered from the rendered GitHub page.
Ask
Preserve raw <img> HTML tags that point at GitHub-hosted assets, including their width / height / alt attributes.
At minimum, do not wrap them in an anchor pointing at a short-lived AWS presigned URL.
Reproduction
- Connect a GitHub repo to a Plane workspace via the official GitHub integration. Set sync to bidirectional.
- Create a GitHub issue with body containing an
<img>referencing a GH user-attachments URL. Apply thePlanelabel. - Within seconds the Plane work item has stored HTML with the anchor-wrapped
<image-component>form shown above. - To exercise the destructive Plane→GH push, follow the trigger recipe in meta-issue 01. Wait >5 minutes after the push and reload the GH issue: the fallback URL errors.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the official GitHub integration's GH→Plane import and Plane→GH export paths, then reproduce the bidirectional sync using the HTML image example and the listed trigger recipe. Trace how GitHub-hosted image tags become Plane image components and how they are serialized back to Markdown. Done means preserving the raw image attributes and avoiding workspace-gated or short-lived fallback URLs.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- github, typescript
- Domain
- accessibility, api, backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 50/100