interface generation [ci skip]