Giorgio Alfredo Pagano

I'm a Drupal developer: I build custom modules and solutions with a spec-driven agentic development workflow. I've worked with Drupal since 2014, and on drupal.org I've gone by @sjpagan (opens in a new tab) since 2015. I look after four public projects: AI Disclosure, Native Observability, DOC to HTML and Voxtrama. The three most recent come from the years I spent building services for Italian public bodies, where I learned to tell people how a service is made and where their data ends up.

What I do with Drupal

I build websites and web services with Drupal, and I write the modules that are missing. My everyday work is content modelling, configuration management, migrations, decoupled architectures and custom modules.

Drupal treats content structure as a contract: content types, fields, roles and publishing workflows live in configuration. I keep that configuration in the repository next to the code and review it in every merge request, like any other change.

AI Disclosure: my contribution to the Drupal AI Initiative

AI Disclosure is the Drupal module that records, for every piece of content and every translation, how much AI contributed to it, and shows that to readers with the official European Commission icons. It started in the Drupal AI Initiative from a plan by @marcus_johansson (opens in a new tab): I took over development, opened the project on drupal.org and write the code. I am its owner, and Marcus and @joevagyok (opens in a new tab) are co-maintainers.

The module is for editorial teams that have to comply with Article 50 of the EU AI Act, and it works out for each item whether a label is required. It is used by 70 sites (Drupal.org, as of ). The Drop Times covered it twice, on Article 50 labelling (opens in a new tab) and on audio and video labels (opens in a new tab).

Every page on this site carries the AI Disclosure panel below the text. This page states that it was written with AI assistance and reviewed by me, and the figures on it are checked against the sources listed below.

How the module came about is on the AI Disclosure project page. How Article 50(4) applies to a Drupal site is covered in a separate article.

Native Observability: measuring Drupal from the inside

Native Observability traces every request to a Drupal site with a correlation ID, records execution spans, cache activity, queries and outgoing HTTP calls, and exports to OpenTelemetry and Prometheus. I wrote it to find out which hook slows a page down without wiring an external APM into every environment.

It supports Drupal 10 and 11 on PHP 8.2 or later, its stable releases are covered by the Drupal security advisory policy, and it is used by 32 sites (Drupal.org, as of ). More on the Native Observability project page. Native Observability was featured on Talking Drupal (opens in a new tab), as Module of the Week in episode #547, and in The Drop Times (opens in a new tab).

Voxtrama: the audio stays on your computer

Voxtrama is an open source application that transcribes meetings, lectures and interviews in Docker, on the machine of whoever recorded them, and writes a summary in which every point quotes the sentence and the minute it came from. The code is on GitHub under the Apache 2.0 licence.

It comes from the same care for data that public sector work left me with: a work recording holds people's voices and decisions, and the safest place to process it is the computer of the person who made it. The path the audio takes, step by step, is on the Voxtrama project page.

My path with Drupal

  1. 2014 I start working with Drupal and go to my first community events: DrupalDay in Bologna and South Italy Drupal Camp in Naples
  2. 2015 On drupal.org as sjpagan

    From September I'm also an individual member of the Drupal Association.

  3. 2015-2019 Kelyon, Naples (@kelyon (opens in a new tab))

    Drupal 7 and 8 development for digital health. In 2017 I create DOC to HTML, the first of the modules I publish on drupal.org with the company's support. Between 2017 and 2018, a break at Insem, on PrestaShop.

  4. 2019-2022 SeoZoom, Naples

    I redesign the back end and front end of the SaaS platform, on a proprietary PHP framework, and run the project as project manager.

  5. 2022-2026 I.T.Svil, Salerno (@itsvil (opens in a new tab))

    Drupal platforms for the Italian public sector.

  6. 2026 SparkFabrik (@sparkfabrik (opens in a new tab)), from May to September: modules on Drupal 10 and 11 for enterprise projects, with a spec-driven workflow

    Then I go freelance and carry that method on in my own work.

  7. 2026 The public projects: Native Observability in February, AI Disclosure in the Drupal AI Initiative in August, Voxtrama on GitHub in September

The projects I built for public bodies stay confidential: on this page I describe the method behind them.

What working for the public sector taught me

