# Changelog

## 1.0.0.103 (August 18, 2026)

- Custom functions can now access the calling cell by adding an argument with the `xw.Caller` type hint, see [Accessing the calling cell](custom-functions.md#accessing-the-calling-cell). It provides the address, row/column and sheet/book name of the cell that called the function. Requires xlwings>=0.36.17.
- Custom functions can now run a script after they return by wrapping their return value in `xw.WithScript()`. This allows a custom function to trigger side effects such as writing to other cells, see [Running a script after a custom function](custom-functions.md#running-a-script-after-a-custom-function). Requires xlwings>=0.36.17.

## 1.0.0.102 (Aug 14, 2026)

- Returning Matplotlib figure objects from custom functions is now enabled by default. This uploads the rendered image to the xlwings image cache during calculation; you can turn it off under **Settings** > **Local**, see [Plots](custom-functions.md#plots). Self-hosted deployments are unaffected as they don’t use an external image cache.

## 1.0.0.101 (Aug 12, 2026)

- Notebooks: **View in Excel (new sheet)** now names the new sheet after the variable (e.g. `df`, `df1`, etc.) instead of `view1`, `view2`, etc., see [View in Excel](notebooks.md#view-in-excel).
- Editor: right-clicking an editor tab now allows you to **Close All** or **Close Others**.

## 1.0.0.100 (Aug 11, 2026)

- To enable reproducible workbooks, all dependencies and sub-dependencies are now automatically pinned in `requirements-pinned.txt`, resolved from `requirements.txt`. This requires Pyodide 314.0.0+, see [Dependencies](dependencies.md).
- Removed `python-dotenv` as a required dependency.

## 1.0.0.98 (Aug 2, 2026)

- Custom functions can now appear under a different name in Excel than the Python function name via `@func(name="myName")`, see [Custom function name](custom-functions.md#custom-function-name).
- A custom-function namespace can now be set for an entire Python module via `__xlwings_func_namespace__`, see [Namespace](custom-functions.md#namespace).

## 1.0.0.97 (Jul 31, 2026)

- Scripts now support arguments. In App Mode, they will be rendered into a form, using appropriate form elements such as a text box, a dropdown menu, a checkbox or a date/time picker, see [Script arguments](custom-scripts.md#script-arguments).

## 1.0.0.96 (Jul 29, 2026)

- Notebooks: added support for the following plotting libraries: Bokeh, Altair, xy, and Plotnine.
- The Output pane can now optionally be shown in App Mode (under **Settings** > **Workbook** > **App Mode**).
- The Output pane now supports colors, e.g., by using Colorama or Rich.

## 1.0.0.95 (Jul 28, 2026)

This release introduces support for multiple source files:

#### NOTE
This release will trigger the trust screen (“Do you trust the Authors of this workbook?”) for any existing workbook.

- You can now create, rename, delete, open, and close source files via the new **Source files** menu (on the left of the editor tabs).
- File system layout: source files now live under `/src`, and the working directory is `/data`. Files that your code writes with a relative path (e.g., `open("output.json", "w")`) therefore persist and appear under **Files** > **Import/Export**. To read a source file from code, use `Path(__file__).parent / "config.json"`, see [Files](files.md).
- Notebooks: Notebooks now have the `.nb.py` file extension; create them with **New Notebook…** from the **Source files** menu. New workbooks ship a `sample.nb.py` instead of the legacy `notebook.py`. Legacy `notebook.py` keep working unchanged.
- pytest: The test runner now collects multiple test files following pytest’s convention: any `test_*.py` or `*_test.py` file. Create them with **New File…**. See [Testing with Pytest](tests.md). **Breaking:** the legacy `tests.py` file is no longer auto-created, and is no longer collected by the runner. A legacy `tests.py` has to be renamed into e.g. `test_main.py`. `pytest` is also no longer included in the default `requirements.txt`. Add `pytest` manually and restart to use the test runner.

Other changes:

- Scripts: you can now additionally run any script directly from its play button in the editor gutter.

## 1.0.0.93 (Jul 16, 2026)

Improved notebook experience:

- Cell status (running, success, error) is now shown to the left of the line numbers.
- Right-click a variable > **View in Excel (new sheet)** to view its data in a new sheet.
- New cell actions: **Run Above** and **Delete Cell**.
- Before running a cell, the current workbook state is now loaded automatically so that `book.sheets.active` etc. resolve correctly.
- `Shift+Enter` on the last cell now adds an empty cell at the end, in line with how it works in Jupyter notebooks.
- Notebooks now recommend the [Async API](async-api.md) for better performance with large workbooks.

For more details, see [Notebooks](notebooks.md).

## 1.0.0.91 (Jul 13, 2026)

- Fixed a regression that restricted the available Pyodide versions to only one.

## 1.0.0.89 (Jul 10, 2026)

- [Self-hosted]: New workbooks now default to Pyodide 314.0.1.

## 1.0.0.88 (Jul 1, 2026)

- Custom functions that return Matplotlib figures are now officially supported. Note that this requires xlwings>=0.36.8 in `requirements.txt`. See [Plots](custom-functions.md#plots) for the details.

## 1.0.0.0-82 (Jun 18, 2026)

- Pyodide 314.0.0 (Python 3.14.2) is now the default version for new workbooks.
- Various bug fixes for streaming functions, object handles, and Pyodide 314.0.0.

## 1.0.0.0-80 (Jun 12, 2026)

- Added support for object handles, see [Object handles](custom-functions.md#object-handles).

## 1.0.0.0-78 (Jun 9, 2026)

- Added support for Pyodide 314.0.0. It’s not the default Pyodide version yet, but you can select it under Settings > Workbook.

## 1.0.0.0-77 (Jun 6, 2026)

- [Self-hosted]: added support for Azure Artifacts.

## 1.0.0.0-76 (Jun 3, 2026)

- Support streaming functions, see [Streaming functions ("RTD functions")](custom-functions.md#streaming-functions-rtd-functions)

## 1.0.0.0-74 (May 28, 2026)

- Fix occasional hanging during startup.
- Fix scroll direction of the editor tabs.

## 1.0.0.0-69 (May 21, 2026)

- Fix Paste in the context menu (right-click) of the editor.

## 1.0.0.0-65 (May 6, 2026)

- Custom functions: if a string parameter only accepts a fixed set of values, you can declare it with `typing.Literal` so that Excel will show a dropdown of those values as the user types the function:, see [Enum parameters](custom-functions.md#enum-parameters).

## 1.0.0.0-64 (May 5, 2026)

- [Self-hosted]: Bug Fix for “convert from cloud add-in” functionality.

## 1.0.0.0-63 (May 4, 2026)

- [Self-hosted]: default to `XLWINGS_ENABLE_PYPI=true`.

## 1.0.0.0-62 (May 3, 2026)

- Removed the Python REPL (use `notebook.py` instead).

## 1.0.0.0-61 (May 2, 2026)

- Dark mode is here!

## 1.0.0.0-60 (May 1, 2026)

- [Self-hosted]: added “convert from cloud add-in” functionality.

## 1.0.0.0-58 (Apr 30, 2026)

- [Self-hosted]: show icons in the Office 365 admin center.
- Bug Fix: all files are now stored in the workbook, even if they contain the default content. This prevents e.g., silent version upgrades in `requirements.txt`.

## 1.0.0.0-57 (Apr 27, 2026)

- Added a new `test.py` file to run pytest tests, see [Testing with Pytest](tests.md).

## 1.0.0.0-52 (Apr 16, 2026)

- Introduced a menu item to Import Python in Excel code into `notebook.py`.

## 1.0.0.0-50 (Apr 13, 2026)

- Plotly plots are now supported in `notebook.py`.

## 1.0.0.0-49 (Apr 10, 2026)

- Bug Fix: Calling `await book.flush()` could result in `PropertyNotLoaded` errors.
- Show previously hidden errors in the Problems pane.
- New workbooks now default to xlwings 0.35.1.

## 1.0.0.0-46 (Apr 6, 2026)

- Introduced `notebook.py`, similar to a Jupyter notebook
- Deprecated `await Book.sync()` in favor of `await Book.flush()` to make it clearer what it does.
- Introduced a new async API, see [Async API](async-api.md).
- New workbooks now default to xlwings 0.35.0.

## 1.0.0.0-45 (Mar 27, 2026)

- Better autocomplete.
- Code issues are now shown with red squiggly lines via [Ty](https://docs.astral.sh/ty/) and listed in the Problems pane.
- Enabled Go to Definition and Rename Symbol (right-click in the editor).
- New workbooks now default to xlwings 0.34.0.

## 1.0.0.0-43 (Mar 22, 2026)

- Added support for `Range.to_png()`.
- Use Ruff instead of Black for code formatting via `Shift+Alt+F`, configurable via `pyproject.toml`.
- New method `await book.sync()`: Use this in `async` functions to process the xlwings commands instantly and to flush `print()` to the Output pane. This is required if an xlwings command produces a file that you need before the end of the `script`, e.g., if you want to use the PNG file produced by `Range.to_png()`.
- New workbooks now default to xlwings 0.33.22.

## 1.0.0.0-39 (Mar 12, 2026)

- App Mode now shows exceptions in an alert.
- Bug Fix: always show scripts in order of appearance from the top.

## 1.0.0.0-38 (Mar 11, 2026)

- Output pane: new `Clear` button and various bug fixes.

## 1.0.0.0-37 (Mar 9, 2026)

- New App mode, allowing for deployment to end-users without showing the editor with the Python code, see [App Mode](app-mode.md).
- `@script` decorators now accept a `name` argument to label the button differently from the function name: `@script(name="My Button")`.
- Wingman chat sessions aren’t automatically resumed after starting the add-in, only within the same add-in session.

## 1.0.0.0-36 (Mar 7, 2026)

- The Pyodide version can now be changed under `Settings` > `Workbook`. For now, there’s just one version, but going forward, new Pyodide versions will be added.
- The sample code can now be switched off under `Settings` > `Local` so the editor starts with a blank file and without the optional dependencies like pandas, etc.
- Changed the autostart default under `Settings` > `Workbook` to `Autostart and open task pane`.
- Improved Wingman response quality.

## 1.0.0.0-35 (Feb 23, 2026)

- Added Wingman Chat in the Output pane. Use it to write or explain your code. It supports Claude, Gemini, and OpenAI out of the box (bring your own API key) plus any OpenAI API compatible API that runs on https and supports CORS.

## 1.0.0.0-34 (Feb 21, 2026)

- Wingman: added provider support for Claude by Anthropic.
- Personal modules: automatically load scripts and custom functions across all workbooks from local files similar to how `Personal.xlsb` works with VBA, see [Personal Modules](personal-modules.md).

## 1.0.0.0-30 (Feb 13, 2026)

- Added the built-in custom function `=WINGMAN(prompt1, [prompt2], ...)`, equivalent to Microsoft’s `COPILOT`. `WINGMAN` is a bring-your-own-model solution: connect it with your OpenAI, Gemini, or other models via xlwings Lite menu > Settings > Local > Wingman.

## 1.0.0.0-29 (Feb 10, 2026)

- xlwings Lite now has a Python Console (REPL). It automatically installs the packages from `requirements.txt` but currently doesn’t support the imported files or mounted local folders.

## 1.0.0.0-28 (Feb 3, 2026)

- **Trusted workbooks**: To keep your environment variables and files secure from attacks, you must now trust a workbook when you run it for the first time if you didn’t author it yourself. You’ll need to do this for existing workbooks, even if you wrote them yourself. You’ll also need to re-trust them whenever the Office cache is cleared, which happens occasionally.
- **Autostart**: The add-in now starts automatically in the background. You can change this in the workbook settings to disable autostart or to start the add-in and show the task pane. Note that existing workbooks will only autostart after you open the add-in manually once more and then save the workbook.
- **Local Files**: Via menu > `Files`, You can now import/export files to access them under `/data`, all handled locally. On Windows Desktop, you can additionally mount a local directory to read from and write to your local disk directly.

## 1.0.0.0-27 (Jan 31, 2026)

- Bug Fix: The content of `main.py` was sometimes replaced with the default code samples or content from `requirements.txt`.

## 1.0.0.0-24 (Jan 22, 2026)

- Fixed an issue with xlwings 0.33.20.
- New workbooks now default to xlwings 0.33.20.

## 1.0.0.0-21 (Jan 18, 2026)

- When using sheet buttons, you can now select a specific cell in your script without it being overridden anymore.
- New workbooks now default to xlwings 0.33.19.

## 1.0.0.0-18 (Jul 11, 2025)

- Show a security warning with regard to using environment variables with scope “Add-in”.
- New workbooks now default to xlwings 0.33.15.

## 1.0.0.0-17 (Jun 23, 2025)

- If you are self-hosting xlwings Lite, you can now build your own Docker image to include custom packages.

## 1.0.0.0-16 (May 27, 2025)

- xlwings Lite is now available as Docker image for [self-hosting](self-hosting.md).

## 1.0.0.0-15 (May 3, 2025)

- Added support for [sheet buttons](custom-scripts.md#running-a-script-via-sheet-button).
- Added support for [scripts configuration](custom-scripts.md#script-configuration) via `include` and `exclude` arguments to prevent sending over the full workbook data to Python.
- New workbooks now default to xlwings 0.33.14.

If you want to use these new features with an existing workbook, you need to upgrade to xlwings 0.33.14 or later via `requirements.txt` tab, followed by a restart.

## 1.0.0.0-14 (Apr 25, 2025)

- Added support for [environment variables](environment-variables.md).

## 1.0.0.0-13 (Apr 18, 2025)

- `Range.font` properties can now be set (`bold`, `italic`, `color`, `size`, `name`).
- Polars DataFrame and Series are now supported via native converter.
- Images aren’t selected anymore after inserting/updating.
- Bug fix: Scripts wouldn’t run if e.g., a shape was selected.
- Bug fix: `Range.expand()` was stopping at `0` values.
- New workbooks now default to xlwings 0.33.12.

If you want to use these new features with an existing workbook, you need to upgrade to xlwings 0.33.12 or later via `requirements.txt` tab, followed by a restart.

## 1.0.0.0-12 (Apr 6, 2025)

- Upgraded to Pyodide 0.27.5, giving access to the `openai` and `osqp` packages amongst others.
- Made the dependency `pyodide-http` optional.

## 1.0.0.0-11 (Mar 25, 2025)

- Show full error tracebacks in the output pane instead of just the error message in an alert.

## 1.0.0.0-10 (Mar 23, 2025)

- Bug fix: Fixed an occasional bug with loading Pyodide.

## 1.0.0.0-9 (Mar 22, 2025)

- Bug fix: Show errors in the output pane whenever changes are saved and prevent running a previously working version of the script/function.

## 1.0.0.0-8 (Mar 21, 2025)

- First public release.
