41554 blogs · [ { "id": "01a0da68-34d4-7102-968a-f50d026a6ef0", "title": "Testing RaySpace against the letters we already know", "url": "https://paultendo.github.io/posts/rayspace-release-2/", "published_at": "2026-09-24T00:00:00+00:00" }, { "id": "01a0da68-34d4-7102-968a-f50d02c99a66", "title": "tothepenny: bank statements that have to add up", "url": "https://paultendo.github.io/posts/tothepenny/", "published_at": "2026-09-24T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c142b86389", "title": "250,000 confusable pairs. 102 that matter for domain names.", "url": "https://paultendo.github.io/posts/idn-relevance/", "published_at": "2026-03-02T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c142d6b9ae", "title": "RaySpace: measuring glyph similarity by firing rays through font outlines", "url": "https://paultendo.github.io/posts/rayspace-methodology/", "published_at": "2026-03-02T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c143c57151", "title": "From CT scanners to confusable characters: the prior art behind RaySpace", "url": "https://paultendo.github.io/posts/rayspace-prior-art/", "published_at": "2026-03-02T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c144115494", "title": "\"oy\" is ѹ: 571,753 multi-character confusable pairs nobody is checking for", "url": "https://paultendo.github.io/posts/multichar-confusables/", "published_at": "2026-03-01T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c144a57eb7", "title": "Your font choice is a security decision", "url": "https://paultendo.github.io/posts/font-specific-confusable-maps/", "published_at": "2026-02-28T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c144dfa5c2", "title": "248 cross-script confusable pairs that no standard covers", "url": "https://paultendo.github.io/posts/confusable-vision-cross-script/", "published_at": "2026-02-27T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c145672d62", "title": "Who does confusable detection actually protect?", "url": "https://paultendo.github.io/posts/anglocentric-confusable-detection/", "published_at": "2026-02-27T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c14628361e", "title": "148x faster: rebuilding a Unicode scanning pipeline for cross-script scale", "url": "https://paultendo.github.io/posts/confusable-vision-pipeline-148x/", "published_at": "2026-02-27T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c146441269", "title": "When shape similarity lies: size-ratio artifacts in confusable detection", "url": "https://paultendo.github.io/posts/confusable-vision-size-ratio/", "published_at": "2026-02-26T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c14678efda", "title": "The new DDoS: Unicode confusables can't fool LLMs, but they can 5x your API bill", "url": "https://paultendo.github.io/posts/confusable-vision-llm-attack-tests/", "published_at": "2026-02-26T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c1469a86dc", "title": "Your LLM reads Unicode codepoints, not glyphs. That's an attack surface.", "url": "https://paultendo.github.io/posts/confusable-llm-attack-vectors/", "published_at": "2026-02-26T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c1470784dd", "title": "28 CJK and Hangul characters look like Latin letters", "url": "https://paultendo.github.io/posts/confusable-vision-cjk-hangul-scan/", "published_at": "2026-02-26T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c147e20158", "title": "793 Unicode characters look like Latin letters but aren't (yet) in confusables.txt", "url": "https://paultendo.github.io/posts/confusable-vision-novel-discoveries/", "published_at": "2026-02-25T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c14818d890", "title": "I rendered 1,418 Unicode confusable pairs across 230 fonts. Most aren't confusable to the eye.", "url": "https://paultendo.github.io/posts/confusable-vision-visual-similarity/", "published_at": "2026-02-25T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c148bc6a29", "title": "A threat model for Unicode identifier spoofing", "url": "https://paultendo.github.io/posts/unicode-identifier-threat-model/", "published_at": "2026-02-25T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c1495de876", "title": "Unicode ships one confusable map. You need two.", "url": "https://paultendo.github.io/posts/confusable-detection-without-nfkc/", "published_at": "2026-02-22T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c149b14726", "title": "Lawyers are using AI wrong", "url": "https://paultendo.github.io/posts/legal-ai-architecture/", "published_at": "2026-02-22T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c149f4987b", "title": "I built a will drafting engine. The AI writes almost nothing.", "url": "https://paultendo.github.io/posts/will-engine-architecture/", "published_at": "2026-02-22T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c14a205bfd", "title": "Building a rights-aware ingestion pipeline for AI-generated music", "url": "https://paultendo.github.io/posts/browser-extension-ingestion-pipeline/", "published_at": "2026-02-21T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c14a58f9d4", "title": "confusables.txt and NFKC disagree on 31 characters", "url": "https://paultendo.github.io/posts/unicode-confusables-nfkc-conflict/", "published_at": "2026-02-21T00:00:00+00:00" }, { "id": "01a087be-46ff-7079-a3b1-b8c14ab28b5e", "title": "namespace-guard: solving the shared URL namespace problem", "url": "https://paultendo.github.io/posts/namespace-guard-launch/", "published_at": "2026-02-20T00:00:00+00:00" } ] posts Claim your blog
Back to paultendo.github.io
Blog · corpus.blog/blogs/paultendo.github.io/posts

paultendo.github.io

paultendo.github.io

2026