Local development

Running the whole stack on a laptop against real bindings — the service, the UI and the routing in front of it — without deploying to see a change.

Overview

InCAPassessed
SAP SHIPSby design
Node.js →

@sap/ams-dev Compiles the DCL authorization policies of SAP's Authorization Management Service to DCN, so an AMS-secured application runs and is tested on a laptop.

@sap/cds-dk The command line client and development toolkit for CAP projects, with the commands cds build, cds deploy, cds watch and cds add among them.

@sap/cds Mocks every imported remote service in process with mock data in the same in-memory database, and authenticates with mocked users by default in development, so the whole stack runs on a laptop before anything is bound.

Java →

com.sap.cds:cds-feature-dev-dashboard A browser dashboard for a running CAP Java service that shows and manages its messaging, resilience and multitenancy state while developing, open to users with the cds.Developer role.

com.sap.cds:cds-maven-plugin The Maven plugin that runs CDS build steps in a CAP Java project: compiling the model, generating typed Java accessor interfaces and adding facets to an existing project.

Not covered: The watch loop stops at the service process: the App Router that carries the authentication flow is a second process started beside it, which capire documents as cds add approuter with cds bind --exec -- npm start on port 5000, and the pages read here document no local stand-in for the HTML5 application repository. What the service runs against is not what production runs: mocked authentication is not suitable for production, a mocked service returns no data across its associations out of the box, and SQLite is not fit for production.

Built into @sap/cds
Sourcecds CLI — cds watchchecked
THE COMMUNITY ADDS

dev-approuter runs the router as a development-time process that serves a project's UI5 and CDS modules, @neoimpulse/cap-js-bootstrap starts several services and the router from one command, and the local HTML5 repository of @cap-js-community/common serves the apps in the app folder from the file system and proxies the rest to the remote repository. @sang2x/captools chains the Cloud Foundry binding and cds watch --profile hybrid behind one command, writing the resolved VCAP_SERVICES into default-env.json.

InABAPassessed

On the ABAP door the laptop runs a whole system: SAP's trial image is an application server and a database in one container, and a developer's own setup happens in that system after it starts, which is the part abapDevSysInit by Mike Pokraka scripts.

SAP SHIPS

SAP publishes the ABAP Cloud Developer Trial as a Docker image, an AS ABAP with its SAP HANA database, free for education and demo purposes. Its ABAP license lasts three months and is renewed by importing a demo license into the container.

Not covered: At a running system. What a developer then sets up inside it on every new container, a user profile, abapGit, SSL certificates and a destination for GitHub, and the repositories to pull, is done by hand.

THE COMMUNITY ADDS

abapDevSysInit scripts that setup inside a trial system, and abap_trial_docker builds the NetWeaver ABAP Developer Edition into a Docker container. web-abap2UI5 and the abap2UI5 Playground run abap2UI5 transpiled to JavaScript in a browser tab with no ABAP system behind it, and open-steamgate runs transpiled ABAP and the Gateway on the developer's machine.

Artifacts15

Group by15 of 15 artifacts
ArtifactSignals
Apps3
com.sap.cds:cds-feature-dev-dashboardBrowser dashboard for a running CAP Java service during development
Signals
none
open-steamgateLocal ABAP server serving /IWBEP/ OData v2 without an SAP system
Signals
Functional boundary
pokrakam/abapDevSysInitABAP report setting up a new ABAP Developer Edition or trial system
Signals
Quiet+1
Build tools3
@sap/ams-devCompiler from AMS DCL policies to DCN for local runs and tests
Signals
Functional boundary
com.sap.cds:cds-maven-pluginMaven plugin running CDS build steps in a CAP Java project
Signals
none
dev-approuterDev-time wrapper for the SAP Application Router
Signals
none
CDS plugins1
vite-plugin-cdsServes a Vite app through cds watch and imports .cds files
Signals
none
CLI tools4
@neoimpulse/cap-js-bootstrapCLI starting several CAP services and an AppRouter locally together
Signals
none
@sang2x/captoolsCLI of CAP development tools for Cloud Foundry workflows
Signals
Functional boundary
@sap/cds-dkCommand line client and development toolkit for CAP
Signals
none
abap_trial_dockerScripts running the ABAP Developer Edition in Docker
Signals
Quiet
Packages2
@cap-js-community/commonSix CAP features in one package, from replication cache to rate limits
Signals
Functional boundary
@sap/cdsCAP Node.js runtime
Signals
none
Web tools2
abap2UI5 PlaygroundIn-browser ABAP editor beside the abap2UI5 app it builds
Signals
Functional boundary
web-abap2UI5abap2UI5 transpiled to JavaScript and run in a browser tab
Signals
Functional boundary

