# 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. - [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 ## Getting Started - [Introduction](https://abap2ui5.github.io/docs/get_started/about.md): Build UI5 Apps Purely in ABAP - [Quickstart](https://abap2ui5.github.io/docs/get_started/quickstart.md): Try abap2UI5 first in the live demo: the complete stack - [Hello World](https://abap2ui5.github.io/docs/get_started/hello_world.md): Just copy the following class into your system: - [Full Example](https://abap2ui5.github.io/docs/get_started/full_example.md): This tutorial walks through a complete app that follows a typical ABAP flow: a small selection screen, reading data from the database, showing the result in a table, opening a popup to edit a row, and posting the chan... - [Tooling](https://abap2ui5.github.io/docs/get_started/tooling.md): Everything on this page is optional — abap2UI5 is one ABAP class and needs no tools at all. What these three add is the loop that ABAP does not give you by itself: catching a broken view before it reaches a system, an... - [Building with AI](https://abap2ui5.github.io/docs/get_started/ai.md): An AI assistant writing abap2UI5 starts at a disadvantage nothing about your project causes. - [What's Next?](https://abap2ui5.github.io/docs/get_started/next.md): You've installed abap2UI5 and built your first app. ## Cookbook - [Overview](https://abap2ui5.github.io/docs/cookbook/overview.md): The Cookbook collects task-oriented recipes for everyday abap2UI5 development. - [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): abap2UI5 uses SAP UI5 on the frontend without modification. - [Deprecated Controls](https://abap2ui5.github.io/docs/cookbook/view/deprecated_controls.md): abap2UI5 sends plain UI5 XML to the browser, so every control the UI5 runtime knows will render - [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): In abap2UI5 you share data between your ABAP code and the UI5 frontend with client->_bind( ). - [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): This section walks through rendering tabular and nested data in views. - [Trees](https://abap2ui5.github.io/docs/cookbook/model/trees.md): For hierarchical data, abap2UI5 uses nested ABAP structures to represent tree levels. - [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. - [Life Cycle](https://abap2ui5.github.io/docs/cookbook/event_navigation/life_cycle.md): Every request enters the main method. CASE abap_true dispatches between initialization, navigation returns, and user events using client->check_on_init( ) , client->check_on_event( EVENT_NAME ) , and client->check_on_... - [Backend](https://abap2ui5.github.io/docs/cookbook/event_navigation/backend.md): UI5 control properties can both display data and fire events. - [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. - [Action (Obsolete)](https://abap2ui5.github.io/docs/cookbook/event_navigation/action.md): client->action->gen( ) is obsolete. Use client->follow_up_action( ) instead — it takes the same frontend event and arguments and now covers this case directly. ::: - [Follow-up Action](https://abap2ui5.github.io/docs/cookbook/expert_more/follow_up_action.md): Sometimes, once your backend event handler has finished, you want to trigger an action that runs on the frontend - [Navigation](https://abap2ui5.github.io/docs/cookbook/event_navigation/navigation.md): In abap2UI5, each app is a single ABAP class. - [Routing](https://abap2ui5.github.io/docs/cookbook/event_navigation/routing.md): By default, abap2UI5 leaves the URL hash untouched - [Exception](https://abap2ui5.github.io/docs/cookbook/event_navigation/exception.md): Beyond plain messages, abap2UI5 ships dedicated popups and fallbacks for handling exceptions and unexpected failures. - [Popup](https://abap2ui5.github.io/docs/cookbook/popup_popover/popup.md): UI5 offers popups that overlay specific parts of the view. - [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: - [Built-In](https://abap2ui5.github.io/docs/cookbook/popup_popover/built_in.md): Pre-built popup classes cover the most common cases. - [Message](https://abap2ui5.github.io/docs/cookbook/translation_messages/message.md): Showing messages is an everyday task for ABAP developers. - [Logging](https://abap2ui5.github.io/docs/cookbook/translation_messages/logging.md): Logging is critical for business processes. - [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. - [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): For UI5 input fields, the soft keyboard pops up automatically when 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. - [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. - [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 - [Barcode Scanning](https://abap2ui5.github.io/docs/cookbook/device_capabilities/barcode_scanning.md): Barcode scanning is common in enterprise apps. - [Audio](https://abap2ui5.github.io/docs/cookbook/device_capabilities/audio.md): Audio feedback is handy in some scenarios. - [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): By default, abap2UI5 runs stateless like any other UI5 freestyle app, with only REST calls to the ABAP backend. - [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 - [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. abap2UI5 ships a built... - [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. - [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 - [App State, Share](https://abap2ui5.github.io/docs/cookbook/expert_more/app_state_share.md): abap2UI5 saves the current app state so you can return to it later - [RAP](https://abap2ui5.github.io/docs/cookbook/eml_cds_sql/rap.md): abap2UI5 is OData/RAP-agnostic — it doesn't care where data lives. You keep all your RAP logic (validations, determinations, actions, draft tables); only the UI layer is different — instead of a Fiori Elements fronten... - [EML](https://abap2ui5.github.io/docs/cookbook/eml_cds_sql/eml.md): All examples in these docs work without EML. - [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. - [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. - [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. - [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. - [E-Mail](https://abap2ui5.github.io/docs/cookbook/expert_more/email.md): abap2UI5 has no e-mail control of its own - [Fuzzy Search](https://abap2ui5.github.io/docs/cookbook/eml_cds_sql/fuzzy_search.md): On SAP HANA you can match strings tolerantly - [Debugging](https://abap2ui5.github.io/docs/configuration/debugging.md): Since all logic runs in ABAP, you can debug everything in the ABAP environment. - [Common Failures](https://abap2ui5.github.io/docs/cookbook/troubleshooting/common_failures.md): Not every problem raises an ABAP exception. - [Deprecations](https://abap2ui5.github.io/docs/resources/deprecations.md): Things in abap2UI5 that have a successor. Every entry says what to write instead, with the old and the new code next to each other. ## Configuration - [Setup](https://abap2ui5.github.io/docs/configuration/setup.md): Every UI5 application has an index.html that bootstraps the framework, picks a theme, defines the page title and so on. - [Installation](https://abap2ui5.github.io/docs/configuration/installation.md): abap2UI5 apps run directly via an HTTP service - [Theme](https://abap2ui5.github.io/docs/configuration/setup/theme.md): The theme defines the look and feel of every UI5 control - [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. - [Language](https://abap2ui5.github.io/docs/configuration/setup/logon_language.md): abap2UI5 picks the user's logon language automatically from the SAP session - [Security](https://abap2ui5.github.io/docs/configuration/security.md): abap2UI5 is a backend-centric framework. All logic and business data stay on the server; the frontend gets only the data it needs to render the view. - [Authorization](https://abap2ui5.github.io/docs/configuration/authorization.md): abap2UI5 gives you flexibility in managing authorization. - [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. - [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 - [Transport](https://abap2ui5.github.io/docs/configuration/transport.md): Transport abap2UI5 to production like any other ABAP project. - [Fiori Launchpad](https://abap2ui5.github.io/docs/configuration/launchpad.md): Embed your abap2UI5 apps into the SAP Fiori Launchpad (FLP) on S/4 On-Premise or Private Cloud. - [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. - [BTP ABAP Environment](https://abap2ui5.github.io/docs/configuration/btp_abap_env.md): The setup in BTP ABAP Environment matches S/4 Public Cloud. - [BTP Build Work Zone](https://abap2ui5.github.io/docs/configuration/btp.md): Embed your abap2UI5 apps into BTP services like SAP Build Work Zone. - [Mobile Start](https://abap2ui5.github.io/docs/configuration/mobile_start.md): SAP Mobile Start surfaces your abap2UI5 apps as tiles in SAP's native mobile entry-point app (iOS/Android). ## Advanced Topic - [Downporting](https://abap2ui5.github.io/docs/advanced/downporting.md): abap2UI5 works right away on ABAP 7.50 and later. - [Use Cases](https://abap2ui5.github.io/docs/advanced/use_cases.md): abap2UI5 fits many contexts, whether you work in a cloud-ready environment or with classic ABAP. - [Add-ons](https://abap2ui5.github.io/docs/advanced/addons.md): abap2UI5 focuses on core capabilities — rendering views, handling events, and exchanging data. This keeps the framework lean and easy to maintain. The real strength lies in the ecosystem: ready-to-use add-ons and comm... - [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. - [abap2UI5 linter](https://abap2ui5.github.io/docs/advanced/linter.md): The view an abap2UI5 app shows does not exist until the app runs. - [MCP Server](https://abap2ui5.github.io/docs/advanced/mcp_server.md): An AI coding agent asked to write an abap2UI5 app can write ABAP. - [VS Code Extension](https://abap2ui5.github.io/docs/advanced/vscode.md): Developing an abap2UI5 app the plain way means three windows: the editor with the class, a browser with the app, and the activation step between them. - [Local](https://abap2ui5.github.io/docs/advanced/local.md): abap2UI5-local is a special build that bundles all framework classes into a single HTTP handler class. - [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. - [Integration into Fiori Elements Apps](https://abap2ui5.github.io/docs/advanced/fiori.md): Extend the object page of a Fiori list report app with an abap2UI5 app. - [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) - [User Exits](https://abap2ui5.github.io/docs/advanced/extensibility/user_exits.md): abap2UI5 offers predefined user exits for tweaking the standard behavior. - [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. ## Technical Insight - [UI5 Over-the-Wire](https://abap2ui5.github.io/docs/technical/concept.md): _The Architecture of abap2UI5_ - [ABAP Thinking, UI5 Results](https://abap2ui5.github.io/docs/technical/dx.md): _A Developer-Centric Approach_ - [Cloud Readiness](https://abap2ui5.github.io/docs/technical/cloud.md): _Ready for the Future — or Not?_ - [Behind the Scenes](https://abap2ui5.github.io/docs/technical/how_it_all_works.md): _Technical Deep Dive into abap2UI5_ - [Technology Overview](https://abap2ui5.github.io/docs/technical/technology/overview.md): _From ITS to abap2UI5_ - [RAP vs. abap2UI5](https://abap2ui5.github.io/docs/technical/technology/rap.md): _Architecture, Communication, and Developer Experience_ - [UI5 Freestyle vs. abap2UI5](https://abap2ui5.github.io/docs/technical/technology/ui5.md): _Architecture, State, and Developer Experience_ - [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. - [abaplint](https://abap2ui5.github.io/docs/technical/tools/abaplint.md): This project uses abaplint for static code analysis and several other tasks. - [open-abap](https://abap2ui5.github.io/docs/technical/tools/open_abap.md): abap2UI5 uses open-abap to run unit tests and frontend tests, and to execute samples directly in your browser - [abap-cleaner](https://abap2ui5.github.io/docs/technical/tools/abap_cleaner.md): The abap-cleaner tool formats the abap2UI5 source code. - [abapmerge](https://abap2ui5.github.io/docs/technical/tools/abapmerge.md): The abapmerge tool creates the abap2UI5-local build by merging ABAP includes into a single file, bundling all abap2UI5 classes into one local implementation of an HTTP handler. ## Resource - [References](https://abap2ui5.github.io/docs/resources/references.md): - Webinar on Launchpad Integration (YouTube - 30.07.2025) - Featured on SAP Developer News (YouTube - 21.03.2025) - [Sample Catalogues](https://abap2ui5.github.io/docs/resources/samples.md): 614 working apps, in three repositories. Every one is a single ABAP class that compiles, renders, and is downported to three releases — so a sample is never a fragment you have to trust, it is an app you can pull and ... - [Who Uses abap2UI5?](https://abap2ui5.github.io/docs/resources/who_uses.md): We'd love to hear how you use abap2UI5. Whether in customer projects, integrations, workshops, open-source contributions, or any other initiative, sharing your scenario can inspire others to try the project and help t... - [Release Notes](https://abap2ui5.github.io/docs/resources/changelog.md): See Deprecations for what is superseded but still shipping, and for the full removal list with migration notes. - [License](https://abap2ui5.github.io/docs/resources/license.md): Technically, abap2UI5 apps are standard UI5 freestyle applications. - [Support](https://abap2ui5.github.io/docs/resources/support.md): The community offers support for abap2UI5 on a best-effort basis. - [Contact](https://abap2ui5.github.io/docs/resources/contact.md): abap2UI5 is an open-source project that values open, transparent communication. - [Contribution](https://abap2ui5.github.io/docs/resources/contribution.md): abap2UI5 is an open-source project built by the ABAP community, often in free time or alongside other projects. - [Sponsor](https://abap2ui5.github.io/docs/resources/sponsor.md): abap2UI5 is a community-driven project built by developers who spend their free time to create, maintain, and improve it. - [Logo](https://abap2ui5.github.io/docs/resources/logo.md): !abap2UI5 logo ## 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): 152 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): 430 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. `z2ui5_cl_xml_view` is the FROZEN predecessor: it still works, it is what most training data shows, and it is not what to write today. - 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.