Can't we just automate this? Permissions & content updates as-a-code with ACM Tool

We're excited to present to you a new open source tool – ACM (AEM Content Manager). It’s a unified console for automating mundane tasks on AEM like:

ACM was written from the ground up using latest tools and methodologies like Adobe’s React Spectrum, Monaco editor for live-coding and Sling jobs for running long tasks. When building it we've focused on two things:

It’s a one-stop-shop, easy to adopt replacement for multiple existing tools in this space: Groovy Console, AC Tool, AECU, APM.

ACM provides an IDE-like experience with code completion, auto-import, and on-the-fly compilation. Beyond simple scripting, it handles comprehensive content migration, permission management, and report generation — all through a consistent interface that works across local AEM, Cloud SDK, on-premise, AMS, and AEMaaCS environments.

wolf

Interactive editor part of Groovyconsole put it on an internal blocklist within Adobe (as it can allow running random code in Production), blocking it completely for many Adobe customers. How certain are you that ACM will not face the same fate?

Jörg

I am not aware that we blocked the Groovy Console... in the recent Java 21 migration we even reached out to many customers to update their Groovy Console before we upgraded them. -- Jörg

wolf

AMS certainly blocks it, we have been shown the internal list by the CSE - and getting it enabled has faced a repeated rejection.

Tomasz Sobczyk

It's fully up to you whether you allow running scripts manually or to just rely on automated executions. Also since it's brand new tool I am sure it's not on that blacklist yet. Whether it will land there - let's see. I am happy to join a call with AMS folks and have a constructive discussion about the remarks they might have.

Michal

No more fixing production with Groove? Can we disable safeguard?

Tomasz Sobczyk

Well.... We kinda don't recommend doing that :) when aem goes soo bad it's not a good idea to run even more code inside it :)

Jose Antonio Insua

IDE experience: Do you have vim shortcut support :) ?

Krystian Panek

Vim? Not particularly 🙂 Some are described when you click the Help button. But if you’d like to add more, feel free to raise a PR 🙂 It’s very easy to add them. Ref: https://github.com/wttech/acm/blob/main/ui.frontend/src/components/CodeEditor.tsx

Robert

How would you handle use case where a script must be executed directly after AEMaaCS deployment (author+publish)?

Tomasz Sobczyk

The automated runner does exactly that. All you need to do is to deploy the scripts as part of your package. You can also integrate it using conditions for example with your custom semaphores you might want to leave in the repo with your package

Bartłomiej Gątarski

AEMaaCS has a hard 60s timeout, scripts are quite often executed longer. How this tool will behave then? Will the script be executed under the hood or aborted?

Henry Kuijpers

He just showed it running in the background :p The UI is probably polling for the output to show

Helge

Is it jit compiled and run within a job?

Tomasz Sobczyk

Spot on Henry. Indeed everything in ACM is asynchronous by nature and the ui relies on long polling to get the latest status so it's all AEMAACS compatible

Yegor Kozlov

How do handle large outputs in the console? Scripts can talk a lot and emit MBs of messages.

Tomasz Sobczyk

Hi. Currently it goes to memory ( so it could cause oom) but there is a ticket for it already in the backlog (see question 9) which will improve this. It's planned for nearest future

Tad

Is execution history, snippets, etc global or user-specific?

Tomasz Sobczyk

Everything is global right now. I know that there is a feature in GC where you can enforce in osgi listing only current user scripts. If you think that would be useful - shout!

Henry Kuijpers

How will you make people shift away from good-old-AC-tool?

Tomasz Sobczyk

The good old way of proving that there is more value for the money here

Robert Wunsch

Is the output file generated in-memory? Or is the file created in the repo, and then written to with the date returned?

Krystian Panek

Yes in memory but only for now (this feature is really fresh). It's planned to implement it in a more memory-efficient way - https://github.com/wttech/acm/issues/224 So stay tuned, we just need some little time to deliver it to you 😉

Amine

How does the ACM tool handle session management and resource resolution when executing scripts, especially for long-running or complex operations that might require multiple JCR interactions?

Tomasz Sobczyk

