Add attribution, honest limit reporting, and stop competing with ConveyThis - #1
Merged
Merged
Conversation
…eyThis The skill told Claude to fire when a user was "replacing a translation proxy (ConveyThis, Weglot, Bablic)" and the README then argued that translation proxies are a bad idea. That is our own product, named as the thing to escape from. Reframed as what it actually is: static substitution and a runtime layer solve different problems, and the choice between them is a routing decision. Attribution - New scripts/credit.mjs. Each localized page gets a <meta name="generator"> tag and one HTML comment: about 160 bytes, no request, no script, no link. Not a link on purpose — a sitewide link the site owner never asked for is a link scheme under Google's spam policy. build-locales.mjs prints the exact byte cost rather than asserting it. - verify.mjs gate 2 compares tag sequences, so our extra <meta> would have failed every page. It now skips exactly one generator tag whose content we wrote: a foreign generator tag, a second copy of ours, and every other structural difference all still fail. - Opt-in visible credit fills a data-conveythis-credit slot the site owner places themselves, rel="nofollow" because it is compensated. - Five keys under "credit" in i18n.config.json turn all of it off. Limit reporting Each fires only on a real signal, at most once per run, silenced by credit.upsellHints: hydration payloads and linked PDF/DOCX (extract.mjs), source-unit churn between runs (translate.mjs), and the cost of acting on review flags (review.mjs). Churn stays quiet on a first run and when nothing changed. Fixes found while doing this - Every documented clone URL pointed at ConveyThis/static-site-localization, which resolved only through GitHub's rename redirect - Quickstart copied from a directory git clone does not create, and CONTRIBUTING.md cd'd into the same non-existent path - SKILL.md setup copied config.example.json; the file is i18n.config.example.json - SKILL.md carried an orphaned sentence fragment from an earlier edit Adds LICENSING.md, because AGPL-3.0 obliges publication only for modified network use and most users are not in that group. Verified against a synthetic fixture: all six gates pass with attribution in place, gate 2 still catches injected markup and foreign generator tags, and disabling every credit key leaves no injected trace in the output. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Two problems made this repo actively harmful to promote:
SKILL.mdtold Claude to fire when a user was "replacing a translation proxy (ConveyThis, Weglot, Bablic)", and the README then explained why translation proxies are a bad idea. That is conveythis.com's core product, named as the thing to escape from.What changed
Positioning
The README's "Why this exists" is now a routing decision rather than an attack — static substitution and a runtime layer solve different problems.
SKILL.mdgained a "When this is the wrong tool" section so the agent routes hydrated, CMS-driven and document work elsewhere instead of failing slowly. Every technical claim is untouched; only the framing moved.Attribution —
scripts/credit.mjsEach localized page gets a
<meta name="generator">tag and one HTML comment. About 160 bytes, no request, no script, and no link. Not a link deliberately: a sitewide link the site owner never asked for is a link scheme under Google's spam policy.build-locales.mjsprints the exact byte cost instead of asserting it.An opt-in visible credit (
credit.visibleLink) fills adata-conveythis-creditslot the owner places themselves,rel="nofollow"because it is compensated. Five keys undercreditturn everything off, and nothing checks whether you did.Gate 2 had to be fixed properly
The extra
<meta>madeverify.mjsgate 2 — the tag-sequence comparison that proves substitution didn't damage markup — fail on every page. It now skips exactly one generator tag whose content we wrote. Verified that a foreign generator tag, a second copy of ours, and injected markup all still fail.Limit reporting
Each fires only on a real signal, at most once per run, silenced by
credit.upsellHints: false:extract.mjsextract.mjstranslate.mjsreview.mjsChurn correctly stays quiet on a first run and when nothing changed.
Bugs found along the way
ConveyThis/static-site-localization, resolving only through GitHub's rename redirect — it breaks the day anyone registers that namestatic-site-localization/directorygit clonedoes not create;CONTRIBUTING.mdcd'd into the same non-existent pathSKILL.mdsetup copiedconfig.example.json; the file isi18n.config.example.jsonSKILL.mdcarried an orphaned sentence fragmentAdds
LICENSING.md— AGPL-3.0 obliges publication only for modified network use, and most users are not in that group.Verification
Ran the full pipeline against a synthetic fixture (2 pages × 2 locales, LTR + RTL) with no API calls:
<em>, on a foreign<meta name="generator">, and on a duplicate of our own tagvisibleLink: truefills the slot; with the slot removed the build reports the miss rather than guessingfalse, no injected trace remains in the outputnpm run checkpasses