After nearly two years of development (including a 1.8 beta cycle that taught us a great deal about what not to do), I'm thrilled to announce that the entire Grav 2.0 suite has reached Release Candidate status today. Grav 2.0 core, the API plugin, Admin2, Quark 2, and the Migrate plugin are all available right now via GPM (the MCP server is a separate standalone Node.js package, see below), and they all behave like the final product is going to behave.

This is the moment we've been building toward for a long time, and it's also the moment where we need the community more than ever. If you run a Grav site, maintain a plugin or theme, or build for clients on Grav, now is the time to test.
For anyone landing here without context: Grav is a mature, stable, file-based CMS that's been in production for a decade. The fundamentals haven't changed and won't. File-based content you fully control, no database, no build step, your edits go live the moment you save. Grav 2.0 is the biggest release yet, bringing a brand-new admin (Admin2) built on a first-party REST API, AI-ready content and workflows via the MCP server, a refreshed default theme (Quark 2), and full support for modern PHP versions. Ten years in, 15K+ stars on GitHub, built for what's coming next.
What's in the Grav 2.0 Release Candidate
Grav 2.0 is a coordinated release of multiple components, all sitting at RC together:
- Grav 2.0 core with a modernized PHP stack (8.3 minimum, supported through 8.5+) and the latest Symfony, Twig, and supporting library versions
- API plugin which is a first-party REST API and the foundation that everything else in 2.0 is built on top of. This API layer makes Grav 2.0 a fully-functional headless CMS
- Admin 2 as the new default admin interface, an API-driven SPA that replaces the classic Twig-rendered admin from 1.x
- Quark 2 as the new default theme. A ground-up modernization of the classic Quark theme that shipped with Grav 1.5 through 1.8, rebuilt on Pico CSS v2 with Font Awesome 7 icons, full auto / light / dark appearance support, a configurable accent color, multi-level dropdown navigation, a sticky animated header, a full-page mobile overlay
- MCP server (
grav-mcp), a standalone Node.js Model Context Protocol server that talks to Grav through the API plugin. It exposes 67 semantic tools across 11 domains (pages, media, configuration, users, packages, system, webhooks, blueprints, environments, dashboard, plugin discovery), giving agentic AI clients like Claude Code the same level of access to your Grav site as a human admin. Distributed as annpmpackage, configured in your AI client with the Grav API URL and an API key generated frombin/plugin api keys:generate - Migrate plugin which is the import-based migration path from 1.7 or 1.8 into a fresh 2.0 install (separate one-click install)
Grav core, API, Admin2, Quark 2, and Migrate are all installable today via GPM. The MCP server installs in the AI client of your choice (npx grav-mcp or your client's MCP config). We're past the point of new features, so from here through to GA the focus is bug fixes, polish, and documentation.
Why an RC, and Why It Matters
A Release Candidate is exactly what the name suggests. This is the build we expect to ship as final. The only thing holding it back from GA is finding bugs, regressions, and rough edges that need addressing. The more people who put it through real-world use right now, the better the GA release will be.
Grav 2.0 is also the largest version jump this project has ever attempted. PHP 8.3+, completely refreshed dependencies, a new admin built on top of a new API, an entirely new install/migration model. There's a lot of surface area, and the realities of the wild are always more varied than any developer's test environment.
If the 1.8 beta cycle taught us anything, it's that real-world testing across many sites is the only way to find the edge cases. We learned that lesson the hard way, and 2.0's import-based migration approach is a direct response. But it still benefits enormously from being tested against your actual content, your actual plugins, and your actual hosting setup.
How You Can Help: For Site Owners
You don't need a separate server, a clean VM, or a backup-restore dance to help us test. The Migrate to Grav 2.0 plugin is built around a side-by-side staged install: it sets up a fresh Grav 2.0 inside your existing site, in a subfolder, served alongside your live 1.x. Your original site keeps running untouched the whole time.

The whole flow is driven from the admin (no CLI needed), and starts with a one-time GPM channel switch:
- In your existing 1.7 or 1.8 admin, head to System → Advanced → GPM Section and set the GPM Releases channel to
Testing. This is the channel where 2.0-related releases (including the migrate plugin itself) currently live during the RC period - Refresh the dashboard. You'll see a banner offering to install the Migrate to Grav 2.0 plugin. Click through to install it via the standard admin install flow
- Once installed, the dashboard banner updates and now shows a Start Migration button. Clicking it moves the standalone
migrate.phpinto your webroot and redirects your browser to it. From this point on you're running the wizard in a fresh PHP process with no 1.x code loaded, so there's no risk of opcache or vendor-stack contamination - Walk through the wizard steps: extract Grav 2.0 into a
grav-2/subfolder (the path is configurable), bulk-copy your user/ directory across, install Admin2 and the API plugin, upgrade 2.0-compatible plugins to their latest versions, and apply your chosen policy (skip or disable) to plugins that aren't yet 2.0-compatible. Themes are kept as-is and rendered through Grav 2.0's Twig 3 compatibility mode - The wizard then patches your
.htaccessso the staged site is reachable at/grav-2/, sitting right alongside your live 1.x install. The Apache flow is the path we've actively tested. Nginx and Caddy users will need to add a manual rewrite/exclude rule for the stage path, and we'd genuinely love your help validating those configurations during the RC - Log into the staged site, test Admin2 via the default
/adminroute, browse the migrated content, click around the parts of the admin you use day-to-day. This is real testing against real content - If something's not right, hit Reset in the wizard. It removes the staged
grav-2/directory, restores your.htaccess, and your live 1.x site is exactly as it was. There's also a lighter Restart option that keeps the downloaded zip so you can re-run the wizard without re-downloading - When you're satisfied, hit Promote. The wizard backs up your existing 1.x site files and swaps the staged 2.0 contents up to your webroot. You're now running Grav 2.0 in place
- Report what you find. Bugs, surprises, plugins that didn't migrate cleanly, anything at all
Full details on the migration process are in the dedicated Migrating to Grav 2.0 post. It's the most important post in the 2.0 series and it's where to start if you want to understand the wizard end-to-end.
The whole point of this design is that testing is genuinely safe. Run the wizard, kick the tires on the staged site, hit Reset, repeat. Every cycle is more useful data for us.
How You Can Help: For Plugin & Theme Developers
This is the part where we really need plugin and theme developers to step up. If you maintain anything in the Grav ecosystem, the next few weeks are when that work is most valuable.

The good news is that most plugins will work on Grav 2.0 with little to no change. The plugin architecture, event system, blueprints, and core form fields are unchanged. The changes that actually matter are:
- PHP 8.3+ compatibility. Most modern plugins are already there, but if not, fix the deprecations
- Updated Symfony 7 / Twig 3, which only matters if you call those APIs directly beyond what Grav abstracts
- Compatibility flags, a new blueprint field that tells GPM and the Migrate plugin which Grav versions your plugins and themes support
- Admin2 integration, which is only relevant if your plugin has custom form fields, custom admin pages, panels, or menu bar items
To make this concrete, we're publishing the developer blog series alongside this RC announcement, starting with the two posts that cover what the vast majority of plugin developers need:
- Grav 2.0 for Plugin Developers: Overview gives the big picture, the three tiers of compatibility, and a checklist of what to verify
- Compatibility Flags covers the new blueprint system, GPM enforcement, inference rules, and exactly what to add
For most plugins, that's the whole job: test on PHP 8.3+, add the compatibility flag, push an update.
If your plugin has custom Admin integrations (a custom form field, a dedicated admin section, a quick-link menu bar item, a utility panel), the deeper guides are coming over the following weeks:
- API Integration for Plugins
- Admin2 Custom Form Fields
- Admin2 Custom Pages
- Admin2 Panels & Menu Bar
In the meantime, all the Grav Premium plugins (Editor Pro, Revisions Pro, Yeti Search Pro, SEO Magic, AI Pro, AI Translate, etc.) already have full Admin2 implementations and if you have licenses, the source is open to read. Freely available plugins such as License Manager and Git-Sync also have sophisticated API and Admin2 integrations. If you're building Admin2 support for your plugin, start there.
If you're using Claude Code (or another Skill consuming AI agent) for plugin development work, we've published a set of Grav-specific skills that walk your agent through the Admin2 and API integration patterns and help with both upgrading existing plugins and scaffolding new 2.0-native ones. Install with /plugin marketplace add getgrav/grav-skills, then activate the grav-api-admin-next-integration skill (or the lighter grav-api-integration one if your plugin only needs API work, no admin UI).
As a baseline for the whole ecosystem: all Trilby and Grav Team maintained plugins (about 120 of them) have already had the compatibility flag added in their blueprints. So as you test, the core ecosystem should already declare its 2.0 status correctly.
The Compatibility Flag Ask
Even if your plugin doesn't need any code changes for 2.0, please add a compatibility flag and push an update. This is the single highest-leverage thing a plugin author can do for the launch.
The flag goes in your plugin's blueprint:
compatibility:
grav: ['1.7', '2.0']
This tells GPM that your plugin is tested and working on both versions. It tells the Migrate plugin to import it cleanly into a 2.0 site. And it tells users browsing the plugin directory that you've done the work.
Without an explicit flag, GPM falls back to conservative inference rules (which usually means "assumed 1.7 only"), and your plugin won't install on 2.0 without the user explicitly overriding. An explicit flag is always better than relying on inference.
The full details are in the Compatibility Flags post.
What About Existing 1.7 Sites?
Nothing changes for you, and there's absolutely no pressure to migrate. Grav 1.7.52 is the latest stable 1.7 release, and going forward the 1.7 branch will only receive major critical security fixes. All active feature development is now happening in 2.0, but 1.7.52 is a perfectly valid long-term home if you're not ready to move yet.
If you're staying on 1.7 for a while, just keep an eye out for the security-only releases as they happen. Migrate when you are ready, and not before.
Where We Need Reports
- Bugs in core, API, Admin2, MCP, or Migrate belong on the relevant GitHub repository as issues
- Plugin compatibility surprises: the Migrate plugin should flag known incompatibilities, but the unknowns are exactly what we want to hear about
- Admin2 UX rough edges: the new admin is brand new and the friction you hit is the same friction every user is going to hit
- Documentation gaps, anywhere the Learn site or these blog posts left you stuck
Discord remains the best place for real-time conversation, and GitHub issues are the best place for anything that should be tracked and fixed.
A Personal Note
Grav 2.0 has been the longest, hardest version cycle this project has ever gone through. The 1.8 beta journey, the safe upgrade experiment, the rollback to 1.7.49, and the eventual decision to skip 1.8 entirely and go straight to 2.0. None of that was on the original plan. Getting here required throwing out a lot of work that didn't pan out and rebuilding the migration story from scratch.
I'm enormously proud of where Grav has landed. But it only lands well at general acceptance if the community helps shake it down between now and then. If you've ever wanted to give back to a project you use, this is the window.
Test it. Break it. Give feedback.
— Andy