diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml
index 59498e7..b1d73d1 100644
--- a/.github/workflows/pages.yml
+++ b/.github/workflows/pages.yml
@@ -1,9 +1,7 @@
# Build, test and publish the page to GitHub Pages at
# https://abap2ui5.github.io/test-docs/.
#
-# On a pull request it builds and tests only. On main it also deploys; the
-# weekly run picks up the counted figures from the framework README
-# (src/lib/facts.mjs), which change without a commit here.
+# On a pull request it builds and tests only. On main it also deploys.
#
# Needs Settings → Pages → Source: "GitHub Actions" once.
name: pages
@@ -12,8 +10,6 @@ on:
push:
branches: [main]
pull_request:
- schedule:
- - cron: "17 6 * * 1"
workflow_dispatch:
permissions:
diff --git a/AGENTS.md b/AGENTS.md
index 7d0ce25..57be42a 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,7 +1,8 @@
# AGENTS.md
-Evaluate abap2UI5: one static page for the people who approve abap2UI5,
-published at https://abap2ui5.github.io/test-docs/ by GitHub Pages. A
+abap2UI5 for decision makers: one static page that presents abap2UI5 to IT
+management and product owners - what it can build, why it beats every other
+UI5 solution on SAP (commercial ones included), what it costs - published at https://abap2ui5.github.io/test-docs/ by GitHub Pages. A
standalone site — its own repository, build and deployment — and nothing in
it depends on abap2UI5/docs or abap2UI5/playground at build time.
@@ -11,13 +12,12 @@ it depends on abap2UI5/docs or abap2UI5/playground at build time.
| --- | --- |
| `src/pages/index.astro` | The page: the text of every section, as data at the top and markup below |
| `src/layouts/Page.astro` | The document: head, the Content-Security-Policy, the header with the section links, the foot |
-| `src/components/` | `Stats` (the figures under the hero), `CostCalculator` (the sheet, after the manual's), `Icon` (inline marks) |
+| `src/components/` | `Stats` (the headline tiles under the hero), `CostCalculator` (the sheet, after the manual's), `Icon` (inline marks) |
| `public/calc.js` | The cost calculator in the browser - the page's one script; the calculator reads correctly without it |
-| `src/lib/facts.mjs` | Reads the counted figures from the framework README's `facts:start` block at build time (`EVALUATE_README` names a local file, else raw GitHub); a failed read costs the counts, never the build |
| `src/styles/global.css` | The one stylesheet; light and dark follow the system |
| `public/` | Font (Inter, self-hosted), logo, icons, the screenshot |
| `test/site.test.mjs` | `node:test` over the built `dist/index.html` |
-| `.github/workflows/pages.yml` | Build + test on every PR; deploy on main and weekly (the figures move without a commit here) |
+| `.github/workflows/pages.yml` | Build + test on every PR; deploy on main |
## Commands
@@ -41,7 +41,8 @@ npm run check # build + test, what CI runs
page. No inline `style=""` either (`style-src 'self'`) — a class in `global.css`.
- **Nothing from another origin.** No CDN, no web font service, no analytics;
the font and the images are in `public/`.
-- **No number typed by hand.** The counts come from the framework README.
+- **Written for managers.** No technical counts (tests, specs, gates) and no
+ "evaluate" or "problem" in the visible text - `test/site.test.mjs` checks the latter.
- **Toolchain:** Node 22 (`.nvmrc`, `engines`), every dependency pinned
exactly (astro 7.3.8), actions pinned to commits.
- The site is written for people. Links into the manual are absolute
diff --git a/README.md b/README.md
index 4398a8d..7e2e61c 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,10 @@
-# Evaluate abap2UI5
+# abap2UI5 for decision makers
-The page for the people who approve abap2UI5 rather than build with it — IT
-management, architecture boards, product owners, SAP Basis and internal audit:
-the problem it answers, when to use it and when RAP, what your organization
-keeps, where it runs, what it costs, the objections a review board raises, and
-how to evaluate it on one real screen in a week.
+The page that presents abap2UI5 to IT management, product owners and
+architecture boards: what you can build with it, why it beats every other way
+to build UI5 apps on SAP — commercial platforms included — what your
+organization keeps, where it runs, what it costs, and how to start with one
+real screen.
**→ https://abap2ui5.github.io/test-docs/**
@@ -22,8 +22,7 @@ npm run dev # http://localhost:4321/test-docs/
npm run check # build + tests, what CI runs
```
-Edit the text in `src/pages/index.astro`. The counted figures under the hero
-are read at build time from the framework README and are never typed here.
+Edit the text in `src/pages/index.astro`.
## License
diff --git a/astro.config.mjs b/astro.config.mjs
index abb3ade..84d4ea9 100644
--- a/astro.config.mjs
+++ b/astro.config.mjs
@@ -1,4 +1,4 @@
-// Evaluate abap2UI5 - one static page, published by GitHub Pages at
+// abap2UI5 for decision makers - one static page, published by GitHub Pages at
// https://abap2ui5.github.io/test-docs/ (.github/workflows/pages.yml).
//
// Static output only: no client component, no island. The page's one script
diff --git a/package-lock.json b/package-lock.json
index 23a53a2..6479d1d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,11 +1,11 @@
{
- "name": "abap2ui5-evaluate",
+ "name": "abap2ui5-decision-makers",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "abap2ui5-evaluate",
+ "name": "abap2ui5-decision-makers",
"version": "1.0.0",
"license": "MIT",
"devDependencies": {
diff --git a/package.json b/package.json
index d822666..2f0d65b 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
{
- "name": "abap2ui5-evaluate",
+ "name": "abap2ui5-decision-makers",
"version": "1.0.0",
"private": true,
- "description": "Evaluate abap2UI5 - the page for the people who approve it",
+ "description": "abap2UI5 for decision makers",
"license": "MIT",
"type": "module",
"engines": {
diff --git a/public/apps/z2ui5_cl_smp_app_070.webp b/public/apps/z2ui5_cl_smp_app_070.webp
new file mode 100644
index 0000000..37d7ae0
Binary files /dev/null and b/public/apps/z2ui5_cl_smp_app_070.webp differ
diff --git a/public/apps/z2ui5_cl_smp_app_530.webp b/public/apps/z2ui5_cl_smp_app_530.webp
new file mode 100644
index 0000000..230c7bc
Binary files /dev/null and b/public/apps/z2ui5_cl_smp_app_530.webp differ
diff --git a/public/apps/z2ui5_cl_smp_app_540.webp b/public/apps/z2ui5_cl_smp_app_540.webp
new file mode 100644
index 0000000..92b770f
Binary files /dev/null and b/public/apps/z2ui5_cl_smp_app_540.webp differ
diff --git a/public/apps/z2ui5_cl_smpc_app_024.webp b/public/apps/z2ui5_cl_smpc_app_024.webp
new file mode 100644
index 0000000..2e9261c
Binary files /dev/null and b/public/apps/z2ui5_cl_smpc_app_024.webp differ
diff --git a/public/apps/z2ui5_cl_smpc_app_089.webp b/public/apps/z2ui5_cl_smpc_app_089.webp
new file mode 100644
index 0000000..d0a4e66
Binary files /dev/null and b/public/apps/z2ui5_cl_smpc_app_089.webp differ
diff --git a/public/apps/z2ui5_cl_smpc_app_108.webp b/public/apps/z2ui5_cl_smpc_app_108.webp
new file mode 100644
index 0000000..4084bcf
Binary files /dev/null and b/public/apps/z2ui5_cl_smpc_app_108.webp differ
diff --git a/public/apps/z2ui5_cl_smpc_app_291.webp b/public/apps/z2ui5_cl_smpc_app_291.webp
new file mode 100644
index 0000000..48e6fce
Binary files /dev/null and b/public/apps/z2ui5_cl_smpc_app_291.webp differ
diff --git a/public/apps/z2ui5_cl_smpc_app_329.webp b/public/apps/z2ui5_cl_smpc_app_329.webp
new file mode 100644
index 0000000..3da1c9a
Binary files /dev/null and b/public/apps/z2ui5_cl_smpc_app_329.webp differ
diff --git a/public/apps/z2ui5_cl_smpc_app_517.webp b/public/apps/z2ui5_cl_smpc_app_517.webp
new file mode 100644
index 0000000..5aa44f2
Binary files /dev/null and b/public/apps/z2ui5_cl_smpc_app_517.webp differ
diff --git a/src/components/CostCalculator.astro b/src/components/CostCalculator.astro
index a042dd1..3817baf 100644
--- a/src/components/CostCalculator.astro
+++ b/src/components/CostCalculator.astro
@@ -43,7 +43,7 @@ const lines = [
const give = [
["Star the repository.", `One click on GitHub, and the next visitor sees a project rather than an experiment.`],
["Answer somebody.", `One reply under an issue or in Slack saves somebody else an afternoon of searching.`],
- ["Report what broke.", `An issue with a class that reproduces the problem is half of the fix already.`],
+ ["Report what broke.", `An issue with a class that reproduces the bug is half of the fix already.`],
["Post about it.", `A short post that mentions the page and carries #abap2UI5 is how the word gets around.`],
["Add your company.", `One row in Who Uses abap2UI5? is what answers is anybody actually running this?`],
["Sponsor the work.", `The contributors, and the open-source projects it stands on - the smallest amount is a real one.`],
diff --git a/src/components/Icon.astro b/src/components/Icon.astro
index e0dd6de..83709e0 100644
--- a/src/components/Icon.astro
+++ b/src/components/Icon.astro
@@ -14,6 +14,13 @@ const PATHS = {
key: '',
db: '',
log: '',
+ box: '',
+ wrench: '',
+ factory: '',
+ check: '',
+ form: '',
+ phone: '',
+ spark: '',
leaf: '',
};
const { name } = Astro.props;
diff --git a/src/components/Stats.astro b/src/components/Stats.astro
index 0b2aa20..eb558d6 100644
--- a/src/components/Stats.astro
+++ b/src/components/Stats.astro
@@ -1,17 +1,17 @@
---
-/* The size of the thing, under the hero. The counts are read at build time
- * from the framework README (src/lib/facts.mjs), never typed; the last two
- * tiles are the release spans and the license, which are the project's
- * claims rather than counts. Without the README the counts are left out and
- * the two claims stay. */
-import { readFacts } from "../lib/facts.mjs";
-const facts = await readFacts();
+/* The headline under the hero: what a decision maker takes away in five
+ * seconds. Claims, not counts - the technical figures (tests, specs, gates)
+ * belong to the framework's README, not to this page. */
+const tiles = [
+ ["0 €", "license fees - now and later, for any number of users"],
+ ["1 class", "per app - no frontend project, no extra platform"],
+ ["Minutes", "to a first screen, built by the ABAP team you have"],
+ ["7.02 → Cloud", "every SAP release, from one source"],
+ ["100 % yours", "open source, no vendor, no lock-in"],
+];
---
-
+
- {facts.map((f) =>
{f.value}{f.label}
)}
-
7.02 → Cloudone source for every ABAP release
-
MITno license fee, no per-user cost
+ {tiles.map(([value, label]) =>
{value}{label}
)}
- {facts.length > 0 &&
Counted from the framework repository at build time.
- abap2UI5 Evaluate
+ abap2UI5 for decision makers
diff --git a/src/lib/facts.mjs b/src/lib/facts.mjs
deleted file mode 100644
index efe8d27..0000000
--- a/src/lib/facts.mjs
+++ /dev/null
@@ -1,51 +0,0 @@
-// The counted figures - unit tests, specs, browser suites, gates. A reader who
-// is deciding wants the size of the thing, and this repository types no number
-// of its own: the framework's README carries them between `facts:start` and
-// `facts:end`, regenerated there by `npm run facts` and held current by a gate.
-//
-// Read at build time: from the file EVALUATE_README names (a local clone),
-// else from raw.githubusercontent.com. Allowed to fail - no network, a 5xx, a
-// README whose block moved - and then the band shows what it can without the
-// counts, and the build log says so. It never falls back to a typed number.
-import fs from "node:fs";
-
-const README_URL = "https://raw.githubusercontent.com/abap2UI5/abap2UI5/main/README.md";
-
-/* What the block carries that the page does not show as a count: the workflow
- * total (a maintainer's figure), the release spans (shown as their own tiles)
- * and the trailing "counted from this repository by …". */
-const SKIP = /workflows|→|counted/;
-
-/** The figures of the block as plain strings - "1,530 ABAP unit tests". */
-export function factsIn(readme) {
- const block = String(readme).match(/([\s\S]*?)/);
- if (!block) return [];
- const text = block[1].replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
- return text.split(/\s·\s/).map((s) => s.trim()).filter((s) => s && !SKIP.test(s));
-}
-
-/** "1,530 ABAP unit tests" -> { value: "1,530", label: "ABAP unit tests" }. */
-export function splitFact(fact) {
- const m = String(fact).match(/^([\d.,]+\+?)\s+(.+)$/);
- return m ? { value: m[1], label: m[2] } : { value: "", label: fact };
-}
-
-let cached;
-export async function readFacts() {
- if (cached) return cached;
- let readme = "";
- try {
- if (process.env.EVALUATE_README) {
- readme = fs.readFileSync(process.env.EVALUATE_README, "utf8");
- } else {
- const res = await fetch(README_URL, { signal: AbortSignal.timeout(15000) });
- if (!res.ok) throw new Error(`HTTP ${res.status}`);
- readme = await res.text();
- }
- } catch (err) {
- console.warn(`evaluate: the counted figures were not read (${err.message}) - the page goes out without them`);
- }
- cached = factsIn(readme).map(splitFact);
- if (readme && !cached.length) console.warn("evaluate: the framework README has no facts block - the page goes out without the counts");
- return cached;
-}
diff --git a/src/pages/index.astro b/src/pages/index.astro
index d04da6a..a1b03b8 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -1,7 +1,7 @@
---
-/* Evaluate abap2UI5 - the page for the people who approve it: IT management,
- * architecture boards, product owners, SAP Basis, internal audit. The
- * questions a review asks, in the order it asks them.
+/* abap2UI5 for decision makers - IT management, product owners, architecture
+ * boards: what it lets you build, why it beats every other way to put a UI5
+ * app on SAP (commercial products included), what it costs and how to start.
*
* THE SECTION IDS ARE ADDRESSES. /docs/evaluate redirects here with its
* #fragment, and the framework's README links #what-you-keep and
@@ -17,6 +17,19 @@ const PLAYGROUND = "https://abap2ui5.github.io/playground/";
const GITHUB = "https://github.com/abap2UI5/abap2UI5";
const base = import.meta.env.BASE_URL;
+/* What it solves - the processes, not one problem. The same ground the
+ * commercial SAP app platforms sell (warehouse, maintenance, shop floor,
+ * approvals), at no license fee. */
+const useCases = [
+ ["box", "Warehouse & logistics", "Goods receipt, picking, stock transfers and inventory counts on scanners, handhelds and tablets - in the browser, with the barcode scanner and camera of the device.", "z2ui5_cl_smp_app_530", "A scan field for the warehouse: every scan lands in the list, no tap needed"],
+ ["wrench", "Maintenance & service", "Work orders, notifications and checklists for technicians, on the desktop in the workshop or on the phone at the machine.", "z2ui5_cl_smpc_app_089", "An object page: header, status and sections, as a work order would show them"],
+ ["factory", "Production & shop floor", "Confirmations, quality inspections, shift plans and the special processes the standard never covered - right where the work happens.", "z2ui5_cl_smpc_app_108", "A planning calendar, as a shift or capacity plan would use it"],
+ ["check", "Approvals & workflows", "Purchase requisitions, invoices, leave and master-data requests: approve in one click, in the launchpad, in Teams or on the phone.", "z2ui5_cl_smpc_app_291", "A notification inbox with priorities and actions"],
+ ["gauge", "Cockpits & dashboards", "KPIs, charts and monitors for one team or one process, live from SAP - no data warehouse, no extra BI tool.", "z2ui5_cl_smpc_app_517", "Launchpad tiles with KPIs, trends and figures"],
+ ["form", "Paper & Excel replaced", "Forms, checklists and spreadsheets that live outside SAP become apps that write straight into it.", "z2ui5_cl_smpc_app_329", "A form with an edit switch, instead of a paper form"],
+ ["list", "SAP GUI modernized", "Reports, ALV lists and transactions turn into browser apps one at a time, with the logic behind them unchanged.", "z2ui5_cl_smp_app_070", "An ALV-style table with search, sort, filter and row actions"],
+ ["phone", "Mobile, without an app store", "Every app runs on iOS and Android in the browser or the mobile shell - nothing to install, nothing to distribute.", "z2ui5_cl_smpc_app_024", "A feed app on a phone"],
+];
const useIt = [
["The team is ABAP.", "No JavaScript, no UI5 tooling, no Business Application Studio to set up. An app is one class, written, debugged, transported and unit-tested like every other class."],
["The system is older than RAP.", "NetWeaver 7.02 to 7.4x have no RAP and a Fiori stack that is expensive to add. abap2UI5 runs there from the same source it runs on ABAP Cloud, so an app written on 7.31 today moves to S/4HANA unchanged."],
@@ -24,22 +37,31 @@ const useIt = [
["You do not want a deployment pipeline.", "No BSP upload, no approuter, no MTA. The ABAP system serves the frontend; an abapGit pull is the installation."],
["You replace SAP GUI screens one at a time.", "Selection screens, lists and transactions become browser apps without rewriting the logic behind them."],
];
-const useRap = [
- ["The service is the product.", "Other consumers, a mobile app, an integration, SAP's own apps, need the OData service anyway. RAP gives you the service and the UI from one model; abap2UI5 gives you a UI and no service."],
- ["The screen is a standard floorplan and should stay one.", "List report, object page, worklist, with SAP's draft handling and flexible column layout as SAP ships and maintains them. Fiori Elements tracks every UI5 release for you; a hand-built screen is yours to keep current."],
- ["The data is large and lives behind paging.", "Fiori Elements pages, sorts and filters through OData on the server. In abap2UI5 the table a view binds travels with the model; thousands of rows are routine, millions are the app's job to page."],
- ["Offline, or a native mobile SDK, is a requirement.", "abap2UI5 is a roundtrip to the ABAP system on every interaction. It has a mobile shell for camera, barcode and location; it has no offline store."],
- ["A frontend team should own the frontend.", "The app is one ABAP class; that is the point, and it means there is no frontend project for a separate team to own, and no place for heavy client-side behavior."],
- ["The organization has standardized on it.", "A clean-core guideline that names RAP as the extensibility model is a decision already taken. abap2UI5 passes the ABAP Cloud checks, but it is not SAP's programming model, and a review board will say so."],
+/* The market, as a manager compares it. Columns: abap2UI5, then SAP's own
+ * two routes, then the commercial UI5 app platforms and low-code builders
+ * sold on top of SAP. */
+const rivals = ["RAP + Fiori Elements", "Freestyle UI5 + OData", "Commercial UI5 & low-code platforms"];
+const compare = [
+ ["License cost", "None. MIT, for any number of users, systems and apps", "Part of the SAP license", "Part of the SAP license", "Subscription or per-user fees, renewed every year"],
+ ["Who builds the apps", "The ABAP team you already have", "ABAP plus CDS, RAP and annotation specialists", "JavaScript / UI5 developers", "Developers trained on the vendor's tool"],
+ ["First screen", "Minutes", "Days: model, service, project, deployment", "Days to weeks", "After the platform is installed and licensed"],
+ ["Freedom of the UI", "Every UI5 control, any layout", "SAP's floorplans and their extension points", "Every UI5 control", "What the vendor's designer offers"],
+ ["Older SAP releases", "NetWeaver 7.02 up to ABAP Cloud, one source", "7.5x and later", "Yes, with OData effort per release", "Depends on the vendor's add-on"],
+ ["Extra infrastructure", "None - one endpoint on your SAP system", "Fiori frontend server and deployment", "Frontend deployment (BSP, BTP or web server)", "The vendor's add-on, server or cloud tenant"],
+ ["Lock-in", "None - apps are plain ABAP classes in your system", "SAP's programming model", "Low", "Apps live in the vendor's runtime and repository"],
+ ["Source code", "Open, every line, on GitHub", "Closed", "UI5 open, your app yours", "Closed"],
+ ["Built with AI", "One class an AI writes whole - AI Studio, Claude Code and Copilot plugins, free", "Many artifacts for an AI to generate and keep in sync", "Two codebases, frontend and service", "The vendor's own AI, at the vendor's price"],
];
-const costCompare = [
- ["Skills", "ABAP, and a reading knowledge of the UI5 control API", "ABAP, CDS, RAP, annotations, and someone who can debug the Fiori Elements template"],
- ["First screen", "One class, minutes", "Data model, behavior definition, service, Fiori project, deploy: a day when everything is set up"],
- ["Custom UI", "Any UI5 control, 1:1, from ABAP", "Extension points; past them, a freestyle UI5 project"],
- ["Upgrade", "The framework is a transport; the public API is held by a snapshot and deprecations are tracked", "SAP's; the template follows the UI5 release"],
- ["Reuse by other consumers", "None, there is no service", "The OData service, by anything"],
- ["Runs on", "NetWeaver 7.02 to ABAP Cloud, UI5 1.71 to 2.x", "7.5x and later for RAP, ABAP Cloud for the full model"],
- ["License", "MIT, no per-user cost", "Part of the platform license"],
+/* Why AI and abap2UI5 fit: one class is one file an assistant can write
+ * whole, check without a system and hand over for review. Every claim is in
+ * the framework README's "Build with AI" and "AI Assistants". */
+const ai = [
+ ["spark", "One app, one file", "An AI writes the whole app - one ABAP class. No OData service, no frontend project, no deployment to generate and keep in sync."],
+ ["play", "From a sentence to an app", "The AI Studio builds an app from a description, right in the browser: written, run and fixed against the real framework, ready for abapGit. Nothing to install."],
+ ["code", "In the tools your team uses", "Plugins for Claude Code and GitHub Copilot, skills for any agent and an MCP server that validates, runs and screenshots apps - without an SAP system."],
+ ["list", "Learns from 700+ samples", "Hundreds of working apps and documentation written for AI make the result right the first time, not the third."],
+ ["check", "Checked before anyone looks", "The abap2UI5 linter tests every class the AI writes, and the AI fixes what it broke before a developer reviews it."],
+ ["chat", "AI inside your apps, too", "A chat or a summarize-this-data panel in an existing app, with a local model first or the provider of your choice."],
];
const keep = [
["What an app is", "An ABAP class"],
@@ -71,6 +93,7 @@ const objections = [
["Is this another UI5 wrapper that will not survive the next UI5 release?", `The frontend is UI5 itself, not a copy of it, and every merge is run in the browser on the oldest supported release and on UI5 2.x. Releases are tagged and listed (Release Notes); what is on its way out is announced and tracked until removal (Deprecations), and the public API apps use is held by a snapshot, so a change to it fails the framework's own pull request.`],
["Every click is a roundtrip. Is that fast enough?", `A roundtrip is one HTTP POST carrying only what changed, served by the ABAP stack that already serves everything else. For the screens this page is about, worklists, forms, cockpits, it is the same round trip a SAP GUI screen makes, in a browser. What it is not built for is a real-time collaborative editor or an app that holds its state offline (Performance).`],
["Our clean-core guideline names RAP. Where does this leave us?", "Side by side. abap2UI5 passes the ABAP Cloud checks and modifies nothing in the standard, so it is clean core in the technical sense, but it is not SAP's programming model. The usual outcome is a scope: standard transactional screens in RAP, the tools around them in abap2UI5, both in one launchpad."],
+ ["Why should we trust it over a product we pay for?", "Because you can check everything a vendor asks you to believe. The source is open, every test is public, and an app is a class in your own system that keeps running whatever happens to the project. A paid platform sells you a runtime you cannot read and a contract you have to renew; abap2UI5 hands you the code."],
["Who is accountable when something breaks?", `Your developer, for the app, the same as for any class in the system; the community, for the framework, on a best-effort basis; a commercial partner, if you sign one. Security reports are acknowledged within three business days (Security).`],
["Is anybody actually running this in production?", `Yes, see below. And every release is tested against Standard ABAP and ABAP Cloud, downported and linted against NetWeaver 7.02, and run in the browser on the oldest and the newest supported UI5 release (verified on).`],
];
@@ -104,8 +127,8 @@ const week = [
["Pick one real screen", "One your team has to build this quarter — not a demo."],
["Build it in a development system", "With the people who will maintain it, in ADT or SE80."],
["Review it like any ABAP", "Read the class, transport it, run ATC on it, check the authorizations it asks for."],
- ["Count", "The files, the systems and the tools involved, and the time until a user can click it."],
- ["Hold it against the evidence", "This page against the security model and the verified-on page, with the skepticism you would apply to any claim — then decide from the screen."],
+ ["Measure", "The time until a user can click it, and the tools and systems it needed - none beyond your SAP system."],
+ ["Compare and decide", "Hold the result against any alternative or vendor quote - then decide from the screen, not from the slide."],
];
const doors = [
["play", "Ten minutes, nothing installed", "Open the playground and change a running app, or browse the sample catalog for the screen closest to yours.", `${PLAYGROUND}samples/`, "Playground"],
@@ -115,18 +138,17 @@ const doors = [
];
---
-
For IT management, architecture boards, product owners, SAP Basis and internal audit
-
Evaluate abap2UI5 with the questions a review asks
-
In the order a review asks them, each with the page that carries the detail. A developer who wants to see it run is better served by the Quickstart; send them there and read on.
+
Modern UI5 apps, built by the team you already have
+
abap2UI5 turns your ABAP developers into UI5 app builders - no JavaScript, no extra platform, no license fee. Faster to build, cheaper to run and freer to leave than any other UI5 solution on the market, commercial ones included.
Nothing to install, no trial license, no sales call — the playground runs in your browser.
@@ -141,50 +163,70 @@ const doors = [
-
The problem it answers
-
Every SAP system has screens nobody shipped
-
-
-
The cockpit for one team, the monitor for one process, the selection screen with a result list that used to be a report with an ALV. They are not standard floorplans, so Fiori Elements does not cover them; they are not worth a frontend project, an OData service and a deployment pipeline, so they stay in SAP GUI, in a spreadsheet, or on paper. And on a system older than S/4HANA, RAP is not there to build them with at all.
-
abap2UI5 is the shorter path for exactly these screens. An app is one ABAP class, written in ADT or SE80, transported like any other class, and it renders as a UI5 app in the browser, in the Fiori launchpad, or on a mobile device. There is no service, no frontend project and nothing to deploy. The rest of this page is what that costs and what it does not.
-
-
-
The cockpit for one team
Too specific for a standard app, too small for a project.
-
The monitor for one process
Today a report someone runs by hand, or a spreadsheet.
-
The selection screen with a list
The ALV report, as a browser app, logic unchanged.
-
+
What you can build
+
One framework for every process that needs a screen
+
From the warehouse floor to the management cockpit: whatever runs in SAP today on paper, in Excel or in SAP GUI becomes a modern app - built in your own system, by your own team.
One way to put a UI5 interface on ABAP — not the only one
-
RAP with Fiori Elements is another, freestyle UI5 with OData a third, and all three run side by side in the same launchpad. Written so that a team can disagree with a specific line rather than with a feeling.
+
Compared with the market
+
Better than every other way to build UI5 apps on SAP - the commercial ones included
+
SAP's own routes, and the UI5 app platforms and low-code builders sold on top of SAP, side by side.
+
+
+
abap2UI5
{rivals.map((r) =>
{r}
)}
+ {compare.map(([k, a, ...rest]) =>
{k}
{a}
{rest.map((t) =>
{t}
)}
)}
+
+
-
Use abap2UI5 when
+
Why teams choose abap2UI5
{useIt.map(([b, t]) =>
{b}{t}
)}
-
-
Use RAP and Fiori Elements when
-
{useRap.map(([b, t]) =>
{b}{t}
)}
+
+
Nothing to throw away
+
+
Your Fiori apps stay.abap2UI5 apps appear as tiles in the same launchpad, with navigation between them.
+
Your ABAP logic stays.A report, a BAPI, a function module: an app calls it as it is.
+
Your rules stay.Transports, code review, ATC and authorizations apply unchanged.
+
Your exit stays open.No contract, no runtime fee - the apps are yours whatever you decide later.
+
-
The common answer is not either. Standard transactional screens as Fiori Elements, the tools and cockpits around them as abap2UI5, both as tiles in the same launchpad with navigation between them. What it costs either way:
An AI assistant is only as good as what it has to produce. With abap2UI5 that is one ABAP class - the simplest target there is for an AI, and the easiest result for your team to check. Your developers describe the screen; the AI writes it; your rules review and transport it like any other code.
+
+
+
Example: a chat assistant inside an abap2UI5 app - one class, with a built-in rule-based answerer that one method turns into a real AI call.
+
+
+ {ai.map(([icon, h, t]) =>
{h}
{t}
)}
+
+
No AI lock-in either. Use Claude, ChatGPT, Copilot or a local model - with your own key, at your own price. Commercial platforms sell their AI as an add-on to their license; abap2UI5's costs nothing.
An abap2UI5 app is ABAP code, and governs itself like it
@@ -198,7 +240,7 @@ const doors = [
{governance.map(([icon, h, t]) =>
{h}
{t}
)}
-
The price is that someone has to write ABAP. There is no click-together designer for business users, on purpose: every app stays one kind of thing, a class, governed by the rules you already have.
+
No shadow IT. There is no click-together designer that bypasses your development process: every app stays one kind of thing, a class, governed by the rules you already have.
→ More on Security and Authorization, and the security model a security review starts from: what the framework guarantees, and which test holds the code to each guarantee.
@@ -207,7 +249,7 @@ const doors = [
No strings attached
Nothing to buy, nothing to renew, nothing between you and your code
-
What a review can check in minutes, and what stays true after the decision.
+
What a commercial platform cannot offer, and what stays true after the decision.
{strings.map(([b, t]) =>
{b}{t}
)}
@@ -259,7 +301,7 @@ const doors = [
What it costs
-
No license fee, now or later — the work is what you pay for
+
No license fee, now or later — while commercial platforms charge every year
The apps built with it are standard UI5 freestyle apps, licensed the way your organization licenses every other UI5 app.
+
Commercial SAP app platforms charge per named user or per device, every month, often with minimum terms and setup fees - and the bill grows with every user who adopts the apps. With abap2UI5 adoption costs nothing.
What is not free is the work: an ABAP developer's time to write the screen, and the evenings of the volunteers who maintain the framework. Support is the community's, on GitHub issues and Slack, on a best-effort basis; there is no vendor SLA to buy from the project. Companies and freelancers offer paid implementation, training and support agreements around it.