Vegane Gesellschaft Österreich
AI-assisted Drupal 7 to 11 relaunch on mossbo Cloud

The Vegane Gesellschaft Österreich (VGÖ) describes itself as an environmental organisation with a focus on nutrition. A team of just under 30 works to interest people in climate-friendly, healthy, plant-based food. Its website vegan.at carries recipes, nutritional information, events and a nationwide directory of vegan-friendly restaurants, alongside the organisation's campaigning, membership and donation work.
The site had been running on Drupal 7 well past its end of life. VGÖ partnered with drunomics to move it to mossbo Cloud, our managed cloud CMS ecosystem, which combines Drupal with a decoupled Nuxt frontend.
Important aspects for the client
- Relaunch the Drupal 7 site on Drupal 11 for security reasons.
- Increase readership participation and interest through a more modern, responsive and performant system.
- Fulfill governance requirements: accessibility, privacy and GDPR compliance.
- Stay within budget constraints.
Important aspects for drunomics as the providing agency
- Build a long-term working relationship.
- Expand the customer base of the award-winning mossbo Cloud SaaS.
- Leverage AI assistants to provide good results while meeting the client's budget
Project Requirements and Approach
As a non-profit, vegan.at needed a relaunch that was affordable, that preserved a decade of content and search rankings, and that left the team with a site they could run themselves without technical overhead.
The content model was rebuilt around the organisation's actual work: articles, recipes, events and the restaurant directory, each with its own editing experience. Four things set this project apart from a conventional migration.
AI-assisted design. The VGÖ's in-house designer provided the branding, colours, typography and logo, and gave feedback on the result. The design itself was generated with Claude Design on top of the mossbo Cloud kickstart component set, with new components for the vegan.at-specific elements. One feedback round was enough to land the prototype as working HTML and Vue, which then became the reference every page was built against.
AI-assisted migration under human gates. Content and pages were both migrated by AI agents, with a human giving direction on the correct implementation and approving every visual outcome. The method was developed on this project and has since been generalized into a reusable set of agent skills, so the next migration starts from the same place.
AI-assisted implementation. Beyond the design draft and the migration, the agents also took over the Drupal configuration (content types, fields, search) and supported the design implementation in the Nuxt frontend. No custom backend code was needed: the mossbo architecture separates platform and project, the project consists of configuration and frontend components, and that is exactly what makes AI-assisted implementation this efficient.
Canvas-based overview pages. vegan.at has an overview page for each of its sections, such as Rezepte or Infos, and for each topic, such as Gesundheit or Umwelt. On the old site these were fixed templates. They are now Canvas pages, built with Drupal Canvas: editors compose them from reusable components and see them as visitors will, instead of assembling an abstract layout. The same pattern drives the campaign and landing pages, and the client manages them without a developer.

One custom feature that sets vegan.at apart is its nationwide restaurant finder, which drunomics rebuilt in Nuxt. The feature does not need Drupal, so instead of bolting it onto the site as in Drupal 7, it is now a Canvas page that simply places a custom restaurant_finder Vue component. The frontend implements a small API proxy that pulls the data directly from the internally used API, keeping requests cached and pleasantly fast. The result offers free-text search across venue names and dishes, search by place or postcode, a "find near me" option, filtering by what a venue offers, and a map of the current result set. Filtered views are shareable because the active filters travel in the page URL.

For the recipe search, a different approach was taken. Since recipes are managed within Drupal and come in higher numbers, drunomics took advantage of the OpenSearch server that mossbo Cloud provides. Recipes are indexed with Search API and searched through a search interface backed by a Drupal Views configuration. Thanks to the Views support in Lupus Decoupled, it was easy to brush up the frontend search experience with some interactive elements in Vue.js.

The site search is backed by the OpenSearch-based search that mossbo Cloud provides as well. It is configured for the specifics of the German language and applies custom ranking logic via boosting, for which improvements were contributed to the Search API OpenSearch module. Editors can also influence the ranking by adjusting the boost of individual articles.

Improved Webform support
For an NGO, being able to configure and customise forms without help is a crucial feature, and so is the power of the Webform module. Lupus Decoupled has supported Webform for a long time, but JavaScript-based features such as Webform conditionals and AJAX file uploads were missing in the decoupled setup. This was solved by adding support for Drupal's library system to the underlying Custom Elements module, which in turn makes conditionals and AJAX file uploads in webforms simply work, just as on a traditionally rendered Drupal site.
Of roughly 60 forms on the Drupal 7 site, about 50 were near-identical recording requests for online talks, which became a content type with one shared form. The remaining forms, from magazine orders to event registrations and feedback surveys with Likert scales, the VGÖ rebuilt in Webform on its own, without a developer. The site now carries over 50 forms, all maintained by the association.
AI-assisted migration of content and pages
The migration ran on two tracks in parallel, both via Drupal core's default_content mechanism.