People who use a public service can't go elsewhere: whoever needs a certificate has that one website. That is where the three things I bring to every project come from.

  • Accessibility: it decides whether a service exists for everyone or only for some people.
  • Transparency about content: citizens should know who wrote a page and with which tools, and AI Disclosure turns that into data.
  • Data kept close: identities, documents and recordings belong as close as possible to whoever is responsible for them, which is how Voxtrama is built.

How I work: spec first, decisions on record, measurements

I write the spec before the code. Every change starts from a document that says why it is made, what it changes and how to check it is done. AI Disclosure started from a sixteen-step plan published in the Drupal AI Initiative, and I have already closed ten of those steps.

I keep decisions on record. Architectural choices go into a dated log, together with the alternatives I weighed. While writing the AI Disclosure project page I found that this site declared AI use once for two languages: the fix and the reason for it are on that page.

I measure before I claim. A measured number carries more weight than a plausible hunch. I measured on my own server how much Native Observability slows Drupal down, and the method is in the article on the measurement.


Open source contributions

Modules I maintain on drupal.org and contributions to other people's projects, year by year. Every entry links to the public proof.

Status of the contributions
Merged 12
In review 3
Closed 3
Open for adoption 1

Latest contributions

Latest update
Module drupal.org

Native Observability

Records from inside Drupal what each request does: queries, calls to external services, cache. For Drupal 10, 11 and 12, with a read-only MCP server for AI agents.

32 sites (Drupal.org, as of ) · 2.2.0 · Project: Native Observability (opens in a new tab)

All contributions

