Video by via Dailymotion Source Lorenzo Sonego earned a handshake from Ben Shelton after pulling off an acrobatic move at the net. Go to Source
Tennis – Australian Open 2025 – Lorenzo Sonego : “Ben Shelton has changed a lot in these two years”
Please join us (in French/ en français) for the Moodle Academy webinar ‘La gestion des rôles dans Moodle’ on 5 February, 13:00 UTC
We invite you to join us for our next Moodle Academy webinar, which is free to attend. Please note: This webinar will be in French.
Webinaire: La gestion des rôles dans Moodle
5 février, 13:00-14:00 UTC
Inscrivez-vous!
Les rôles de Moodle sont une des clefs de la flexibilité de son utilisation. Cependant, la gestion de ces rôles est complexe et assez difficile d’accès. Ce webinaire, destiné avant tout aux administrateurs et administratrices de Moodle, mais aussi à toute personne curieuse du fonctionnement interne de Moodle, se donne comme objectif d’améliorer la compréhension de l’architecture des rôles de Moodle et, à l’aide d’exemples, de trucs et d’astuces, de rendre plus digeste l’administration de ces rôles. Des bonnes pratiques de gestion des rôles dans Moodle seront également présentées.
Ce webinaire fait partie du cours ‘Moodle Academy webinars‘. Il faut vous inscrire au cours pour participer au webinaire.
Dries Buytaert: I gave an AI agent edit access to my website

