diff --git a/.specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md b/.specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md
index ed167ec..3c5f398 100644
--- a/.specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md
+++ b/.specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md
@@ -11847,91 +11847,414 @@ Add a gitea workflow for this project in a way that mirrors my AMZNCharTools ext
_**Agent (model default, mode Agent)**_
+Thought Process
+The user wants me to add a Gitea workflow for the Dynamic-Link-Manager project, mirroring the structure from the AMZNCharTools (AmazonCharacterTools) extension they modeled the project after. I need to:
+
+1. Look at the AmazonCharacterTools project for its Gitea workflow(s)
+2. Create similar workflow(s) in Dynamic-Link-Manager
+
+Let me search for Gitea workflow files in the AmazonCharacterTools project.
+
---
+
+
---
-
+
-Tool use: **glob_file_search**
+Tool use: **glob_file_search** • Searched codebase "undefined" • **2** results in **1** directory
-Status: **loading**
+Directory: **T:\AmazonCharacterTools** (2 files)
+| File |
+|------|
+| `../..\AmazonCharacterTools\.gitea\workflows\release.yml` |
+| `../..\AmazonCharacterTools\.gitea\docker-compose.runner.yml` |
---
-
+
-Tool use: **glob_file_search**
+Tool use: **glob_file_search** • Searched codebase "undefined" • **2** results in **1** directory
-Status: **loading**
+Directory: **T:\AmazonCharacterTools** (2 files)
+| File |
+|------|
+| `../..\AmazonCharacterTools\.gitea\workflows\release.yml` |
+| `../..\AmazonCharacterTools\.gitea\docker-compose.runner.yml` |
---
+Thought Process
+Found the Gitea workflow and docker-compose in AmazonCharacterTools. Let me read those files and also check if Dynamic-Link-Manager has any .gitea folder yet.
+
---
+
+
---
-
-
-Tool use: **read_file_v2**
-
-Status: **loading**
-
+
+Tool use: **read_file_v2** • Read file: T:\AmazonCharacterTools\.gitea\workflows\release.yml
---
-
-
-Tool use: **read_file_v2**
-
-Status: **loading**
-
+
+Tool use: **read_file_v2** • Read file: T:\AmazonCharacterTools\.gitea\docker-compose.runner.yml
---
-
+
-Tool use: **glob_file_search**
-
-Status: **loading**
+Tool use: **glob_file_search** • Searched codebase "undefined" • **0** result in **1** directory
+Directory: **T:\Dynamic-Link-Manager** (0 file)
---
-
-
-Tool use: **read_file_v2**
-
-Status: **loading**
-
+
+Tool use: **read_file_v2** • Read file: T:\Dynamic-Link-Manager\blender_manifest.toml
---
+
+Tool use: **read_file_v2** • Read file: T:\AmazonCharacterTools\blender_manifest.toml
+
+
+
+
+---
+
+Thought Process
+
+I have what I need. The AmazonCharacterTools has:
+1. `.gitea/workflows/release.yml` - A workflow that:
+ - Triggers on workflow_dispatch with input release_tag
+ - Gets version from blender_manifest.toml using Python/tomllib
+ - Creates a zip with addon dir name "amzncharactertools" and copies __init__.py, blender_manifest.toml, ops, ui, utils
+ - Creates a release via API and uploads the zip as asset
+
+2. `.gitea/docker-compose.runner.yml` - Runner config (user-specific, with tokens/paths) - I should NOT copy this verbatim; it's environment-specific. I could add a similar file but with placeholders, or skip it since the user said "workflow" and the workflow is the main thing. I'll add the workflow and optionally a docker-compose that mirrors structure but with neutral placeholders so they can duplicate and fill in.
+
+For Dynamic-Link-Manager:
+- Addon id in manifest is "dynamiclinkmanager", name "Dynamic Link Manager"
+- Structure: has ops/, ui/, and from the conversation also utils might exist. Let me check.
+- Top-level: __init__.py, blender_manifest.toml (and maybe others)
+
+I'll create:
+1. `.gitea/workflows/release.yml` - adapted for Dynamic-Link-Manager:
+ - Same structure (workflow_dispatch, get version from blender_manifest.toml)
+ - ADDON_DIR=dynamiclinkmanager (lowercase, from manifest id or typical zip name)
+ - zip_name=dynamiclinkmanager_${version}.zip or dynamic_link_manager_${version}.zip - the AMZN one uses amzncharactertools_version.zip so I'll use dynamiclinkmanager_version.zip
+ - Copy same kind of files: __init__.py, blender_manifest.toml, ops, ui, utils if present
+
+Let me check Dynamic-Link-Manager structure for dirs and top-level files.
+
+
+---
+
+
+Checking Dynamic-Link-Manager layout to match the zip structure:
+
+
+---
+
+
+
+Tool use: **glob_file_search** • Searched codebase "undefined" • **28** results in **1** directory
+
+Directory: **T:\Dynamic-Link-Manager** (28 files)
+
+| File |
+|------|
+| `../ui/preferences.py` |
+| `../ops/__init__.py` |
+| `../__init__.py` |
+| `../ops/migrator.py` |
+| `../ui/__init__.py` |
+| `../utils/__init__.py` |
+| `../blender_manifest.toml` |
+| `../.cursorindexingignore` |
+| `../ui/operators.py` |
+| `../.specstory/history/2025-08-20_22-43Z-creating-a-blender-extension-for-asset-replacement.md` |
+| `../ops\tweak_tools.py` |
+| `../ui\properties.py` |
+| `../ui/panels.py` |
+| `../ui\__pycache__\properties.cpython-311.pyc` |
+| `../.specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md` |
+| `../ui\panels.py` |
+| `../.specstory/.gitignore` |
+| `../ui\__pycache__\operators.cpython-311.pyc` |
+| `../ui\operators.py` |
+| `../ui\__pycache__\panels.cpython-311.pyc` |
+| `../ops\__pycache__\migrator.cpython-311.pyc` |
+| `../ops\migrator.py` |
+| `../.specstory\history\2026-02-19_18-53Z-blendfile-local-datablocks-analysis.md` |
+| `../.specstory\.what-is-this.md` |
+| `../.specstory\history\2026-02-18_23-39Z-character-migrator-workflow-integration.md` |
+| `../.gitignore` |
+| `../ui/properties.py` |
+| `../ops/library.py` |
+
+
+
+
+---
+
+
+Tool use: **read_file_v2** • Read file: T:\Dynamic-Link-Manager\__init__.py
+
+
+
+
+---
+
+Thought Process
+
+Dynamic-Link-Manager has:
+- __init__.py (root)
+- blender_manifest.toml
+- ops/ (with __init__.py, migrator.py, tweak_tools.py, library.py)
+- ui/ (with __init__.py, operators.py, panels.py, properties.py, preferences.py)
+- utils/ (with __init__.py)
+
+The addon is loaded by Blender with a module name - from the manifest, id = "dynamiclinkmanager". The folder name when installed is often the repo name "Dynamic-Link-Manager" but for zips it's usually a single token. AMZN uses "amzncharactertools" as the folder inside the zip. For Blender extensions/addons the folder name in the zip should match what the addon expects. Looking at the manifest, `id = "dynamiclinkmanager"` - so the zip could be structured as a folder "dynamiclinkmanager" or "Dynamic-Link-Manager". The AMZN workflow uses ADDON_DIR=amzncharactertools (manifest id). So I'll use dynamiclinkmanager.
+
+Creating the workflow and the docker-compose. For docker-compose I'll mirror the structure but use placeholder/example values so the user can duplicate and configure (or I'll use generic names like "dlm-runner" and leave tokens/paths as placeholders).
+
+
+---
+
+
+Adding `.gitea/workflows/release.yml` and `.gitea/docker-compose.runner.yml` to mirror AmazonCharacterTools.
+
+
+---
+
+
+
+Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\.gitea\workflows\release.yml
+
+
+
+
+
+---
+
+
+Tool use: **read_file_v2** • Read file: T:\AmazonCharacterTools\.gitea\docker-compose.runner.yml
+
+
+
+
+---
+
+Thought Process
+
+I'll add a docker-compose.runner.yml that mirrors the structure but is clearly for Dynamic-Link-Manager (different runner name, placeholder token). The user can reuse the same runner for multiple repos or duplicate and change the token/name. I'll use placeholder token and a distinct runner name so it doesn't conflict with the AMZN one if they want a separate runner.
+
+
+---
+
+
+
+
+
+---
+
+
+
+Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\.gitea\docker-compose.runner.yml
+
+
+
+
+
+---
+
+Thought Process
+
+Done. I've added:
+1. `.gitea/workflows/release.yml` - mirrors AMZNCharTools release workflow, adapted for Dynamic-Link-Manager (version from blender_manifest.toml, zip name dynamiclinkmanager_.zip, ADDON_DIR=dynamiclinkmanager, same ops/ui/utils copy pattern).
+2. `.gitea/docker-compose.runner.yml` - mirrors the runner compose file with container name gitea-act-runner-dlm, runner name dlm-runner, and placeholder token so they can register a runner for this repo (or reuse the same runner as AMZN if they prefer).
+
+No need to run linters on YAML. I'll summarize for the user.
+
+
+---
+
+
+Summary of what was added to mirror your AMZNCharacterTools setup:
+
+**1. `.gitea/workflows/release.yml`**
+- **Trigger:** `workflow_dispatch` with input `release_tag` (e.g. `v0.3.0`).
+- **Version:** Read from `blender_manifest.toml` via Python/tomllib; outputs `version` and `zip_name=dynamiclinkmanager_.zip`.
+- **ZIP layout:** Top-level `__init__.py` and `blender_manifest.toml`, plus `ops/`, `ui/`, and `utils/` (if present), all under a single folder `dynamiclinkmanager` (manifest `id`).
+- **Release:** Creates a draft release for the given tag and uploads the zip as an asset using `GITEA_TOKEN`.
+
+**2. `.gitea/docker-compose.runner.yml`**
+- Same layout as AMZN’s runner compose.
+- `container_name`: `gitea-act-runner-dlm`, `GITEA_RUNNER_NAME`: `dlm-runner`.
+- `GITEA_RUNNER_REGISTRATION_TOKEN` is set to ``; replace with the token from **Repository → Settings → Actions → Runners → New Runner** (or point the repo at your existing `amzn-tools-runner` and skip this file).
+
+If you already use one Gitea Actions runner for all repos, you can ignore the docker-compose file and only use the workflow; it uses `runs-on: ubuntu-latest`, which works with a standard runner.
+
+---
+
+_**User**_
+
+bump version to 0.1.0 and update the changelog to concisely summarize the last 9 commits.
+
+---
+
+_**Agent (model default, mode Agent)**_
+
+Thought Process
+
+The user wants me to:
+1. Bump version to 0.1.0 in the project (likely blender_manifest.toml)
+2. Update the changelog to concisely summarize the last 9 commits
+
+I need to:
+1. Find where version is defined (blender_manifest.toml)
+2. Find the changelog file (CHANGELOG.md or similar)
+3. Get the last 9 commits from git
+4. Update version and write changelog entries
+
+
+---
+
+
+
+
+
+---
+
+
+Tool use: **read_file_v2** • Read file: T:\Dynamic-Link-Manager\blender_manifest.toml
+
+
+
+
+---
+
+
+
+Tool use: **glob_file_search** • Searched codebase "undefined" • **0** result in **1** directory
+
+Directory: **T:\Dynamic-Link-Manager** (0 file)
+
+
+
+
+---
+
+
+Tool use: **run_terminal_command_v2** • Run command: cd /d T:\Dynamic-Link-Manager && git log -9 --oneline
+
+```bash
+cd /d T:\Dynamic-Link-Manager && git log -9 --oneline
+```
+
+```
+Set-Location: C:\Users\Nathan\AppData\Local\Temp\ps-script-24013b75-b893-4570-9bbb-ef187ab3e60b.ps1:7
+Line |
+ 7 | cd /d T:\Dynamic-Link-Manager && git log -9 --oneline
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ | A positional parameter cannot be found that accepts argument 'T:\Dynamic-Link-Manager'.
+
+```
+
+
+
+---
+
+Thought Process
+
+PowerShell doesn't use `cd /d`. I need to use Set-Location or cd without /d. Also there's no CHANGELOG file - I'll need to create one. Let me get the git log with a proper PowerShell command.
+
+
+---
+
+
+
+
+
+---
+
+
+Tool use: **run_terminal_command_v2** • Run command: Set-Location T:\Dynamic-Link-Manager; git log -9 --oneline
+
+```bash
+Set-Location T:\Dynamic-Link-Manager; git log -9 --oneline
+```
+
+```
+6d9fb0f gitea composer
+1f28932 MigNLA action slot behavior and reports
+ae38056 refactor operator labels and document operators
+55afba3 NLAMig AnimLayers feature
+a3868e1 tweak tools (untested for now)
+4dee5cb fix BBod Shapekeys liboverride and copy values
+4b6a351 truncate names
+4d5706d specify icons
+7642ff5 redefine and fix migrate basebody shapkeys
+
+```
+
+
+
+---
+
+
+Tool use: **run_terminal_command_v2** • Run command: Set-Location T:\Dynamic-Link-Manager; git log -9 --format="%s"
+
+```bash
+Set-Location T:\Dynamic-Link-Manager; git log -9 --format="%s"
+```
+
+```
+gitea composer
+MigNLA action slot behavior and reports
+refactor operator labels and document operators
+NLAMig AnimLayers feature
+tweak tools (untested for now)
+fix BBod Shapekeys liboverride and copy values
+truncate names
+specify icons
+redefine and fix migrate basebody shapkeys
+
+```
+
+
+
+---
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..0b5d6ff
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,19 @@
+# Changelog
+
+## [0.1.0] - 2026-02-19
+
+### Added
+- Gitea release workflow and runner docker-compose.
+- Tweak tools subsection: add/remove/bake constraints for arms, legs, and both; track name and post-clean options.
+- MigNLA: when no NLA, copy active action and action slot (incl. last_slot_identifier, blend/extrapolation/influence); debug logging for slot migration.
+- NLAMig: AnimLayers support (mirror `als.turn_on`), strip timing and properties; active-action-only path when no NLA tracks.
+- Operator icons (CopyAttr, MigNLA, CustProps, BoneConst, RetargRelatives, MigBBodyShapeKeys, pickers, tweak ops).
+- BaseBody shapekeys step: prefer original base body’s shape-key action slot; library override + editable; copy shape key values.
+
+### Changed
+- Operator labels refactored to canonical short names (CopyAttr, MigNLA, MigCustProps, etc.) with `bl_description` on all UI operators.
+- Migrate BaseBody shapekeys redefined: find base body in hierarchy, override mesh/key data when linked, then apply shape-key action.
+- Button labels truncated (e.g. “NLA”, “BaseBody ShapeKeys”).
+
+### Fixed
+- BaseBody shapekeys: lib override creation and value copy; correct original-base-body lookup and slot assignment.
diff --git a/blender_manifest.toml b/blender_manifest.toml
index f13cbc2..25eb737 100644
--- a/blender_manifest.toml
+++ b/blender_manifest.toml
@@ -3,7 +3,7 @@ schema_version = "1.0.0"
id = "dynamiclinkmanager"
name = "Dynamic Link Manager"
tagline = "Character migrator and linked library tools"
-version = "0.0.2"
+version = "0.1.0"
type = "add-on"
# Optional: Semantic Versioning