Subassemblies are one of the most flexible parts of Microvellum, allowing you to reuse a component — a drawer box, a door, a hardware group — across many products without rebuilding it each time.
That flexibility is derived from the subassembly being stored across several levels of data all at once, allowing one to save modifications and adjustments without disturbing the component everywhere else it is used. But understanding where changes are saved and which version is currently in use can be slightly confusing. This guide explains how subassemblies work, how Microvellum determines which one to use, and how to apply changes where they are desired without causing any undesired effects.

Every subassembly lives at one of five levels. They run from the broadest — shared by everything — to the narrowest, which affects a single row.
Level | What it covers | Use it when… |
Library | Your master version, available for all future projects. It is never used directly inside a project; a copy is pulled in instead. | You want this to become the company standard going forward. |
Project (shared) | The project's working copy. This is the default version for everything in the job. | The change should apply to the whole job. |
Project (parent-specific) | A version attached to one parent subassembly, used everywhere that parent appears in the job. | Every instance of one assembly needs its own variation. |
Product | A version used by a single product. | One cabinet needs something different. |
Row | A version used by a single row of a single product. | One line item needs a one-off change. |

When a product calls for a subassembly by name, Microvellum looks for it from the narrowest level to the broadest and uses the first one it finds:
Row
Product
Project — parent-specific
Project — shared
Library
If the search reaches the Library, Microvellum copies that Library version into your project as a new shared project version and uses the copy. From then on, the project has its own working copy. This happens automatically whenever there is no project version detected.
If nothing is found at any level, the subassembly cannot be copied and you will get an error. In practice that almost always means the name is misspelled or the item has not been added to the library you are using.
Capitalization is ignored. DRAWER BOX and Drawer Box are the same subassembly.
Spaces and underscores are interchangeable. Drawer Box and Drawer_Box are the same subassembly.
When you save over an existing subassembly, the stored spelling updates to match what you just saved, so the name matches and updates to your most recent version.
Multiple subassemblies of the same name can exist within one project, but within a single level, a name can only belong to one subassembly.
Editing a subassembly changes only the version you were working on. Nothing moves to another level on its own- moving a change up or down in level is always a deliberate save.
There are three directions you can save, and each behaves differently.
Direction | What it is called | What happens |
Saving up (narrower to broader) | Promotion | The version you edited moves up to a broader level. It no longer exists at the level you started from, so the broader version is the one that now applies. |
Saving down (broader to narrower) | Override | A copy is created at a narrower level. The version you started from stays exactly where it is and continues to serve everything else. |
Saving at the same level | Update | The version you are working on is updated in place. Nothing else moves or changes. |
Saving up covers row to product, row to project, and product to project. Saving down covers project to product, project to row, and product to row. Saving to the Library is a separate action and is covered in section 7.
Promoting a change does not clean up other, more specific versions elsewhere in the job. Those remain in place, because they are still more specific than the version you’ve just promoted. This includes subassemblies already placed into products, for instance.

Saving down leaves the original untouched, remaining that way to ensure it can be reverted based on it for every other product and row. If you later want the narrower version to serve the whole job, promote it.
A nested subassembly is one used inside another subassembly rather than directly in a product. Nesting goes one level deep: product, then subassembly, then nested subassembly.
At project level, a nested subassembly takes one of two forms:
Shared — used everywhere in the job, like any other shared project subassembly.
Parent-specific — attached to one parent subassembly and used everywhere that parent appears, overriding the shared version.
A nested subassembly can be saved at project, product, or row level, regardless of the level its parent is on.
When you... | The nested subassemblies... |
Save the parent up (promote it) | Move with it. They stay linked and are not duplicated. |
Save the parent down (override it) | Are copied under the new version, so the new parent gets its own set. |
Overwrite an existing parent | Are replaced entirely by the incoming set — the two are never mixed. |
Delete or revert the parent | Are deleted with it. |
Revert a nested subassembly on its own | Behave independently — you can roll one back without touching the parent. |

Reverting deletes the version you are currently using so that the next broadest version takes over. It does not copy or move anything down, it simply removes the override you no longer want.
Because of that, you can only revert when something broader exists to fall back on.
When you revert a... | You go back to... |
Row version | The product version, or the next available level above it if there is no product version. |
Product version | The parent-specific project version if one applies, otherwise the shared project version. |
Parent-specific project version | The shared project version. If there isn't one, a fresh copy is pulled from the Library. |
Shared project version | A fresh copy pulled from the Library. |
Library version | Not applicable — Library versions cannot be reverted. |

Saving to the Library updates the master version used by future projects — and by current projects if they revert back to it. It does not change the working copy in the project you are in.
Situation | What happens |
A subassembly with this name already exists in the library | It is overwritten, and its stored name is updated to the spelling you just used. |
You type a name that is not in use | A new, independent Library subassembly is created under that name. |
You type a name that is already in use elsewhere | The save is rejected and the conflict is reported, telling you whether the name was found in the project or in the library. Nothing is overwritten and no duplicate is created. |
No matching subassembly exists | A new Library subassembly is created. |
A Library subassembly is identified by its name together with the library it belongs to, so the same name can exist in a different library without conflict. Project-specific details are cleared when the subassembly is saved to the Library — what is stored is the component itself, not where it happened to be used.
Save as New creates an independent copy under a new name. The original is never consumed or altered, and the copy follows all the same rules from then on.
The name you choose must be genuinely unused — no other subassembly drawn from the same library, or living in the same project, may already be using it. If the name is taken, the save is rejected and Microvellum reports where the conflict was found.

A name that is refused becomes available again if the subassembly currently using that name is later deleted.
Mode | What you get |
Assign to current row | The new subassembly is created at row level and the row you are working in is updated to point at the new name. |
Do not assign to current row | A new shared project-level subassembly is created and the row keeps pointing at the original name. |
Repointing is never automatic outside of the first mode. If a save fails partway through, the previous name is restored so the operation leaves your work untouched.
Common tasks and the level each one belongs at.
You want to... | Do this | Result |
Change one line item only | Edit and save at row level | An override that affects that row alone. |
Change one cabinet | Save at product level | An override for that product; other products are unaffected. |
Change every instance of one assembly in the job | Save as a parent-specific project version | Applies wherever that parent assembly is used. |
Apply a change to the whole job | Save up to project level | Becomes the default; existing narrower overrides still remain in their own respective scope. |
Make it the standard for future jobs | Save to the Library | Future projects start from the new version. Current projects are unaffected. |
Undo an override | Revert | The override is deleted and the next broadest version takes over. |
Create a variation without touching the original | Save as New with an unused name | An independent subassembly; the original stays as it was. |