# abap2UI5 > Build SAP UI5 applications purely in ABAP - no JavaScript, OData or RAP > required. One ABAP class per app: the framework renders the UI5 XML view, > binds ABAP data both ways and dispatches events over stateless HTTP > roundtrips. Runs from NetWeaver 7.02 to ABAP Cloud, on-premise and cloud. This is the documentation site, written for people and published here in markdown so a machine can read the same thing. Every link below is the raw source of a page; drop the `.md` for the rendered version. The facts, for a question that needs no page: - Latest release: 1.148.0 - every release lists its changes in the [release notes](https://abap2ui5.github.io/docs/resources/changelog.md) - License: MIT, commercial use included - no license key, no per-user fee, no subscription, no BTP required - Runs on: SAP NetWeaver AS ABAP 7.02 and later, S/4HANA on-premise and private cloud, BTP ABAP Environment and S/4HANA Public Cloud (ABAP Cloud, released APIs only); the frontend is SAPUI5 or OpenUI5, 1.71 to 2.x, from a CDN or the UI5 the system ships - a system without internet access is fine - Install: one abapGit pull of https://github.com/abap2UI5/abap2UI5 (the `702` branch below 7.50), then one HTTP service - An app: one ABAP class implementing `z2ui5_if_app`; `main( )` runs on every roundtrip, the view is UI5 XML built in ABAP, data is bound both ways, and the app is stateless like any other UI5 app - Not for: offline apps or real-time collaboration; the layout editor emits a class, there is no designer at runtime - Support: the community, on GitHub issues and Slack; no vendor and no SLA - Tooling: a browser playground at https://abap2ui5.github.io/playground/ that runs an app with no SAP system, a drag-and-drop layout editor that emits one app class, an MCP server with a Claude Code plugin, a VS Code extension, a linter (`@abap2ui5/linter` on npm, also a GitHub Action), and a headless frontend that tests an app in ABAP Unit - all on [Tooling](https://abap2ui5.github.io/docs/advanced/tooling.md), in the order a developer meets them - [llms-full.txt](https://abap2ui5.github.io/docs/llms-full.txt): the whole documentation as one document, if you would rather fetch it once than page by page - [the code map](https://github.com/abap2UI5/abap2UI5/blob/main/llms.txt): the same idea for the framework source - the package layering, the public API and where each concept lives. This file maps the prose, that one maps the code - [the playground](https://abap2ui5.github.io/playground/llms.txt): how to open a class in the browser by URL, how to embed a running example in a page of your own, and where the samples are as data - [the sample catalogue](https://abap2ui5.github.io/playground/samples/llms.txt): 863 complete apps from three repositories, each with a page of its own and the class in full. That file describes `apps.json`, the whole index as data: what each sample builds, the controls and libraries it needs, the oldest UI5 release it runs on, and whether it runs in a browser with no system - [client-api.json](https://abap2ui5.github.io/docs/api/client-api.json): every method, parameter and constant of `z2ui5_if_client` at this release, generated from the source - the same reference as the API page, as data ## Getting Started - [In a Nutshell](https://abap2ui5.github.io/docs/get_started/about.md): The technical picture of abap2UI5 on one page — UI5 apps written purely in ABAP, how the roundtrip works, what it runs on, where an app can appear, and the tooling around it. - [Evaluate abap2UI5](https://abap2ui5.github.io/docs/get_started/evaluate.md): abap2UI5 for the people who approve a tool rather than build with it - what problem it answers, when it is the right choice and when RAP is, what your organization keeps, where it runs, what it costs, the objections a review board raises, and how to test it on one real screen in a week. - [Quickstart](https://abap2ui5.github.io/docs/get_started/quickstart.md): Install abap2UI5 with abapGit and start your first app, or try it first in the browser playground and the live demo with no system at all. - [Hello World](https://abap2ui5.github.io/docs/get_started/hello_world.md): Your first abap2UI5 app - one ABAP class with a view, two-way data binding and an event, explained line by line. - [Developing with AI](https://abap2ui5.github.io/docs/get_started/ai.md): Developing abap2UI5 apps with an AI assistant - the AI Studio that builds an app from a description in the browser, one paragraph to paste into a prompt, and the linter and MCP server that let an agent check its own work without a system. ## Tutorial - [Tutorial](https://abap2ui5.github.io/docs/tutorials/index.md): Learn abap2UI5 by building — a step-by-step walkthrough where every step is a complete class you can run in the browser. - [Step 1: The App Class](https://abap2ui5.github.io/docs/tutorials/step-1.md): The smallest possible abap2UI5 app — one class implementing z2ui5_if_app, and the one method the framework calls. - [Step 2: A First View](https://abap2ui5.github.io/docs/tutorials/step-2.md): Render a UI5 XML view built entirely in ABAP with the view builder. - [Step 3: Events](https://abap2ui5.github.io/docs/tutorials/step-3.md): A button, a press event, and the abap2UI5 lifecycle behind them. - [Step 4: Data Binding](https://abap2ui5.github.io/docs/tutorials/step-4.md): Bind an input field to a class attribute — data reaches the server by itself. - [Step 5: List Binding](https://abap2ui5.github.io/docs/tutorials/step-5.md): Show an internal table as a UI5 list with aggregation binding. - [Step 6: Row Events](https://abap2ui5.github.io/docs/tutorials/step-6.md): React to a click on a list row and know which row it was — events with arguments. - [Step 7: Popups](https://abap2ui5.github.io/docs/tutorials/step-7.md): Edit a list row in a dialog — popups with the same builder, displayed over the running view. - [Step 8: Selection Screen](https://abap2ui5.github.io/docs/tutorials/step-8.md): A selection form above the list, and reading the data it asks for — the shape of a classic ABAP report. - [Step 9: Tables](https://abap2ui5.github.io/docs/tutorials/step-9.md): Swap the list for a real UI5 table — columns, cells and a row action that opens the editor. - [Step 10: App Structure](https://abap2ui5.github.io/docs/tutorials/step-10.md): Put everything into the structure real apps use — a dispatcher, named methods, protected state, and the SELECT and UPDATE in one place. - [Step 11: From Playground to Production](https://abap2ui5.github.io/docs/tutorials/step-11.md): Take the finished walkthrough app to a real system — real data, a pinned release, the transport order, authorization, and the URL users start it from. - [Step 12: Unit Tests](https://abap2ui5.github.io/docs/tutorials/step-12.md): Unit-test the app class like any ABAP class — the data methods are plain ABAP, the test class never touches the UI, and the structure from Step 10 is what makes that possible. ## Cookbook - [Cookbook](https://abap2ui5.github.io/docs/cookbook/index.md): The map of the cookbook - one row per group, from the view and the model to EML and troubleshooting, and the cheat sheet to keep open while working. - [Cheat Sheet](https://abap2ui5.github.io/docs/cookbook/cheat_sheet.md): A one-page recap of the rules that decide whether an abap2UI5 app works or misbehaves in a way that is hard to debug. - [Definition](https://abap2ui5.github.io/docs/cookbook/view/definition.md): How an abap2UI5 view is defined - a standard UI5 XML view sent from ABAP, built with the view builder control by control, and where to look for controls. - [Nested Views](https://abap2ui5.github.io/docs/cookbook/view/nested_views.md): A nested view in abap2UI5 is a separate XML view fragment that you inject into a placeholder inside another view. - [XML Templating](https://abap2ui5.github.io/docs/cookbook/view/xml_templating.md): XML Templating is a UI5 preprocessor feature, not an abap2UI5 invention. - [Binding](https://abap2ui5.github.io/docs/cookbook/model/binding.md): Data binding in abap2UI5 - client->_bind( ) shares ABAP variables with the UI5 view, for displaying and editing data, binding to structures, and the data-type mapping. - [Expression Binding](https://abap2ui5.github.io/docs/cookbook/model/expression_binding.md): Expression Binding lets you compute values directly in XML views with JavaScript-like expressions. - [Formatter](https://abap2ui5.github.io/docs/cookbook/model/formatter.md): You can format values like currencies, numerics, dates, or booleans directly on the frontend with UI5 type formatters. - [Tables](https://abap2ui5.github.io/docs/cookbook/model/tables.md): Tables in abap2UI5 - binding an internal table to a UI5 table, editable cells, nested structures, and the working samples for each. - [Trees](https://abap2ui5.github.io/docs/cookbook/model/trees.md): For hierarchical data, abap2UI5 uses nested ABAP structures to represent tree levels. Each level holds a table of child nodes, which UI5 traverses to build the expandable tree control. - [Device Model](https://abap2ui5.github.io/docs/cookbook/model/device_model.md): abap2UI5 offers two ways to access device information: directly in the view via the UI5 device model (frontend), or in ABAP logic via client->get( )-s_device (backend). - [Size Limit](https://abap2ui5.github.io/docs/cookbook/model/size_limit.md): Every UI5 JSON model has a built-in upper limit on the number of items it will expose to a list binding. By default this limit is 100. - [Life Cycle](https://abap2ui5.github.io/docs/cookbook/event_navigation/life_cycle.md): The abap2UI5 app life cycle - every request enters main( ), and check_on_init, check_on_navigated and check_on_event tell you which case it is, pitfalls included. - [Backend](https://abap2ui5.github.io/docs/cookbook/event_navigation/backend.md): UI5 control properties can both display data and fire events. To run backend logic when an event fires, use the client->_event method. - [Frontend](https://abap2ui5.github.io/docs/cookbook/event_navigation/frontend.md): If you don't want to handle the event in the backend, fire actions directly on the frontend. - [Inner App](https://abap2ui5.github.io/docs/cookbook/event_navigation/navigation/inner_app.md): Navigation inside one abap2UI5 deployment: switching screens within a class, and calling one of your app classes from another. - [Cross App](https://abap2ui5.github.io/docs/cookbook/event_navigation/navigation/cross_app.md): Navigation out of your app and into another Fiori app, and back. - [Hash](https://abap2ui5.github.io/docs/cookbook/event_navigation/navigation/hash.md): The URL hash is one string, and in abap2UI5 exactly one thing may own it at a time. - [App State, Share, Bookmark](https://abap2ui5.github.io/docs/cookbook/event_navigation/navigation/app_state.md): A link that restores an app exactly as it stands — every value the user has typed, the row they selected, the tab they opened — not just the app it was. - [Exception](https://abap2ui5.github.io/docs/cookbook/event_navigation/exception.md): An exception that escapes your main method is not caught anywhere near your app. - [Popup](https://abap2ui5.github.io/docs/cookbook/popup_popover/popup.md): Popups in abap2UI5 - a dialog built as a UI5 fragment in ABAP, the flow logic behind opening and closing it, and popups as separate apps. - [Popover](https://abap2ui5.github.io/docs/cookbook/popup_popover/popover.md): To show a popover, call client->popover_display and pass the ID of the control the popover should attach to: - [Message](https://abap2ui5.github.io/docs/cookbook/translation_messages/message.md): Showing messages is an everyday task for ABAP developers. The functions below cover the most common cases. - [Logging](https://abap2ui5.github.io/docs/cookbook/translation_messages/logging.md): Logging is critical for business processes. In ABAP systems, the standard tool is the Business Application Log (BAL), available on-premise and in ABAP Cloud environments alike. - [Translation](https://abap2ui5.github.io/docs/cookbook/translation_messages/translation_i18n.md): Standard UI5 apps handle translations with i18n files stored as frontend artifacts. - [Title](https://abap2ui5.github.io/docs/cookbook/browser_interaction/title.md): Set the text the browser shows in the tab and window title bar. - [Focus](https://abap2ui5.github.io/docs/cookbook/browser_interaction/focus.md): Read which control currently holds the focus from the backend, or move the focus from the backend to a specific field - [Scrolling](https://abap2ui5.github.io/docs/cookbook/browser_interaction/scrolling.md): Read the current scroll positions from the backend, or scroll a control programmatically from the backend with two frontend events: - [Timer](https://abap2ui5.github.io/docs/cookbook/browser_interaction/timer.md): Fire a backend event after a delay with the start_timer frontend event. Handy for dashboards, status monitors, or any case that needs a delayed or periodic update without user interaction. - [Clipboard](https://abap2ui5.github.io/docs/cookbook/browser_interaction/clipboard.md): Copy arbitrary text to the user's clipboard with the frontend event client->cs_event-clipboard_copy. - [URL Handling](https://abap2ui5.github.io/docs/cookbook/browser_interaction/url_handling.md): Working with URLs is common — reading parameters from the current URL, opening links in new tabs, or managing browser history. - [Soft Keyboard](https://abap2ui5.github.io/docs/cookbook/browser_interaction/soft_keyboard.md): On a touch device the on-screen keyboard pops up whenever an input receives focus. - [Keyboard Shortcuts](https://abap2ui5.github.io/docs/cookbook/browser_interaction/keyboard_shortcuts.md): The keyboard_shortcut frontend event binds a key combination to a named backend event - [Info](https://abap2ui5.github.io/docs/cookbook/device_capabilities/info.md): abap2UI5 ships the current frontend state with every roundtrip. Read it from client->get( ) — no custom control, no extra event needed. - [Camera](https://abap2ui5.github.io/docs/cookbook/device_capabilities/camera.md): abap2UI5 offers a custom control for taking photos directly from the device's camera. The control returns the image as a base64-encoded string, ready for backend processing. - [Geolocation](https://abap2ui5.github.io/docs/cookbook/device_capabilities/geolocation.md): abap2UI5 offers a custom control for reading geolocation data from the user's device — longitude, latitude, altitude, speed, and accuracy values. - [Barcode Scanning](https://abap2ui5.github.io/docs/cookbook/device_capabilities/barcode_scanning.md): Barcode scanning is common in enterprise apps. - [Audio, Video](https://abap2ui5.github.io/docs/cookbook/device_capabilities/audio.md): Audio feedback is handy in some scenarios. Fire the play_audio frontend event with the URL of a sound file — for example a .wav from the SAP MIME repository at /SAP/PUBLIC/BC/ABAP/mime_demo/bam.wav. - [Upload, Download](https://abap2ui5.github.io/docs/cookbook/device_capabilities/upload_download.md): abap2UI5 handles file uploads and downloads by sending base64-encoded data over the binding. - [PDF](https://abap2ui5.github.io/docs/cookbook/device_capabilities/pdf.md): Render a PDF directly in your app — for printouts from Adobe Forms, SmartForms, archived documents from the Content Server, or anything else that produces an xstring. - [Spreadsheet](https://abap2ui5.github.io/docs/cookbook/device_capabilities/spreadsheet.md): abap2UI5 works with the XLSX APIs on your ABAP system to upload and download spreadsheets, converting between XLSX files and internal tables as needed. - [Lock](https://abap2ui5.github.io/docs/cookbook/expert_more/lock.md): In classic SAP GUI, a transaction like VA02 calls ENQUEUE_EVVBAK and the lock lives as long as the dialog session. - [Statefulness](https://abap2ui5.github.io/docs/cookbook/expert_more/statefulness.md): abap2UI5 apps run stateless by default, one fresh ABAP session per roundtrip; stateful sessions exist for the few cases that need them, with their trade-offs. - [WebSocket](https://abap2ui5.github.io/docs/cookbook/expert_more/websocket.md): Stateless roundtrips are fine for click-driven UIs, but some scenarios need the server to push — a news feed, a job-status indicator, a chat. - [OData](https://abap2ui5.github.io/docs/cookbook/expert_more/odata.md): By default, you bind public attributes of your class to UI5 properties with _bind. For cases where you need access to large datasets, you can also use existing OData services. - [Smart Controls](https://abap2ui5.github.io/docs/cookbook/expert_more/smart_controls.md): Smart controls from the sap.ui.comp library (SmartFilterBar, SmartTable, SmartForm, SmartField, SmartChart) build their UI from OData V2 metadata - [RAP](https://abap2ui5.github.io/docs/cookbook/eml_cds_sql/rap.md): abap2UI5 is OData/RAP-agnostic — it doesn't care where data lives. - [EML](https://abap2ui5.github.io/docs/cookbook/eml_cds_sql/eml.md): All examples in these docs work without EML. But on a recent ABAP release, you can also use this feature in abap2UI5 apps. - [Draft Handling](https://abap2ui5.github.io/docs/cookbook/eml_cds_sql/draft_handling.md): Draft handling is one of the headline features of the ABAP RESTful Application Programming Model (RAP). - [CDS](https://abap2ui5.github.io/docs/cookbook/eml_cds_sql/cds.md): All examples in these docs work without CDS. On a recent ABAP release, you can also read data through CDS views in your abap2UI5 apps. - [ABAP SQL](https://abap2ui5.github.io/docs/cookbook/eml_cds_sql/abap_sql.md): ABAP SQL is the standard way to read and change data in the database directly from ABAP. - [Snippets](https://abap2ui5.github.io/docs/cookbook/expert_more/snippets.md): Copy-paste starting points for the most common app shapes. Each snippet is a complete, self-contained class — drop it in, activate it, and launch it by its name from the abap2UI5 landing page. - [Value Help](https://abap2ui5.github.io/docs/cookbook/expert_more/value_help.md): Value help (the classic ABAP F4 input help) lets users pick a value from a list instead of typing it. abap2UI5 covers the basics with two built-in popups and lets you build anything custom on top. - [Demo Output](https://abap2ui5.github.io/docs/cookbook/expert_more/demo_output.md): Familiar with CL_DEMO_OUTPUT from classic ABAP? You can show its HTML output inside an abap2UI5 app too. This is handy for quick data visualization or when porting existing demos. - [E-Mail](https://abap2ui5.github.io/docs/cookbook/expert_more/email.md): abap2UI5 has no e-mail control of its own — sending mail is plain ABAP via cl_bcs_message (or cl_bcs on older releases). - [Fuzzy Search](https://abap2ui5.github.io/docs/cookbook/eml_cds_sql/fuzzy_search.md): On SAP HANA you can match strings tolerantly — typos, missing letters, transposed characters — with the CONTAINS SQL function in fuzzy mode. - [Common Failures](https://abap2ui5.github.io/docs/cookbook/troubleshooting/common_failures.md): Not every problem raises an ABAP exception. Many failures surface only in the browser, fail silently, or look like framework bugs when they are actually pattern mistakes. ## Configuration - [Deployment Scenarios](https://abap2ui5.github.io/docs/configuration/installation.md): To install the framework, start with the Quickstart — this page is about where the endpoint may live, per system. - [Setup](https://abap2ui5.github.io/docs/configuration/setup.md): Every UI5 application has an index.html that bootstraps the framework, picks a theme, loads a UI5 version and so on. - [Theme](https://abap2ui5.github.io/docs/configuration/setup/theme.md): The theme defines the look and feel of every UI5 control — colors, fonts, paddings, spacings. In a hand-written index.html it is set via the data-sap-ui-theme attribute on the bootstrap script. - [Bootstrapping](https://abap2ui5.github.io/docs/configuration/setup/ui5_bootstrapping.md): Bootstrapping is the process of loading the UI5 runtime into the browser. - [Bootstrap Attributes](https://abap2ui5.github.io/docs/configuration/setup/bootstrap_attributes.md): The UI5 bootstrap script tag in index.html accepts a long list of data-sap-ui- attributes - [Style / CSS](https://abap2ui5.github.io/docs/configuration/setup/style_css.md): UI5 supports app-specific CSS in addition to the theme. - [Logon Language](https://abap2ui5.github.io/docs/configuration/setup/logon_language.md): abap2UI5 picks the user's logon language automatically from the SAP session — every text element, every OData/CDS label, every message class is returned in that language. - [Security](https://abap2ui5.github.io/docs/configuration/security.md): How abap2UI5 keeps data on the server - one HTTP endpoint, SAP authentication and authorization, the Content-Security-Policy, response headers and CSRF. - [Authorization](https://abap2ui5.github.io/docs/configuration/authorization.md): Authorization for abap2UI5 apps at the service level or in the app class, with the authorization objects and checks you already use in ABAP. - [Performance](https://abap2ui5.github.io/docs/configuration/performance.md): abap2UI5 is fast. Almost all processing runs on the ABAP backend, which is much faster than the browser. - [Monitoring](https://abap2ui5.github.io/docs/configuration/monitoring.md): Logging what abap2UI5 apps do in production - the roundtrip monitor z2ui5_if_ui5_monitor an installation implements, and the Admin Cockpit add-on that shows whether abap2UI5 is used, fast and safely configured. - [UI5 Versions](https://abap2ui5.github.io/docs/configuration/ui5_versions.md): The abap2UI5 frontend uses the SAP UI5 framework, which ships in several distributions and versions. - [Productive Usage](https://abap2ui5.github.io/docs/configuration/productive_usage.md): Technically, abap2UI5 is just an HTTP handler implementation — use it like any other HTTP service in production. - [Logout](https://abap2ui5.github.io/docs/configuration/logout.md): A logout button isn't a single action. Depending on how an abap2UI5 app was started, the user may have one, two, or three SAP sessions open at the same time, and each lives in a different place. - [Debugging](https://abap2ui5.github.io/docs/configuration/debugging.md): Since all logic runs in ABAP, you can debug everything in the ABAP environment. Set an external breakpoint, because abap2UI5 apps are called externally via HTTP. - [S/4 Public Cloud](https://abap2ui5.github.io/docs/configuration/s4_public_cloud.md): Use abap2UI5 for on-stack extension scenarios in S/4 Public Cloud. ## Advanced Topics - [Advanced Topics](https://abap2ui5.github.io/docs/advanced/index.md): What comes after the first app - extending the framework, showing an app outside the browser tab, running it on older releases and other stacks, and the tools you develop with. - [User Exits](https://abap2ui5.github.io/docs/advanced/extensibility/user_exits.md): abap2UI5 offers predefined user exits for tweaking the standard behavior. The interface Z2UI5_IF_UI5_EXIT exposes the user exits. - [Frontend](https://abap2ui5.github.io/docs/advanced/extensibility/frontend.md): The abap2UI5 frontend artifacts live in the app folder. - [Custom Controls](https://abap2ui5.github.io/docs/advanced/extensibility/custom_control.md): You can build your own UI5 custom controls and use them in abap2UI5 apps. - [Integration](https://abap2ui5.github.io/docs/integration/index.md): Every place an abap2UI5 app can appear outside its own browser tab - Fiori Launchpad, SAP Build Work Zone, SAP Mobile Start, a native mobile shell, other UI5 apps and web pages, Microsoft Teams, Microsoft Excel, another ABAP system and AI agents. - [Fiori Launchpad](https://abap2ui5.github.io/docs/configuration/launchpad.md): Embed abap2UI5 apps as tiles in the SAP Fiori Launchpad on S/4HANA on-premise or private cloud - installation, target mapping, launchpad features, KPIs and troubleshooting. - [Build Work Zone](https://abap2ui5.github.io/docs/configuration/btp.md): Run abap2UI5 apps in SAP Build Work Zone and other BTP services through the connector app, with an on-premise or cloud ABAP backend. - [Fiori Elements Integration](https://abap2ui5.github.io/docs/advanced/fiori.md): An abap2UI5 app can run inside the object page of a Fiori elements app, next to the sections the annotations make. - [Mobile Start](https://abap2ui5.github.io/docs/configuration/mobile_start.md): abap2UI5 apps as tiles in SAP Mobile Start on iOS and Android, mirrored from the Fiori Launchpad with no extra development. - [Native Mobile Shell](https://abap2ui5.github.io/docs/integration/mobile_shell.md): The abap2UI5 native mobile shell - a proof of concept that runs abap2UI5 apps in a generic iOS and Android app built for the SAP mobile stack, with a bridge to the camera, and the NativeBridgeScan control that uses it. - [Microsoft Teams](https://abap2ui5.github.io/docs/integration/teams.md): Show an abap2UI5 app in Microsoft Teams as a personal tab - why it is not an Adaptive Card, the user exit that lets Teams frame the app, a wrapper page with the Teams JavaScript library, the app manifest, the upload, and the sign-in. - [Microsoft Excel](https://abap2ui5.github.io/docs/integration/excel.md): abap2UI5 apps in the task pane of Microsoft Excel with the abap2UI5 add-in for Excel - a host page on your SAP system, the add-in manifest, the deployment, Excel on the web, and the ExcelBridge control that lets the app read and write the workbook. - [RFC Connector](https://abap2ui5.github.io/docs/advanced/rfc.md): The abap2UI5 RFC Connector calls abap2UI5 apps remotely over RFC between two ABAP systems. - [HTTP Connector](https://abap2ui5.github.io/docs/advanced/http.md): The abap2UI5 HTTP Connector calls abap2UI5 apps remotely over HTTP between two ABAP systems. It works similarly to the RFC Connector, but uses HTTP instead of RFC as the communication channel. - [Agent-Operable Apps](https://abap2ui5.github.io/docs/advanced/agents.md): AI agents operating abap2UI5 apps - four tools that read an app's screen as data, fill its fields and fire its events over the app's own JSON protocol, in the MCP server, in the VS Code extension, as an ABAP-native endpoint in the system and in a CAP server with cap2UI5. - [Downporting](https://abap2ui5.github.io/docs/advanced/downporting.md): abap2UI5 below ABAP 7.50 - the downported branch supports NetWeaver 7.02 and later, generated from main automatically; how it works and why the framework is downportable. - [Namespaces, Renaming](https://abap2ui5.github.io/docs/advanced/renaming.md): Everything abap2UI5 installs lives under a single prefix: Z2UI5_. - [Working Off-Stack](https://abap2ui5.github.io/docs/advanced/working_off_stack.md): An abap2UI5 app usually starts as a class typed straight into a system, living there and nowhere else. - [Migrating Classic Reports](https://abap2ui5.github.io/docs/advanced/report_migration.md): Converting a classic ABAP report - selection screen, event blocks, WRITE list, ALV - into an abap2UI5 app of the abap-cloud-gui add-on with its converter report2cloud, from the command line or through the MCP server's migrate_report tool, and what is left to do for ABAP Cloud. - [UI5 Legacy-Free](https://abap2ui5.github.io/docs/advanced/legacy_free.md): The abap2UI5 frontend is also available as a legacy-free variant, bootstrapped from the new legacy-free distribution of OpenUI5 (1.142.0-legacy-free) - [Tooling](https://abap2ui5.github.io/docs/advanced/tooling.md): The optional tooling around abap2UI5, in the order a developer meets it - the playground, the layout editor, the Claude Code plugin and MCP server, the VS Code extension, the linter in CI, the headless frontend and the agent runtime - each with what it does, when to use it and how to start it. - [npm Packages](https://abap2ui5.github.io/docs/advanced/npm_packages.md): The npm packages around abap2UI5 - what each one is for, which ones depend on each other, and the version rules that keep them compatible. - [abap2UI5 linter](https://abap2ui5.github.io/docs/advanced/linter.md): The abap2UI5 linter reconstructs the UI5 view out of the ABAP that builds it and reports what UI5 does not have, without an SAP system - findings, rules, the pipeline, the library. - [MCP Server](https://abap2ui5.github.io/docs/advanced/mcp_server.md): The abap2UI5 MCP server - the tools an AI coding agent gets to boot an app headless, read the errors and a screenshot, and search the samples; setup and the intended loop. - [VS Code Extension](https://abap2ui5.github.io/docs/advanced/vscode.md): The abap2UI5 VS Code extension - run the app from the editor on F9, check views while you type, write views with the linter's help, in VS Code and vscode.dev. - [Agent Setup](https://abap2ui5.github.io/docs/advanced/agent_setup.md): Setting up an AI agent for abap2UI5 development, in rising order of effort - the conventions file it reads, the gates it can run without a system, the MCP server that gives it the build-and-look loop, and the editor. - [Toolchain](https://abap2ui5.github.io/docs/technical/tools/index.md): The open-source projects abap2UI5 is built with - abapGit, ajson, S-RTTI, abaplint, open-abap, abap-cleaner, abapmerge - and what each one does for the framework. - [abapGit](https://abap2ui5.github.io/docs/technical/tools/abapgit.md): This project uses abapGit for version control and easy code distribution. - [ajson](https://abap2ui5.github.io/docs/technical/tools/ajson.md): abap2UI5 handles all frontend-backend communication with JSON. - [S-RTTI](https://abap2ui5.github.io/docs/technical/tools/srtti.md): In abap2UI5, you don't always have to define your data model at design time. Instead, you can work with generic data references and apply typing dynamically at runtime based on your program logic. - [abaplint](https://abap2ui5.github.io/docs/technical/tools/abaplint.md): This project uses abaplint for static code analysis and several other tasks. ## Resources - [References](https://abap2ui5.github.io/docs/resources/references.md): - Field Service Management Mobile Logging using abap2UI5 (Decabase Blog - 22.08.2026) - UI5 in ABAP Cloud (without RAP or Fiori Elements) (Decabase Blog - 17.08.2026) - Fiori-type Apps built 100% with ABAP (Logali Gro... - [Client API](https://abap2ui5.github.io/docs/resources/api.md): The complete abap2UI5 client API — every method, parameter and constant of z2ui5_if_client on the framework's main branch, generated from the source. - [Add-ons](https://abap2ui5.github.io/docs/resources/addons.md): The optional add-ons around abap2UI5 - popups, HTTP and RFC connectors, a lock manager, table maintenance, launchpad KPIs - and the open-source projects it builds on. - [Who Uses abap2UI5?](https://abap2ui5.github.io/docs/resources/who_uses.md): Companies, workshops and integrations that use abap2UI5, with the system release and the use case, and how to add your own. - [Release Notes](https://abap2ui5.github.io/docs/resources/changelog.md): The abap2UI5 release notes - every release with its changes, newest first. - [Deprecations](https://abap2ui5.github.io/docs/resources/deprecations.md): What in abap2UI5 has a successor - each deprecated call with what to write instead, old and new code side by side. - [Blogs](https://abap2ui5.github.io/docs/advanced/insights/index.md): The abap2UI5 blog series - the ideas behind abap2UI5 in pieces one coffee long, from why it exists and how it works to a working day and where it belongs. - [#1 Somewhere on the Way to UI5, We Lost RTTS](https://abap2ui5.github.io/docs/advanced/insights/01-somewhere-on-the-way-to-ui5.md): Open SE16 and type a table name. Any table name. A screen appears with the right columns, the right labels and the right types, and nobody wrote that screen for that table. - [#2 The Cost of a Screen](https://abap2ui5.github.io/docs/advanced/insights/02-the-cost-of-a-screen.md): An ABAP team needs a screen. A maintenance view for a customizing table nobody wants to explain in SM30 again. - [#3 One Class, No Programming Model](https://abap2ui5.github.io/docs/advanced/insights/03-one-class-no-programming-model.md): To use a framework, you always have to fulfill certain requirements: these can be a structure to follow, a lifecycle to fit into, layers to fill in - [#4 No Annotation in Between](https://abap2ui5.github.io/docs/advanced/insights/04-no-annotation-in-between.md): In a metadata-driven UI a screen is described rather than written. - [#5 UI5 Over-the-Wire](https://abap2ui5.github.io/docs/advanced/insights/05-ui5-over-the-wire.md): A UI5 freestyle app is a single-page application. - [#6 The Frontend Knows Nothing](https://abap2ui5.github.io/docs/advanced/insights/06-the-frontend-knows-nothing.md): The first GET request delivers a UI5 app to the browser. Worth asking what is actually inside it. - [#7 One Handler for Every App](https://abap2ui5.github.io/docs/advanced/insights/07-one-handler-for-every-app.md): Count what a screen usually costs in backend artifacts. - [#8 Only the Changed Part](https://abap2ui5.github.io/docs/advanced/insights/08-only-the-changed-part.md): If the backend sends the view on every request — #5 — does the screen rebuild itself on every click? - [#9 A New Instance on Every Request](https://abap2ui5.github.io/docs/advanced/insights/09-a-new-instance-on-every-request.md): Every request lands on a fresh instance of the app class. No session holds the previous one, and the next request may not even reach the same application server. - [#10 Swapping the View at Runtime](https://abap2ui5.github.io/docs/advanced/insights/10-swapping-the-view-at-runtime.md): The view is a string the app produced for this request. Which raises an obvious question: what stops the next request from producing a different one? - [#11 No Build, No Deploy, No Cache](https://abap2ui5.github.io/docs/advanced/insights/11-no-build-no-deploy-no-cache.md): The loop is: change the class, activate, refresh the browser. - [#12 Where Your Own JavaScript Goes](https://abap2ui5.github.io/docs/advanced/insights/12-where-your-own-javascript-goes.md): Sooner or later an app needs something the XML view cannot express. A chart library. A control nobody has wrapped. - [#13 Four Verbs, Every Control](https://abap2ui5.github.io/docs/advanced/insights/13-four-verbs-every-control.md): The first view builder in abap2UI5 had one method per UI5 control. button( ), input( ), table( ) — hundreds of them, each with the control's properties as named parameters. - [#14 A Classrun for the Browser](https://abap2ui5.github.io/docs/advanced/insights/14-a-classrun-for-the-browser.md): Every ABAP developer already knows the smallest program that does something: - [#15 Where the Selection Screen Went](https://abap2ui5.github.io/docs/advanced/insights/15-where-the-selection-screen-went.md): Long before anyone said "full-stack" in a job ad, ABAP had this: - [#16 One Click, One Request](https://abap2ui5.github.io/docs/advanced/insights/16-one-click-one-request.md): The mental model that everything else in the framework rests on fits in one sentence: every click is one HTTP request, and every request is one call to main( ) on a fresh instance. - [#17 What the Client Can Do](https://abap2ui5.github.io/docs/advanced/insights/17-what-the-client-can-do.md): The app implements one interface with one method. The single parameter of that method is the other interface — z2ui5_if_client — and it is the whole of what an app can ask the framework for. - [#18 CALL SCREEN, LEAVE SCREEN](https://abap2ui5.github.io/docs/advanced/insights/18-call-screen-leave-screen.md): Module pools had a call stack of screens. CALL SCREEN 200 pushed one, LEAVE TO SCREEN 0 popped it, and the screen underneath came back with its fields intact. - [#19 Where F4 Went](https://abap2ui5.github.io/docs/advanced/insights/19-where-f4-went.md): PARAMETERS pa_arbgb TYPE t100-arbgb got a value help for free, because the DDIC knew the search help and the screen knew the DDIC. - [#20 MESSAGE Still Works](https://abap2ui5.github.io/docs/advanced/insights/20-message-still-works.md): An ABAP developer has thirty years of habits around messages, and the good news is that most of them carry over unchanged. - [#21 The Lock Is Gone by the Next Click](https://abap2ui5.github.io/docs/advanced/insights/21-the-lock-is-gone-by-the-next-click.md): VA02 calls ENQUEUE_EVVBAK when the order opens and holds the lock for as long as the dialog session lives. That works because the session lives. - [#22 Who May Start Which App](https://abap2ui5.github.io/docs/advanced/insights/22-who-may-start-which-app.md): One ICF node serves every abap2UI5 app in the system, and the URL names the class: ?app_start=zcl_job_monitor. - [#23 100 Rows, Four Hours, One Request](https://abap2ui5.github.io/docs/advanced/insights/23-100-rows-four-hours-one-request.md): Three numbers decide whether an abap2UI5 app feels fast, and none of them is in your code. - [#24 ABAP Unit for a Screen](https://abap2ui5.github.io/docs/advanced/insights/24-abap-unit-for-a-screen.md): Testing a screen is usually where enthusiasm goes to die. - [#25 When One Class Is Not Enough](https://abap2ui5.github.io/docs/advanced/insights/25-when-one-class-is-not-enough.md): Every example in this series is one class, and for the screens it is about that is the right size. - [#26 A Tile Like Any Other](https://abap2ui5.github.io/docs/advanced/insights/26-a-tile-like-any-other.md): An app that is reached by pasting a URL is a demo. It becomes an application when it has a tile — and in the launchpad an abap2UI5 app is indistinguishable from the RAP and freestyle tiles beside it. - [#27 One Codebase, 7.02 to ABAP Cloud](https://abap2ui5.github.io/docs/advanced/insights/27-one-codebase-702-to-abap-cloud.md): Most SAP landscapes are currently two landscapes. Something old that runs the business, something new that is being built beside it, and a migration between them measured in years rather than sprints. - [#28 Cloud-Ready Is a Property of Your App](https://abap2ui5.github.io/docs/advanced/insights/28-cloud-ready-is-a-property-of-your-app.md): The framework is ABAP Cloud compliant. It is written in the ABAP for Cloud language version, it calls released APIs only, it modifies no standard SAP code, and it installs on BTP ABAP Environment and S/4HANA Public Cl... - [#29 When the API Is Not Released](https://abap2ui5.github.io/docs/advanced/insights/29-when-the-api-is-not-released.md): SAP grades an extension, and since August 2025 it does so on four clean core levels: - [#30 On-Stack or Side-by-Side](https://abap2ui5.github.io/docs/advanced/insights/30-on-stack-or-side-by-side.md): Two places to run an abap2UI5 app, and — this is the part people usually get backwards — the choice is about lifecycles rather than about code. - [#31 One App, Many Systems](https://abap2ui5.github.io/docs/advanced/insights/31-one-app-many-systems.md): A side-by-side app (#30) already runs outside the system it serves. Which invites a question worth asking out loud: how many systems can it serve? - [#32 From ITS to abap2UI5](https://abap2ui5.github.io/docs/advanced/insights/32-from-its-to-abap2ui5.md): Twenty-seven years of SAP user interfaces, laid out end to end - [#33 RAP or abap2UI5?](https://abap2ui5.github.io/docs/advanced/insights/33-rap-or-abap2ui5.md): The honest answer, before the table: most systems end up with both, and the question is never "which framework" but "which one for this screen". - [#34 UI5 Freestyle or abap2UI5?](https://abap2ui5.github.io/docs/advanced/insights/34-freestyle-or-abap2ui5.md): Both give full access to the UI5 control library. Neither limits what a screen can contain. So the choice is not about what is possible — it is about where the work happens and who does it. - [#35 Low-Code or abap2UI5?](https://abap2ui5.github.io/docs/advanced/insights/35-low-code-or-abap2ui5.md): A commercial low-code platform and abap2UI5 answer the same question: modern UIs for SAP systems without a full frontend stack per app. - [#36 Written for Agents](https://abap2ui5.github.io/docs/advanced/insights/36-written-for-agents.md): The property this series kept returning to — an app is one class, and the class is text — turned out to have a consequence nobody was designing for in 2023. - [#37 What the AI Leaves Behind](https://abap2ui5.github.io/docs/advanced/insights/37-what-the-ai-leaves-behind.md): Low-code platforms have AI assistants now. - [License](https://abap2ui5.github.io/docs/resources/license.md): abap2UI5 is MIT licensed, free for commercial use; the apps built with it are standard UI5 freestyle apps, licensed like any other UI5 app in your organization. - [Cost Calculator](https://abap2ui5.github.io/docs/resources/cost_calculator.md): What abap2UI5 costs for your users, systems, apps and support, worked out slider by slider - why every line of the sheet comes to the same number, what that number gets you, and who paid for it. - [Support](https://abap2ui5.github.io/docs/resources/support.md): Where to get help with abap2UI5 - community support on GitHub issues and Slack, and the options for commercial support. - [Contribution](https://abap2ui5.github.io/docs/resources/contribution.md): How to contribute to abap2UI5 - code, samples and documentation, turning answers into pages, and where to ask for help. - [Sponsor](https://abap2ui5.github.io/docs/resources/sponsor.md): Sponsor abap2UI5 and the open-source projects it is built on; the framework is maintained by volunteers in their free time. - [Logo & Brand](https://abap2ui5.github.io/docs/resources/logo.md): Everything the project signs — the documentation, the repositories, a talk slide, a link shared on LinkedIn — uses the same red mark, and the same three animals turn up around it. ## Beyond the documentation - [abap2UI5](https://github.com/abap2UI5/abap2UI5): the framework. `AGENTS.md` is the briefing for changing it; `src/02/z2ui5_if_client.intf.abap` is the complete API an app may call, with inline documentation - [samples](https://github.com/abap2UI5/samples): 130 complete apps, one class each. [`SAMPLES.md`](https://github.com/abap2UI5/samples/blob/main/SAMPLES.md) lists all of them with search terms - ask it "is there a sample for X?" before writing one - [samples-controls](https://github.com/abap2UI5/samples-controls): 689 ports of the official UI5 demo kit, plus `CAPABILITIES.md` - what abap2UI5 can and cannot express - [samples-stack](https://github.com/abap2UI5/samples-stack): abap2UI5 combined with OData, RAP, WebSockets and the Fiori Launchpad - [app-template](https://github.com/abap2UI5/app-template): starter repository with both gates and CI already wired up - begin an app here - [linter](https://github.com/abap2UI5/linter): checks an app class and the view it builds without an SAP system (CLI, GitHub Action, VS Code) - [mcp-server](https://github.com/abap2UI5/mcp-server): MCP server - query the sample catalogue, validate a view, deploy, build, boot the app headless and get a screenshot back. No SAP system needed ## What to know before writing ABAP - An app is ONE class implementing `z2ui5_if_app`. Everything enters `main`, which dispatches on `client->check_on_init( )`, `client->check_on_event( )` and `client->check_on_navigated( )`. - Build the view with `z2ui5_cl_ui5_view_builder` and its `ele`/`tag`/`a`/`end` verbs. Any other view builder that training data shows is superseded; resources/deprecations.html names it, and nothing else on the site does. - Bind with `client->_bind( )`. It is bidirectional, and only the paths the user edited travel back. - Every roundtrip is a fresh ABAP session. Nothing on the server survives between two clicks unless it is in the app class, which is serialized.