
Grab your gear: The official Sanity swag store
Read Grab your gear: The official Sanity swag storeGood news! While there's no built-in method to hide the "Create new" button in filtered document lists, there's a working solution that other community members have used successfully.
The issue you're facing is common – when you create filtered lists (like "Past events"), the create button still appears even though creating a document in that context doesn't make sense. Unfortunately, the Structure Builder API doesn't expose a direct way to hide this button through configuration.
However, there's a clever workaround that involves overriding the serializer of the document list. A community member shared this solution that works by filtering out the create menu item from the serialized configuration:
// customDocumentList.js
export const customDocumentList = (spec, context) => {
const _documentList = spec || context.documentList()
return {
..._documentList,
__serialize: (...args) => {
const { menuItems, ...rest } = _documentList.__serialize(...args)
// Filter out the create menu item
const filteredMenuItems = menuItems.filter(
({ intent }) => intent?.type !== 'create'
)
return { menuItems: filteredMenuItems, ...rest }
}
}
}Then use it in your structure:
import { customDocumentList } from './customDocumentList'
S.listItem()
.title("Past events")
.child(
customDocumentList(
S.documentList()
.title("Past events")
.filter("_type == 'event' && date < now()")
)
)Important notes:
__serialize)intent?.type) to handle menu items that don't have an intent propertycreateMenuIdx === -1 if you want to handle cases where there's no create menuAlternative approaches you might consider:
initialValueTemplates([]) to remove all template options (though this affects the entire list, not just the button)The serializer override is currently the most targeted solution for hiding the create button on specific filtered lists while keeping it available elsewhere in your structure. Just keep in mind it's working with internal APIs that aren't officially documented, so treat it as a temporary workaround until Sanity potentially adds official support for this use case.
Sanity is the developer-first content operating system that gives you complete control. Schema-as-code, GROQ queries, and real-time APIs mean no more workarounds or waiting for deployments. Free to start, scale as you grow.
Content operations
Content backend


The only platform powering content operations
By Industry


Tecovas strengthens their customer connections
Build and Share

Grab your gear: The official Sanity swag store
Read Grab your gear: The official Sanity swag store