Tasks4Beta

Shown workingCoversCovers, under conditionsNot assessed
Open a CAP application through its router locally1 shown working, 1 covers, 2 under conditions

A developer opens the application on a laptop at the address the App Router serves, logs in through the real authentication flow, and reaches the CAP service and the UI modules behind it the way a deployed request would.

Covers the routing and the login in front of the service. Starting the service itself is a separate outcome, and so is resolving the cloud bindings the router's authentication needs. Assessed on Node.js, where capire documents the local App Router setup; the same router in front of a CAP Java service was not assessed here.

Shown working@sap/cds-dkcds add approuter puts the router in the project, and cds bind --exec -- npm start starts it on port 5000 with the credentials of the bound XSUAA instance, with the service running beside it under the hybrid profile.

Conditions: an XSUAA or SAP Identity service instance exists in the cloud and is bound with cds bind, since the credentials the router starts with come from that binding the CAP application runs beside the router with the hybrid profile

Remaining work: Create the service instance and the service key in the cloud, bind them, and keep two processes running. The router itself needs no restart on a file change, since it serves static files or delegates to the backend service.

Open artifact →

Coversdev-approuterWraps the SAP Application Router for development time and serves the project's UI5 and CDS modules once they are added to it as dependencies, so the modules reach the router through the dependency list rather than through a route configuration.

Remaining work: Add the modules as dependencies. The registry page carries no README, so what it expects of the environment around it is not documented here.

Open artifact →

Covers, under conditions@cap-js-community/commonServes the apps and libraries of the project's app folder from the local file system as the HTML5 repository the router asks, and proxies every other request to the remote HTML5 repository, so a UI change is tested behind the router without being deployed first.

Conditions: a default-env.json in the approuter folder holds a valid HTML5 repository configuration from the deployment environment the app or library sits in the app folder and contains a ui5.yaml, which is what the local repository picks up

Remaining work: Write the configuration file and run the local-html5-repo command beside the router. The package is a bundle, so depending on it for this one feature brings its other five.

Open artifact →

Covers, under conditions@neoimpulse/cap-js-bootstrapStarts a local CAP development environment of several services together with the App Router: cds watch per service, sequentially or in parallel, and the router through cds bind --exec -- npm start.

Conditions: Node.js 22 or newer, which the package states as its requirement a binding the router's own start command can resolve, since it starts the router through cds bind --exec

Remaining work: Configure the services it is to start. The documentation is in German, and the repository declared in the package metadata returns 404, so the npm page is the only thing to read.

Open artifact →

Pick up a CDS model change without restarting by hand1 covers, 1 under conditions

A developer edits a CDS file or a handler and the running service answers the next request against the changed model, without stopping and starting it.

Covers the loop between a saved file and a served request. Attaching a debugger to that process is debugging, and what the service is bound to while it runs is a separate outcome.

Covers@sap/cds-dkcds watch watches for changed files and restarts the Node.js server, so the next request is served against the saved model.

Remaining work: Nothing beyond running it. The restart follows any changed file the project holds, seed data included, which is the loop working as documented rather than a setting.

Open artifact →

Covers, under conditionscom.sap.cds:cds-maven-pluginThe watch goal runs the CDS build and starts the application, and with Devtools on the project it takes advantage of their reload mechanism, where any change reloads the application context instead of restarting the whole application.

Conditions: Spring Boot Devtools are on the project, without which the goal performs a complete restart of the application after a CDS model change, which capire calls slower on Windows the watch goal only works if the Spring Boot Devtools are enabled

Remaining work: Add the Devtools dependency, and the plugin group com.sap.cds to ~/.m2/settings.xml for the short mvn cds:watch form. Devtools detects changes to .class files only, so a change to Java code is picked up once the build has produced them.

Open artifact →

Run a CAP service against a cloud service instance1 shown working, 1 under conditions

A service running on a laptop reads and writes through a service instance that exists in the cloud — a database, a destination, an authentication service — instead of through the local substitute, with nothing deployed.

Covers how the local process comes to hold the instance's credentials and what kinds of instance can be reached. The network path to a system behind a firewall is connectivity rather than binding, and the router's login flow is its own outcome.

Shown working@sap/cds-dkcds bind records where the credentials can be obtained rather than the credentials themselves, and reaches a managed, a user-provided or a shared Cloud Foundry instance as well as a Kubernetes service binding or a plain secret. The run then starts under that profile: cds watch --profile hybrid on Node.js, and cds bind --exec mvn spring-boot:run for a CAP Java application.

Conditions: the developer is logged in to the target Cloud Foundry space or Kubernetes cluster, which is where cds bind resolves the instance from the same profile name is used to create the binding and to run, since bindings are assigned to the hybrid profile by default

