aem-eds-kit / Local development & Universal Editor
Local developmentLocal development & Universal Editor
Run an AEM Edge Delivery Services project locally, configure the proxy, and preview content in the Universal Editor - with the eds commands that wire each piece. Everything here is light: a local proxy plus the hosted editor against your cloud author. No local AEM SDK, no local Universal Editor Service, no Docker.
The moving pieces
| Piece | What it is | Runs where |
|---|---|---|
AEM proxy (aem up) | Serves your local blocks/CSS/JS, proxies content | localhost |
| Content source | Where authored content lives | DA / Drive / SharePoint, or AEM author |
| Universal Editor | In-context WYSIWYG editing (UE/crosswalk) | Hosted at experience.adobe.com |
The local proxy renders your code against preview content (*.aem.page), so code changes hot-reload instantly while content comes from the real source.
.env - the proxy config
The AEM CLI (aem up) reads a .env at the project root. eds init writes one by default, and eds scaffold env (re)generates it on demand:
AEM_OPEN=/ # path opened on start ("/" = home) AEM_PORT=3007 # local proxy port AEM_PAGES_URL= # content origin (the *.aem.page preview host)
AEM_PAGES_URLis prefilled from your git remote ashttps://main--<repo>--<owner>.aem.page.- The file is never overwritten by the CLI and is always gitignored - it's local-only and may hold secrets, so it never enters version control.
$ eds scaffold env # interactive $ eds scaffold env --port 3007 --open / --yes # non-interactive $ eds init --no-env # opt out during setup
Then start the proxy:
$ npm install $ aem up # opens http://localhost:3007
xwalk.json - Universal Editor multi-field
Crosswalk (Universal Editor) projects need xwalk.json at the project root to enable multi-field support in the editor. eds init writes it by default for UE projects; regenerate with eds scaffold xwalk:
{
"public": {
"xwalk": {
"multi-field": { "enabled": true }
}
}
}
$ eds scaffold xwalk # on demand (never overwrites) $ eds init --no-xwalk # opt out during setup
eds ue - readiness check + editor deep link
Two light helpers for the Universal Editor - no infrastructure to stand up.
eds ue check
An offline readiness report. It confirms the project is UE-ready and lists which blocks are actually editable:
- Project is UE-ready when
component-definition.jsonandcomponent-models.jsonare present (component-filters.jsoncompletes the set). - A block is editable when it has a model - a distributed
_<name>.jsoninblocks/<name>/, or an entry incomponent-models.json. A block with no model won't appear in the editor;ue checkflags it first.
$ eds ue check
eds ue open [path]
Builds and opens the deep link into the hosted Universal Editor, pointing the editor canvas at your preview host (derived from the git remote):
$ eds ue open /products $ eds ue open / --org my-org --ref dev $ eds ue open /blog --url main--site--owner.aem.page --no-open
The link format is https://experience.adobe.com/#/[@<org>/]aem/editor/canvas/<host>/<path>, where <host> defaults to main--<repo>--<owner>.aem.page.
The typical loop (Universal Editor, cloud author)
eds initwrites.env,xwalk.jsonand the UE config, thennpm install.aem up- local proxy onAEM_PORT.eds ue check- confirm blocks are editable.eds ue open <path>- author in the Universal Editor; content saves to your cloud author and previews on*.aem.page.- Edit block code locally; the proxy hot-reloads.
- Commit & push; the AEM Code Sync pipeline deploys.
FAQ
Can I run the Universal Editor fully locally?
You can, with a local AEM SDK and a local Universal Editor Service, but it's heavy (Node, certificates, Docker). aem-eds-kit deliberately stays light: it uses the hosted Universal Editor against your cloud author, which needs no local infrastructure. The only gaps - knowing a block is editable and getting the right editor link - are what eds ue check and eds ue open solve.
What is AEM_PAGES_URL and where does it come from?
It's the content origin the local proxy serves from - your Edge Delivery preview host, https://main--<repo>--<owner>.aem.page. eds init and eds scaffold env prefill it from your git remote.
Why isn't my block showing up in the editor?
Most often it has no Universal Editor model. A block is editable only when it has a _<name>.json model or an entry in component-models.json. Run eds ue check - it lists exactly which blocks are editable.
Is .env safe to commit?
No. .env is local-only and may hold secrets, so the CLI always adds it to .gitignore and never overwrites an existing one.