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
-
2014 I start working with Drupal and go to my first community events: DrupalDay in Bologna and South Italy Drupal Camp in Naples
-
2015 On drupal.org as sjpagan
From September I'm also an individual member of the Drupal Association.
-
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.
-
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.
-
2022-2026 I.T.Svil, Salerno (@itsvil (opens in a new tab))
Drupal platforms for the Italian public sector.
-
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.
-
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
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.
AI Disclosure integration with AI Translate
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.
Token OR leaves pipes inside quotes alone
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.
All contributions
2026 19 entries
-
Merge request: AI Translate!72 AI Disclosure integration with AI Translate
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.
-
Merge request: Token OR!28 · !29 Token OR leaves pipes inside quotes alone
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.
-
Merge request: IndexNow!78 IndexNow pings only for content that was public
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.
-
Co-maintainer: drupal.org C2PA Sign
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.
-
Pull request: GitHub · c2patool#1 Fix to the c2patool PHP library
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.
-
Merge request: LSCache!2 Error-free purge where LiteSpeed is not in front of Drupal
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)).
-
Merge request: C2PA Sign!8 · !9 · !10 Three fixes to content signing
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.
-
Contribution: Content Credentials2 issue Content Credentials contributions
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).
-
Project: GitHub Voxtrama
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) -
Merge request: Tool API!155 Execute form outcome from one layer
Issue #3582968 (opens in a new tab): the tool execute form reports its outcome from a single place instead of several layers.
-
Contribution: AI Content Disclosure#3621703 Proposal to merge two modules on the same topic
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.
-
Module: drupal.org AI Disclosure
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) -
Merge request: AI (drupal/ai)!1943 Tool calls as a flat list in the EchoProvider
Issue #3586656 (opens in a new tab): the EchoProvider, the AI module's test provider, returns tool calls as a flat list of ToolsFunctionOutput.
-
Merge request: AI Translate!43 TextTranslator clean-up
Issue #3585546 (opens in a new tab): removes the aiConfig property from TextTranslator, which had been left unused.
-
Merge request: AI Translate!41 HTML markup kept in translations
Issue #3585525 (opens in a new tab): translated values keep their HTML markup and entities as in the original.
-
Contribution: Drupal core4 issue Drupal core contributions
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).
-
Contribution: S3 File System#3601091 Drupal 11.4 MimeTypeGuesser support
Issue #3601091 (opens in a new tab): s3fs adapts to the MimeTypeGuesser service as changed in Drupal 11.4.
-
Merge request: Paragraphs!256 Paragraph icons on remote file systems
Issue #3592735 (opens in a new tab): getIconFile() checks that the file exists, so paragraph icons keep showing on S3 and similar file systems.
-
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)
2019 2 entries
-
Module: drupal.org Views Field Percentage
Adds a Views field that shows a value as a percentage. It dates from Drupal 8.
-
Module: drupal.org Views custom link
Adds custom links to Views.
2018 2 entries
-
Module: drupal.org Vsauce Sticky Popup
A popup that stays fixed on screen, configured from the interface. Written for Drupal 8.
-
Module: drupal.org Style Management
Manages the site's styles from the admin interface, on Drupal 8.
2017 2 entries
-
Community: drupal.org Project application reviews
Fourteen reviews of modules applying for publication on drupal.org, in February 2017.
-
Module: drupal.org DOC to HTML
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
-
Community: drupal.org drupal.org account
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:
- FPV flights: @lowflyfpv (opens in a new tab)
- 3D prints: @lowfly_stampa3d (opens in a new tab)
- Street photography, an archive of shots: @sjpagan (opens in a new tab)
Where to find me
- Modules, releases and contributions: @sjpagan (opens in a new tab) on drupal.org
- Code outside drupal.org, Voxtrama included: @sjpagan (opens in a new tab) on GitHub
- Work history: @giorgioalfredopagano (opens in a new tab) on LinkedIn
- To write to me: the Contact page
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.
- sjpagan's profile on drupal.org (opens in a new tab): membership, maintained projects, companies. Primary source.
- Kelyon on drupal.org (opens in a new tab): supporting organisation of my first modules. Primary source.
- LinkedIn profile (opens in a new tab): roles with their dates and individual membership of the Drupal Association. Primary source.
- DOC to HTML on drupal.org (opens in a new tab): project created in January 2017, releases and compatibility. Primary source.
- AI Disclosure on drupal.org (opens in a new tab): creation, maintainers, releases, sites using it. Primary source.
- Module plan in the Drupal AI Initiative (opens in a new tab): the sixteen steps and the ones closed. Primary source.
- Native Observability on drupal.org (opens in a new tab): creation, compatibility, security advisory policy, sites using it. Primary source.
- Voxtrama on GitHub (opens in a new tab): licence and first release. Primary source.
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.