Remaining work: Create the instance and its service key in the cloud and keep the profile name consistent. The binding is resolved when the process starts, so a service only reachable through a tunnel still needs the tunnel.

Open artifact →

Covers, under conditions@sang2x/captoolsbind-local binds the local project to the services of a Cloud Foundry application and writes the resulting VCAP_SERVICES into default-env.json; run-local chains that behind one command with the install step and cds watch --profile hybrid.

Conditions: the target is a Cloud Foundry space with the application already deployed, since the command reads the bound services of an app the resolved VCAP_SERVICES may be written into default-env.json in the project

Remaining work: Keep the written file out of the repository, and read the published dist to know what a command does: there is no repository and no README.

Open artifact →

Start a CAP service with nothing bound1 shown working, 2 covers

A CAP project whose model imports a remote service and whose endpoints are authenticated starts, serves and answers requests on a laptop with no service instance bound, no database provisioned and no upstream system reachable.

Covers what answers in place of the database, the identity provider and the imported service. Reaching a real instance of any of them from the same laptop is hybrid testing and is assessed separately, and what the router in front adds is its own outcome.

Shown working@sap/cdsMocks every imported service in process with mock data in the same in-memory database as the project's own data, and authenticates with the pre-defined mock users of its mocked strategy, so a first run needs nothing bound to it.

Remaining work: Supply the mock data as CSV under srv/external/data. An association of a mocked service returns no data until the imported model is extended by hand, and the mocked users say nothing about how the deployed application will authenticate.

Open artifact →

Covers@sap/cds-dkcds watch starts the server and the artifacts the in-memory SQLite database needs are created as it runs, with no build step in a Node.js project; cds mock runs the imported service in a separate process where one process is too far from the target setup.

Remaining work: Nothing beyond running it. The database is reset on each application start, so seed data is the only data a fresh run has.

Open artifact →

Coverscom.sap.cds:cds-maven-pluginThe watch goal runs the CDS build and starts the application, which is how a Java project gets from a checked-out model to a served endpoint without a deployment.

Remaining work: Add the plugin group com.sap.cds to ~/.m2/settings.xml for the short mvn cds:watch form, and generate the SQLite or H2 schema in the build where the local database needs one.

Open artifact →

Content36

