Installation
Prerequisites
Section titled “Prerequisites”- macOS with Excel for Mac (the add-in requires the
CustomFunctionsRuntime1.1 requirement set) - LM Studio with its local server started and a model loaded
- Either Docker (the default path used by the
npm run docker:*scripts) or Python 3.12+ to run the server directly opensslandsecurity, both of which ship with macOS
1. Generate your own localhost certificate
Section titled “1. Generate your own localhost certificate”Office Add-ins must be served over HTTPS, and a self-signed certificate is acceptable for local development as long as the machine trusts it. Run this from the repository root:
mkdir -p certsopenssl req -x509 -newkey rsa:2048 \ -keyout certs/localhost-key.pem \ -out certs/localhost.pem \ -days 365 -nodes \ -subj "/CN=localhost" \ -addext "subjectAltName=DNS:localhost,IP:127.0.0.1"This writes an unencrypted private key (-nodes) that is only ever used by the local dev server.
Keep it out of version control — the provided .gitignore already does that. Tighten the
permissions if you like:
chmod 600 certs/localhost-key.pem2. Trust the certificate
Section titled “2. Trust the certificate”Excel will refuse to load the add-in if the certificate is not trusted. The repository ships a
helper, scripts/trust-localhost-cert.sh, exposed as an npm script:
npm run mac:trust-certThe script checks that certs/localhost.pem exists, then runs:
security add-trusted-cert -d -r trustRoot \ -k "$HOME/Library/Keychains/login.keychain-db" \ certs/localhost.pemmacOS will prompt for your password. To undo it later:
security delete-certificate -c localhost \ "$HOME/Library/Keychains/login.keychain-db"3. Start the add-in host
Section titled “3. Start the add-in host”npm run docker:upThis runs docker compose up --build -d. The image contains only scripts/ and web/;
certs/ is mounted read-only at runtime rather than copied in, so a TLS private key never
ends up inside an image layer. The certificate must exist on the host before you start the
container. It binds 0.0.0.0:3000 inside the container, published to the host as
127.0.0.1:3000 only — the proxy is unauthenticated, so it is deliberately not reachable from
your LAN. It reaches LM Studio through http://host.docker.internal:1234/v1.
npm start# equivalent to: python3 scripts/dev_server.pyRun directly, the server binds 127.0.0.1:3000 and talks to LM Studio at
http://127.0.0.1:1234/v1. No third-party Python packages are required.
Check that it is up:
curl -k https://localhost:3000/api/healthA healthy response reports the LM Studio base URL and the active model. See Configuration for every environment variable.
4. Start LM Studio’s local server
Section titled “4. Start LM Studio’s local server”In LM Studio, open the Developer tab, start the local server, and confirm a model is loaded. The
proxy calls GET /v1/models and uses the first entry it finds unless you pin LM_STUDIO_MODEL.
5. Sideload the manifest into Excel
Section titled “5. Sideload the manifest into Excel”npm run install-manifestscripts/install_manifest.sh copies manifest.xml to:
~/Library/Containers/com.microsoft.Excel/Data/Documents/wef/cell-translator-manifest.xml6. Register the functions once
Section titled “6. Register the functions once”-
Quit Excel completely and reopen it.
-
Open a workbook and go to Home → Add-ins.
-
Launch Cell Translator once. This first launch is what registers the custom functions for your Excel user profile.
-
In any cell, try:
=XLT.TRANSLATE(A1,"de")
If Excel shows #NAME?, the custom-functions runtime has not registered yet — see
Troubleshooting.
Documentation site
Section titled “Documentation site”This site lives in docs/ and is a standard Astro Starlight project:
cd docsnpm installnpm run build