You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by ja...@apache.org on 2026/10/04 18:58:29 UTC
(grails-static-website) branch docs/grails-8-announcement updated (ecc3ce4610d -> e32c409caec)
This is an automated email from the ASF dual-hosted git repository.
jamesfredley pushed a change to branch docs/grails-8-announcement
in repository https://gitbox.apache.org/repos/asf/grails-static-website.git
from ecc3ce4610d Complete the Grails 8.0.0 release announcement
add af139cd820b Add Grails 8 HTTP client guide (v8 prose, snippets, guides.yml)
add 2942705c9ce Sync HTTP client guide snippets with review fixes.
add af219e4c577 Sync guide with verified HTTP client sample
add 58460ed330b Merge pull request #520 from sanjana2505006/grails-http-client-v8-guide
add a218d5cc69b Add Grails 8 database migration guide (v8 prose, snippets, guides.yml) (#523)
add affa3233da2 Promote Grails 8 guides on the guides index and version pages
add 787d9dd146f Merge pull request #527 from apache/feature/promote-grails-8-guides
add 7ed8178d455 Polish the Grails 8 guides catalogue
add 21d47bf049b Document the guides design system
add 9eb5dc39828 Potential fix for pull request finding
add 12c42811afd Merge pull request #528 from apache/fix/grails-8-guides-visual-polish
add f2151dcbc3a Remove exposed OpenWeather key from Grails 3 guide
add 350bcef8aab Remove exposed OpenWeather key from Grails 4 guide
add 4e7c1f9a057 Document the OpenWeather environment variable
add ef5ee939800 Merge pull request #529 from apache/feature/remove-openweather-api-key
add f9fa407ec56 Update conf/releases.yml
add 9e923ac91a7 Update conf/releases.yml
add c7916661f05 Update conf/releases.yml
add beb57b4f23c Add Soren lifetime contributor announcement
add a64cdddd132 Add Soren lifetime contributor award card
add 909ea58aef1 Add Jeff Scott Brown quote to Soren lifetime contributor post
add bc4d7ec0fcc Add Guillaume Laforge quote to Soren lifetime contributor post
add fc2cbaf74e6 Polish Soren lifetime contributor post prose
add a24139b9ed4 Add Graeme Rocher quote to Soren lifetime contributor post
add 468e79777f5 Schedule Soren lifetime contributor post for July 28
add 41ffd93fc24 Amending Gennemtænkt IT, and a little more GR8Conf context
add 4dc5847e5ad Merge pull request #530 from apache/soeren-lifetime-award-amendments
add 1139de4a5d6 Merge pull request #531 from apache/soren-lifetime-award
add 882e33b7310 Add Grails 8 email guide (v8 prose, snippets, guides.yml)
add 52ffc535a3c Address review feedback on Grails 8 email guide.
add efc870f4c52 Refresh PR after review fixes
add 611b7d50523 Sync email guide snippets with companion review fixes.
add 7c086fd6b87 Re-vendor email snippets from companion b07505d.
add 3ebb6814c6c Document the errors view and re-vendor the mail controller
add 81aa726f750 Merge pull request #524 from sanjana2505006/grails-email-v8-guide
add 458f6364a0d chore: remove stale commented-out code and TODOs from community page
add 1b008108266 Merge pull request #434 from sanjana2505006/chore/remove-stale-todos
add 7e7093cae77 Add Historical Contributors section (Issue #374)
add d9fac3577ce Merge remote-tracking branch 'upstream/master' into feature/historical-contributors
add b99c28254df Merge branch 'master' into feature/historical-contributors
add 26d0c1ad326 Merge pull request #416 from sanjana2505006/feature/historical-contributors
add 5311cb3896c Update conf/releases.yml
add ba3522569c1 Add new release versions to releases.yml
add d964923cc84 Update support schedule dates to August 2026
add 372ba6d401b Add Grails TeePublic shirt promotion
add 691ac2bac3a Add Grails 8 JobRunr guide
add 53c08c0b766 Fix guide download and clone controls
add e5009f3e25b Improve guide renderer accessibility and responsiveness
add 10fe9eb76dc Preserve code blocks in printed guides
add 38fd5a5d148 Document the JobRunr delivery model
add 3f3c26f158c Document the JobRunr delivery API
add d618f42460b Prevent TOC focus layout shift
add 64f75dcbbfd Merge pull request #533 from apache/add-grails-teepublic-shirt
add ff2afb0b61d Merge branch 'master' into add-grails-jobrunr-guide
add be699a0c648 Align JobRunr requirements TOC with other guides
add f749f3dd024 Add Content-Type header to the delivery curl example
add 4c4cb812c99 Vendor JobExamples specs in the JobRunr guide
add b42012051c8 Merge pull request #534 from jamesfredley/add-grails-jobrunr-guide
add 1798543e289 Update conf/releases.yml
add fd73e8666d7 Update conf/releases.yml
add 0b23ac30b59 Update conf/releases.yml
add f13e0dae9e4 Replace blocked surefire-report action in Java CI
add c9f7b1c329c Merge pull request #535 from jamesfredley/replace-blocked-surefire-report-action
add 0d990ed5e2d Add Grails 8 command-objects-and-forms guide.
add bd981f3363c Restore the command-object teaching sequence for the Grails 8 guide.
add 798eaa44e40 Fix command-object guide snippets and unique-name handling.
add 27446f9232d Merge pull request #536 from sanjana2505006/command-objects-and-forms-v8
add c9efec11cfd Update conf/releases.yml
add 55a8d8cae6a Add Algolia indexing pipeline
add 7e6e89457ad Add Algolia site search interface
add b0f16143cd3 Integrate Algolia search with Guide rendering
add 76d60fb6455 Integrate Algolia search in CI and documentation
add 6f0e14555e5 Allow Forge API hosts in grails.apache.org CSP
add ff4fa2ca2c8 Merge pull request #537 from apache/csp-allow-forge-apis
add 2c0cab1a62b Allow Forge API hosts as CSP host-only sources
add 52e52023df9 Merge pull request #538 from apache/csp-explicit-forge-api-hosts
add 12d075bced0 Retarget Forge UI links to grails.apache.org/start/
add 4e698623b91 Drop misleading Forge API-docs parentheticals
add 35703c7ea1b Merge pull request #539 from apache/retarget-forge-ui-urls
add 6ff7f97b3ae Replace dead start.grails.org curl ZIP examples
add 9927cbb40a5 Use latest.grails.org for the Grails 8 curl example
add 2461ec8b3ff Merge pull request #540 from apache/retarget-dead-forge-curl
add 3318742a063 Add new Grails URLs to HtaccessTask
add ab832405487 Retry publishMainSite on concurrent asf-site-production pushes
add 0424196bd3b Address Copilot review on publish retry logging and git flags.
add af6959cb6fb Correct comments about deploy-github-pages capabilities.
add e646c3ae82f Merge pull request #541 from jamesfredley/ci/deploy-github-pages-action
add c46a713a68b Merge branch 'master' into feat/algolia-search
add 6105b931c8b ci: Update GitHub Action versions
add 16d82e4a5dd ci: Update GitHub Action versions
add ff827471ca5 Merge pull request #543 from apache/ci/update-actions
add 89dad55fd5c Merge branch 'master' into feat/algolia-search
add c307053b61f Merge pull request #542 from apache/feat/algolia-search
add 54956ce9cef Stop the home page from highlighting the Blog menu item
add 0da377bf9ba Merge pull request #544 from apache/fix-menu
add 6d325227cfc Add Grails 8 GORM Event Listeners guide.
add c5bb4cd9bff Guard empty text before last-char strip in FriendlyUrlService.
add 96335462ec8 Merge pull request #545 from sanjana2505006/gorm-event-listeners-v8
add 82466a905dc Register Grails 8 GORM Event Listeners guide in guides.yml.
add 99a8c6ec12e Merge pull request #547 from jamesfredley/register-gorm-event-listeners-v8
add 2f6b82915f2 Add Grails 8 creating-your-first-grails-app guide.
add 4e405677fee Add url-mappings tag to first-app Grails 8 guide.
add 60e8da316da Add Asset Pipeline chapter to creating-your-first-grails-app v8.
add 7ef0dccb90a Merge branch 'master' into creating-your-first-grails-app-v8
add 993ae59a5fa Merge branch 'master' into creating-your-first-grails-app-v8
add 1817597772c Sync Vehicle.year mapping with the companion sample.
add 954a972c1ca Merge pull request #532 from sanjana2505006/creating-your-first-grails-app-v8
add 121e7a88a5e Add Grails 8 grails-multi-datasource guide.
add a670136d32e Merge pull request #550 from sanjana2505006/grails-multi-datasource-v8
add bfe3b8cc159 Add itexto as a commercial support option in south america
add 0994d2d84a3 Update pages/support.html
add 51d2124c30f Update pages/support.html
add 5c5b739c57a Merge pull request #551 from kico-itexto/master
add 8a9cecc1e20 Update support schedule for Grails/Spring Boot versions
add d4991f46a9f Add Grails 8 Database per Tenant Multi-Tenancy guide.
add 1d91aa34a70 Tidy database-per-tenant v8 guide metadata and includes.
add 6b821789bc8 Fix v8 database-per-tenant snippet includes and GORM links.
add 91e43146552 Merge pull request #548 from sanjana2505006/database-per-tenant-v8
add 3814a788832 Fix Grails 8 grails-multi-datasource v8 snippets for Groovy 5 and books connection.
add 25f6f8a85e4 Add Grails 8 grails_url_mappings guide.
add 965bb607632 Merge pull request #553 from sanjana2505006/grails_url_mappings-v8
add 03dcc728d1c Update conf/releases.yml
add ac3af905972 Update conf/releases.yml
add 8dcddfa6440 Update conf/releases.yml
add a237f0c383b IntelliJ plugin support
add 48128d7cb56 Remove cache that can't finish on large number of files and rely on the setup-gradle cache. Update the release tool workflow to match pins of other versions
add e478a814d1f Update Grails Publish Gradle Plugin to 1.0.0-RC1 for Grails 8
add 3ece054bb71 Update conf/releases.yml
add 36f03718b46 Inclusion of Grails Brasil user group on communities (we are back!)
add 25ea7a7ca50 Merge pull request #557 from kico-itexto/master
add 59c1815a640 Revise support schedule for Spring Boot versions
add d0022e07d9e Revise support schedule for Spring Boot versions
add 9af3c47a7b2 Update homepage events for the next Grails 8 talk.
add 7fb6a256a4b Merge pull request #558 from apache/update-homepage-events
add ee4dad1e26d Update conf/releases.yml
add bbea252ac88 Update conf/releases.yml
add e32c409caec Merge branch 'master' into docs/grails-8-announcement
No new revisions were added by this update.
Summary of changes:
.github/workflows/algolia-index.yml | 38 ++
.github/workflows/gradle.yml | 9 +-
.github/workflows/publish.yml | 27 +-
.github/workflows/release-companion.yml | 4 +-
.github/workflows/release-tool.yml | 55 ++
.github/workflows/release.yml | 4 +-
.github/workflows/rendersite.yml | 6 +-
DESIGN.md | 224 ++++++++
README.md | 72 ++-
assets/images/algolia-logo-blue.svg | 1 +
assets/images/confs/javamug.png | Bin 0 -> 35541 bytes
assets/images/confs/stljug.jpg | Bin 36574 -> 0 bytes
.../images/grails-teepublic-shirt-acid-black.jpg | Bin 0 -> 47420 bytes
assets/images/restapis-guides.svg | 23 +
.../soren-glasius-2026-lifetime-contributor.png | Bin 0 -> 278572 bytes
assets/javascripts/algolia-search.js | 358 ++++++++++++
assets/javascripts/navigation.js | 20 +-
assets/javascripts/search.js | 52 +-
assets/stylesheets/algolia-search.css | 560 ++++++++++++++++++
assets/stylesheets/screen.css | 603 ++++++++++++++++++-
.../website/gradle/GrailsWebsitePlugin.groovy | 36 ++
.../website/gradle/RenderGuidesPlugin.groovy | 32 +-
.../groovy/website/gradle/tasks/BlogTask.groovy | 4 +-
.../tasks/CollectAlgoliaDocumentationTask.groovy | 269 +++++++++
.../gradle/tasks/ExportAlgoliaIndexTask.groovy | 636 +++++++++++++++++++++
.../gradle/tasks/GenerateAlgoliaConfigTask.groovy | 82 +++
.../groovy/website/gradle/tasks/GuidesTask.groovy | 12 +-
.../website/gradle/tasks/HtaccessTask.groovy | 14 +-
.../groovy/website/gradle/tasks/MinutesTask.groovy | 4 +-
.../groovy/website/gradle/tasks/PluginsTask.groovy | 1 -
.../gradle/tasks/PublishMainSiteTask.groovy | 100 +++-
.../gradle/tasks/RecordToolReleaseTask.groovy | 246 ++++++++
.../website/gradle/tasks/RenderSiteTask.groovy | 83 ++-
.../gradle/tasks/UploadAlgoliaIndexTask.groovy | 236 ++++++++
.../model/documentation/DownloadPage.groovy | 85 ++-
.../website/model/documentation/SiteMap.groovy | 33 +-
.../groovy/website/model/guides/GuidesPage.groovy | 565 ++++++++++++------
.../gradle/RenderGuidesPluginSnippetSpec.groovy | 74 +++
.../gradle/tasks/AlgoliaSearchPageSpec.groovy | 209 +++++++
.../gradle/tasks/AlgoliaTaskWiringSpec.groovy | 55 ++
.../CollectAlgoliaDocumentationTaskSpec.groovy | 92 +++
.../gradle/tasks/ExportAlgoliaIndexTaskSpec.groovy | 389 +++++++++++++
.../tasks/GenerateAlgoliaConfigTaskSpec.groovy | 46 ++
.../gradle/tasks/PublishMainSiteTaskSpec.groovy | 258 +++++++++
.../tasks/RecordCompanionReleaseTaskSpec.groovy | 63 ++
.../gradle/tasks/RecordToolReleaseTaskSpec.groovy | 195 +++++++
.../website/gradle/tasks/RenderSiteTaskSpec.groovy | 88 +++
.../website/model/documentation/SiteMapSpec.groovy | 38 ++
.../website/model/guides/GuidesPageSpec.groovy | 375 ++++++++++++
conf/csp-allowlist.yml | 4 +
conf/guides.yml | 420 +++++++++++++-
conf/releases.yml | 64 ++-
etc/bin/upload-algolia-index.sh | 49 ++
gradle.properties | 5 +-
.../v8/guide/addCreateAndSaveActions.adoc | 140 +++++
.../v8/guide/addEditAndUpdateActions.adoc | 249 ++++++++
.../v8/guide/createTheController.adoc | 15 +
.../v8/guide/gettingStarted.adoc | 6 +
.../v8}/guide/helpWithGrails.adoc | 0
.../command-objects-and-forms/v8/guide/howto.adoc | 12 +
.../v8/guide/requirements.adoc | 4 +
.../v8/guide/runningTheApp.adoc | 18 +
.../v8/guide/whatAreCommandObjects.adoc | 9 +
.../v8/guide/writingTheApp.adoc | 2 +
.../controllers/demo/PlayerController.groovy | 105 ++++
.../snippets/grails-app/domain/demo/Player.groovy | 0
.../v8/snippets/grails-app/views/player/create.gsp | 38 ++
.../v8/snippets/grails-app/views/player/edit.gsp | 42 ++
.../groovy/demo/PlayerControllerFuncSpec.groovy | 100 ++++
.../test/groovy/demo/PlayerControllerSpec.groovy | 57 ++
.../src/test/groovy/demo/PlayerInfoSpec.groovy | 43 ++
.../common-grailsApplicationForge-grails3.adoc | 9 +-
guides/common/common-grailsApplicationForge.adoc | 9 +-
guides/common/common-grailsApplicationForge5.adoc | 9 +-
guides/common/ommon-grailsApplicationForge5.adoc | 9 +-
.../v3/guide/runningTheApp.adoc | 2 +-
.../v4/guide/runningTheApp.adoc | 2 +-
.../v6/guide/runningTheApp.adoc | 2 +-
.../v8/guide/assetPipeline.adoc | 70 +++
.../v8/guide/controllers.adoc | 39 ++
.../v8/guide/creatingTheApp.adoc | 14 +
.../v8/guide/domainClasses.adoc | 29 +
.../v8/guide/gettingStarted.adoc | 14 +
.../v8}/guide/helpWithGrails.adoc | 0
.../v8/guide/introduction.adoc | 3 +
.../v8/guide/requirements.adoc | 5 +
.../v8/guide/runningTheApp.adoc | 10 +
.../v8/guide/services.adoc | 37 ++
.../v8/guide/summary.adoc | 10 +
.../v8/guide/testing.adoc | 27 +
.../v8/guide/views.adoc | 25 +
.../grails-app/assets/javascripts/application.js | 20 +
.../grails-app/assets/stylesheets/application.css | 14 +
.../controllers/example/HomeController.groovy | 21 +
.../controllers/example/MakeController.groovy | 7 +
.../controllers/example/ModelController.groovy | 7 +
.../controllers/example/UrlMappings.groovy | 17 +
.../controllers/example/VehicleController.groovy | 122 ++++
.../snippets/grails-app/domain/example/Make.groovy | 14 +
.../grails-app/domain/example/Model.groovy | 16 +
.../grails-app/domain/example/Vehicle.groovy | 23 +
.../grails-app/init/example/BootStrap.groovy | 27 +
.../grails-app/services/example/MakeService.groovy | 8 +
.../services/example/ModelService.groovy | 8 +
.../services/example/ValueEstimateService.groovy | 12 +
.../services/example/VehicleService.groovy | 8 +
.../v8/snippets/grails-app/views/home/index.gsp | 36 ++
.../snippets/grails-app/views/vehicle/create.gsp | 43 ++
.../v8/snippets/grails-app/views/vehicle/edit.gsp | 45 ++
.../v8/snippets/grails-app/views/vehicle/index.gsp | 29 +
.../v8/snippets/grails-app/views/vehicle/show.gsp | 41 ++
.../groovy/example/HomePageSpec.groovy | 18 +
.../groovy/example/ValueEstimateServiceSpec.groovy | 27 +
.../v8/guide/gettingStarted.adoc | 3 +
.../v8}/guide/helpWithGrails.adoc | 0
guides/database-per-tenant/v8/guide/howto.adoc | 10 +
.../v8/guide/integrationTest.adoc | 41 ++
.../database-per-tenant/v8/guide/requirements.adoc | 5 +
.../v8/guide/runningTheApp.adoc | 9 +
.../{v4 => v8}/guide/setupMultitenancy.adoc | 0
.../v8/guide/testingTheApp.adoc | 73 +++
.../v8/guide/writingTheApp.adoc | 7 +
.../v8/guide/writingTheApp/domainClasses.adoc | 31 +
.../v8/guide/writingTheApp/multiTenantLogic.adoc | 38 ++
.../multiTenantLogic/readingData.adoc | 61 ++
.../multiTenantLogic/writingData.adoc | 37 ++
.../v8/guide/writingTheApp/seedData.adoc | 13 +
.../setupMultitenancy/dataSources.adoc | 12 +
.../setupMultitenancy/multiTenancyMode.adoc | 20 +
.../setupMultitenancy/multiTenancyResolver.adoc | 29 +
.../v8/guide/writingTheApp/tenantSelection.adoc | 62 ++
.../v8/snippets/gradle.properties | 6 +
.../v8/snippets/grails-app/conf/application.yml | 83 +++
.../controllers/demo/ManufacturerController.groovy | 42 ++
.../grails-app/controllers/demo/UrlMappings.groovy | 27 +
.../controllers/demo/VehicleController.groovy | 89 +++
.../snippets/grails-app/domain/demo/Engine.groovy | 11 +
.../grails-app/domain/demo/Manufacturer.groovy | 9 +
.../snippets/grails-app/domain/demo/Vehicle.groovy | 17 +
.../grails-app/init/demo/Application.groovy | 25 +
.../grails-app/services/demo/VehicleService.groovy | 50 ++
.../v8/snippets/grails-app/views/index.gsp | 27 +
.../groovy/demo/ManufacturersPage.groovy | 21 +
.../groovy/demo/NewVehiclePage.groovy | 20 +
.../groovy/demo/ShowVehiclePage.groovy | 16 +
.../demo/TenantIsolationIntegrationSpec.groovy | 54 ++
.../groovy/demo/TenantSelectionFuncSpec.groovy | 105 ++++
.../groovy/demo/VehiclesPage.groovy | 21 +
.../test/groovy/demo/VehicleControllerSpec.groovy | 148 +++++
guides/gorm-event-listeners/v8/guide/async.adoc | 36 ++
.../gorm-event-listeners/v8/guide/conclusion.adoc | 1 +
.../v8/guide/dataServices.adoc | 21 +
.../v8/guide/gettingStarted.adoc | 5 +
.../v8}/guide/helpWithGrails.adoc | 0
guides/gorm-event-listeners/v8/guide/howto.adoc | 10 +
.../v8/guide/requirements.adoc | 4 +
.../v8/guide/runningTheTests.adoc | 9 +
guides/gorm-event-listeners/v8/guide/sync.adoc | 81 +++
.../v8/guide/writingTheApp.adoc | 24 +
.../snippets/grails-app/domain/demo/Audit.groovy | 0
.../v8/snippets/grails-app/domain/demo/Book.groovy | 20 +
.../services/demo/AuditDataService.groovy | 19 +
.../services/demo/AuditListenerService.groovy | 50 ++
.../services/demo/BookDataService.groovy | 17 +
.../services/demo/FriendlyUrlService.groovy | 68 +++
.../demo/SerialNumberGeneratorService.groovy | 19 +
.../services/demo/TitleListenerService.groovy | 40 ++
.../AuditListenerServiceIntegrationSpec.groovy | 0
.../TitleListenerServiceIntegrationSpec.groovy | 0
.../groovy/demo/AuditListenerServiceSpec.groovy | 63 ++
.../test/groovy/demo/FriendlyUrlServiceSpec.groovy | 0
.../demo/TitleListenerServiceGrailsUnitSpec.groovy | 75 +++
.../groovy/demo/TitleListenerServiceSpec.groovy | 35 ++
guides/grails-basicauth/v3/guide/howto.adoc | 2 +-
guides/grails-basicauth/v4/guide/howto.adoc | 2 +-
.../v8/guide/addAttributes.adoc | 16 +
.../v8/guide/baseline.adoc | 37 ++
.../v8/guide/changelogDiscipline.adoc | 8 +
.../v8/guide/designedRollback.adoc | 31 +
.../v8/guide/gettingStarted.adoc | 17 +
.../v8}/guide/helpWithGrails.adoc | 0
.../v8/guide/introduction.adoc | 5 +
.../v8/guide/legacyOnboarding.adoc | 17 +
.../v8/guide/makeColumnNullable.adoc | 34 ++
.../v8/guide/pluginSetup.adoc | 19 +
.../v8/guide/redesignTables.adoc | 38 ++
.../v8/guide/releaseRunbook.adoc | 33 ++
.../v8/guide/requirements.adoc | 5 +
.../v8/guide/runningTheApp.adoc | 14 +
.../v8/guide/summary.adoc | 9 +
.../v8/guide/testing.adoc | 44 ++
.../v8/snippets/build.gradle | 1 +
.../conf/application-databasemigration.yml | 10 +
.../controllers/example/PersonController.groovy | 12 +
.../controllers/example/UrlMappings.groovy | 17 +
.../grails-app/domain/example/Address.groovy | 25 +
.../domain/example/Person-after-nullable.groovy | 15 +
.../domain/example/Person-initial.groovy | 15 +
.../grails-app/domain/example/Person.groovy | 21 +
.../migrations/add-address-fields-to-person.groovy | 20 +
.../change-age-constraint-to-nullable.groovy | 6 +
.../migrations/changelog-baseline.groovy | 4 +
.../changelog-through-address-fields.groovy | 6 +
.../grails-app/migrations/changelog.groovy | 7 +
.../migrations/create-address-table.groovy | 96 ++++
.../migrations/create-person-table.groovy | 19 +
.../DatabaseMigrationIntegrationSpec.groovy | 195 +++++++
.../src/test/groovy/example/AddressSpec.groovy | 28 +
.../src/test/groovy/example/PersonSpec.groovy | 24 +
.../v8/guide/createApp.adoc | 2 +-
.../v8/guide/download.adoc | 2 +-
.../v8/guide/howto.adoc | 2 +-
guides/grails-email/v3/guide/howto.adoc | 2 +-
guides/grails-email/v4/guide/howto.adoc | 2 +-
guides/grails-email/v8/guide/awsSesService.adoc | 9 +
guides/grails-email/v8/guide/controller.adoc | 39 ++
guides/grails-email/v8/guide/emailContract.adoc | 25 +
guides/grails-email/v8/guide/gettingStarted.adoc | 14 +
.../v8}/guide/helpWithGrails.adoc | 0
guides/grails-email/v8/guide/introduction.adoc | 5 +
.../grails-email/v8/guide/mailConfiguration.adoc | 9 +
guides/grails-email/v8/guide/requirements.adoc | 4 +
guides/grails-email/v8/guide/sendGridService.adoc | 9 +
guides/grails-email/v8/guide/smtpMail.adoc | 17 +
guides/grails-email/v8/guide/summary.adoc | 8 +
guides/grails-email/v8/guide/testing.adoc | 17 +
guides/grails-email/v8/snippets/build.gradle | 3 +
.../v8/snippets/grails-app/conf/application.yml | 28 +
.../grails-app/conf/spring/resources.groovy | 26 +
.../grails-app/controllers/example/EmailCmd.groovy | 27 +
.../controllers/example/MailController.groovy | 25 +
.../services/example/SmtpEmailService.groovy | 36 ++
.../snippets/grails-app/views/errors/_errors.gson | 44 ++
.../groovy/example/MailControllerSpec.groovy | 108 ++++
.../main/groovy/example/AwsSesEmailService.groovy | 83 +++
.../snippets/src/main/groovy/example/Email.groovy | 14 +
.../src/main/groovy/example/EmailService.groovy | 8 +
.../groovy/example/SendGridEmailService.groovy | 93 +++
.../v8/guide/createApp.adoc | 2 +-
.../v8/guide/download.adoc | 2 +-
.../v8/guide/howto.adoc | 2 +-
.../v8/guide/createApp.adoc | 2 +-
.../v8/guide/download.adoc | 2 +-
.../grails-github-actions-cicd/v8/guide/howto.adoc | 2 +-
guides/grails-htmx/v8/guide/createApp.adoc | 2 +-
.../v8/guide/domainAndControllers.adoc | 40 ++
.../v8/guide/gettingStarted.adoc | 22 +
.../v8}/guide/helpWithGrails.adoc | 0
.../v8/guide/httpClientSetup.adoc | 47 ++
.../grails-http-client/v8/guide/introduction.adoc | 5 +
.../grails-http-client/v8/guide/requirements.adoc | 5 +
.../grails-http-client/v8/guide/runningTheApp.adoc | 17 +
.../grails-http-client/v8/guide/searchService.adoc | 17 +
guides/grails-http-client/v8/guide/summary.adoc | 8 +
guides/grails-http-client/v8/guide/testing.adoc | 52 ++
.../example/RecordLabelController.groovy | 56 ++
.../controllers/example/SearchController.groovy | 21 +
.../controllers/example/UrlMappings.groovy | 19 +
.../grails-app/domain/example/RecordLabel.groovy | 19 +
.../grails-app/init/example/Application.groovy | 16 +
.../grails-app/init/example/BootStrap.groovy | 21 +
.../services/example/ItunesSearchService.groovy | 19 +
.../example/ItunesClientIntegrationSpec.groovy | 68 +++
.../example/RecordLabelIntegrationSpec.groovy | 21 +
.../snippets/src/main/groovy/example/Album.groovy | 10 +
.../src/main/groovy/example/ItunesClient.groovy | 14 +
.../example/ItunesClientConfiguration.groovy | 34 ++
.../src/main/groovy/example/SearchResult.groovy | 9 +
.../groovy/example/ItunesSearchServiceSpec.groovy | 25 +
.../src/test/groovy/example/RecordLabelSpec.groovy | 32 ++
.../grails-jobrunr/v8/guide/dependencySetup.adoc | 33 ++
guides/grails-jobrunr/v8/guide/durableEnqueue.adoc | 39 ++
guides/grails-jobrunr/v8/guide/gettingStarted.adoc | 13 +
.../v8}/guide/helpWithGrails.adoc | 0
guides/grails-jobrunr/v8/guide/howto.adoc | 10 +
guides/grails-jobrunr/v8/guide/jobApis.adoc | 49 ++
guides/grails-jobrunr/v8/guide/jobRequests.adoc | 28 +
guides/grails-jobrunr/v8/guide/operations.adoc | 25 +
guides/grails-jobrunr/v8/guide/requirements.adoc | 8 +
guides/grails-jobrunr/v8/guide/runningTheApp.adoc | 29 +
.../v8/guide/storageConfiguration.adoc | 29 +
guides/grails-jobrunr/v8/guide/testing.adoc | 61 ++
.../v8/snippets/complete/build.gradle | 38 ++
.../v8/snippets/complete/gradle.properties | 4 +
.../complete/grails-app/conf/application.yml | 64 +++
.../grails-app/conf/spring/resources.groovy | 5 +
.../example/grails/DeliveryController.groovy | 29 +
.../example/grails/JobExamplesController.groovy | 27 +
.../controllers/example/grails/UrlMappings.groovy | 12 +
.../domain/example/grails/Delivery.groovy | 14 +
.../init/example/grails/Application.groovy | 16 +
.../services/example/grails/DeliveryService.groovy | 23 +
.../example/grails/JobExamplesService.groovy | 34 ++
.../example/grails/DeliveryCreatedEvent.groovy | 12 +
.../example/grails/DeliveryJobEnqueuer.groovy | 21 +
.../jobrunr/DeliveryJobRequestHandler.groovy | 47 ++
.../grails/jobrunr/JobRunrStorageConfig.groovy | 29 +
.../jobrunr/ProcessDeliveryJobRequest.groovy | 21 +
.../grails/jobrunr/RetryDeliveryJobRequest.groovy | 21 +
.../jobrunr/RetryDeliveryJobRequestHandler.groovy | 16 +
.../example/grails/DeliveryHttpApiSpec.groovy | 69 +++
.../example/grails/DeliveryJobEnqueuerSpec.groovy | 32 ++
.../grails/JobExamplesControllerSpec.groovy | 39 ++
.../example/grails/JobExamplesServiceSpec.groovy | 24 +
.../example/grails/JobRunrIntegrationSpec.groovy | 67 +++
.../example/grails/jobrunr/JobRequestSpec.groovy | 21 +
.../grails/jobrunr/JobRunrStorageConfigSpec.groovy | 45 ++
.../v8/snippets/initial/build.gradle | 31 +
.../v8/snippets/initial/gradle.properties | 3 +
.../v4/guide/buildingAnalytics.adoc | 2 +-
.../v3/guide/openweather.adoc | 2 -
.../v3/guide/runningTheApp.adoc | 4 +-
guides/grails-mock-http-server/v3/img/apiKey.png | Bin 123760 -> 0 bytes
.../v3/snippets/grails-app/conf/application.yml | 2 +-
.../v4/guide/openweather.adoc | 2 -
.../v4/guide/runningTheApp.adoc | 4 +-
guides/grails-mock-http-server/v4/img/apiKey.png | Bin 123760 -> 0 bytes
.../v4/snippets/grails-app/conf/application.yml | 2 +-
.../v8/guide/configuration.adoc | 7 +
.../v8/guide/controllers.adoc | 25 +
.../grails-multi-datasource/v8/guide/domain.adoc | 27 +
.../v8/guide/gettingStarted.adoc | 1 +
.../v8}/guide/helpWithGrails.adoc | 0
guides/grails-multi-datasource/v8/guide/howto.adoc | 10 +
.../v8/guide/requirements.adoc | 4 +
.../grails-multi-datasource/v8/guide/services.adoc | 59 ++
guides/grails-multi-datasource/v8/guide/test.adoc | 7 +
.../v8/guide/testingTheApp.adoc | 7 +
guides/grails-multi-datasource/v8/guide/views.adoc | 31 +
.../v8/guide/writingTheApp.adoc | 5 +
.../{v3 => v8}/img/graph.jpg | Bin
.../v8/snippets/grails-app/conf/application.yml | 76 +++
.../controllers/demo/BookController.groovy | 36 ++
.../controllers/demo/MovieController.groovy | 36 ++
.../controllers/demo/SaveBookCommand.groovy | 15 +
.../controllers/demo/SaveMovieCommand.groovy | 15 +
.../v8/snippets/grails-app/domain/demo/Book.groovy | 11 +
.../snippets/grails-app/domain/demo/Keyword.groovy | 11 +
.../snippets/grails-app/domain/demo/Movie.groovy | 6 +
.../services/demo/BookDataService.groovy | 0
.../grails-app/services/demo/BookService.groovy | 24 +
.../grails-app/services/demo/KeywordService.groovy | 27 +
.../services/demo/MovieDataService.groovy | 15 +
.../grails-app/services/demo/MovieService.groovy | 24 +
.../v8/snippets/grails-app/views/book/_book.gson | 10 +
.../snippets/grails-app/views/book/index.gson | 0
.../snippets/grails-app/views/keyword/index.gson | 0
.../v8/snippets/grails-app/views/movie/_movie.gson | 10 +
.../snippets/grails-app/views/movie/index.gson | 0
.../groovy/demo/MultipleDataSourceSpec.groovy | 120 ++++
.../v8/guide/generateModules.adoc | 2 +-
.../grails-multi-module/v8/guide/requirements.adoc | 2 +-
guides/grails-oauth-google/v4/guide/howto.adoc | 2 +-
guides/grails-oauth-twitter/v4/guide/howto.adoc | 2 +-
.../v4/guide/writingTheApp.adoc | 2 +-
.../v3/guide/writingTheApp.adoc | 2 +-
.../v4/guide/writingTheApp.adoc | 2 +-
.../v4/guide/buildingAnalytics.adoc | 2 +-
guides/grails-rest-library/v8/guide/createApp.adoc | 2 +-
guides/grails-rest-library/v8/guide/download.adoc | 2 +-
guides/grails-rest-library/v8/guide/howto.adoc | 2 +-
guides/grails-tailwindcss/v8/guide/createApp.adoc | 2 +-
guides/grails-tailwindcss/v8/guide/download.adoc | 2 +-
guides/grails-tailwindcss/v8/guide/howto.adoc | 2 +-
.../v8/guide/download.adoc | 4 +-
.../v8/guide/howto.adoc | 2 +-
guides/grails-vs-nodejs/v4/guide/reactProfile.adoc | 2 +-
.../v4/guide/creatingTheApp.adoc | 7 +-
.../grails_url_mappings/v8/guide/conclusion.adoc | 1 +
.../grails_url_mappings/v8/guide/controllers.adoc | 82 +++
.../v8/guide/creatingTheApp.adoc | 10 +
.../v8/guide/gettingStarted.adoc | 5 +
.../v8}/guide/helpWithGrails.adoc | 0
guides/grails_url_mappings/v8/guide/howto.adoc | 10 +
.../grails_url_mappings/v8/guide/requirements.adoc | 4 +
.../v8/guide/splitUrlMappings.adoc | 50 ++
guides/grails_url_mappings/v8/guide/testing.adoc | 24 +
.../grails_url_mappings/v8/guide/urlMappings.adoc | 153 +++++
.../controllers/demo/AgendaController.groovy | 0
.../controllers/demo/ConferenceController.groovy | 24 +
.../controllers/demo/ConferenceUrlMappings.groovy | 0
.../controllers/demo/SpeakerController.groovy | 0
.../controllers/demo/TalkController.groovy | 0
.../grails-app/controllers/demo/UrlMappings.groovy | 17 +
.../groovy/demo/ConferenceUrlMappingsSpec.groovy | 26 +
guides/resources/css/guide.css | 176 +++++-
guides/resources/style/guideItem.html | 32 +-
guides/resources/style/layout.html | 9 +-
.../v4/guide/generateTheApp.adoc | 7 +-
.../v3/guide/generateTheApp.adoc | 7 +-
.../v4/guide/generateTheApp.adoc | 7 +-
pages/community.html | 445 +++++++++++---
pages/index.html | 37 +-
pages/search.html | 107 +---
pages/support-schedule.html | 48 +-
pages/support.html | 8 +-
posts/2016-12-14.md | 4 +-
posts/2017-11-21.md | 6 +-
posts/2017-12-05.md | 4 +-
posts/2023-08-03-introducing-new-grails-forge.md | 8 +-
posts/2023-11-14-introducing-grails-6_1_0.md | 4 +-
posts/2024-10-03-introducing-grails-6-2-1.md | 6 +-
posts/2024-11-20-introducing-grails-6-2-2.md | 4 +-
posts/2024-12-23-grails-7-m1.md | 8 +-
posts/2025-01-03-introducing-grails-6-2-3.md | 4 +-
posts/2025-03-05-grails-7-m3.md | 4 +-
posts/2025-06-10-grails-7-m4.md | 4 +-
posts/2025-07-15-grails-7-m5.md | 4 +-
posts/2025-08-10-grails-7-rc1.md | 4 +-
posts/2025-09-11-grails-7-rc2.md | 4 +-
posts/2025-10-18-introducing-grails-7.md | 4 +-
...-28-soren-glasius-lifetime-contributor-award.md | 69 +++
templates/document.html | 3 +
templates/partials/site-head.html | 30 +-
templates/partials/site-header.html | 109 +++-
415 files changed, 15264 insertions(+), 665 deletions(-)
create mode 100644 .github/workflows/algolia-index.yml
create mode 100644 .github/workflows/release-tool.yml
create mode 100644 DESIGN.md
create mode 100644 assets/images/algolia-logo-blue.svg
create mode 100644 assets/images/confs/javamug.png
delete mode 100644 assets/images/confs/stljug.jpg
create mode 100644 assets/images/grails-teepublic-shirt-acid-black.jpg
create mode 100644 assets/images/restapis-guides.svg
create mode 100644 assets/images/soren-glasius-2026-lifetime-contributor.png
create mode 100644 assets/javascripts/algolia-search.js
create mode 100644 assets/stylesheets/algolia-search.css
create mode 100644 buildSrc/src/main/groovy/website/gradle/tasks/CollectAlgoliaDocumentationTask.groovy
create mode 100644 buildSrc/src/main/groovy/website/gradle/tasks/ExportAlgoliaIndexTask.groovy
create mode 100644 buildSrc/src/main/groovy/website/gradle/tasks/GenerateAlgoliaConfigTask.groovy
create mode 100644 buildSrc/src/main/groovy/website/gradle/tasks/RecordToolReleaseTask.groovy
create mode 100644 buildSrc/src/main/groovy/website/gradle/tasks/UploadAlgoliaIndexTask.groovy
create mode 100644 buildSrc/src/test/groovy/website/gradle/RenderGuidesPluginSnippetSpec.groovy
create mode 100644 buildSrc/src/test/groovy/website/gradle/tasks/AlgoliaSearchPageSpec.groovy
create mode 100644 buildSrc/src/test/groovy/website/gradle/tasks/AlgoliaTaskWiringSpec.groovy
create mode 100644 buildSrc/src/test/groovy/website/gradle/tasks/CollectAlgoliaDocumentationTaskSpec.groovy
create mode 100644 buildSrc/src/test/groovy/website/gradle/tasks/ExportAlgoliaIndexTaskSpec.groovy
create mode 100644 buildSrc/src/test/groovy/website/gradle/tasks/GenerateAlgoliaConfigTaskSpec.groovy
create mode 100644 buildSrc/src/test/groovy/website/gradle/tasks/PublishMainSiteTaskSpec.groovy
create mode 100644 buildSrc/src/test/groovy/website/gradle/tasks/RecordToolReleaseTaskSpec.groovy
create mode 100644 buildSrc/src/test/groovy/website/gradle/tasks/RenderSiteTaskSpec.groovy
create mode 100644 buildSrc/src/test/groovy/website/model/guides/GuidesPageSpec.groovy
create mode 100755 etc/bin/upload-algolia-index.sh
create mode 100644 guides/command-objects-and-forms/v8/guide/addCreateAndSaveActions.adoc
create mode 100644 guides/command-objects-and-forms/v8/guide/addEditAndUpdateActions.adoc
create mode 100644 guides/command-objects-and-forms/v8/guide/createTheController.adoc
create mode 100644 guides/command-objects-and-forms/v8/guide/gettingStarted.adoc
copy guides/{angular2-combined/v4 => command-objects-and-forms/v8}/guide/helpWithGrails.adoc (100%)
create mode 100644 guides/command-objects-and-forms/v8/guide/howto.adoc
create mode 100644 guides/command-objects-and-forms/v8/guide/requirements.adoc
create mode 100644 guides/command-objects-and-forms/v8/guide/runningTheApp.adoc
create mode 100644 guides/command-objects-and-forms/v8/guide/whatAreCommandObjects.adoc
create mode 100644 guides/command-objects-and-forms/v8/guide/writingTheApp.adoc
create mode 100644 guides/command-objects-and-forms/v8/snippets/grails-app/controllers/demo/PlayerController.groovy
copy guides/command-objects-and-forms/{v3 => v8}/snippets/grails-app/domain/demo/Player.groovy (100%)
create mode 100644 guides/command-objects-and-forms/v8/snippets/grails-app/views/player/create.gsp
create mode 100644 guides/command-objects-and-forms/v8/snippets/grails-app/views/player/edit.gsp
create mode 100644 guides/command-objects-and-forms/v8/snippets/src/integration-test/groovy/demo/PlayerControllerFuncSpec.groovy
create mode 100644 guides/command-objects-and-forms/v8/snippets/src/test/groovy/demo/PlayerControllerSpec.groovy
create mode 100644 guides/command-objects-and-forms/v8/snippets/src/test/groovy/demo/PlayerInfoSpec.groovy
create mode 100644 guides/creating-your-first-grails-app/v8/guide/assetPipeline.adoc
create mode 100644 guides/creating-your-first-grails-app/v8/guide/controllers.adoc
create mode 100644 guides/creating-your-first-grails-app/v8/guide/creatingTheApp.adoc
create mode 100644 guides/creating-your-first-grails-app/v8/guide/domainClasses.adoc
create mode 100644 guides/creating-your-first-grails-app/v8/guide/gettingStarted.adoc
copy guides/{angular2-combined/v4 => creating-your-first-grails-app/v8}/guide/helpWithGrails.adoc (100%)
create mode 100644 guides/creating-your-first-grails-app/v8/guide/introduction.adoc
create mode 100644 guides/creating-your-first-grails-app/v8/guide/requirements.adoc
create mode 100644 guides/creating-your-first-grails-app/v8/guide/runningTheApp.adoc
create mode 100644 guides/creating-your-first-grails-app/v8/guide/services.adoc
create mode 100644 guides/creating-your-first-grails-app/v8/guide/summary.adoc
create mode 100644 guides/creating-your-first-grails-app/v8/guide/testing.adoc
create mode 100644 guides/creating-your-first-grails-app/v8/guide/views.adoc
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/assets/javascripts/application.js
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/assets/stylesheets/application.css
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/controllers/example/HomeController.groovy
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/controllers/example/MakeController.groovy
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/controllers/example/ModelController.groovy
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/controllers/example/UrlMappings.groovy
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/controllers/example/VehicleController.groovy
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/domain/example/Make.groovy
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/domain/example/Model.groovy
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/domain/example/Vehicle.groovy
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/init/example/BootStrap.groovy
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/services/example/MakeService.groovy
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/services/example/ModelService.groovy
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/services/example/ValueEstimateService.groovy
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/services/example/VehicleService.groovy
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/views/home/index.gsp
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/views/vehicle/create.gsp
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/views/vehicle/edit.gsp
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/views/vehicle/index.gsp
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/grails-app/views/vehicle/show.gsp
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/src/integration-test/groovy/example/HomePageSpec.groovy
create mode 100644 guides/creating-your-first-grails-app/v8/snippets/src/test/groovy/example/ValueEstimateServiceSpec.groovy
create mode 100644 guides/database-per-tenant/v8/guide/gettingStarted.adoc
copy guides/{angular2-combined/v4 => database-per-tenant/v8}/guide/helpWithGrails.adoc (100%)
create mode 100644 guides/database-per-tenant/v8/guide/howto.adoc
create mode 100644 guides/database-per-tenant/v8/guide/integrationTest.adoc
create mode 100644 guides/database-per-tenant/v8/guide/requirements.adoc
create mode 100644 guides/database-per-tenant/v8/guide/runningTheApp.adoc
copy guides/database-per-tenant/{v4 => v8}/guide/setupMultitenancy.adoc (100%)
create mode 100644 guides/database-per-tenant/v8/guide/testingTheApp.adoc
create mode 100644 guides/database-per-tenant/v8/guide/writingTheApp.adoc
create mode 100644 guides/database-per-tenant/v8/guide/writingTheApp/domainClasses.adoc
create mode 100644 guides/database-per-tenant/v8/guide/writingTheApp/multiTenantLogic.adoc
create mode 100644 guides/database-per-tenant/v8/guide/writingTheApp/multiTenantLogic/readingData.adoc
create mode 100644 guides/database-per-tenant/v8/guide/writingTheApp/multiTenantLogic/writingData.adoc
create mode 100644 guides/database-per-tenant/v8/guide/writingTheApp/seedData.adoc
create mode 100644 guides/database-per-tenant/v8/guide/writingTheApp/setupMultitenancy/dataSources.adoc
create mode 100644 guides/database-per-tenant/v8/guide/writingTheApp/setupMultitenancy/multiTenancyMode.adoc
create mode 100644 guides/database-per-tenant/v8/guide/writingTheApp/setupMultitenancy/multiTenancyResolver.adoc
create mode 100644 guides/database-per-tenant/v8/guide/writingTheApp/tenantSelection.adoc
create mode 100644 guides/database-per-tenant/v8/snippets/gradle.properties
create mode 100644 guides/database-per-tenant/v8/snippets/grails-app/conf/application.yml
create mode 100644 guides/database-per-tenant/v8/snippets/grails-app/controllers/demo/ManufacturerController.groovy
create mode 100644 guides/database-per-tenant/v8/snippets/grails-app/controllers/demo/UrlMappings.groovy
create mode 100644 guides/database-per-tenant/v8/snippets/grails-app/controllers/demo/VehicleController.groovy
create mode 100644 guides/database-per-tenant/v8/snippets/grails-app/domain/demo/Engine.groovy
create mode 100644 guides/database-per-tenant/v8/snippets/grails-app/domain/demo/Manufacturer.groovy
create mode 100644 guides/database-per-tenant/v8/snippets/grails-app/domain/demo/Vehicle.groovy
create mode 100644 guides/database-per-tenant/v8/snippets/grails-app/init/demo/Application.groovy
create mode 100644 guides/database-per-tenant/v8/snippets/grails-app/services/demo/VehicleService.groovy
create mode 100644 guides/database-per-tenant/v8/snippets/grails-app/views/index.gsp
create mode 100644 guides/database-per-tenant/v8/snippets/src/integration-test/groovy/demo/ManufacturersPage.groovy
create mode 100644 guides/database-per-tenant/v8/snippets/src/integration-test/groovy/demo/NewVehiclePage.groovy
create mode 100644 guides/database-per-tenant/v8/snippets/src/integration-test/groovy/demo/ShowVehiclePage.groovy
create mode 100644 guides/database-per-tenant/v8/snippets/src/integration-test/groovy/demo/TenantIsolationIntegrationSpec.groovy
create mode 100644 guides/database-per-tenant/v8/snippets/src/integration-test/groovy/demo/TenantSelectionFuncSpec.groovy
create mode 100644 guides/database-per-tenant/v8/snippets/src/integration-test/groovy/demo/VehiclesPage.groovy
create mode 100644 guides/database-per-tenant/v8/snippets/src/test/groovy/demo/VehicleControllerSpec.groovy
create mode 100644 guides/gorm-event-listeners/v8/guide/async.adoc
create mode 100644 guides/gorm-event-listeners/v8/guide/conclusion.adoc
create mode 100644 guides/gorm-event-listeners/v8/guide/dataServices.adoc
create mode 100644 guides/gorm-event-listeners/v8/guide/gettingStarted.adoc
copy guides/{angular2-combined/v4 => gorm-event-listeners/v8}/guide/helpWithGrails.adoc (100%)
create mode 100644 guides/gorm-event-listeners/v8/guide/howto.adoc
create mode 100644 guides/gorm-event-listeners/v8/guide/requirements.adoc
create mode 100644 guides/gorm-event-listeners/v8/guide/runningTheTests.adoc
create mode 100644 guides/gorm-event-listeners/v8/guide/sync.adoc
create mode 100644 guides/gorm-event-listeners/v8/guide/writingTheApp.adoc
copy guides/gorm-event-listeners/{v3 => v8}/snippets/grails-app/domain/demo/Audit.groovy (100%)
create mode 100644 guides/gorm-event-listeners/v8/snippets/grails-app/domain/demo/Book.groovy
create mode 100644 guides/gorm-event-listeners/v8/snippets/grails-app/services/demo/AuditDataService.groovy
create mode 100644 guides/gorm-event-listeners/v8/snippets/grails-app/services/demo/AuditListenerService.groovy
create mode 100644 guides/gorm-event-listeners/v8/snippets/grails-app/services/demo/BookDataService.groovy
create mode 100644 guides/gorm-event-listeners/v8/snippets/grails-app/services/demo/FriendlyUrlService.groovy
create mode 100644 guides/gorm-event-listeners/v8/snippets/grails-app/services/demo/SerialNumberGeneratorService.groovy
create mode 100644 guides/gorm-event-listeners/v8/snippets/grails-app/services/demo/TitleListenerService.groovy
copy guides/gorm-event-listeners/{v4 => v8}/snippets/src/integration-test/groovy/demo/AuditListenerServiceIntegrationSpec.groovy (100%)
copy guides/gorm-event-listeners/{v3 => v8}/snippets/src/integration-test/groovy/demo/TitleListenerServiceIntegrationSpec.groovy (100%)
create mode 100644 guides/gorm-event-listeners/v8/snippets/src/test/groovy/demo/AuditListenerServiceSpec.groovy
copy guides/gorm-event-listeners/{v3 => v8}/snippets/src/test/groovy/demo/FriendlyUrlServiceSpec.groovy (100%)
create mode 100644 guides/gorm-event-listeners/v8/snippets/src/test/groovy/demo/TitleListenerServiceGrailsUnitSpec.groovy
create mode 100644 guides/gorm-event-listeners/v8/snippets/src/test/groovy/demo/TitleListenerServiceSpec.groovy
create mode 100644 guides/grails-database-migration/v8/guide/addAttributes.adoc
create mode 100644 guides/grails-database-migration/v8/guide/baseline.adoc
create mode 100644 guides/grails-database-migration/v8/guide/changelogDiscipline.adoc
create mode 100644 guides/grails-database-migration/v8/guide/designedRollback.adoc
create mode 100644 guides/grails-database-migration/v8/guide/gettingStarted.adoc
copy guides/{angular2-combined/v4 => grails-database-migration/v8}/guide/helpWithGrails.adoc (100%)
create mode 100644 guides/grails-database-migration/v8/guide/introduction.adoc
create mode 100644 guides/grails-database-migration/v8/guide/legacyOnboarding.adoc
create mode 100644 guides/grails-database-migration/v8/guide/makeColumnNullable.adoc
create mode 100644 guides/grails-database-migration/v8/guide/pluginSetup.adoc
create mode 100644 guides/grails-database-migration/v8/guide/redesignTables.adoc
create mode 100644 guides/grails-database-migration/v8/guide/releaseRunbook.adoc
create mode 100644 guides/grails-database-migration/v8/guide/requirements.adoc
create mode 100644 guides/grails-database-migration/v8/guide/runningTheApp.adoc
create mode 100644 guides/grails-database-migration/v8/guide/summary.adoc
create mode 100644 guides/grails-database-migration/v8/guide/testing.adoc
create mode 100644 guides/grails-database-migration/v8/snippets/build.gradle
create mode 100644 guides/grails-database-migration/v8/snippets/grails-app/conf/application-databasemigration.yml
create mode 100644 guides/grails-database-migration/v8/snippets/grails-app/controllers/example/PersonController.groovy
create mode 100644 guides/grails-database-migration/v8/snippets/grails-app/controllers/example/UrlMappings.groovy
create mode 100644 guides/grails-database-migration/v8/snippets/grails-app/domain/example/Address.groovy
create mode 100644 guides/grails-database-migration/v8/snippets/grails-app/domain/example/Person-after-nullable.groovy
create mode 100644 guides/grails-database-migration/v8/snippets/grails-app/domain/example/Person-initial.groovy
create mode 100644 guides/grails-database-migration/v8/snippets/grails-app/domain/example/Person.groovy
create mode 100644 guides/grails-database-migration/v8/snippets/grails-app/migrations/add-address-fields-to-person.groovy
create mode 100644 guides/grails-database-migration/v8/snippets/grails-app/migrations/change-age-constraint-to-nullable.groovy
create mode 100644 guides/grails-database-migration/v8/snippets/grails-app/migrations/changelog-baseline.groovy
create mode 100644 guides/grails-database-migration/v8/snippets/grails-app/migrations/changelog-through-address-fields.groovy
create mode 100644 guides/grails-database-migration/v8/snippets/grails-app/migrations/changelog.groovy
create mode 100644 guides/grails-database-migration/v8/snippets/grails-app/migrations/create-address-table.groovy
create mode 100644 guides/grails-database-migration/v8/snippets/grails-app/migrations/create-person-table.groovy
create mode 100644 guides/grails-database-migration/v8/snippets/src/integration-test/groovy/example/DatabaseMigrationIntegrationSpec.groovy
create mode 100644 guides/grails-database-migration/v8/snippets/src/test/groovy/example/AddressSpec.groovy
create mode 100644 guides/grails-database-migration/v8/snippets/src/test/groovy/example/PersonSpec.groovy
create mode 100644 guides/grails-email/v8/guide/awsSesService.adoc
create mode 100644 guides/grails-email/v8/guide/controller.adoc
create mode 100644 guides/grails-email/v8/guide/emailContract.adoc
create mode 100644 guides/grails-email/v8/guide/gettingStarted.adoc
copy guides/{angular2-combined/v4 => grails-email/v8}/guide/helpWithGrails.adoc (100%)
create mode 100644 guides/grails-email/v8/guide/introduction.adoc
create mode 100644 guides/grails-email/v8/guide/mailConfiguration.adoc
create mode 100644 guides/grails-email/v8/guide/requirements.adoc
create mode 100644 guides/grails-email/v8/guide/sendGridService.adoc
create mode 100644 guides/grails-email/v8/guide/smtpMail.adoc
create mode 100644 guides/grails-email/v8/guide/summary.adoc
create mode 100644 guides/grails-email/v8/guide/testing.adoc
create mode 100644 guides/grails-email/v8/snippets/build.gradle
create mode 100644 guides/grails-email/v8/snippets/grails-app/conf/application.yml
create mode 100644 guides/grails-email/v8/snippets/grails-app/conf/spring/resources.groovy
create mode 100644 guides/grails-email/v8/snippets/grails-app/controllers/example/EmailCmd.groovy
create mode 100644 guides/grails-email/v8/snippets/grails-app/controllers/example/MailController.groovy
create mode 100644 guides/grails-email/v8/snippets/grails-app/services/example/SmtpEmailService.groovy
create mode 100644 guides/grails-email/v8/snippets/grails-app/views/errors/_errors.gson
create mode 100644 guides/grails-email/v8/snippets/src/integration-test/groovy/example/MailControllerSpec.groovy
create mode 100644 guides/grails-email/v8/snippets/src/main/groovy/example/AwsSesEmailService.groovy
create mode 100644 guides/grails-email/v8/snippets/src/main/groovy/example/Email.groovy
create mode 100644 guides/grails-email/v8/snippets/src/main/groovy/example/EmailService.groovy
create mode 100644 guides/grails-email/v8/snippets/src/main/groovy/example/SendGridEmailService.groovy
create mode 100644 guides/grails-http-client/v8/guide/domainAndControllers.adoc
create mode 100644 guides/grails-http-client/v8/guide/gettingStarted.adoc
copy guides/{angular2-combined/v4 => grails-http-client/v8}/guide/helpWithGrails.adoc (100%)
create mode 100644 guides/grails-http-client/v8/guide/httpClientSetup.adoc
create mode 100644 guides/grails-http-client/v8/guide/introduction.adoc
create mode 100644 guides/grails-http-client/v8/guide/requirements.adoc
create mode 100644 guides/grails-http-client/v8/guide/runningTheApp.adoc
create mode 100644 guides/grails-http-client/v8/guide/searchService.adoc
create mode 100644 guides/grails-http-client/v8/guide/summary.adoc
create mode 100644 guides/grails-http-client/v8/guide/testing.adoc
create mode 100644 guides/grails-http-client/v8/snippets/grails-app/controllers/example/RecordLabelController.groovy
create mode 100644 guides/grails-http-client/v8/snippets/grails-app/controllers/example/SearchController.groovy
create mode 100644 guides/grails-http-client/v8/snippets/grails-app/controllers/example/UrlMappings.groovy
create mode 100644 guides/grails-http-client/v8/snippets/grails-app/domain/example/RecordLabel.groovy
create mode 100644 guides/grails-http-client/v8/snippets/grails-app/init/example/Application.groovy
create mode 100644 guides/grails-http-client/v8/snippets/grails-app/init/example/BootStrap.groovy
create mode 100644 guides/grails-http-client/v8/snippets/grails-app/services/example/ItunesSearchService.groovy
create mode 100644 guides/grails-http-client/v8/snippets/src/integration-test/groovy/example/ItunesClientIntegrationSpec.groovy
create mode 100644 guides/grails-http-client/v8/snippets/src/integration-test/groovy/example/RecordLabelIntegrationSpec.groovy
create mode 100644 guides/grails-http-client/v8/snippets/src/main/groovy/example/Album.groovy
create mode 100644 guides/grails-http-client/v8/snippets/src/main/groovy/example/ItunesClient.groovy
create mode 100644 guides/grails-http-client/v8/snippets/src/main/groovy/example/ItunesClientConfiguration.groovy
create mode 100644 guides/grails-http-client/v8/snippets/src/main/groovy/example/SearchResult.groovy
create mode 100644 guides/grails-http-client/v8/snippets/src/test/groovy/example/ItunesSearchServiceSpec.groovy
create mode 100644 guides/grails-http-client/v8/snippets/src/test/groovy/example/RecordLabelSpec.groovy
create mode 100644 guides/grails-jobrunr/v8/guide/dependencySetup.adoc
create mode 100644 guides/grails-jobrunr/v8/guide/durableEnqueue.adoc
create mode 100644 guides/grails-jobrunr/v8/guide/gettingStarted.adoc
copy guides/{angular2-combined/v4 => grails-jobrunr/v8}/guide/helpWithGrails.adoc (100%)
create mode 100644 guides/grails-jobrunr/v8/guide/howto.adoc
create mode 100644 guides/grails-jobrunr/v8/guide/jobApis.adoc
create mode 100644 guides/grails-jobrunr/v8/guide/jobRequests.adoc
create mode 100644 guides/grails-jobrunr/v8/guide/operations.adoc
create mode 100644 guides/grails-jobrunr/v8/guide/requirements.adoc
create mode 100644 guides/grails-jobrunr/v8/guide/runningTheApp.adoc
create mode 100644 guides/grails-jobrunr/v8/guide/storageConfiguration.adoc
create mode 100644 guides/grails-jobrunr/v8/guide/testing.adoc
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/build.gradle
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/gradle.properties
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/grails-app/conf/application.yml
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/grails-app/conf/spring/resources.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/grails-app/controllers/example/grails/DeliveryController.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/grails-app/controllers/example/grails/JobExamplesController.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/grails-app/controllers/example/grails/UrlMappings.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/grails-app/domain/example/grails/Delivery.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/grails-app/init/example/grails/Application.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/grails-app/services/example/grails/DeliveryService.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/grails-app/services/example/grails/JobExamplesService.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/src/main/groovy/example/grails/DeliveryCreatedEvent.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/src/main/groovy/example/grails/DeliveryJobEnqueuer.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/src/main/groovy/example/grails/jobrunr/DeliveryJobRequestHandler.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/src/main/groovy/example/grails/jobrunr/JobRunrStorageConfig.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/src/main/groovy/example/grails/jobrunr/ProcessDeliveryJobRequest.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/src/main/groovy/example/grails/jobrunr/RetryDeliveryJobRequest.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/src/main/groovy/example/grails/jobrunr/RetryDeliveryJobRequestHandler.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/src/test/groovy/example/grails/DeliveryHttpApiSpec.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/src/test/groovy/example/grails/DeliveryJobEnqueuerSpec.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/src/test/groovy/example/grails/JobExamplesControllerSpec.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/src/test/groovy/example/grails/JobExamplesServiceSpec.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/src/test/groovy/example/grails/JobRunrIntegrationSpec.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/src/test/groovy/example/grails/jobrunr/JobRequestSpec.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/complete/src/test/groovy/example/grails/jobrunr/JobRunrStorageConfigSpec.groovy
create mode 100644 guides/grails-jobrunr/v8/snippets/initial/build.gradle
create mode 100644 guides/grails-jobrunr/v8/snippets/initial/gradle.properties
delete mode 100644 guides/grails-mock-http-server/v3/img/apiKey.png
delete mode 100644 guides/grails-mock-http-server/v4/img/apiKey.png
create mode 100644 guides/grails-multi-datasource/v8/guide/configuration.adoc
create mode 100644 guides/grails-multi-datasource/v8/guide/controllers.adoc
create mode 100644 guides/grails-multi-datasource/v8/guide/domain.adoc
create mode 100644 guides/grails-multi-datasource/v8/guide/gettingStarted.adoc
copy guides/{angular2-combined/v4 => grails-multi-datasource/v8}/guide/helpWithGrails.adoc (100%)
create mode 100644 guides/grails-multi-datasource/v8/guide/howto.adoc
create mode 100644 guides/grails-multi-datasource/v8/guide/requirements.adoc
create mode 100644 guides/grails-multi-datasource/v8/guide/services.adoc
create mode 100644 guides/grails-multi-datasource/v8/guide/test.adoc
create mode 100644 guides/grails-multi-datasource/v8/guide/testingTheApp.adoc
create mode 100644 guides/grails-multi-datasource/v8/guide/views.adoc
create mode 100644 guides/grails-multi-datasource/v8/guide/writingTheApp.adoc
copy guides/grails-multi-datasource/{v3 => v8}/img/graph.jpg (100%)
create mode 100644 guides/grails-multi-datasource/v8/snippets/grails-app/conf/application.yml
create mode 100644 guides/grails-multi-datasource/v8/snippets/grails-app/controllers/demo/BookController.groovy
create mode 100644 guides/grails-multi-datasource/v8/snippets/grails-app/controllers/demo/MovieController.groovy
create mode 100644 guides/grails-multi-datasource/v8/snippets/grails-app/controllers/demo/SaveBookCommand.groovy
create mode 100644 guides/grails-multi-datasource/v8/snippets/grails-app/controllers/demo/SaveMovieCommand.groovy
create mode 100644 guides/grails-multi-datasource/v8/snippets/grails-app/domain/demo/Book.groovy
create mode 100644 guides/grails-multi-datasource/v8/snippets/grails-app/domain/demo/Keyword.groovy
create mode 100644 guides/grails-multi-datasource/v8/snippets/grails-app/domain/demo/Movie.groovy
copy guides/grails-multi-datasource/{v3 => v8}/snippets/grails-app/services/demo/BookDataService.groovy (100%)
create mode 100644 guides/grails-multi-datasource/v8/snippets/grails-app/services/demo/BookService.groovy
create mode 100644 guides/grails-multi-datasource/v8/snippets/grails-app/services/demo/KeywordService.groovy
create mode 100644 guides/grails-multi-datasource/v8/snippets/grails-app/services/demo/MovieDataService.groovy
create mode 100644 guides/grails-multi-datasource/v8/snippets/grails-app/services/demo/MovieService.groovy
create mode 100644 guides/grails-multi-datasource/v8/snippets/grails-app/views/book/_book.gson
copy guides/grails-multi-datasource/{v3 => v8}/snippets/grails-app/views/book/index.gson (100%)
copy guides/grails-multi-datasource/{v3 => v8}/snippets/grails-app/views/keyword/index.gson (100%)
create mode 100644 guides/grails-multi-datasource/v8/snippets/grails-app/views/movie/_movie.gson
copy guides/grails-multi-datasource/{v3 => v8}/snippets/grails-app/views/movie/index.gson (100%)
create mode 100644 guides/grails-multi-datasource/v8/snippets/src/integration-test/groovy/demo/MultipleDataSourceSpec.groovy
create mode 100644 guides/grails_url_mappings/v8/guide/conclusion.adoc
create mode 100644 guides/grails_url_mappings/v8/guide/controllers.adoc
create mode 100644 guides/grails_url_mappings/v8/guide/creatingTheApp.adoc
create mode 100644 guides/grails_url_mappings/v8/guide/gettingStarted.adoc
copy guides/{angular2-combined/v4 => grails_url_mappings/v8}/guide/helpWithGrails.adoc (100%)
create mode 100644 guides/grails_url_mappings/v8/guide/howto.adoc
create mode 100644 guides/grails_url_mappings/v8/guide/requirements.adoc
create mode 100644 guides/grails_url_mappings/v8/guide/splitUrlMappings.adoc
create mode 100644 guides/grails_url_mappings/v8/guide/testing.adoc
create mode 100644 guides/grails_url_mappings/v8/guide/urlMappings.adoc
copy guides/grails_url_mappings/{v4 => v8}/snippets/grails-app/controllers/demo/AgendaController.groovy (100%)
create mode 100644 guides/grails_url_mappings/v8/snippets/grails-app/controllers/demo/ConferenceController.groovy
copy guides/grails_url_mappings/{v4 => v8}/snippets/grails-app/controllers/demo/ConferenceUrlMappings.groovy (100%)
copy guides/grails_url_mappings/{v4 => v8}/snippets/grails-app/controllers/demo/SpeakerController.groovy (100%)
copy guides/grails_url_mappings/{v4 => v8}/snippets/grails-app/controllers/demo/TalkController.groovy (100%)
create mode 100644 guides/grails_url_mappings/v8/snippets/grails-app/controllers/demo/UrlMappings.groovy
create mode 100644 guides/grails_url_mappings/v8/snippets/src/test/groovy/demo/ConferenceUrlMappingsSpec.groovy
create mode 100644 posts/2026-07-28-soren-glasius-lifetime-contributor-award.md