Group by36 of 36 pieces
Piece, what it offers
Fullstack CAP Application with HANA Cloud (Decoupled Architecture) [Part-1]
SAP Community, sanjucs, BlogThe reasoningA recipeRunnable code
Core changed
Don't Wait for SAP: Unlocking MCP Servers in BAS Right Now
SAP Community, Marian Zeis, BlogThe reasoningRunnable code
Establishing connectivity between a local CAP runtime and on-premise systems
SAP Community, vLeonkev, BlogThe reasoningA recipeRunnable code
Show 33 more
Creating a Hybrid CAP (Node.js) Profile with PostgreSQL on BTP from Business Application Studio
SAP Community, valentincadart, BlogThe reasoningRunnable code
Core changed
CAP with Local App Previews – Tips for Smooth Development
SAP Community, MioYasutake, Blog
How to Call a Remote OData API from Your Local CAP Java Project
SAP Community, Umezuki, BlogThe reasoningRunnable code
How to fix npm error notarget @sap/hdi-deploy when you create a CAP app in BAS
SAP Community, Ryota_Ito, Blog
Remote Debugging of SAP CAPM App - Nodejs
SAP Community, darshanv23, BlogThe reasoningA recipe
CAPM Basics - Part 4
SAP Community, archisman92, Blog
SAP CAP Lessons Learned: SQLite is single threaded, HANA is not
SAP Community, LucasMagriniRigo, Blog
My CAP Projects Toolbox
SAP Community, vvdries, Blog
CAP for nodejs安全的暴露接口练习
SAP Community, ArthurYang, Blog
XSUAA Local Testing
SAP Community, ManasaManu, BlogThe reasoningA recipeRunnable code
Core changed
Avoid design time CAP server restarts when maintaining local data files
SAP Community, DJ Adams, BlogThe reasoningRunnable code
Core changed
Develop CAP Project with Lazyvim in Docker
SAP Community, Helmut Tammen, BlogThe reasoning
cds-launchpad-plugin supercharged & ready for the future - CAP Plugin, UI5 Tooling support & Async Launchpad
SAP Community, Geert-Jan Klaps, BlogThe reasoningRunnable code
CAP PostgreSql setup local debugging using Docker - Part 2
SAP Community, ramonlee5, BlogA recipe
Core changed
SAP Tech Bytes: Using the SAP Approuter at dev time - a full-stack journey with UI5 and CAP
SAP Community, Nico Schoenteich, BlogThe reasoningRunnable code
New majors
Hybrid testing using PostgreSQL on SAP BTP, hyperscaler option
SAP Community, martinfrick, Blog
The fastest and easiest way to run full-stack applications in SAP Business Application Studio
SAP Community, liat_b, BlogThe reasoning
CAP Typescript + Fiori Typescript + live reload Initial app setup
SAP Community, Christophe_SW, BlogThe reasoningRunnable code
Core changed
Surviving and Thriving with the SAP Cloud Application Programming Model: Local development hurdles
SAP Community, maxstreifeneder, Blog
BTP CAP : How to Connect to Remote Services Locally in CAP Application
SAP Community, showkath_naseem, BlogThe reasoning
加速开发和部署的CAP CDS和Fiori一些实用命令
SAP Community, TiaXu, BlogThe reasoningA recipeRunnable code
Core changed
A Fiori Launchpad Sandbox for all your CAP-based projects - Overview
SAP Community, Geert-Jan Klaps, BlogThe reasoningA recipeRunnable code
A Fiori Launchpad Sandbox for all your CAP-based projects – Sample project setup
SAP Community, Geert-Jan Klaps, BlogThe reasoningRunnable code
Use Tasks in Visual Studio Code to start a cds service, an approuter and launch a browser in one go
SAP Community, pieterjanssens, BlogThe reasoningRunnable code
Core changed
SAP Cloud Application Programming Model(CAP):概要およびデモ - Part 1
SAP Community, rasai, part 1 of 2, Blog
Running CAP Node Applications in SAP Business Application Studio
SAP Community, liat_b, BlogThe reasoning
Use SCP CF Destination service in NodeJs locally
SAP Community, WouterLemaire, BlogThe reasoningRunnable code
Core changed
Develop SAP CAP apps inside a VS Code Docker Container
SAP Community, Helmut Tammen, BlogThe reasoningRunnable code
Core changed
Set up VS Code on Chrome OS for local Application Programming Model development
SAP Community, DJ Adams, BlogThe reasoningRunnable code
Core changed
Create a Simple CAP Application and Explore the Defaults
SAP Developer Center, SAP, WorkshopThe reasoningA recipe
Get an introduction to the cds REPL
SAP Developer Center, SAP, TutorialThe reasoningA recipe
Use mocking to embrace auth in your domain model from the outset
SAP Developer Center, SAP, TutorialThe reasoningA recipe
Set up a self-contained development environment for CAP Node.js
SAP Developer Center, SAP, TutorialThe reasoningA recipe

Seen working8

ArtifactSignals
Samples8
approuterShowcase for dev-approuter in front of two UI5 apps
none
cap-java-resilienceCAP Java service consuming a Business Partner API mocked in Node.js
No license
cap-java-snippetsTen short CAP Java references, one document per topic
none
cap-nodejs-dev-envDevelopment container definition for CAP Node.js
none
forsap-s4hana-private-simulatorCAP project simulating S/4HANA Private Edition OData APIs locally
none
SAP-samples/cap-local-development-workshopreCAP 2025 workshop on CAP's local-development toolset
none
SAP-samples/cap-tour-hands-onEight-exercise tour of CAP features, from mocking to plugins
none
ui5con24-dev-envpnpm workspace running CAP, a local launchpad and two UI5 apps
No license

Details

What changed — and what it makes stale2
@sap/cds-dk 7.9.1, CAP

cds bind gained support for service instances shared across Cloud Foundry orgs and spaces. Before 7.9.0, hybrid testing against a shared instance needed its own binding created per org and space; after it, cds bind can use an instance already shared into the current space directly, given Space Developer on both spaces.

Makes stale:

Advice that hybrid testing needs a dedicated service instance per org and space. True before mid-2024; a shared instance is enough since.

@sap/cds-dk 6.5.0, CAP

cds bind and cds watch --profile hybrid gained support for user-provided service instances, not only SAP BTP managed ones. Before this, hybrid testing against a user-provided service meant wiring VCAP_SERVICES by hand; after it, cds bind --to my-user-provided-service resolves the binding the same way it does for a managed service.

Makes stale:

Guidance that hybrid testing only reaches managed BTP services. Since January 2023 a user-provided service binds the same way.

Coverage
statecore and community, CAP
assessed
state in ABAPcore and community, assessed
relationshipnarrow by design
also inABAP
Comparison properties3

These are the questions used to compare what the artifacts do. Values come from their documentation and may apply to a particular ecosystem or runtime. Each recorded value in the comparison opens its statement and sources.

Part of the local stack it startsBinds cloud servicesCredentials on disk
For your agent
Ref
capability:local-development
JSON
/capabilities/local-development.json
MCP
Connecting an agent