drupal / agora_transparency
A transparency and open government site template for Drupal CMS, for councils, public bodies and organisations that publish accountability information.
Package info
git.drupalcode.org/project/agora_transparency.git
Type:drupal-recipe
pkg:composer/drupal/agora_transparency
Requires
- drupal/agora_core: ^1.0.1
- drupal/agora_theme: ^1.2.5
- drupal/config_guardian: ^1.1
- drupal/drupal_cms_helper: ^2
- drupal/drupal_cms_site_template_base: ^2
- drupal/easy_email_express: ^1
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Ágora Transparency (Ágora for short) is a site template for Drupal CMS for transparency and open government portals: local councils, public bodies, foundations and other organisations that publish what they decide, what they spend and who works for them.

Features
- A working Drupal CMS site: administration, media, SEO, privacy and consent, authentication and HTML email.
- Its own front-end theme,
drupal/agora_theme, which this template requires at^1.2.5and makes the default theme. - Six registers (documents, people, contracts, agreements, grants and datasets), each with a table of records that can be filtered and downloaded, plus a listing across all of them and a document library.
- A Canvas landing page as the home page, carrying five blocks from the template's own views.
The service-area cards on
/publicationsfilter the register beside them. - Configuration auditing with Config Guardian: weekly snapshots kept for 400 days, and a read-only Governance auditor role.
- Demonstration content: 60 records across six registers, with generated PDFs and CSV files.
Not included in this release: freedom-of-information requests, an editorial review workflow of the template's own (records use Drupal CMS's draft and published states), and an AI assistant.
Demonstration content
The demonstration content belongs to Fuentelclaro, a fictional Spanish municipality; every person,
figure, contract and document in it is invented. Its registers follow Spanish transparency law,
which is why it publishes budget chapters, a by-law, an equality plan and declarations of assets for
elected members. It is written in English: a site template cannot ship interface translations, so a
Spanish site is set up after installation with the language and config_translation modules.
The package has 224 files in content/ and 133 config objects in config/. The licence and source
of every image, PDF and CSV file are listed in
content/MEDIA-LICENCES.md, and the invented people in
content/PEOPLE.md.
Accessibility
The public pages of a clean install conform to WCAG 2.2 level AA, by an evaluation made on
2026-10-28. The administrative interface and the pages that need an account are outside that
claim. The method, the results and what was not measured are in
ACCESSIBILITY.md, which also describes the automated accessibility tests that
run on every change.
The site ships an accessibility statement at /accessibility-statement. Its sections marked "To be
completed" are for the organisation running the site.
Requirements
- A Drupal CMS 2.2 or later project, on Drupal core 11.4 or later; the installation steps below create one.
- PHP and Composer versions as required by Drupal CMS. This template adds no constraint of its own.
- DDEV 1.25.0 or later for the commands below.
Drupal CMS 2.2.3 and later ship a
.ddev/config.yamlthat requires it.
Installation
mkdir agora-site
cd agora-site
ddev config --project-type=drupal11 --docroot=web
ddev start
ddev composer create-project --no-install drupal/cms
ddev composer install
ddev composer require drupal/agora_transparency
Create the project with --no-install and run composer install separately: with a one-step
create-project, Drupal CMS 2.2.0 rewrites a constraint in the project's composer.json that makes
the require fail.
Then install the site, either in the browser (ddev launch, and choose Ágora at the site template
step) or with Drush:
ddev drush site:install --site-name="Your institution" --yes recipes/agora_transparency
Without --site-name, Drush names the site "Drush Site-Install".
Installing from a clone
To install from a clone of this repository instead of a release, start from
drupal/recommended-project, add the clone as a Composer path repository, and then install the
site as above:
mkdir agora-site
cd agora-site
ddev config --project-type=drupal11 --docroot=web
ddev config --web-environment-add="COMPOSER_MIRROR_PATH_REPOS=1"
ddev start
ddev composer create-project --no-install drupal/recommended-project
git clone https://git.drupalcode.org/project/agora_transparency.git source
ddev composer repository add source path source
ddev composer require --update-with-all-dependencies "drupal/agora_transparency:@dev"
ddev composer require --dev "drush/drush:^13"
The tests are in the repository but not in the release. .github/workflows/phpunit.yml runs this
sequence, copies the tests from the clone into the installed package and runs them.
Make it yours
What an organisation usually changes before going live:
- Site name: Configuration > System > Basic site settings
(
/admin/config/system/site-information). - Logo: Appearance > Settings > Ágora Transparency theme. Untick "Use the logo supplied by the theme" and upload your own.
- Masthead image and opening line: the same page, under "Front-page masthead". With no image the band is plain navy.
- Currency: the same page lists every field that carries a currency prefix or suffix, with a link to each field's settings. The currency is set per field.
- Social links: Structure > Menus > "Follow us". The four links point at each network's home page; change them to your accounts or delete them.
- Accessibility statement and legal pages: complete the "To be completed" sections of
/accessibility-statement, and the Legal notice, Privacy notice and Cookies pages.drupal_cms_site_template_basealso adds an unpublished "Privacy policy" page at/privacy-policy, with a link in the footer menu that only administrators see. Delete it, or complete and publish it and point the cookie banner at it (Configuration > User interface > Klaro! > Texts); the banner points at the Privacy notice by default. - Trash: deleted content goes to Content > Trash (
/admin/content/trash) until the trash is emptied, for example withddev drush trash:purge --all -y. Media and files are deleted at once. - Canvas page templates: leave "Use Drupal Canvas for page templates in this theme" unticked in the theme settings. Ticking it replaces the theme's header and footer with empty Canvas regions.
- Config Guardian baseline: Configuration > Development > Config Guardian > Sync > Export Configuration writes the current configuration to the sync directory, as the starting point for later comparisons.
Removing the demonstration content
- Content (
/admin/content): select every document, person, contract, agreement, grant and dataset record and delete them. - Content > Media (
/admin/content/media): select the demonstration documents and delete them. Their files are deleted with them. - Empty the trash:
ddev drush trash:purge --all -y. Eleven files are attached to records directly rather than through media. Delete the ones no longer in use:
ddev drush php:eval ' $uuids = [ "1303ba70-7644-566e-8f6a-531e3ae9f9b4", "34a26985-1f6a-5c06-acc3-d25192efdad9", "37581c03-6cec-5b93-93bc-fb1215b30cb4", "49763496-7ef0-5dba-9b15-330481d8ee07", "4eeb8798-0a79-5d60-879e-b6c91d135df7", "54c17258-9efe-5c77-91f0-3f946edc1282", "7ca8185e-daa9-5190-b9d3-d55299325ee3", "87d36bf0-1f2f-5c0d-b710-268c15045c7e", "a33ad178-9649-5db1-acc1-00a1a52684ed", "dbafc2a2-955e-54b9-8d06-fab433c3849c", "e02588e5-c81c-52d8-96dc-a7a9d9b1e203", ]; $repo = \Drupal::service("entity.repository"); $usage = \Drupal::service("file.usage"); foreach ($uuids as $uuid) { $file = $repo->loadEntityByUuid("file", $uuid); if (!$file || $usage->listUsage($file)) { continue; } echo $file->getFileUri() . PHP_EOL; $file->delete(); } 'In Canvas, delete the last block of the front page, which names Fuentelclaro, and publish.
The taxonomy terms, menu links and the two Canvas pages are part of the site's structure and stay.
What the template applies
Recipes, in the order recipe.yml applies them:
| Recipe | What it contributes |
|---|---|
core/recipes/administrator_role | A generic administrator role with all permissions |
core/recipes/core_recommended_maintenance | Core modules that help with site maintenance |
core/recipes/core_recommended_performance | Core modules that improve performance |
drupal_cms_site_template_base | Drupal CMS Basics: administration UI and theme, authentication, media types, privacy and consent, SEO and Canvas |
easy_email_express | HTML email |
It also installs a few core modules, agora_theme, agora_core (which serves the sign-in and other
account pages in the front-end theme) and config_guardian. It sets the front page to the Canvas
landing page in content/, and keeps administrative components out of the Canvas page builder.
What the package contains
The release holds fourteen top-level entries and 377 entries in all: .gitattributes,
ACCESSIBILITY.md, AGENTS.md, LICENCE-MANIFEST.md, LICENSE.txt, README.md, SECURITY.md,
composer.json, config/, content/, logo.png, recipe.yml, recommended.yml and
screenshot.webp. Tests, CI configuration and project notes are in the repository but not in the
release.
Known limitations
- The demonstration content is a fictional Spanish municipality, published in English.
- No anti-spam module is installed. The forms open to visitors are search and filtering, sign-in and password reset.
- A site template is applied once. Later releases do not change an existing site.
Support
Report bugs and ask questions in the
issue queue, naming the release you
are running. Report security issues privately, as described in SECURITY.md.
License
GPL-2.0-or-later; see LICENSE.txt. The licence of every file in the package,
including the demonstration media, is listed in LICENCE-MANIFEST.md.
How Ágora is built
Ágora is developed with AI coding assistants, under the maintainer's direction and checked by the project's automated tests. The maintainer is accountable for every release. The project's decisions and their reasoning are recorded in its public repository.