In manual mode it acts on behalf of the user (but using it's own session established inside Sling job). For automated tasks similarly a new session is established but it then assumes a service user (acm)

Georg Henzler

What about k8n pods restarting in the cloud at any time? How is the tool handling it?

Radu Cotescu

They said Sling jobs at some point.

Tomasz Sobczyk

Yes, correct it's all handled thanks to sling jobs robustness. Of course scripts should be written in an idempoten way - running the same script again should have no extra results

Konrad

How to execute a script automatically with a Cloud Manager deployment?

Tomasz Sobczyk

You simply add it to the package to a dedicated folder (single root but you can then have namespaces underneath)

Krystian Panek

https://github.com/wttech/acm/tree/main/ui.content.example/src/main/content/jcr_root/conf/acm/settings/script The script itself decides if it should be run always, once, with retry after failure or any other conditions... Just implement canRun method you need 😉 there are many useful conditions.xxx() methods available OOTB to simplify your implementations. The recommended set up for the start is to skip defining scheduleRun method which is an implicit schedules.boot().. Then as a condition use condition.changed() (it is pretty smart, just check it out 😉)

Michal

Maybe you could fire scripts based on events, not only schedule them.

Tomasz Sobczyk

That doesn't sound like a bad idea at all. Would be great to here from you some actual use cases to design this properly

Krystian Panek

But in AEM there are no events like "just created website/language copy/live copy." As far as I remember, even listening for page creation is tricky 😉. Keep in mind that ACM is generally AEM-version-agnostic, but catching these events may require using APIs that could have changed over time, so it feels a bit like going down a dark alley 😂

Javier Reyes

Can it be available to manage scripts on publish instances directly?

Tomasz Sobczyk

In aem on prem you can access it directly or course. On aem cloud you manage scripts on author but then you can deploy them to publish with a single button click (sync button)

RikVB

Can the snippets and schedulers be managed in the project repository?

Tomasz Sobczyk

Definitely they can and we actually do recommend to do it this way. Only ad hoc things should be managed directly on shared environments

Masoud Rozati

Does ACM support extension points or SPIs, e.g. to have custom services (like repo, acl,... )

Tomasz Sobczyk

You can use add these in the extension scripts without a problem (inside the prepareRun method)

Henry Kuijpers

There have been a few projects that Cognifide/Wttech has abandoned, such as Bobcat, Sling-Query, APM, ... Will you keep maintaining this tool? Your competition (for example AC Tool) is doing this maintenance very well, so the community can rely on it.

wolf

APM is on that list too, apparently.

Tomasz Sobczyk

I am afraid that this comment is based on ill-informed opinion and it’s best if we put the facts here on the table. Let’s go! 1. Bobcat was seeded into open source in July 2016. The project was archived after over 5 years, in November 2021 after over 1k commits from 25 contributors (many of them from Cognifide but of course the wider community also played it’s part). The whole premise of running UI tests based on Selenium framework at that stage was completely outdated, and was superseded by Cypress. 4 years later even Cypress is no longer a go-to-solution any more (being superseded by Playwright). The technology moved on, Bobcat became obsolete by what happened with the technology. I hope you’re NOT writing Selenium-based tests in 2025?

Tomasz Sobczyk

2. Sling Query after achieving a stage of becoming feature complete was donated to Apache foundation and became a proud member of Sling family. This was a mammoth effort from the main maintainer of it Tomasz Rekawek, and I’m not sure how something like this can be called abandoning the project?

Tomasz Sobczyk

3. APM was started in September 2016, and received over years over 1.3k commits from 26 contributors. It went from supporting CQ, through all 6.X versions all the way to becoming fully AEM as a Cloud service compatible. It has surved it’s purpose over years but this year we have realised that a lot of the key parts of it would require a refresh - thinks like automated runs, backend performance on AEM as a Cloud service, frontend all would require a major overhaul. As you saw this week, we have decided that it’s an opportunity for a fresh start, and also a chance to kill more birds with one stone. If you try ACM out you will realise that you can migrate your APM scripts probably in couple of hours of vibe-coding with Windsurf/Claude CLI into ACM groovy scripts and live happily ever after. Example of the progress Java made over last 20 years compared to frontend languages clearly proves that forcible backward compatibility at the end of the day does NOT help.

Tomasz Sobczyk

4. We are still fully committed to open source, and nothing changed here. We simply want to take it to the next level instead of dragging everyone into the past. Hopefully you will join us on this exciting journey!

Krystian Panek

ACM is a direct successor of the APM. It's 100% compatible with it but only requires to use different syntax (groovy instead of APM-specific language ) to define ACLs. So it's definitely not harmful move but simplification. Migrating from APM to ACM as Tomek said could be done with Ai in under 1h. We already checked that 🙂 so if it would help you... it's just APM 2.0 with better interfaces.

Angela

Do you verify if the changes to access control setup have the desired effect? That would be really cool

Krystian Panek

There is a acl checker for that - https://github.com/wttech/acm/blob/main/core/src/main/java/dev/vml/es/acm/core/acl/AclChecker.java 🙂

tneves

Where is the undo button?

Tomasz Sobczyk

That is not a bad idea at all. But it has some complications :) Let's brainstorm this together today during expert session?

Konrad

Is APM dead now?

Tomasz Sobczyk

As Krystian mentioned treat this as an APM 2.0 on steroids. We will support the current APM with any critical fixes for bit more time to give people time to switch , but mid to long term we want everyone to move to acm

Michal

Can it make coffee too?

Konrad

Without a DSL? You must be kidding...

wolf

Does not seem to support HTCPCP (RFC2324), so how could it?

Anian Weber

418

Tomasz Sobczyk

Yes, for sure, we just need to integrate it with agentic AI and it should be an easy peasy. Anyone aware of an MCP server for HTCPCP?

MrPoofy

Can it also fix my marriage?

Radu Cotescu

Does it run on AEM? 😱

Michal

Would be stable on AEM

SessionLost

Adobe support may help.

Radu Cotescu

Only if you have a support contract. How much is a lawyer where you live?

MrPoofy

They sold me stability, I didn't get that... 😭

Radu Cotescu

You wanted romance. Romance is not stable!

Tomasz Sobczyk

That is yet another use case where integrating it with Ai agent could help fulfill the need :)