The UI for a custom property is described by a `dict` object, stored in a special/hidden `_RNA_UI` property.

The internal blender addons tend not to access `_RNA_UI` directly, but use the `rna_prop_ui.rna_idprop_ui_prop_get` function to get or create the relevent "ui" object.


```python
import bpy

context = bpy.context
obj = context.object

from rna_prop_ui import rna_idprop_ui_prop_get

# create the property, set it the initial value
obj["scale_factor"] = 1.0

# get or create the UI object for the property
ui = rna_idprop_ui_prop_get(obj, "scale_factor", create=True)
ui['description'] = "Scale factor"
ui['default'] = 1.0
ui['min'] = ui['soft_min'] = 0.0
ui['max'] = ui['soft_max'] = 10.0

# test UI in text editor footer

def draw(self, context):
    ob = context.object
    self.layout.prop(ob, '["scale_factor"]')

bpy.types.TEXT_HT_footer.append(draw)
```