I publish technical articles to Zenn, to dev.to, and to my own site. Same content. Done naively, that leaves Google looking at the same article three times.
Which of the three appears in search results is then Google's decision, not mine. Left to itself, that decision usually goes the way I do not want.
"Duplicate content is penalised" is a common phrasing and not quite right. When Google finds duplicates it picks one and drops the rest from results. That is selection, not punishment.
Suppose my own site wins. It is a new domain with no authority. Zenn and dev.to will outrank it on any query. If the weakest copy is chosen as canonical, nothing shows up at all.
And if a stronger one wins while I do nothing, my own page is treated as the duplicate, and whatever value would have accrued to it goes nowhere.
You can point it at a different domain. It means: this page is a copy, please consolidate onto that one.
Point from the weak domain to the strong one — from my own site to Zenn or dev.to.
It feels like giving something away, and it is the opposite. Value split three ways consolidates into one place, which is the only version with a chance of ranking. Owning three pages that never appear is not better than owning one that does.
The catch is that the canonical target only exists after publishing. A Zenn URL is not knowable until the article is live there.
Keeping it out of frontmatter is deliberate. That frontmatter is handed verbatim to Zenn and dev.to. I did not want to add keys of my own to a structure that another platform parses and may reject.
A sitemap is a request to index a page. Asking for indexing while simultaneously declaring "the original is over there" is saying two different things.
An article not yet published anywhere else genuinely is original on my site, so it stays in the sitemap until the day it is not. The rule follows publication state automatically.
Waiting for a platform to be ready leaves a window where the article exists and is visible nowhere. Indexing takes weeks, so every day of waiting pushes the payoff back by a day.
So it goes to my own site the moment it is written, and at that point my site is the original. When the platform is ready, the canonical is repointed — which is a one-line data change, not a code change.
Renaming an article's slug produces the new page and leaves the old one in place. Nothing tells it to go.
The result is two live URLs with identical content. Duplicate content I created myself.
A generator that wipes its output directory each run never has this problem. One that writes incrementally always will.
Summary Duplication is selection, not a penalty. The problem is not choosing which copy wins Point canonical from the weak domain to the strong one. One page that ranks beats three that do not The canonical target is only known after publishing, so keep it in a separate file — frontmatter is handed to other platforms and should not carry your own keys Drop canonicalised pages from the sitemap. Say one thing, not two Publish to your own site first. Indexing takes weeks and waiting only costs you them Delete stale output when a slug changes. Incremental generators always miss this
