Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added Docs/screenshots/word-taskpane.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
59 changes: 59 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,65 @@ See `skill/README.md`.

---

## 6. Use it where the writing happens — the Word add-in

A task pane inside Word. Press **Read the signs** on the Home tab and it reads the open document and
answers in the sidebar: no copying into a browser, no uploading a file, no leaving the page you are
writing on.

**It is the same engine, not a smaller one.** Every rule, the character scan, the citation
cross-check and the verdict rules arrive through `SignsOfAI.UI`, the class library the web app and
the desktop app also render. Word is simply a third host.

### Why a task pane is the right place for this particular tool

A task pane is a browser. The WebAssembly engine is downloaded once and runs there, on the machine,
which means **the document is never uploaded**. It is the guarantee the web app already makes, in the
application where the document actually lives.

That is not a nicety. Every other add-in in this category posts your text to an API, because their
analysis is a server. Ours is not, so there is nothing to post it to. And the manifest asks for
**`ReadDocument`**, not `ReadWriteDocument`: Word itself enforces that this add-in can only read
your document, rather than asking you to trust a sentence on a website.

### What it looks like on a real document

![The Signs of AI Writing task pane open beside a document in Word on the web: a score of 0/100, the verdict withheld because the document is 357 words, and six no-break spaces reported underneath](Docs/screenshots/word-taskpane.png)

That is Word on the web (the address bar is in the picture) with a 357-word document open, and the
pane is worth reading twice.

**It refused to give a verdict**, and printed why: the corpus this build is calibrated on contains no
text shorter than 649 words, so below that there is nothing to compare against and the score is
*"neither evidence that a machine wrote this nor evidence that a person did."* See
[the calibration](Docs/CALIBRATION.md).

**And it still found six no-break spaces**, because the character scan is a fact about the file
rather than a judgement of its prose. It carries no threshold, so it holds at any length, and it
says nothing about who wrote anything, which the panel states in as many words.

A tool that answers everything is easy to build. This is the other kind.

### Installing it

**Word on the web** — Home → Add-ins → More Add-ins → My Add-ins → **Upload My Add-in**, and choose
[`src/SignsOfAI.Word/manifest.xml`](src/SignsOfAI.Word/manifest.xml).

**Word for Windows** has no upload button and reads a shared-folder catalogue instead; the steps are
in [`src/SignsOfAI.Word/README.md`](src/SignsOfAI.Word/README.md).

First load is about 3.4 MB — the .NET runtime, cached afterwards. It is not in the Office Store yet.

### PowerPoint is a different product, on purpose

A deck rarely reaches 649 words, so the same add-in in PowerPoint would mostly do what it did above:
withhold the verdict. Correct, and not much use. What *does* work at slide length is the part with no
threshold — the character scan and the named tells — so the honest question there is **"does this
deck carry a humanizer's fingerprints"**, not "is this AI". That is a different product and it is not
built yet.

---

## Architecture

