# Tesseract Core v1.12.0 released

**URL:** <https://si-tesseract.discourse.group/t/tesseract-core-v1-12-0-released/156>\
**Category:** Release Notes\
**Created:** [August 28, 2026, 2:41pm UTC](https://si-tesseract.discourse.group/t/tesseract-core-v1-12-0-released/156 "2026-08-28T14:41:27Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![dionhaefner](https://yyz1.discourse-cdn.com/flex009/user_avatar/si-tesseract.discourse.group/dionhaefner/32/13_2.png) [@dionhaefner](https://si-tesseract.discourse.group/u/dionhaefner)\
**Post date:** [August 28, 2026, 2:41pm UTC](https://si-tesseract.discourse.group/t/tesseract-core-v1-12-0-released/156/1 "2026-08-28T14:41:28Z")

</div>

# Release v1.12.0

## Action required

### `python-pip` provider renamed to `uv-pip`, `python_version` moved under the provider

The build has always run under `uv`, so the `python-pip` requirements provider was renamed to `uv-pip`, and `python_version` moved from `build_config` into the provider’s `requirements` block (#680):

```yaml
build_config:
requirements:
provider: uv-pip # was: python-pip
python_version: "3.12" # was: build_config.python_version

```

The old `python-pip` name and top-level `build_config.python_version` still work but now emit deprecation warnings and **will be removed in 1.13.0**. Update your `tesseract_config.yaml` files now.

## Highlights

### Build against private package indices, git repos, and conda channels

You can now build Tesseracts that depend on private sources without leaking credentials into the image or build cache (#680). Declare which host needs authentication in `tesseract_config.yaml`, then pass the token out-of-band at build time via a BuildKit secret:

```yaml
build_config:
host_credentials:
- host: pkgs.dev.azure.com
secret: azure_token # name of the build secret carrying the token
username: __token__ # optional, this is the default

```

```bash
tesseract build . --secret id=azure_token,env=AZURE_TOKEN
# or: --secret id=azure_token,src=./token.txt

```

A single `host_credentials` entry authenticates everything fetched from that host — `--extra-index-url` indices, PEP 508 direct-reference wheels, `git+https` dependencies, and conda channels alike. Tokens are assembled into netrc/git-credential entries on a tmpfs inside the build stage and never land in the config, an image layer, or the build cache. The same PR also adds `build_config.build_env` for non-secret, build-stage-only environment variables (e.g. `UV_INDEX_STRATEGY`) that are not carried into the final image.

### Faster same-machine array transfer

Two new opt-in output formats cut per-call overhead when the client and a served Tesseract run on the same machine — the common case for solver-in-the-loop and differentiable-physics workloads where `json+base64` copies dominate the call.

**Shared memory (Linux, #664).** With `json+binref` on a `/dev/shm` tmpfs, only lightweight file references travel over HTTP while array data stays in shared memory. An experimental warm-buffer pool pushes latency further. In benchmarks, a 76 MB float64 round-trip dropped from ~1,130 ms (base64) to ~206 ms (shmem binref) to ~87 ms (with the pool):

```python
import tempfile
from pathlib import Path
from tesseract_core import Tesseract

shm = Path("/dev/shm")
with Tesseract.from_image(
"my-tesseract",
input_path=Path(tempfile.mkdtemp(dir=shm)),
output_path=Path(tempfile.mkdtemp(dir=shm)),
output_format="json+binref",
experimental_binref_pool=True, # opt in to the warm-buffer fast path
) as t:
result = t.apply({"x": x})

```

**GPU-direct via CUDA IPC (experimental, #588).** For arrays exchanged between co-located GPU processes, the new `json+cuda_ipc` format passes GPU arrays by reference: only a 64-byte `cudaIpcMemHandle_t` travels over HTTP while the data never leaves the device. It works with any producer implementing ` __cuda_array_interface__ ` (CuPy, PyTorch, JAX, Numba, …) and is gated behind an experimental flag:

```python
with Tesseract.from_image(
"my-gpu-tesseract",
gpus=["all"],
output_format="json+cuda_ipc",
runtime_config={"enable_experimental_cuda_ipc": True},
) as t:
result = t.apply({"a": a, "b": b, "s": 3.0})
out = result["result"] # exposes __cuda_array_interface__ and __dlpack__
out_host = np.asarray(out) # copy to host works as expected

```

### Debug `tesseract run`, not just `serve`

The `--debug` flag now works on one-shot `tesseract run ...` commands, not only `serve` (#631). The runtime waits for a debugger to attach before executing, so even import-time code in `tesseract_api.py` becomes observable. The debugpy host/port are now configurable via `RuntimeConfig`, environment variables, or CLI flags for non-containerised Tesseracts (#663).

## Other changes

- A JSON schema for `tesseract_config.yaml` is now generated and hosted alongside the docs, ready for SchemaStore registration so editors can validate config files with real-time feedback (#683).
- The docs were reorganised around [Diátaxis](https://diataxis.fr/) and `.html` suffixes stripped from page URLs; redirects keep existing links working (#655). New Bayesian inference (NumPyro) and multiphysics demos were added (#628, #627).
- Cross-arch builds with a pinned `python_version` (e.g. `linux/amd64` on arm64) no longer fail during venv setup, and the uv image is pinned to a released version for reproducibility (#686).
- `--config-override` values are now passed through as strings, so e.g. `python_version=3.13` is no longer mangled into a float (#679).
- Auto-created output temp directories are now cleaned up on garbage collection instead of accumulating under `/tmp` (#685).
- `check-gradients` no longer aborts on Tesseracts with absent optional container inputs (#689), and two correctness bugs in the experimental VJP cache were fixed (#667).

## What’s Changed

### Features

- Add debug mode to one-shot commands (#631)
- Make the debugpy address configurable (#663)
- _(sdk)_ Add deprecation tombstone registry (#681)
- Add `json+cuda_ipc` array encoding for GPU-direct tensor transfer (#588)
- Add shared memory tooling, docs, and example for fast same-machine IPC on Linux (#664)
- Add yaml schema for tesseract\_config.yaml, ready for integration with SchemaStore (#683)
- Secret handling for private dependencies + more configurability of the build process (#680)

### Bug Fixes

- Get rid of hardcoded ports in run\_tesseract’s debug logic (#657)
- Run the console scripts under test, not whichever are on PATH (#662)
- _(runtime)_ Compare VJP cache keys, and don’t trace non-JAX inputs (#667)
- _(sdk)_ Pin uv image to target platform for cross-arch builds (#686)
- _(runtime)_ Skip absent optional containers when expanding paths (#689)
- Config parsing with string fallbacks (#679)
- _(sdk)_ Purge auto-created output tempdirs on garbage collection (#685)

### Documentation

- Refactor according to Diátaxis, eliminate .html suffixes (#655)
- Add Bayesian inference via NumPyro demo (#628)
- Add hackathon banner (#653)
- Set runtime license (#659)
- Fix dead links and broken images throughout docs (#661)
- Blog post on cookiecutter-tesseract announcement (#665)
- Add multiphysics demo (#627)

### Performance

- _(runtime)_ Sweep the VJP once per path pair in check-gradients (#688)

### Testing

- _(runtime)_ Cover the gradient fallbacks with more than one key (#701)

**Full diff** : [Comparing v1.11.0...v1.12.0 · pasteurlabs/tesseract-core · GitHub](https://github.com/pasteurlabs/tesseract-core/compare/v1.11.0...v1.12.0)
