[{"data":1,"prerenderedAt":570},["ShallowReactive",2],{"navigation":3,"\u002Fposts\u002F2026-10-31-documentation-updates-a-website-story":166,"\u002Fposts\u002F2026-10-31-documentation-updates-a-website-story-surround":568},[4],{"title":5,"path":6,"stem":7,"children":8,"page":165},"Posts","\u002Fposts","posts",[9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161],{"title":10,"path":11,"stem":12},"New API client library: Perl","\u002Fposts\u002F2012-01-03-perl-api-library","posts\u002F2012-01-03-perl-api-library",{"title":14,"path":15,"stem":16},"'Good' vs 'Strong' passwords","\u002Fposts\u002F2012-01-25-good-passwords","posts\u002F2012-01-25-good-passwords",{"title":18,"path":19,"stem":20},"Protecting your credentials from criminals","\u002Fposts\u002F2012-01-30-protecting-credentials","posts\u002F2012-01-30-protecting-credentials",{"title":22,"path":23,"stem":24},"Onetime Secret is Now Opensource","\u002Fposts\u002F2013-01-30-onetimesecret-is-now-opensource","posts\u002F2013-01-30-onetimesecret-is-now-opensource",{"title":26,"path":27,"stem":28},"Major UI update (with mobile support)","\u002Fposts\u002F2013-02-04-ui-update-mobile","posts\u002F2013-02-04-ui-update-mobile",{"title":30,"path":31,"stem":32},"Copying server data from the command-line, safely","\u002Fposts\u002F2013-02-12-copy-server-data-command-line","posts\u002F2013-02-12-copy-server-data-command-line",{"title":34,"path":35,"stem":36},"Privacy Policy Update (June 2024)","\u002Fposts\u002F2024-06-15-privacy-policy-update","posts\u002F2024-06-15-privacy-policy-update",{"title":38,"path":39,"stem":40},"Onetime Secret v0.16.0 Release - Modern UI and Enhanced Development","\u002Fposts\u002F2024-07-29-release-notes-v0.16.0","posts\u002F2024-07-29-release-notes-v0.16.0",{"title":42,"path":43,"stem":44},"Open-Source First Development Model","\u002Fposts\u002F2024-08-14-opensource-first-model","posts\u002F2024-08-14-opensource-first-model",{"title":46,"path":47,"stem":48},"Onetime Secret v0.17.0: Foundation for the Future","\u002Fposts\u002F2024-08-31-release-notes-v0.17.0","posts\u002F2024-08-31-release-notes-v0.17.0",{"title":50,"path":51,"stem":52},"So the custom font was a whoopsies","\u002Fposts\u002F2024-09-03-custom-font-a-whoopsies","posts\u002F2024-09-03-custom-font-a-whoopsies",{"title":54,"path":55,"stem":56},"UI\u002FUX Updates - September '24","\u002Fposts\u002F2024-09-04-ux-ui-updates","posts\u002F2024-09-04-ux-ui-updates",{"title":58,"path":59,"stem":60},"Data Privacy Regulations: A New Framework for UI Design","\u002Fposts\u002F2024-09-05-constraints","posts\u002F2024-09-05-constraints",{"title":62,"path":63,"stem":64},"A verifiable error in our signup flow","\u002Fposts\u002F2024-09-06-mistake-were-made-signups","posts\u002F2024-09-06-mistake-were-made-signups",{"title":66,"path":67,"stem":68},"Denial of Service (DoS) Attack: A brief summary","\u002Fposts\u002F2024-09-09-denial-of-service","posts\u002F2024-09-09-denial-of-service",{"title":70,"path":71,"stem":72},"Denial of Service (DoS) Attack: Continued Adventure","\u002Fposts\u002F2024-09-12-ddos-day-4","posts\u002F2024-09-12-ddos-day-4",{"title":74,"path":75,"stem":76},"Denial of Service (DoS) Attack: Day 5","\u002Fposts\u002F2024-09-13-ddos-day-5","posts\u002F2024-09-13-ddos-day-5",{"title":78,"path":79,"stem":80},"Onetime Secret v0.18.0: Enjoying the Vue","\u002Fposts\u002F2024-10-03-release-notes-v0.18.0","posts\u002F2024-10-03-release-notes-v0.18.0",{"title":82,"path":83,"stem":84},"Installing Onetime Secret: The Complete Guide (Part 1 of 5)","\u002Fposts\u002F2024-10-08-installation-series-1of5-standalone","posts\u002F2024-10-08-installation-series-1of5-standalone",{"title":86,"path":87,"stem":88},"Ugly By Nature: Why Our Blog Graphics Look Terrible (On Purpose)","\u002Fposts\u002F2024-10-15-ai-generated-graphics-transparency","posts\u002F2024-10-15-ai-generated-graphics-transparency",{"title":90,"path":91,"stem":92},"Expanding Horizons: Introducing US Data Locality for Onetime Secret","\u002Fposts\u002F2024-10-23-us-data-center","posts\u002F2024-10-23-us-data-center",{"title":94,"path":95,"stem":96},"Industry Practices We Deliberately Avoid","\u002Fposts\u002F2024-11-01-industry-practices-we-deliberately-avoid","posts\u002F2024-11-01-industry-practices-we-deliberately-avoid",{"title":98,"path":99,"stem":100},"Why we don't have a cookie notice","\u002Fposts\u002F2024-11-05-privacy-by-design-no-cookie-notice","posts\u002F2024-11-05-privacy-by-design-no-cookie-notice",{"title":102,"path":103,"stem":104},"Onetime Secret v0.19.0: Custom Branding & Type Safety","\u002Fposts\u002F2025-01-24-release-notes-v0.19.0","posts\u002F2025-01-24-release-notes-v0.19.0",{"title":106,"path":107,"stem":108},"Onetime Secret v0.20.0: Internationalization","\u002Fposts\u002F2025-02-24-release-notes-v0.20.0","posts\u002F2025-02-24-release-notes-v0.20.0",{"title":110,"path":111,"stem":112},"Canada Region Now Available","\u002Fposts\u002F2025-03-03-canada-region-now-available","posts\u002F2025-03-03-canada-region-now-available",{"title":114,"path":115,"stem":116},"Aotearoa New Zealand Region Now Available","\u002Fposts\u002F2025-04-03-aotearoa-new-zealand-region-available","posts\u002F2025-04-03-aotearoa-new-zealand-region-available",{"title":118,"path":119,"stem":120},"Homepage Update: We're Going Regional","\u002Fposts\u002F2025-05-05-homepage-update-going-regional","posts\u002F2025-05-05-homepage-update-going-regional",{"title":122,"path":123,"stem":124},"Domain Strategy Reengineered: Building Verification into Our Architecture","\u002Fposts\u002F2025-05-14-homepage-post-as-in-after","posts\u002F2025-05-14-homepage-post-as-in-after",{"title":126,"path":127,"stem":128},"Verifying Authentic Onetime Secret Services","\u002Fposts\u002F2025-05-15-distrust-and-double-verify","posts\u002F2025-05-15-distrust-and-double-verify",{"title":130,"path":131,"stem":132},"Claude Roasts our tests","\u002Fposts\u002F2025-05-21-claude-roasts-our-tests","posts\u002F2025-05-21-claude-roasts-our-tests",{"title":134,"path":135,"stem":136},"JSON Trouble on the Default-lines","\u002Fposts\u002F2025-06-07-json-trouble-on-the-default-lines","posts\u002F2025-06-07-json-trouble-on-the-default-lines",{"title":138,"path":139,"stem":140},"OneTimeSecret v0.22.4: Password Settings & Disabling Homepage","\u002Fposts\u002F2025-09-16-release-notes-v0.22.4","posts\u002F2025-09-16-release-notes-v0.22.4",{"title":142,"path":143,"stem":144},"The Ramshackler's Guide to i18n","\u002Fposts\u002F2025-12-12-how-we-handle-translations","posts\u002F2025-12-12-how-we-handle-translations",{"title":146,"path":147,"stem":148},"Onetime Secret v0.23: Config Migration and API Improvements","\u002Fposts\u002F2026-01-18-release-notes-v0.23","posts\u002F2026-01-18-release-notes-v0.23",{"title":150,"path":151,"stem":152},"UK Region Now Available","\u002Fposts\u002F2026-02-06-uk-region-now-available","posts\u002F2026-02-06-uk-region-now-available",{"title":154,"path":155,"stem":156},"Onetime Secret v0.24.0: A New Foundation","\u002Fposts\u002F2026-03-04-release-notes-v0.24.0","posts\u002F2026-03-04-release-notes-v0.24.0",{"title":158,"path":159,"stem":160},"Mea gulpa: a big bowl of humble broth (or, API-carumba: an upgrade story)","\u002Fposts\u002F2026-03-27-mea-gulpa-api-carumba","posts\u002F2026-03-27-mea-gulpa-api-carumba",{"title":162,"path":163,"stem":164},"Updated Docs: A Website Story","\u002Fposts\u002F2026-10-31-documentation-updates-a-website-story","posts\u002F2026-10-31-documentation-updates-a-website-story",false,{"id":167,"title":162,"authors":168,"badge":174,"body":176,"date":553,"description":243,"draft":165,"extension":554,"headline":555,"icon":555,"image":556,"layout":561,"meta":562,"navigation":563,"path":163,"readingTime":564,"seo":565,"stem":164,"textprov":566,"__hash__":567},"posts\u002Fposts\u002F2026-10-31-documentation-updates-a-website-story.md",[169],{"name":170,"to":171,"avatar":172},"Delano","https:\u002F\u002Fblog.onetimesecret.com\u002Fabout",{"src":173},"\u002Fimg\u002Fportrait-profile-pic-delano-2025-m.png",{"label":175},"Skunkworks",{"type":177,"value":178,"toc":544},"minimark",[179,186,189,230,233,238,244,253,264,268,281,307,321,324,329,331,341,379,383,388,395,410,420,424,427,476,481,485,529,531],[180,181,182],"note",{},[183,184,185],"p",{},"This post is part of our \"Skunkworks\" series, where we write about experimental projects we're working on.",[187,188],"hr",{},[190,191,197,198],"div",{"className":192},[193,194,195,196],"flex","justify-center","items-center","my-10","\n  ",[199,200,205,206,197],"a",{"href":201,"className":202},"https:\u002F\u002Fdocs.onetimesecret.com\u002F",[203,204],"text-center","inline-block","\n    ",[207,208,229],"span",{"className":209},[210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228],"font-brand","font-bold","text-3xl","sm:text-4xl","md:text-5xl","bg-clip-text","text-transparent","bg-gradient-to-r","from-brand-500","to-brandcompdim-500","animate-flowing-colors","hover:animate-bounce","transition-all","duration-300","ease-in-out","transform","hover:scale-105","rounded-xl","dark:border-brand-600","\n      docs.onetimesecret.com\n    ",[183,231,232],{},"Our documentation website has been reorganized and expanded to include the features and functionalities we have added over the past 8-10 months, and beyond. The work was accomplished with the help of AI, including the writing, so I want to talk a bit about why it's important to me to be transparent about that.",[234,235,237],"h2",{"id":236},"why-i-use-ai-to-write","Why I use AI to write",[183,239,240],{},[241,242,243],"em",{},"AI helps me keep the documentation site up to date. Highlighting the changes it makes helps me sleep at night.",[183,245,246,247,252],{},"I enjoy using AI tools when I write because I'm a slow writer and a habitually non-linear thinker. Without the help, a lot of what I have wanted to write has gone stale, stated the conclusion before the premise, and\u002For never seen the light of day. With the help, I'm able to produce (mostly) ",[207,248,251],{"class":249,"data-textprov":250},"textprov-ai","ai","decent-quality"," drafts and get into a flow state more readily. But it comes with a cost: there's that much more content to review and edit! The bottleneck just moved from writing to reviewing. So in order to actually Get Things Done™, I either need to get real specific about what \"done\" means or I need to publish sooner, before everything is fully reviewed.",[183,254,255,256,259,260,263],{},"Herein lies the ",[207,257,258],{"class":249,"data-textprov":250},"dilemma"," that has me Sweating Bullets™: passing off longform AI-generated text as human-made content is misleading. Especially if I'm ",[207,261,262],{"class":249,"data-textprov":250},"knowingly"," publishing it early. That would feel actively dishonest. So what do? What can has do?",[234,265,267],{"id":266},"main-screen-turn-on","Main screen, turn on",[183,269,270,271,276,277,280],{},"If I know it's \"going to take a while\" to review and edit all the new content on our ",[199,272,275],{"href":201,"rel":273},[274],"nofollow","documentation website",", I can at least be really loud about AI's involvement in the meantime. There are a couple ",[207,278,279],{"class":249,"data-textprov":250},"of"," established ways of doing it (and some \"less established\" ways, which I mention at the end).",[282,283,284,296],"ol",{},[285,286,287,288,291,292,295],"li",{},"Semantic watermarking ",[207,289,290],{"class":249,"data-textprov":250},"works"," by ",[207,293,294],{"class":249,"data-textprov":250},"subtly"," altering word choices in a body of text to create a hidden signature that can be detected by a trained model. Watermarking is good at identifying which model generated all or sections of a piece of text.",[285,297,298,299,302,303,306],{},"The ",[207,300,301],{"class":249,"data-textprov":250},"Coalition for"," Content Provenance and Authenticity (C2PA) is both a mouthful and a standard for embedding a verifiable ",[207,304,305],{"class":249,"data-textprov":250},"chain of custody"," in media. C2PA is good for establishing the origin and authenticity of a finished piece of art.",[183,308,309,310,313,314,317,318,320],{},"Neither ",[207,311,312],{"class":249,"data-textprov":250},"shows a reader which words AI wrote, and neither"," is meant to be used during the writing ",[207,315,316],{"class":249,"data-textprov":250},"process,"," so I came up with a quick way to show AI's involvement down to each character. It's like a local feedback system. I can see what changes an LLM agent made and keep track of those changes over time without using any special tools (even copy and paste works). At the end of the ",[207,319,316],{"class":249,"data-textprov":250}," I can highlight those markings to draw attention to the parts where AI was involved.",[322,323],"br",{},[325,326],"text-prov-toggle",{"help":327,"text":328},"(I wrote this post over and over again many times, so only proofreading edits and a few sentences are left to demonstrate.)","This sentence was generated by an LLM agent.",[322,330],{},[183,332,333,336,337,340],{},[207,334,335],{"class":249,"data-textprov":250},"For readers,"," it helps avoid the Slop or Not™ guessing ",[207,338,339],{"class":249,"data-textprov":250},"game,"," but it is not perfect.",[342,343,344,358,364],"ul",{},[285,345,346,347,350,351,354,355],{},"I can type things I remembered from an AI ",[207,348,349],{"class":249,"data-textprov":250},"earlier,"," or an AI can repeat something it was fed in a prompt or other context. But highlighting works well in the sloppiest of ",[207,352,353],{"class":249,"data-textprov":250},"cases,"," like saying, \"It's okay, it's not you. This really is awful, sloppy ",[207,356,357],{"class":249,"data-textprov":250},"crap.\"",[285,359,360,361],{},"It doesn't work on text written ",[207,362,363],{"class":249,"data-textprov":250},"previously.",[285,365,366,370,371,375,376],{},[367,368,369],"strong",{},"Crucially",": ",[372,373,374],"u",{},"it is not a trust signal",". Keeping track of which characters came from where is not historical proof. ",[207,377,378],{"class":249,"data-textprov":250},"It's a disclosure: my claim about how this was written.",[234,380,382],{"id":381},"why-it-matters","Why it matters",[183,384,385],{},[241,386,387],{},"When all writing was human writing, even the crappy stuff depended on some amount of human energy.",[183,389,390,391,394],{},"It's important for readers to know how the content sausage was made and decide for themselves how much stock to put in it. Kind of like qualitative food ",[207,392,393],{"class":249,"data-textprov":250},"labeling",". It's low in sugar. It's high in AI edits.",[183,396,397,398,401,402,405,406,409],{},"Up until 2022, it was safe to assume that longform content was produced by a real human person. We didn't give it a second thought. ",[207,399,400],{"class":249,"data-textprov":250},"Machine-made"," text was templated, on the order of a few phrases or sentences, and for the most part was given away by the repetition. Fast-forward to ",[207,403,404],{"class":249,"data-textprov":250},"today:"," past a certain level of quality, it's not so easy to tell the difference between human ",[207,407,408],{"class":249,"data-textprov":250},"and AI-produced"," text (once the obvious tells are removed).",[183,411,412,413,416,417],{},"What changed is the energy differential. The imbalance between how little time a draft can take to generate and how much attention it still asks of a reader. Even a small deficit can add up over time. As we well know from another ",[207,414,415],{"class":249,"data-textprov":250},"kind"," of public deficit. ",[207,418,419],{"class":249,"data-textprov":250},"Disclosure lets readers decide where to spend their attention.",[234,421,423],{"id":422},"some-novel-approaches","Some novel approaches",[183,425,426],{},"I mentioned at the top that there are other ways to show AI's involvement in content. Here are a few:",[342,428,429,432,435,444,462],{},[285,430,431],{},"Reference content that no AI ever would. Like a version of Almost Honest by Megadeth, live at Woodstock 1999.",[285,433,434],{},"Make multiple references to the same band without explanation.",[285,436,437,438,443],{},"Show your working copies (or ",[199,439,442],{"href":440,"rel":441},"https:\u002F\u002Fgithub.com\u002Fonetimesecret\u002Fblog.onetimesecret.com\u002Fcommits\u002Fd94c680ce312c52\u002Fcontent\u002Fposts\u002F2026-10-31-documentation-updates-a-website-story.md",[274],"git commits",", or a changelog, or a diff of the text). A maximalist might choose to include the full conversation history.",[285,445,446,449,450,453,454,457,458,461],{},[207,447,448],{"class":249,"data-textprov":250},"Use a CRDT"," document ",[207,451,452],{"class":249,"data-textprov":250},"format,"," like ",[207,455,456],{"class":249,"data-textprov":250},"Yjs"," or ",[207,459,460],{"class":249,"data-textprov":250},"Automerge",", to track each person and AI as a separate voice (kind of like how Google Docs works).",[285,463,464,469,470,475],{},[199,465,468],{"href":466,"rel":467},"https:\u002F\u002Fbyronm.com\u002F13sentences.html",[274],"Record it live"," like Paul Graham's ",[199,471,474],{"href":472,"rel":473},"https:\u002F\u002Fnews.ycombinator.com\u002Fitem?id=491196",[274],"Startups in 13 Sentences"," experiment.",[477,478],"youtube-no-cookie",{"caption":479,"video-id":480},"Almost Honest (Cryptic Writings) - Megadeth","nt9nJ3tkS4A",[234,482,484],{"id":483},"where-to-go-from-here","Where to go from here",[183,486,487,488,493,494,497,498,505,508,509,512,513,516,517,520,521,524,525,528],{},"I'm going to keep working on this approach (which I'm calling ",[199,489,492],{"href":490,"rel":491},"https:\u002F\u002Ftextprov.org\u002F",[274],"TextProv"," for now). ",[207,495,496],{"class":249,"data-textprov":250},"It's already live on the"," ",[199,499,502],{"href":500,"rel":501},"https:\u002F\u002Fdocs.onetimesecret.com\u002Fen\u002Faccount\u002Fsigning-in\u002F",[274],[207,503,504],{"class":249,"data-textprov":250},"docs site",[207,506,507],{"class":249,"data-textprov":250},", where you can turn on \"Highlight AI edits\" in the sidebar to see it working."," We'll see how it goes ",[207,510,511],{"class":249,"data-textprov":250},"there."," I'm going to try it with new blog posts as well. Writing blog posts is very different from writing product documentation",[207,514,515],{"class":249,"data-textprov":250},","," so my hunch is that the highlights will be pretty sparse here. Plus it's not really ",[241,518,519],{},"de rigueur"," to rewrite a post after the fact ",[207,522,523],{"class":249,"data-textprov":250},"(like"," I'm doing with the ",[207,526,527],{"class":249,"data-textprov":250},"documentation),"," but that might be something to focus TextProv on in the future.",[187,530],{},[532,533,535],"collapsible-content",{"summary":534},"About this post",[183,536,537,540,541],{},[367,538,539],{},"The image"," was created by GPT-6 Astra. The brief was a reader's lens revealing character-level provenance marks beneath a line of text, with a dark star field and neon glow in the blog's illustration style. ",[207,542,543],{"class":249,"data-textprov":250},"It was later changed to show autosuggested ghost text through the lens, when the TextProv display-time recommendations were updated.",{"title":545,"searchDepth":546,"depth":546,"links":547},"",2,[548,549,550,551,552],{"id":236,"depth":546,"text":237},{"id":266,"depth":546,"text":267},{"id":381,"depth":546,"text":382},{"id":422,"depth":546,"text":423},{"id":483,"depth":546,"text":484},"2026-10-31","md",null,{"src":557,"alt":558,"width":559,"height":560},"\u002Fimg\u002Fblog\u002F2026\u002F2026-1027-documentation-updates-and-textprov.svg","A reader's lens shows that the text after the cursor is autosuggested ghost text. -- GPT-6 Astra",800,400,"post",{},true,5,{"title":162,"description":243},"inline","2SVtUq5BrknlfpXxncJWvZzO42Orjei2WLHmltIMRr8",[569,555],{"title":158,"path":159,"stem":160,"children":-1},1793601210496]