Volto Hydra Documentation
A Visual Headless CMS using Plone as a server, providing true visual editing with drag-and-drop blocks and editable text — with any frontend stack you choose.
Why Hydra?
- Visual + True Headless + Open Source — a unique combination in the CMS space
- Framework agnostic — Next.js, Nuxt.js, Astro, plus server-only stacks (PHP, Django, Rails, Laravel) via the server-render pattern
- Quick visual editing — enable it with simple HTML data attributes, no React or Vue required in your frontend
- Omni-channel — switch between multiple frontends mid-edit
- Enterprise features — versioning, i18n, workflow, and automated content rules
- Customisable — both the admin interface and block definitions are fully configurable
Try the online demo
The fastest way to feel what Hydra does is to log into the hosted demo and edit a real page against a real frontend.
Open <https://hydra.pretagov.com>, log in, then:
- Open user preferences (bottom-left).
- Pick one of the preset frontends, or paste in your own frontend URL.
- Edit any page — every change updates the live preview.
The default preset is a Nuxt.js frontend deployed as an SSG to demonstrate scale-to-zero editing on free hosting. An Astro example demonstrates the server-render pattern for static-first frameworks. See Build a frontend › Deployment patterns.
To run Hydra locally against your own frontend, see the Run Locally section of the project README.
Grid
The Grid block allows adding multi-column blocks. A grid block can contain between one and four columns of different blocks. Teasers and images can be added in a grid block.
Grid Block
A responsive grid layout container. Each cell is a child block (teaser, slate, image, etc.) rendered inside the grid. This is the built-in Volto grid block (gridBlock).
Context Navigation Block
A vertical navigation list for grouped pages — a left sidebar on desktop and a collapsible disclosure at the top on mobile. Each row is a navItem (hand-added link) and/or a listing (auto-populated from a path query). The active link is detected from the current URL and gets aria-current="page" plus a .current class. Named after Plone's @contextnavigation endpoint, which serves the same purpose.


