Code snipet to expose the problem.

Class ZUser.NewClass1 Extends %Persistent [ Not ProcedureBlock ]
{

ClassMethod Demo()
{

    Do ..TestLock()
    ; This class is Not ProcedureBlock the record still locked

    ; If the class is ProcedureBlock the record is released.
    ; try by yourself :-)
}

ClassMethod TestLock() As %Status
{
    Set id = $Order(^ZUser.NewClass1D(""))
    If id = "" {
        Set obj = ##class(ZUser.NewClass1).%New()
        Do obj.%Save()
        Kill obj
    }

    Set id = $Order(^ZUser.NewClass1D(""))

    Set obj = ##class(ZUser.NewClass1).%OpenId(id, 4)

    ; in case of usage Not ProcedureBlock you should 
    ; kill obj or set obj="" (and all others variables with this object reference) to release the lock


    Return $$$OK


}
}

Hi,

I tested your application.  Great UI for ZPM!  

I think developers don't install this app to see existing packages in OEX.  
Because the OEX page allows to filter and see all apps with small descriptions.  
Also showing the list of installed packages, install, uninstall can be done very easily with ZPM commands.  

In my opinion, the real added value of this application is the usage with a private registry.  
Private registry users have not UI for ZPM and You developed it!  

I have a private ZPM registry and I'll use your app without hesitation If need a UI.  yes

Just an idea:

Currently, we have only templates for development.

Maybe we could create a template for docker image build purpose.
I would say that an app isn't always a single module in a namespace.
A template to configure IRIS, create namespaces, install modules, etc ... and publish to the user docker registry might be useful.

Perhaps, a better way to do this exists (maybe by using workflow, I don't know). I'm not up to date with all existing possibilities. So, If you have resources about that, I'm interested.