Assets for Retyc Outlook plugin
532
Send large files securely from Outlook — end-to-end encrypted, GDPR-compliant.
Files are encrypted client-side in the task pane and replaced by a secure download link in your message body.
To
field on confirmClick the Send via Retyc button in the compose ribbon to open the task pane, then click Log in with Retyc. A code and URL appear — open the URL in your browser, enter the code, and authenticate. You can pin the task pane (📌 in the pane's header) to keep it open across drafts.
In a compose window with the task pane open:
To / Cc / Bcc fields — edit them in Outlook and the pane stays in sync.
Your own address is filtered out automatically.To field, and appends a Retyc download link to the message body.The Account tab shows your current quota (storage + transfers) and lets you switch the UI language.
package.json engines and .nvmrc)@retyc/sdk package (declared as a runtime dependency, fetched from the public npm registry)npm install
npm run build:dev # vite development build
npm run build # vite production build
npm run watch # rebuild on file changes
npm run typecheck # vue-tsc --noEmit
npm run lint # eslint src
npm run start # vite dev server (HTTPS, port 3000)
npm run dev:setup # regenerate mkcert leaf cert + manifest.dev.xml (used by DEV_VM workflow)
npm run start to serve the bundle over HTTPS at https://localhost:3000.manifest.xml into Outlook:
manifest.xml.For development against a Windows VM (recommended for testing Classic Outlook desktop on Linux hosts), see
DEV_VM.md — it covers the mkcert setup, the IP-rewritten manifest.dev.xml, and the sideload procedure.
A multi-stage Dockerfile is provided. It builds the static bundle with Node 24 and serves it through nginx 1.30
alpine-slim (~13 MB image). Images are per-environment: the manifest baked in (manifest.xml) and the API URL
(VITE_RETYC_API_URL, defaults to https://api.retyc.com) are resolved at build time. Build a separate image for each
environment.
# Prod
docker build -t retyc-outlook-plugin:prod .
# Other environments — provide your own gitignored manifest, override the API URL at build time
cp manifest.<env>.xml manifest.xml
docker build \
--build-arg VITE_RETYC_API_URL=https://api.<env>.example.com \
-t retyc-outlook-plugin:<env> .
The / redirect is hardcoded to /taskpane.html (relative). Browsers hitting the bare-domain root land on the task
pane directly — Outlook itself fetches /taskpane.html and never relies on the redirect.
CI/release workflows publish to ghcr.io/retyc/retyc-outlook-plugin (and Docker Hub retyc/retyc-outlook-plugin once
the credentials block in _docker.yml is uncommented).
src/
main.ts # bootstrap (Buffer polyfill, lucide icons, i18n, Office.onReady → mount)
App.vue # auth gate + UTabs (Transfer / Account)
components/ # LoginWall, TransferTab, AccountTab, DropZone (lazy-loaded .vue)
composables/ # useAuth, useTransfer, useDropOverlay
shared/ # constants, sdk-factory, storage, token-store, upload pipeline
i18n.ts # vue-i18n singleton + locale detection
locales/ # en.ts, fr.ts message bundles
assets/ # custom.css with the @theme block
public/ # PNG icons (XML manifest does not accept SVG)
scripts/ # dev-setup.js (regenerates mkcert leaf + manifest.dev.xml)
taskpane.html # Vite HTML entry (kept at repo root)
manifest.xml # Office Add-in XML manifest (Outlook MailApp, VersionOverrides V1_0 + V1_1)
manifest.dev.xml # generated for VM sideload, gitignored
Dockerfile # multi-stage build → nginx:1.30.0-alpine-slim, ~13 MB
The add-in declares a single runtime — the task pane — and does all its work there. Persistence is delegated to
Office.context.roamingSettings (mailbox-scoped, syncs across devices) wrapped by a small abstraction that falls back
to localStorage when the page is opened standalone in a browser.
Why no OnMessageSend interception? Office.js's event runtime is isolated from the compose runtime on Classic
Outlook desktop — getAttachmentContentAsync returns empty content for attachments unless the draft has been saved to
Exchange first. Forcing a saveAsync would push the unencrypted attachment to Exchange in cleartext, breaking the E2EE
threat model. We sidestep the whole problem by never using Outlook's attachment system: files come from a dropzone
in the task pane and go through file.arrayBuffer() → SDK encryption → upload.
Send-via-Retyc flow
User opens a compose window and pins/opens the Retyc task pane
└─ User drops files into the task pane (HTML5 drag-drop or file picker)
└─ User types recipients (textarea, comma/semicolon-separated)
└─ User optionally types a passphrase (≥ 8 chars)
└─ User clicks "Encrypt & insert Retyc link"
├─ Read each File via file.arrayBuffer() — bytes stay in the WebView2 process
├─ @retyc/sdk encrypts client-side (age / X25519 hybrid PQ)
├─ SDK uploads encrypted chunks to the Retyc API
├─ item.to.setAsync(recipients) — only if recipients were provided
└─ body.setAsync(existingHtml + retycLinkSnippet)
└─ User clicks Send in Outlook → email goes through Exchange with no attachments,
just the Retyc link in the body
MIT — © Retyc / TripleStack SAS
Content type
Image
Digest
sha256:453d06994…
Size
5.7 MB
Last updated
3 months ago
docker pull retyc/retyc-outlook-plugin:commit-b00022749078669da3b0eb89665b56bc91d3a5fc