This guide is for developers who want to modify and extend the TermNorm Excel Add-in codebase. Whether you're customizing the UI, enhancing the Python backend, or building new features, this document will get you set up.
New to Excel Add-ins? Start here:
- Office Add-ins Overview - What are Office Add-ins and how they work
- Excel JavaScript API - Complete API reference
- Build your first Excel add-in - Official tutorial
- Sideloading Office Add-ins from network share - Network deployment (recommended for enterprise)
- Microsoft 365 Store submission guide - Publishing to AppSource
- Open Office account in Partner Center - Required for store submission
- Make solutions available in AppSource - Complete publishing process
Install these tools before starting:
- Node.js 16+ - JavaScript runtime for building frontend
- Git - Version control
- Visual Studio Code - Recommended IDE
- Office Add-ins Developer Kit (VS Code extension) - Essential for development
- Python 3.9+ - For backend server
- Microsoft Excel (Desktop or Microsoft 365)
1. Install VS Code Extensions:
Open VS Code and install these extensions:
- Office Add-ins Developer Kit (msoffice.microsoft-office-add-in-debugger)
- ESLint (for code linting)
- Prettier (optional, for code formatting)
2. Configure the Developer Kit:
The Office Add-ins Developer Kit provides:
- ✅ One-click debugging in Excel
- ✅ Manifest validation
- ✅ Built-in webpack dev server
- ✅ Automatic sideloading
git clone https://github.com/runfish5/TermNorm-excel.git
cd TermNorm-excel- Visit: https://github.com/runfish5/TermNorm-excel
- Click Code → Download ZIP
- Extract to your desired location
- Open terminal in the extracted folder
1. Install dependencies:
npm installThis installs all required packages (webpack, babel, office-addin-* tools, etc.)
2. Verify installation:
npm run validateThis checks your manifest.xml for errors.
Option A: Using VS Code Office Add-ins Developer Kit (Recommended)
- Open the project in VS Code
- Press
F5or click Run → Start Debugging - The Developer Kit will:
- Start the webpack dev server (https://localhost:3000)
- Validate the manifest
- Sideload the add-in in Excel
- Open Excel with your add-in loaded
Option B: Using Command Line
Start the dev server:
npm run dev-serverThen sideload manually:
npm run start # Sideload in Excel Desktop
npm run start:web # Sideload in Excel OnlineThe build command you use determines what the UI displays to users. Choose based on your deployment scenario:
Standard build (GitHub Pages / Development):
npm run buildShows development paths and assumes GitHub Pages deployment.
IIS Server deployment:
# Set the deployment path to match your IIS server location
set DEPLOYMENT_PATH=C:\inetpub\wwwroot\termnorm
npm run build:iis- UI displays "IIS Server" deployment type
- Shows server filesystem paths for admin access
- Includes note about drag-and-drop for regular users
Microsoft 365 deployment:
npm run build:m365- UI displays "Microsoft 365" deployment type
- Hides all filesystem paths
- Shows drag-and-drop instructions only
Custom deployment with full control:
set DEPLOYMENT_URL=http://your-server:8080/
set DEPLOYMENT_PATH=C:\inetpub\wwwroot\termnorm
set DEPLOYMENT_TYPE=iis
npm run buildAvailable environment variables:
DEPLOYMENT_URL- Base URL for manifest (default: GitHub Pages)DEPLOYMENT_TYPE- UI behavior:development,iis, orm365(default:development)DEPLOYMENT_PATH- Filesystem path shown in UI (default: build directory)
The built files will be in the dist/ folder.
Legacy deployment script (deprecated):
scripts\deployment\build-http.bat # Use npm run build:iis instead1. Navigate to backend directory:
cd backend-api2. Create virtual environment:
python -m venv .venv3. Activate virtual environment:
Windows:
.\.venv\Scripts\activateMac/Linux:
source .venv/bin/activate4. Install dependencies:
pip install -r requirements.txt5. Set environment variables:
Create a .env file in backend-api/:
GROQ_API_KEY=your_groq_api_key_here
BRAVE_SEARCH_API_KEY=your_brave_api_key_here # OptionalOr set system environment variables:
setx GROQ_API_KEY "your_groq_api_key_here"Start the backend server:
Local development:
python -m uvicorn main:app --reloadServer runs at: http://127.0.0.1:8000
Network access (for testing on other devices):
python -m uvicorn main:app --host 0.0.0.0 --port 8000 --reloadServer accessible at: http://your-ip:8000
Quick start (automated setup):
# From project root
start-server-py-LLMs.batHealth check:
curl http://127.0.0.1:8000/healthTest connection from frontend:
- Open TermNorm task pane in Excel
- Go to Settings tab
- Server URL should show green status indicator
Only fuzzy_matching and token_matching require a session (indexed terms). All other nodes work session-free:
| Node | Session | Notes |
|---|---|---|
fuzzy_matching |
Yes | Matches against indexed terms |
token_matching |
Yes | Token-level lookup against terms |
web_search |
No | Web research on query alone |
entity_profiling |
No | LLM profile from web content |
llm_ranking |
No | Ranks candidates via LLM |
llm_only |
No | Direct LLM prompt |
cache_lookup |
No | Cached results |
Pipelines without fuzzy/token nodes skip POST /sessions entirely.
1. Build production files for your deployment type:
For IIS Server:
set DEPLOYMENT_PATH=C:\inetpub\wwwroot\termnorm
npm run build:iisFor Microsoft 365:
npm run build:m365For GitHub Pages or custom hosting:
set DEPLOYMENT_URL=https://your-domain.com/path/
npm run build2. Deploy to IIS (Windows Server):
Use the PowerShell deployment commands from the Installation Guide.
3. Or deploy to any static host (GitHub Pages, Netlify, etc.):
- Upload
dist/folder contents - Update manifest URLs to match your host
Important: The build command determines what users see in the UI. Use build:iis for IIS deployments to show correct filesystem paths to administrators.
1. Set up as Windows service (production):
Install NSSM:
nssm install TermNormBackend "C:\path\to\.venv\Scripts\python.exe" "-m uvicorn main:app --host 0.0.0.0 --port 8000"
nssm set TermNormBackend AppDirectory "C:\path\to\backend-api"
nssm start TermNormBackend2. Or use Docker:
Create Dockerfile in backend-api/:
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]Build and run:
docker build -t termnorm-backend .
docker run -p 8000:8000 termnorm-backendIf you fork this project, you'll face the same repository size issue: Your git repo is small (~4MB), but developers need to download ~1GB of node_modules/ for development. However, your end users should not need to download all that.
- Git clone downloads ~4MB (source code)
npm installdownloads ~900MB (node_modules)- Total: ~1GB local directory
- End users don't need node_modules - they only need the pre-built dist/ folder!
This repository uses automated GitHub Release deployment packages that create lightweight deployment zips (~5-10MB) when you publish a release. These packages include only:
- ✅ Pre-built
dist/folder - ✅ Python
backend-api/ - ✅ Manifest files
- ✅ Configuration templates
- ❌ No source code
- ❌ No node_modules
Instead of manually configuring this, use Claude Code in VS Code to set it up for you:
- Open your forked project in VS Code
- Open Claude Code (Ctrl+L or Cmd+L)
- Ask: "Set up automated GitHub release deployment packages like the original TermNorm project. Create a workflow that builds the project and packages only dist/, backend-api/, and manifests into a deployment zip when I publish a release. No node_modules should be included."
Claude Code will:
- Create the GitHub Actions workflow file
- Set up proper packaging
- Update your README with instructions
- Explain how to create releases
Benefits:
- Your end users download 5-10MB instead of cloning + npm install (~1GB)
- Developers still have full source access
- Automated - runs every time you publish a release
- No manual zip creation needed
Note: The workflow already exists in .github/workflows/release-package.yml if you want to review it, but asking Claude Code ensures it's properly configured for your fork's specific needs.