Cross-Posting Technical Writing Without Wrecking Your SEO
August 31, 2026
·
8 min read
You wrote something good and it is sitting on your own site getting forty views a week. Dev.to has the audience. Medium has the audience. Publishing to both means copying the article into two more editors, and somewhere in the back of your mind is the worry that Google will punish you for it.
The worry is worth taking seriously, but it is solvable, and the solution is one HTML tag that both platforms already support. Get it right and syndication is free reach. Get it wrong and you spend a year wondering why a competitor outranks you for your own article.
The duplicate content question, answered properly
First, the reassuring part: Google does not have a duplicate content penalty in the sense most people imagine. You do not get demoted for republishing your own work. What actually happens is more mundane and, in its way, more annoying.
When the same article exists at several URLs, a search engine has to pick one to show. That choice is called canonicalisation, and if you do not express a preference, the engine makes it for you. It tends to favour the version on the stronger domain. Dev.to and Medium are both vastly stronger domains than your personal site. So the default outcome is that your article ranks, and the traffic goes to Medium.
You are not penalised. You are simply outbid for your own writing on your own behalf.
What rel=canonical actually does
A canonical tag is a line in the head of a page saying this content is a copy, the original lives over there. It is a hint rather than a directive, but it is a strong one and search engines respect it in the overwhelming majority of cases.
The mechanics that matter in practice:
The canonical points from the copy to the original, not the other way round. The syndicated version carries the tag; your own site does not need one pointing anywhere else.
It consolidates ranking signals onto the original. Links earned by the Dev.to copy count towards your version.
The copy can still be read, shared and commented on normally. Canonicalisation affects which URL search engines index, not whether humans can see the page.
It must be an absolute URL, and the original must be publicly reachable. A canonical pointing at a page behind a login or a staging domain does nothing.
Publish on your own site first
Give the original a few hours to be crawled before the copies appear. If the syndicated version is discovered first, you are asking a search engine to reverse a decision it has already made, which is slower and less reliable than getting it right initially.
The POSSE order
The convention here is POSSE, meaning publish on your own site, syndicate elsewhere. It is old advice from the indie web crowd and it has held up, because it puts the asset you control at the centre and treats every platform as distribution.
1.
Publish the article on your own domain first, whether that is Ghost, a static site or anything else you own.
2.
Wait a few hours. Overnight is comfortable.
3.
Syndicate to Dev.to with the canonical URL field set to your original.
4.
Syndicate to Medium with the canonical set to your original.
5.
Link back to the original from inside the syndicated copies as well, in a line at the top or bottom. Human readers follow those; the canonical is for machines.
Setting the canonical on each platform
Dev.to has an explicit canonical URL field. In the editor it is part of the post's front matter and metadata, and it is also settable through the API, which is what any decent scheduling tool will use. Fill it in every time. It takes three seconds and it is the entire ballgame.
Medium supports canonical attribution as well, most reliably through its import tool, which fetches your original by URL and sets the canonical automatically. If you are posting through an API or by pasting, verify the canonical is actually set rather than assuming.
Ghost sits on the other side of this arrangement for most people. It is usually the original rather than a copy, in which case it needs no canonical at all. If you are using Ghost as a syndication target for something published elsewhere, set the canonical field in the post settings to the true original.
What to syndicate and what to hold back
Syndicate: tutorials, deep technical explanations, opinion pieces, anything evergreen that benefits from a larger audience finding it.
Syndicate selectively: series posts. Sending part three to a platform that never saw parts one and two rarely works.
Hold back: anything whose value is that it lives on your site, such as documentation, portfolio pieces, or writing that exists to make your own domain worth visiting.
Hold back: posts written for a specific community's context, which read as confusing or self-promotional out of it.
The practical workflow
The manual version of this is three editors, three sets of formatting quirks, and a canonical field you will eventually forget. That is the failure mode, because forgetting it once on a post that does well is exactly how you hand a competitor your ranking.
PostSpoke connects Dev.to with a personal API key, Medium and Ghost with tokens you generate yourself, so the article goes out from one composer rather than three tabs. Because everything is scheduled from one calendar, the delay between publishing the original and pushing the copies is something you set once rather than remember each time.
Whatever you use, the checklist is short and worth running every time:
1.
Original published on your own domain and publicly reachable.
2.
Canonical URL set on every syndicated copy, as an absolute URL.
3.
A visible link back to the original inside each copy.
4.
Code blocks checked after publishing, because every platform mangles something.
5.
Images carrying alt text, which matters for accessibility and is a signal you get for free.
Do that consistently and syndication is pure upside: the reach of platforms with real audiences, with the ranking authority still accruing to the domain you own. Skip the canonical and you are writing for Medium's SEO instead of your own.
Frequently asked questions
Does cross-posting to Dev.to and Medium hurt SEO?
Not if you set canonical URLs. There is no duplicate content penalty, but without a canonical the search engine picks which copy to index and usually favours the stronger domain, meaning Dev.to or Medium rather than your site. A canonical tag on each copy consolidates the ranking signals onto your original.
What is a canonical URL and where does it go?
It is a tag on a page declaring that the content is a copy and naming the original's address. It goes on the syndicated copies, pointing back to your version, never the other way round. It must be an absolute URL and the original must be publicly reachable.
Should I publish on my own site first?
Yes. Publish the original and give it a few hours to be crawled before the copies go out. If a syndicated version is discovered first, you are asking a search engine to reverse a decision it has already made, which is slower and less reliable.
Which developer platforms can PostSpoke publish to?
Dev.to, Medium and Ghost are all connectable today, using an API key for Dev.to and tokens you generate yourself for Medium and Ghost. Hashnode and self-hosted WordPress are on the roadmap rather than available now.
Schedule it all from one editor
PostSpoke publishes to Bluesky, Mastodon, Substack, Ghost, Medium, Dev.to and Telegram from a single compose screen. Free while we are in public beta.