I’m often asked, Will AI agents replace digital marketers and site builders?
. The answer is yes
, at least for certain kinds of tasks.
To explore this idea, I prototyped two AI agents to automate marketing tasks on my personal website. They update meta descriptions to improve SEO and optimize tags to improve content discovery.
Watching the AI agents in action is incredible. In the video below, you’ll see them effortlessly navigate my Drupal site — logging in, finding posts, and editing content. It’s a glimpse into how AI could transform the role of digital marketers.
The experiment
I built two AI agents to help optimize my blog posts. Here is how they work together:
- Agent 1: Content analysis: This agent finds a blog post, reviews its content, and suggests improved summaries and tags to enhance SEO and increase discoverability.
- Agent 2: Applying updates: After manual approval, this agent logs into the site and updates the summary and tags suggested by the first agent.
All of this could be done in one step, or with a single agent, but keeping a ‘human-in-the-loop’ is good for quality assurance.
This was achieved with just 120 lines of Python code and a few hours of trial and error. As the video demonstrates, the code is approachable for developers with basic programming skills.
The secret ingredient is the browser_use
framework, which acts as a bridge between various LLMs and Playwright, a framework for browser automation and testing.
The magic and the reality check
What makes this exciting is the agent’s ability to problem-solve. It’s almost human-like.
Watching the AI agents operate my site, I noticed they often face the same UX challenges as humans. It likely means that the more we simplify a CMS like Drupal for human users, the more accessible it becomes for AI agents. I find this link between human and AI usability both striking and thought-provoking.
In the first part of the video, the agent was tasked with finding my DrupalCon Lille 2023 keynote. When scrolling through the blog section failed, it adapted by using Google search instead.
In the second part of the video, it navigated Drupal’s more complex UI elements, like auto-complete taxonomy fields, though it required one trial-and-error attempt.
The results are incredible, but not flawless. I ran the agents multiple times, and while they performed well most of the time, they aren’t reliable enough for production use. However, this field is evolving quickly, and agents like this could become highly reliable within a year or two.
Native agents versus explorer agents
In my mind, agents can be categorized as “explorer agents” or “native agents”. I haven’t seen these terms used before, so here is how I define them:
- Explorer agents: These agents operate across multiple websites. For example, an agent might use Google to search for a product, compare prices on different sites, and order the cheapest option.
- Native agents: These agents work within a specific site, directly integrating with the CMS to leverage its APIs and built-in features.
The browser_use
framework, in my view, is best suited for explorer agents. While it can be applied to a single website, as shown in my demo, it’s not the most efficient approach.
Native agents that directly interact with the CMS’s APIs should be more effective. Rather than imitating human behavior to “search” for content, the agent could retrieve it directly through a single API call. It could then programmatically propose changes within a CMS-supported content editing workflow, complete with role-based permissions and moderation states
I can also imagine a future where native agents and explorer agents work together (hybrid agents), combining the strengths of both approaches to unlock even greater opportunities.
Next steps
A next step for me is to build a similar solution using Drupal’s AI agent capabilities. Drupal’s native AI agents should make finding and updating content more efficiently.
Of course, other digital marketing use cases might benefit from explorer agents. I’d be happy to explore these possibilities as well. Let me know if you have ideas.
Conclusions
Building an AI assistant to handle digital marketing tasks is no longer science fiction. It’s clear that, soon, AI agents will be working alongside digital marketers and site builders.
These tools are advancing rapidly and are surprisingly easy to create, even though they’re not yet perfect. Their potential disruption is both exciting and hard to fully understand.
As Drupal, we need to stay ahead by asking questions like: are we fully imagining the disruption AI could bring? The future is ours to shape, but we need to rise to the challenge.
JRuby 9.4.10.0 Released
The JRuby community is pleased to announce the release of JRuby 9.4.10.0.
- Homepage: https://www.jruby.org/
- Download: https://www.jruby.org/download
JRuby 9.4.x targets Ruby 3.1 compatibility.
Thank you to our contributors this release, you help keep JRuby moving forward!
- Dani Smith @danini-the-panini
- Karol Bucek @kares
- mrnoname1000 @mrnoname1000
Ruby Compatibility
- Fixed a NegativeArraySizeException crash parsing heredocs. #8355, #8557
- Users can now opt into Ruby 3.3 behavior for NoMethodError and NameError that no longer inspects the target object. This inspect frequently led to memory issues. Specify JRuby flag
-XnameError.inspect.object=false
or JVM propertyjruby.nameError.inspect.object=false
to disable the inspect call. #216, #8384, #8538 - Implemented the missing
Process.argv0
method, used by recent Bundler releases. #8568, #8570
Standard Library
- The jar-dependencies gem, responsible for fetching jar file dependencies of Ruby gems, can now be updated independently of JRuby. #7262, #8488, #8502
- An upcoming release of jar-dependencies, will fix issues sourcing jar dependencies in container deployments (partially fixed previously by an updated ruby-maven-libs gem). #7059, #8366
- The psych gem is updated to version 5.2.3, including a fix for YAML aliases from SnakeYAML-Engine version 2.9. #8352, #8575
- The reline gem is updated to 0.5.12. #8481
Java Integration
- Only JVM classes imported from the same classloader hierarchy as JRuby will be bound to constants in JRuby’s package hierarchy. #8156
- Implementing a Java interface no longer leads to constant redefinition warnings. #8349, #8503
- Precompiled Ruby scripts now properly prepare optimized homogeneous case/when statements. Previously they would deserialize incorrectly and garble the branches. #8421, #8424
Performance and Usability
- Additional runtime data structures are eagerly cleared when tearing down a JRuby runtime, aiding GC. #8343, #8566
- The JRuby shell-based launcher script now properly handles JRuby installed in a path with spaces. #8441, #8442
- The
Class#subclasses
method has been optimized to eliminate it as a bottleneck in complex ActiveRecord STI queries. #8457, #8462 - Integer multiplication operations that overflow outside of int64 range have been optimized to eliminate heavy exception raises. #8516, #8523
Issues and PRs resolved for 9.4.10.0
- #7059 Issue of Jar dependency with Jruby-9.3.3.0
- #7262 jar-dependencies cannot be updated out-of-band from jruby
- #8156 JRuby adds Java proxy classes to the Java module even if they are not from JRubyClassLoader
- #8343 Free up memory memory used by JRuby during teardown
- #8349 internal proxy class is stored in Ruby land and prints warning
- #8352 Cyclic references in Set objects raise exception with
YAML#load
- #8355 NegativeArraySizeException while parsing Heredoc in irb in JRuby 9.4.8.0
- #8366 Jruby 9.4.8.0 fails to install psych
- #8384 OutOfMemoryError while constructing a NameError in the context of a large object
- #8398 ruby2_keywords + forwarding to native does not properly check arity
- #8412 Intermittent exceptions with ‘Java::JavaLang::NoClassDefFoundError : org/jruby/gen/RubyObject13’
- #8415 Skip extension builds for default gems
- #8416 [Possible bug] Can not start jruby-swing applications since 9.4.9.0 – or rather, the window auto-closes almost instantly
- #8417 Trivial refactoring for match
- #8421 Incorrect case tree selection when comparing long Symbols during compiled Ruby code execution
- #8424 Sort the jump tables based on new values
- #8425 Don’t clear the ThreadGroup when Thread terminates
- #8431 jruby/thread_dump.rb seems to be broken
- #8433 Root specialized object classloader at JRuby classloader
- #8436 Pass Enumerable#uniq arguments properly
- #8438 Remove rogue exit(0) that shuts down JVM
- #8441 Spaces in the path cause
bin/jruby
script to build an invalid command string - #8442 jruby.sh: Use array to handle option files
- #8457 Class#subclasses slows down with larger sets
- #8462 Optimize Class#subclasses
- #8466 jirb 9.4.9.0 – reline “cannot convert parameter to native pointer”
- #8469 fix –jdb -sourcepath command
- #8477 Update to jar-dependencies 0.5.0
- #8478 Avoid re-polling while reporting a Thread#raise
- #8479 Thread interrupt requests can overwrite each other
- #8480 Provide concrete-only traversal for Class#subclasses
- #8481 Update reline to 0.5.12
- #8488 Issues bundling psych related to the jar-dependencies bump
- #8502 Avoid loading jar-dependencies to install gem hook
- #8503 [ji] do not expose InterfaceImpl classes in Ruby land
- #8511 Update to jruby-maven-plugins 3.0.4
- #8512 Disable Maven download progress output on CI jobs
- #8515 Update jruby-maven-plugins to 3.0.5
- #8516 Strange performance difference?
- #8523 Revert multiply to use non-intrinsic exactness checks
- #8538 Backport no-inspect NameError logic
- #8557 Fixes #8355: wallpaper crash in heredoc eof error
- #8562 Use same logic as IR for kwarg handling in IO#write
- #8566 Additional teardown to aid GC and release resources
- #8567 Update thread dump hook for modern JRuby
- #8568 Process.argv0 missing
- #8570 Add Process.argv0
- #8571 Update to jcodings 1.0.59
- #8572 Use warning instead of warning when adding attr as module_function
- #8573 Update jcodings to 1.0.61 and joni to 2.2.3
- #8575 Update psych to 5.2.3