```
Expand Down
1 change: 1 addition & 0 deletions src/SignsOfAI.UI/Components/Icon.razor
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"close" => "<path d='M6 6l12 12'/><path d='M18 6 6 18'/>",
"lock" => "<rect x='4' y='11' width='16' height='9' rx='2'/><path d='M8 11V7a4 4 0 0 1 8 0v4'/>",
"check-circle" => "<circle cx='12' cy='12' r='9'/><path d='m8.5 12.5 2.5 2.5 4.5-5'/>",
"file-text" => "<path d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8Z'/><path d='M14 3v5h5'/><path d='M9 13h6'/><path d='M9 17h4'/>",
"beaker" => "<path d='M9 3h6'/><path d='M10 3v6l-5 9a2 2 0 0 0 1.8 3h10.4a2 2 0 0 0 1.8-3l-5-9V3'/><path d='M7.5 15h9'/>",
"scale" => "<path d='M12 3v18'/><path d='M7 21h10'/><path d='M5 7h14'/><path d='M9 7 5 7 3 12a3 3 0 0 0 6 0Z'/><path d='M19 7h-4l-2 5a3 3 0 0 0 6 0Z'/>",
"globe" => "<circle cx='12' cy='12' r='9'/><path d='M3 12h18'/><path d='M12 3a15 15 0 0 1 0 18a15 15 0 0 1 0-18'/>",
Expand Down
24 changes: 24 additions & 0 deletions src/SignsOfAI.UI/Pages/Download.razor
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,30 @@ else
<p class="hint">@L.M("dl.zip.body")</p>
</section>

@* Not the desktop app, and placed after it rather than beside it: this is the other way to run the
engine on your own machine, in the application where the document already is. The privacy claim is
the same one and it is the reason this host is worth having at all, so it is stated rather than
implied. *@
<section class="card">
<h2 class="dl-h2"><Icon Name="file-text" /> @L["dl.word.title"]</h2>
<p class="hint">@L["dl.word.lede"]</p>
<p>@L.M("dl.word.why")</p>

<ul class="dl-steps">
<li>@L.M("dl.word.install.web")</li>
<li>@L.M("dl.word.install.desktop")</li>
</ul>

<p class="hint sub">
<a href="https://github.com/peopleworks/SignsofAI/blob/main/src/SignsOfAI.Word/manifest.xml"
target="_blank" rel="noopener">@L["dl.word.manifest"]</a>
·
<a href="https://github.com/peopleworks/SignsofAI/blob/main/src/SignsOfAI.Word/README.md"
target="_blank" rel="noopener">@L["dl.word.steps"]</a>
</p>
<p class="hint">@L["dl.word.size"]</p>
</section>

@code {
private bool _checkForUpdates;

Expand Down
8 changes: 8 additions & 0 deletions src/SignsOfAI.UI/wwwroot/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,14 @@
"dl.add.ollama.browser": "In a browser: refused, unless you reconfigure Ollama’s allowed origins yourself.",
"dl.same.title": "What it does not change",
"dl.same.body": "The same text gets the same number here and in the browser — it is the same engine, compiled from the same source. Nothing is uploaded to run the analysis. Four optional features can send text off the device and <strong>not one of them runs unless you turn it on</strong>; in the desktop app the perplexity measurement is local too, so three remain.",
"dl.word.title": "Inside Word, where the writing happens",
"dl.word.lede": "A task pane that reads the open document and answers in the sidebar. Same engine, same rules, same numbers — Word is simply a third place to run it.",
"dl.word.why": "A task pane <strong>is a browser</strong>, so the engine runs there, on your machine, and <strong>the document is never uploaded</strong>. Every other add-in of this kind posts your text to an API, because their analysis is a server; ours is not, so there is nothing to post it to. And it asks Word for permission to <strong>read</strong> your document, never to change it — Word enforces that, rather than asking you to trust a sentence on a website.",
"dl.word.install.web": "<strong>Word on the web:</strong> Home → Add-ins → More Add-ins → My Add-ins → Upload My Add-in, and choose the manifest.",
"dl.word.install.desktop": "<strong>Word for Windows</strong> has no upload button and reads a shared folder instead; the steps are written out in the add-in's own page.",
"dl.word.manifest": "The manifest",
"dl.word.steps": "Installing, step by step",
"dl.word.size": "First load is about 3.4 MB — the runtime, cached afterwards. Not in the Office Store yet.",
"dl.warn.title": "Windows will warn you, and it is right to",
"dl.warn.body": "The download is <strong>not code-signed</strong> — a certificate is the one thing this project has no funding for. SmartScreen therefore says <em>Windows protected your PC</em> the first time you run it, and names an unknown publisher. The warning is doing its job. Check the file instead of clicking through it:",
"dl.warn.step1": "Right-click the downloaded .zip → Properties, and tick Unblock if it is offered.",
Expand Down
8 changes: 8 additions & 0 deletions src/SignsOfAI.UI/wwwroot/i18n/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,14 @@
"dl.add.ollama.browser": "En el navegador: rechazado, salvo que reconfigures tú mismo los orígenes permitidos de Ollama.",
"dl.same.title": "Lo que no cambia",
"dl.same.body": "El mismo texto obtiene el mismo número aquí y en el navegador — es el mismo motor, compilado de la misma fuente. No se sube nada para hacer el análisis. Hay cuatro funciones opcionales que pueden enviar texto fuera del dispositivo y <strong>ninguna se activa si tú no la activas</strong>; en la app de escritorio la medición de perplejidad también es local, así que quedan tres.",
"dl.word.title": "Dentro de Word, donde se escribe",
"dl.word.lede": "Un panel que lee el documento abierto y responde en la barra lateral. El mismo motor, las mismas reglas, los mismos números — Word es sencillamente un tercer sitio donde ejecutarlo.",
"dl.word.why": "Un panel de tareas <strong>es un navegador</strong>, así que el motor corre ahí, en tu máquina, y <strong>el documento no se sube a ningún sitio</strong>. Los demás add-ins de este tipo envían tu texto a una API, porque su análisis es un servidor; el nuestro no lo es, así que no hay adónde enviarlo. Y le pide permiso a Word para <strong>leer</strong> el documento, nunca para cambiarlo — lo impone Word, en vez de pedirte que te fíes de una frase en una web.",
"dl.word.install.web": "<strong>Word en el navegador:</strong> Inicio → Complementos → Más complementos → Mis complementos → Cargar mi complemento, y elige el manifest.",
"dl.word.install.desktop": "<strong>Word para Windows</strong> no tiene botón de carga y lee una carpeta compartida; los pasos están escritos en la página del propio add-in.",
"dl.word.manifest": "El manifest",
"dl.word.steps": "Cómo instalarlo, paso a paso",
"dl.word.size": "La primera carga son unos 3,4 MB — el runtime, y después queda en caché. Todavía no está en la tienda de Office.",
"dl.warn.title": "Windows te va a avisar, y hace bien",
"dl.warn.body": "La descarga <strong>no está firmada</strong> — un certificado es justo lo que este proyecto no puede costear. Por eso SmartScreen dice <em>Windows protegió su PC</em> la primera vez y habla de un editor desconocido. El aviso está haciendo su trabajo. Comprueba el archivo en vez de saltártelo:",
"dl.warn.step1": "Clic derecho en el .zip descargado → Propiedades, y marca Desbloquear si aparece.",
Expand Down
Loading