Volto Hydra
Why Hydra
Most CMS platforms force a trade-off: visual editing or frontend freedom. Hydra gives you both.
Visual Editing
True WYSIWYG with drag-and-drop blocks. No special frontend framework required — just HTML attributes.
Any Frontend
Use React, Vue, Nuxt, Next.js, or any stack. Switch between frontends mid-edit for omni-channel delivery.
Truly Decoupled
Your frontend is independent code you own. Upgrade the CMS without rewriting your site; switch frameworks and get the same editing experience.
Open Source
Secure, scalable Plone backend. Host anywhere, control your costs and security.
Quick Start
<!-- pages/[...slug].vue -->
<template>
<!-- data-block-uid: makes block selectable, draggable, and editable -->
<div v-for="id in page?.blocks_layout?.items" :key="id"
:data-block-uid="editing ? id : undefined">
<!-- data-edit-link: click to edit link URL in sidebar -->
<a :href="page.blocks[id].link"
:data-edit-link="editing ? 'link' : undefined">
<!-- data-edit-media: click to pick/upload image in sidebar -->
<img :src="page.blocks[id].image"
:data-edit-media="editing ? 'image' : undefined" />
<!-- data-edit-text: edit text directly in the preview -->
<h3 :data-edit-text="editing ? 'title' : undefined">
{{ page.blocks[id].title }}
</h3>
<p :data-edit-text="editing ? 'description' : undefined">
{{ page.blocks[id].description }}
</p>
</a>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { initBridge } from 'hydra-js'
const page = ref(null)
const editing = ref(false)
onMounted(async () => {
// Only init bridge when loaded inside the editor
if (window.name.startsWith('hydra')) {
editing.value = true
initBridge({
// Register custom block types with their field schemas
blocks: {
card: { blockSchema: { properties: {
image: { widget: 'image' },
title: { type: 'string' },
description: { type: 'string' },
link: { widget: 'url' },
}}}
},
// Receive live updates as editor changes content
onEditChange: (data) => { page.value = data }
})
} else {
const res = await fetch(`/++api++${useRoute().path}`)
page.value = await res.json()
}
})
</script>You can use this site to test Hydra Edit.
Disclaimer: This instance is reset every night, so all changes will be lost afterwards.
You can log in and use it as an admin user using these credentials: username: admin password: admin
This site uses some recommended add-ons:
- Some blocks that are suitable to be used with volto-light-theme.
- volto-form-block