I think we can get there by making layer processing functions more declarative in a data structure. For example, a mapping like: ```typescript PROCESSING_TOOLBOX = { 'buffer': { title: '...' description: '...', predicate: isVectorLayer, gdalCommandTemplate: [ ... ], }, 'extractCentroids': { title: 'Extract centroids', description: 'Calculate centroid points for each feature in the layer', predicate: isPolygonLayer, gdalCommandTemplate: [ ... ], }, // ... } ``` A predicate function could be any function that accepts a layer and returns a boolean. See post by @arjxn-py in https://github.com/geojupyter/jupytergis/pull/744#pullrequestreview-2909570295