The page migration benefited greatly from the ability to use Vue components directly with Drupal Canvas, through the Canvas support in Lupus Decoupled. Coding agents are efficient at writing modern JavaScript such as Vue, so creating static pages for phase 1 was simple. In phase 2 the components were registered in Drupal, so the pages could be built and imported. In the end, the same tree of components approved in phase 1 was rendered through Lupus Decoupled, now as a fully editorially managed page.
Content track. With the help of a coding agent the target data model and mapping against the sanitized Drupal 7 database has been planned. Then the agent has been tasked to write the extraction scripts, which produced easy-to-import yaml files using the Drupal default content importer. Crucially, the scripts run deterministically: the same dump produces the same content tree, and no content is transformed through a live model call. Some missing content, like recipe teasers, were pre-generated using AI once, so a re-import restores exactly the same text.
| Content | Source records | Entities created | Elapsed | Feedback rounds | Development effort |
| Articles | 970 | ~13,000 | 6 days | 17 | ~1 day, mostly QA |
| Recipes | 1,012 | 19,431 | 6 days | 21 | ~1 day, mostly QA |
The recipes also needed a normalized ingredient list which has been consolidated into a controlled vocabulary: 2,820 raw terms became 923. 42 Drupal 7 category terms were remodelled onto two vocabularies, Channel and Topics, and 269 articles kept secondary classifications that a naive one-field mapping would have dropped. 6,458 media records came across with them.
The page migration ran as tickets, which makes it measurable: 48 tickets over 15 calendar days, all of them implemented by coding agents. The review rounds are the point, not a flaw. Work was almost always sent back for design fidelity or writing good code, that can be maintained well. Rarely because something did not function.
More than half the project time went into building the process and its tooling rather than into the site itself. That investment is what made the method reusable.
Goals, and how we measured them
Seven goals were set at the start. Each is listed with the evidence that it was met.
1. Get off Drupal 7, which has had no security coverage since January 2025. ✅ The site runs Drupal 11.4 and went live on 27 August 2026. Updates and security patches now run automatically as part of mossbo Cloud.
2. Preserve ten years of content and the search rankings attached to it. ✅ Around 2,173 pages were migrated, the old URLs redirect, and the sitemap was accepted by Google Search Console on the day of the switch. The entry redirect went from two hops (http://vegan.at → http://www.vegan.at → https) to one. Search Console's indexing report had shown no new indexed pages within the last months; within days of the switch the index was growing at a healthy rate, the combined effect of the go-live and the new sitemap submitted the same day.
3. Give the editorial team an interface that needs little technical knowledge. ✅ Editors compose overview and campaign pages in Canvas and work in content forms built around articles, recipes and events rather than around Drupal.
4. Remove the burden of maintenance from a small non-profit. ✅ The site runs on the mossbo Cloud platform with a GDPR-compliant host whose data centre is in Germany, behind a CDN, with monitoring, with all updates and security patches handled by the platform - including Drupal major version upgrades!
5. Audit against WCAG 2.2 AA and deliver the legally required accessibility statement. ✅ The site was self-audited by drunomics against WCAG 2.2 AA: 14 pages at three viewports (375, 768 and 1440 px), axe-core plus manual keyboard, focus, contrast and zoom checks. The accessibility statement was written from the findings, names the remaining shortcomings, and has been provided to vegan.at with the launch.
6. Make the site noticeably faster for visitors. ✅ More than six times faster. Google's own crawl statistics, collected the same way before and after, show the average response time falling from roughly 900 milliseconds to around 130 on the day of the switch.

7. Do all of it at a cost a charitable association can carry. ✅ The project was delivered by a small team leveraging AI-assisted workflows. The AI-assisted design and migration sped up time to delivery, thus saving the client time and cost.
A result nobody set as a goal: structured data
The old site shipped no structured data. The new one emits Schema.org markup through Schema.org Metatag, and Search Console picked it up from the first crawl: by 3 September it reported 1,153 valid breadcrumb items, 529 valid recipe items and 3 event items, with zero errors. Recipes with valid markup are eligible for rich results in Google, which is where a recipe site earns its clicks.
Before and after at a glance
| Before | After | |
| Drupal | 7.105 (end of life since 01/2025) | 11.4, automated updates |
| Entry redirect | two hops | one hop |
| Structured data | none | Schema.org breadcrumbs, recipes, events; 0 errors in Search Console |
| Accessibility | no statement, no audited baseline | audited against WCAG 2.2 AA, statement names the remaining findings |
| Overview pages | hard-wired templates | Canvas, composed by the editorial team |
| Analytics | Matomo Cloud plus Google Tag Manager | Plausible, cookieless, loads before consent; GA4 only after consent |
Mit der Neuentwicklung von vegan.at haben wir unsere historisch gewachsene Drupal-7-Website in eine moderne, leistungsfähige und zukunftssichere Plattform überführt. Das neue System ermöglicht es uns, Inhalte wie Artikel, Rezepte und Veranstaltungen deutlich flexibler und effizienter zu verwalten. Besonders wertvoll ist für uns, dass Betrieb, Monitoring und Sicherheitsupdates in einer Managed-Cloud-Lösung gebündelt sind. Dadurch kann sich unser Team stärker auf die redaktionelle Arbeit konzentrieren und vegan.at kontinuierlich weiterentwickeln.
Why Drupal Was Chosen
Drupal 7 reached end of life in January 2025, so a move was unavoidable. The organization's content is genuinely structured: recipes, events, restaurants and articles each behave differently, which is where Drupal's content modelling earns its place over a simpler CMS.
By extending Drupal with Lupus Decoupled and Drupal Canvas the system provides the perfect base for combining a modern frontend experience with a likewise modern editing experience, driven by a robust backend.
mossbo Cloud adds the parts a small non-profit cannot maintain itself: ISO 27001-certified European hosting, automated Drupal updates and security patches, monitoring, and a decoupled Nuxt frontend that keeps the public site fast without the editors having to think about it.
Technical Specifications
Drupal version: 11.4.5
Key modules, themes and distributions (verified against the enabled module list, 04.09.2026):
- Lupus Decoupled Drupal
- Custom Elements and Custom Elements UI
- Lupus Custom Elements Renderer
- Drupal Canvas, integrated through Lupus Decoupled Canvas
- Search API with OpenSearch and Facets
- Geofield, Geocoder and Address (restaurant finder)
- Smart Date (events)
- Webform
- Simple XML Sitemap, Redirect, Pathauto
- Metatag and Schema.org Metatag
- AI with the Mistral provider (European-hosted, editorial assistance)
- Config Preview Deploy
- Purge (CDN cache-tag invalidation)
- OhDear Integration
Why these were chosen: Lupus Decoupled Drupal is the open source foundation of mossbo Cloud and provides the decoupled architecture. Canvas gives editors component-based page building. The search, GEO and date modules carry the three content types that behave differently from plain articles: restaurants, events and recipes. The remainder supports SEO continuity, editorial workflow and monitoring.
Hosting: mossbo Cloud platform, GDPR-compliant hosting with the data centre in Germany, ISO/IEC 27001-certified, CDN in front.
Team Members
- Wolfgang Ziegler (fago)
- Jeremy Chinquist (jjchinquist)
- Oliver Berndt (oliver_berndt)
We also want to thank colleagues whose contributions to mossbo Cloud and lupus_decoupled also made this project possible: (in alphabetical order)
- Bašić, Petar (petar_basic)
- Fink, Matic (turtlbbx)
- Guntupalli, Sinduri (sinduri)
- Ieremia, Alexandru (alex_ieremia)
- Lorenz, Arthur (arthur_lorenz)
- Novelli, Liopold (useernamee)
- Stavovei, Ciprian (ciprianstavovei)
Community Contributions
The work produced a series of improvements for upstream projects, most of them for Drupal Canvas and the file-upload path a decoupled Canvas page depends on. Each was contributed upstream as a merge request, most of them already merged; the remaining ones are carried in the project as patches until they land.
| Issue | Project | What it fixes |
| #3457067 | Drupal core | Status messages rendered in managed file form elements filter HTML too aggressively |
| #3618230 | Drupal core | Adopt the AJAX MessageCommand for file uploads, so a decoupled frontend receives upload messages as structured data instead of parsed HTML |
| #3591986 | Canvas | Canvas breaks uploading files with spaces for the whole site |
| #3591989 | Canvas | Form AJAX errors are swallowed by Canvas (MR !1558) |
| #3591845 | Canvas | Prevent Canvas from caching blocks that throw exceptions (MR !1396) |
| #3616474 | Search API OpenSearch | Fix per-type boosting and make boosts apply multiplicatively (MR !147) |
| #3619637 | Address Suggestion | Warnings when a Nominatim result has no road and house number |
| #3619641 | Geocoder | Allow disabling geocoding of country-only addresses |
| #3605817 | Lupus Custom Elements Renderer | Ease setting custom page_layouts per route |
| #3534177 | Custom Elements | Introduce an extensible service for converting render-arrays to custom elements (MR !184) |
| #3568233 | Custom Elements | Add support for loading Drupal JavaScript libraries via custom elements |
| #3615475 | Custom Elements | Add a formatter for smart-date output |
| #3615478 | Custom Elements | Add a formatter for geofield data output |
| #3615479 | Custom Elements | Add a formatter for addressfield data output |
| #3616027 | Custom Elements | Add entity_label and entity_reference CE field formatters for raw reference output |
| #3612219 | Custom Elements | Add a reusable search-text extractor and an optional Search API processor for indexing custom element text (MR !187) |
| #3472359 | Custom Elements | Ability to add a field multiple times |
| #3618933 | Custom Elements | CanvasFormatter swallows flow-control exceptions, so an AJAX file upload inside a Canvas page never gets its response (MR !200) |
Beyond this project, drunomics maintains Lupus Decoupled Drupal, Custom Elements, Lupus Custom Elements Renderer, Config Preview Deploy, Lupus Stark, OhDear Integration and Request Info, and contributes to AI, Experience Builder, OpenAI Provider and OpenID Connect / OAuth Client.