Publish-subscribe UI framework