## Populating Sidebar Categories
3D Viewport's sidebar (a.k.a. N-panel) became the most prominent place for putting add-on properties and operators. So much so, that users who depend on lot of add-ons have very cluttered sidebar, with so many categories that none of them have fully displayed name.
You always want to put your add-on in the most discoverable place, and while sidebar seems like a best answer, it's not always the case, because for some users it might be so populated, that your category gets lost in the chaos.
First, you might want to rethink if sidebar is the <ins>correct</ins> place. Blender's UI consists of many different types of spaces, and all of them have their context. They depend on workspaces, editors, object modes, selections, etc. And because of that users have strong associations with them, and you might want to leverage that. For example:
* If your add-on deals with mesh data, maybe best place for it is Object Data category in Properties editor? Users will expect them alongside vertex groups and attributes.
* If your add-on does mesh editing operations, you might want to put operators in Vertex, Edge, and Face menus in Edit Mode, so they're in correct context.
* If your add-on deals with f-curves, wouldn't it be more discoverable in Graph Editors sidebar instead of 3D Viewports?
*Correct place for operators and properties can also mean correct context, and save you some trouble with unwanted errors*
But sometimes sidebar is indeed the best place. In that case, its best if you let users choose sidebar category, instead of hardcoding it. That way they can combine panels from multiple add-ons in the same category, according to their workflow and needs, and save space (making your add-on more discoverable in the meantime!)
### How to let users choose sidebar category?
Sidebar category should be changed from add-on preferences, so first you want to create StringProperty in your *AddonPreferences* class:
```
sidebar_category: bpy.props.StringProperty(
name = "Sidebar Category",
description = "Category for the the add-on panels in the Sidebar (N-menu)",
default = "Animate",
update = update_sidebar_category,
)
```
You want to include default, so that property has a fallback and it still has a place if users don't change it. Its best to choose simple and short name, so that it takes least amount of space. General names also mean it has higher chance of sharing category with other add-ons by default. Bonus points if you follow Blenders verb naming convention (Edit, View, Animate...)
*sidebar_category* property includes update. Now you need to create a function that will be called when that property is modified and updates the sidebar.
```
def update_sidebar_category(self, context):
try:
bpy.utils.unregister_class(VIEW3D_add_on_panel)
except:
pass
VIEW3D_add_on_panel.bl_category = self.sidebar_category
bpy.utils.register_class(VIEW3D_add_on_panel)
```
Logic is simple: in order to change *bl_category* of the *bpy.types.Panel* class, you need to register it again. So this function does three things:
1. **Unregister panel** *(bpy.utils.unregister_class(VIEW3D_add_on_panel))*
2. **Change its *bl_description* to user input in *sidebar_category* property** *(VIEW3D_add_on_panel.bl_category = self.sidebar_category)*
3. **Register the panel again with new *bl_category*** *bpy.utils.register_class(VIEW3D_add_on_panel)*
And lastly, in order to save category when Blender is restarted (at this point *sidebar_category* will reset to default every time user opens Blender) you need to call this update function when add-on is loaded.
This code snippet needs to be added in your main `__init__` registration.
```
prefs = bpy.context.preferences.addons[__name__].preferences
update_sidebar_category(prefs, bpy.context)
```
Now every time Blender is opened add-on will look at the *sidebar_category* StringProperty and put panels there. If property is empty, then panels will go to default category.
And that's it! With just couple of lines of code you can make your add-on more user-friendly and avoid it being lost in the sea of other add-ons. Same method can be aplied to any panel that is registered in editor sidebars, not just 3D viewport one.