2026 19 entries
  1. Merge request: AI Translate!72 AI Disclosure integration with AI Translate Merged

    Issue #3585563 (opens in a new tab): each AI translation gets the "AI translated" grade of AI Disclosure, also on referenced entities and Layout Builder blocks. A new translation does not inherit the human review of its source.

  2. Merge request: Token OR!28 · !29 Token OR leaves pipes inside quotes alone Merged

    Issue #3633480 (opens in a new tab): when every pipe in a bracketed token sits inside quotes, as in an attribute value, Token OR now leaves the text as it is instead of calling the token service on it again and again. The maintainer committed the fix with credit in 2.3.4 and 3.0.0-beta2.

  3. Merge request: IndexNow!78 IndexNow pings only for content that was public In review

    Issue #3607004 (opens in a new tab): update pings go out only for content that was public, and again when a page is unpublished. The check runs when the content is saved, with kernel tests. The maintainer carried the fix over to the 3.1.x branch in !79.

  4. Co-maintainer: drupal.org C2PA Sign Co-maintainer

    Co-maintainer with @jrglasgow (opens in a new tab), who created it. It signs the media files uploaded to the site with Content Credentials, using c2patool.

  5. Pull request: GitHub · c2patool#1 Fix to the c2patool PHP library Merged

    A fix to jrglasgow/c2patool, the PHP library C2PA Sign uses to run the c2patool command-line tool: from version 0.10 of the tool the manifest has to sit in a folder of its own, because the tool loads the icon only from there. It came out of testing my fixes to C2PA Sign and shipped in version 0.5.3 of the library.

  6. Merge request: LSCache!2 Error-free purge where LiteSpeed is not in front of Drupal In review

    Without LiteSpeed in front of Drupal, the module tried to purge an absent cache and showed an error on every admin page. The fix skips the purge in that case, with tests (issue #3609034 (opens in a new tab)).

  7. Merge request: C2PA Sign!8 · !9 · !10 Three fixes to content signing Merged

    Three fixes to how C2PA Sign signs files, in issues #3596030 (opens in a new tab), #3596031 (opens in a new tab) and #3596032 (opens in a new tab). I tested them end to end with Content Credentials.

  8. Contribution: Content Credentials2 issue Content Credentials contributions Merged

    Two issues: #3622690 (opens in a new tab) (requires ai_disclosure 1.0.0-alpha2) and #3629737 (opens in a new tab) (the digital source type gets lost when another tool signs the file again).

  9. Project: GitHub Voxtrama Project

    Transcribes meetings on your own computer, recognises who is speaking and writes minutes where each sentence points back to its place in the audio.

    Stars: 3 · last push: Repository: Voxtrama (opens in a new tab)
  10. Merge request: Tool API!155 Execute form outcome from one layer Merged

    Issue #3582968 (opens in a new tab): the tool execute form reports its outcome from a single place instead of several layers.

  11. Contribution: AI Content Disclosure#3621703 Proposal to merge two modules on the same topic Merged

    Issue #3621703 (opens in a new tab): this module covers the same ground as AI Disclosure, and I offered to work together on a single one.

  12. Module: drupal.org AI Disclosure Module

    Shows how much AI contributed to each piece of content and translation. Readers see it as a label, and search engines and AI assistants read it in the page code.

    70 sites (Drupal.org, as of ) · 1.0.0-beta2 · Project: AI Disclosure (opens in a new tab)
  13. Merge request: AI (drupal/ai)!1943 Tool calls as a flat list in the EchoProvider Merged

    Issue #3586656 (opens in a new tab): the EchoProvider, the AI module's test provider, returns tool calls as a flat list of ToolsFunctionOutput.

  14. Merge request: AI Translate!43 TextTranslator clean-up Merged

    Issue #3585546 (opens in a new tab): removes the aiConfig property from TextTranslator, which had been left unused.

  15. Merge request: AI Translate!41 HTML markup kept in translations Merged

    Issue #3585525 (opens in a new tab): translated values keep their HTML markup and entities as in the original.

  16. Contribution: Drupal core4 issue Drupal core contributions Merged

    Four issues: #3615256 (opens in a new tab) (performance tests on main), #3615175 (opens in a new tab) (calculateChecksum), #3615423 (opens in a new tab) (container in tests, RTBC) and #3614983 (opens in a new tab) (search help text).

  17. Contribution: S3 File System#3601091 Drupal 11.4 MimeTypeGuesser support Merged

    Issue #3601091 (opens in a new tab): s3fs adapts to the MimeTypeGuesser service as changed in Drupal 11.4.

  18. Merge request: Paragraphs!256 Paragraph icons on remote file systems In review

    Issue #3592735 (opens in a new tab): getIconFile() checks that the file exists, so paragraph icons keep showing on S3 and similar file systems.

  19. Module: drupal.org Native Observability Latest update Module

    Records from inside Drupal what each request does: queries, calls to external services, cache. For Drupal 10, 11 and 12, with a read-only MCP server for AI agents.

    32 sites (Drupal.org, as of ) · 2.2.0 · Project: Native Observability (opens in a new tab)
2019 2 entries
  1. Module: drupal.org Views Field Percentage Closed

    Adds a Views field that shows a value as a percentage. It dates from Drupal 8.

  2. Module: drupal.org Views custom link Open for adoption

    Adds custom links to Views.

2018 2 entries
  1. Module: drupal.org Vsauce Sticky Popup Closed

    A popup that stays fixed on screen, configured from the interface. Written for Drupal 8.

  2. Module: drupal.org Style Management Closed

    Manages the site's styles from the admin interface, on Drupal 8.

2017 2 entries
  1. Community: drupal.org Project application reviews Community

    Fourteen reviews of modules applying for publication on drupal.org, in February 2017.

  2. Module: drupal.org DOC to HTML Module

    Imports Word, OpenDocument, RTF and PowerPoint documents straight into the node form, as HTML. It started at Kelyon.

    3 sites (Drupal.org, as of ) · 2.1.0 · Project: DOC to HTML (opens in a new tab)
2015 1 entry
  1. Community: drupal.org drupal.org account Community

    Member since 20 February 2015, as sjpagan.


Passions

I fly FPV drones: the headset shows the flight from the drone's camera, and every session takes quick reflexes and careful tuning of motors, props and radio. I 3D print with a Bambu Lab and a Prusa Core One L with INDX, Prusa's tool changer that handles several materials and colours in a single print. On Instagram I keep a profile for each passion:

Where to find me

Sources

All sources were checked on 11 October 2026. Usage figures are refreshed from drupal.org: if you spot a difference, drupal.org is right.

AI modified

This text was translated by AI.

How was AI used?

Translated from the Italian original with AI assistance, then read and corrected by a person, who holds editorial responsibility.

Do you have a project in mind?

Let's talk and build something solid together.

Contact me