diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index dec098d..a93a134 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -33,6 +33,9 @@ jobs: - run: npm run check env: ASTRO_TELEMETRY_DISABLED: "1" + # the release test reads the newest release from the GitHub API; + # with the token it is not rate-limited on a shared runner + GITHUB_TOKEN: ${{ github.token }} - if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main' uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0 - if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main' diff --git a/src/pages/community.astro b/src/pages/community.astro index 16d9cf6..aaa7e31 100644 --- a/src/pages/community.astro +++ b/src/pages/community.astro @@ -34,7 +34,7 @@ const give = [ ["Send a pull request", `A fix, a sample, a sentence in the documentation: send it as a pull request. Every one is reviewed in the open, and the next release carries it.`], ["Answer somebody", `One reply under an issue or in Slack saves somebody else an afternoon, and the answer stays public for the next person.`], ["Add-ons: share yours", `Selection screens, table maintenance, popups, a launchpad KPI: the building blocks live as add-ons in the open. The screen you solved for your plant is somebody else's next week.`], - ["Say what you build", `A post on LinkedIn with #abap2UI5, a talk at your user group, a row under Who runs it: that is how the next decision maker learns it exists.`], + ["Say what you build", `A post on LinkedIn with #abap2UI5, a talk at your user group, a row under Who runs it: that is how the next decision maker learns it exists.`], ["Add your company", `One row under Who runs it is what answers is anybody actually running this? for the next decision maker.`], ["Sponsor the work", `Sponsoring the contributors says the release you pull next month matters to you.`], ]; diff --git a/src/pages/faq.astro b/src/pages/faq.astro index c5623c6..bc6b68d 100644 --- a/src/pages/faq.astro +++ b/src/pages/faq.astro @@ -15,29 +15,34 @@ const slug = (t: string) => t.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace( * landscape, and what users will say. */ const faq = [ ["Risk and support", [ + ["Is abap2UI5 an SAP product?", `No. abap2UI5 is a community open-source project under the MIT license, not affiliated with SAP and not supported by SAP. SAP has shown it: at SAP TechEd 2023, in SAP Developer News and in the SAP Developer Code Challenge 2023. Support is the project's own, in the open, as described on Community & Support.`], + ["Will the next abap2UI5 release break our apps?", `It has happened: in 2023 and 2024 releases changed the API and apps had to follow, and users said so on GitHub (issue 317); in 2026 a round of releases removed what had been superseded, and every one of those removals is marked as breaking in the release notes. The rule now: the released interface an app is written against is the surface the project keeps stable; what is superseded moves to a frozen package first and is removed only after that; every removal is listed on the Deprecations page with what to write instead and the release it leaves in, and the linter rewrites the mechanical part. The project's practice is to ask users on GitHub before a change that breaks an app (an example). An installed version keeps running until you pull the next one; when and how to move is on Versioning.`], ["It is an open-source project. What if the maintainers stop?", `The installed version keeps running, the source is in your system in full, readable and changeable, and the apps stay plain ABAP classes. Nothing is called at runtime that is not in your system, apart from the UI5 library, which your system ships. A build renamed into your own namespace is one workflow run (Namespaces, Renaming).`], - ["Who do we call when something breaks?", `Rarely anyone, because an app is upgrade-stable: abap2UI5 uses released APIs only, passes the ABAP Cloud checks and runs the same source from NetWeaver 7.02 to S/4HANA and ABAP Cloud; the frontend is UI5 itself, tested on the oldest and the newest release. A system upgrade or a UI5 upgrade does not break it. When something does break: your developer, for the app, as for any class in the system. For the framework, write in the Slack channel or open an issue on GitHub: anyone can, at any time, no account with the project needed, and in the open is where it gets answered fastest and where everybody sees the answer. Pull requests are welcome the same way. If your organization needs more, closer cooperation, a workshop or a support arrangement, write to ${MAIL} and plan it together (Support). Security reports are acknowledged within three business days (Security).`], + ["Who do we call when something breaks?", `For the app: your developer, as for any class in the system. For the framework: write in the Slack channel or open an issue on GitHub; anyone can, at any time, no account with the project needed, and in the open is where it gets answered fastest and where everybody sees the answer. Pull requests are welcome the same way. If your organization needs more, closer cooperation, a workshop or a support arrangement, write to ${MAIL} and plan it together (Support). Security reports are acknowledged within three business days (Security). And it is rarely needed, because an app is upgrade-stable: abap2UI5 uses released APIs only, passes the ABAP Cloud checks and runs the same source from NetWeaver 7.02 to S/4HANA and ABAP Cloud; the frontend is UI5 itself, tested on the oldest and the newest release. A system upgrade or a UI5 upgrade does not break it.`], ["Will an upgrade break it: the next S/4HANA release, ABAP Cloud, the next UI5?", `No. On the ABAP side abap2UI5 uses released APIs only and passes the ABAP Cloud checks, so it is cloud-ready and an S/4HANA upgrade leaves it as it is; the same source runs from NetWeaver 7.02 to ABAP Cloud, so an app moves with your landscape. On the UI5 side the frontend is UI5 itself, not a copy, and every change runs in the browser on the oldest supported release and on UI5 2.x. Releases are listed (Release Notes); what goes is announced and tracked until removal (Deprecations).`], ["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. What you do not get is an SLA in a contract; what you get is the code, and a maintainer you can reach."], - ["Is anybody actually running this in production?", `Two companies say so under Who runs it below, and every release is tested against Standard ABAP and ABAP Cloud, downported to NetWeaver 7.02 and run in the browser on the oldest and the newest supported UI5 release (verified on).`], + ["Is anybody actually running this in production?", `Two companies say so under Who runs it, and every release is tested against Standard ABAP and ABAP Cloud, downported to NetWeaver 7.02 and run in the browser on the oldest and the newest supported UI5 release (verified on).`], ]], ["Where it fits", [ ["When abap2UI5, and when a custom SAPUI5 app, for a complex screen?", "Ask where the complexity is. If it is in the data and the rules, which is the usual case for a cockpit, a worklist or a multi-step form, abap2UI5 is the shorter path: the logic stays in ABAP next to the data, the screen is any UI5 control, and one ABAP developer owns the whole thing. If it is in the browser itself, an editor that works offline, an animation-heavy control, a client that must keep working without SAP for minutes, a custom SAPUI5 app with its own JavaScript is the right tool. Three questions decide it: does the app need to run without a connection, does it need custom JavaScript on the client, and who will maintain it in five years."], ["Fiori Elements covers 80 percent of our screens. What about the rest?", "That rest is what abap2UI5 is for. Keep Fiori Elements where a list report or an object page from annotations fits; take abap2UI5 where a template becomes the thing you fight: a cockpit with a chart and a custom form, a scanner screen, a tool nobody wrote a floorplan for. Both appear as tiles in the same launchpad, and the business logic behind both is the same ABAP."], + ["Can we port our heavy SAP GUI transactions?", `One screen at a time, yes; the logic behind it is called as it is. Where abap2UI5 is weakest is a transaction that needs the server to hold its state for minutes: a long multi-step dialog with locks held from one click to the next. Every click is one request, and the app instance is rebuilt from a server-side draft each time, so nothing is held in between. A stateful session mode exists for the few cases that need it, at a cost: it pins one work process per user and is not available on S/4HANA Cloud Public Edition (Statefulness, Locks). The usual path is one screen per task, each click a short request.`], ["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."], ]], ["Team and skills", [ - ["Our ABAP team is small and getting older. Can we take on a new UI technology?", "You are not taking one on. The UI is one more ABAP class, written by the people who write the rest, in the tools they use today, with UI5's controls learned from running examples in hours, not weeks. No JavaScript developer to hire in a market that has few, no full-stack profile to find, no training project before the real project. And an AI assistant writes a first version of such a class whole, which is exactly where a small team gains the most."], + ["Our ABAP team is small and getting older. Can we take on a new UI technology?", "You are not taking one on. The UI is one more ABAP class, written by the people who write the rest, in the tools they use today, with UI5's controls learned from running examples in hours, not weeks. No JavaScript developer to hire, no full-stack profile to find, no training project before the real project. One honest clause: a control that needs JavaScript of its own, a chart library or a custom control, needs one person who reads JavaScript; everything else is ABAP. And an AI assistant writes a first version of such a class whole, which is exactly where a small team gains the most."], ["How do our developers learn it, and how long does it take?", "From running examples, not from tutorials that aged. The catalogue holds hundreds of samples, each one opens in the browser and each one is maintained with the framework, so none goes stale. The quickstart takes minutes: pull, one endpoint, the first screen is up. Within hours a developer builds a first real app, and within a week the screen your team needs this quarter, with the people who will maintain it. What a developer learns is UI5's controls and their properties, in ABAP, not a new language or a new toolchain."], ]], ["Landscape and tooling", [ ["Do we need BTP for this?", "No. abap2UI5 runs on the ABAP system you already have, from NetWeaver 7.02 on, with no subscription beside it. If you run the BTP ABAP Environment or S/4HANA Cloud already, it runs there too, from the same source, so the decision about BTP stays yours and is not made for you by the UI."], ["We are in the middle of an S/4HANA move. Is this the moment?", "It is one of the better ones. An app you build on the old system today runs on S/4HANA unchanged, so nothing you build now is thrown away at go-live. Screens move one at a time, SAP GUI stays until the last one, and the same team does both. And the apps are classes in your transport landscape, so they travel with the migration like everything else."], + ["Our development guidelines reject Z-objects, or require a certified add-on.", `The framework installs as Z-objects, like every open-source ABAP. A build renamed into your own registered namespace is one workflow run in your fork of the repository (Namespaces, Renaming); a move into an SAP open-source namespace is an open request (issue 2848). SAP certification (ICC) and delivery as an add-on through SAINT or SPAM are not on offer: both need a company behind the product, and this is an open-source project. What you get instead is the source, the public tests and the review pack, and you run your own ATC and CVA checks on the package as on any custom code; findings are reported and handled as GitHub issues, in the open.`], + ["Can we run several framework versions, or several vendors' apps, on one system?", `Yes, by name. One installation of abap2UI5 serves every app written against it; where two versions have to coexist, a consultancy delivers its apps with its own build, or an old and a new version run side by side during a migration, each build is renamed into its own namespace and the two do not touch (Namespaces, Renaming).`], ["Do we need Business Application Studio, Git, npm, a deployment pipeline?", "No. The framework is installed once with abapGit, as any open-source ABAP is. An app is written in ADT or SE80, checked by ATC, transported like any class. There is no frontend build, no BSP upload, no MTA, no approuter and no cache to clear after a deployment, because there is no deployment: the system serves the screen itself."], ]], ["Performance and users", [ - ["Every click is a request to SAP. Is that fast enough?", `Faster than most Fiori apps, in practice: one plain HTTP request per click with the changed data only, no OData metadata, no batch, no app logic or bundle in the browser. For worklists, forms and cockpits that is the round trip a SAP GUI screen makes. It is not built for an app that holds its state offline (Performance).`], - ["Our users are fast in SAP GUI. Will they accept it?", "Users go back to SAP GUI when the Fiori app is slower than the transaction it replaced. An abap2UI5 screen makes one request per click on the same ABAP stack, so a keyboard-driven worklist stays as quick as it was. And nothing is replaced in one go: one screen at a time, the GUI stays until the last one, the logic behind both is the same code."], + ["Every click is a request to SAP. Is that fast enough?", `One plain HTTP request per click with the changed data only, no OData metadata, no batch, no app logic or bundle in the browser. For worklists, forms and cockpits that is the round trip a SAP GUI screen makes. It is not built for an app that holds its state offline (Performance).`], + ["Our users are fast in SAP GUI. Will they accept it?", "A screen slower than the transaction it replaces is one users leave. An abap2UI5 screen makes one request per click on the same ABAP stack, so a keyboard-driven worklist stays as quick as it was. And nothing is replaced in one go: one screen at a time, the GUI stays until the last one, the logic behind both is the same code."], ]], ]; --- diff --git a/src/pages/index.astro b/src/pages/index.astro index e3b7e4b..d6a3051 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -80,14 +80,14 @@ const rivals = ["RAP + Fiori Elements", "Freestyle UI5 + OData", "Commercial UI5 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"], - ["Time to productivity", "Minutes to the first screen, hours to the first app: an ABAP developer learns UI5's controls from the examples, not a new language", "Weeks: CDS, RAP, annotations, Business Application Studio", "Months: JavaScript, UI5 tooling, Git, npm", "The vendor's training"], + ["Time to productivity", "Minutes to the first screen, hours to the first app: an ABAP developer learns UI5's controls from the examples, not a new language", "A CDS, RAP and annotation skill set, and Business Application Studio", "A JavaScript and UI5 tool chain: UI5 tooling, Git, npm", "The vendor's training"], ["Where the business logic lives", "In ABAP, next to the data, as it does today", "In ABAP, behind CDS and annotations", "Split: JavaScript in the browser, a service in ABAP", "In the vendor's tool"], - ["First screen", "Minutes", "Days: model, service, project, deployment", "Days to weeks", "After the platform is installed and licensed"], + ["First screen", "Minutes", "After the model, the service, the project and a deployment", "After the project setup and a deployment", "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"], ["Performance: what a click costs", "One plain HTTP request carrying only what changed; no app code and no logic in the browser", "OData calls with metadata, batch and draft handling, and the Fiori Elements runtime in the browser", "OData calls and an app bundle per app, logic in the browser", "The vendor's runtime in the browser"], ["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"], + ["Lock-in", "Low: apps are plain ABAP classes written against one interface, and the framework stays 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"], ["Standard transactional apps", "Possible, but hand-built; the standard route is RAP", "Its home ground: list report and object page from annotations", "Hand-built", "From the vendor's templates", "even"], ["Offline", "Not built for it: an app needs its connection to SAP", "Offline with extra tooling", "Possible, with effort", "Depends on the vendor", "even"], @@ -104,6 +104,7 @@ const notIt = [ ["You want the SAP standard transactional app.", "A list report with an object page on S/4HANA, from a released CDS model: RAP and Fiori Elements are the shorter path, and the one SAP supports."], ["The app must work offline.", "Every click is one request to the SAP system. A device without a network is not what it is for; live data on a connected screen is."], ["Your guideline mandates SAP's programming model.", "abap2UI5 is clean core in the technical sense, but it is not RAP. The usual outcome is a scope, not a replacement."], + ["You want the transaction as it is, in a browser.", "SAP GUI for HTML and Screen Personas keep the transaction and change how it looks; abap2UI5 is a new screen on the same logic, built one at a time. If the screen itself may stay, SAP's own route is the shorter one."], ["Your rules need an SLA on paper.", "Support happens in the open: anyone can write in the Slack channel or open an issue or a pull request on GitHub, at any time, and that is where answers come fastest. If you need more than that, write to the maintainers by mail and plan it together; what is not on offer is an SLA in a contract."], ]; @@ -119,7 +120,8 @@ const governance = [ ["lock", "Logon is SAP's", "No user store, no token, no session of its own: a request that reaches an app has passed SAP logon."], ["key", "Authorizations are SAP's", "The authorization on the service endpoint, and the app's own checks in its code, as a transaction does them."], ["db", "Data changes are your code's", "An app posts through the same BAPIs, function modules or RAP actions as any program, so change documents and application logs apply unchanged."], - ["log", "Every request can be logged", "A monitor records, per request, user, app, event, timings and any error. Off until an installation switches it on."], + ["db", "Data stays on your system", "The app's data never leaves the SAP system. What the framework stores between two clicks is the app instance, in one table on that system, deleted after four hours by default; the browser holds only the screen it shows and the id of that row."], + ["log", "Every request can be logged", "A monitor records, per request, user, app, event, timings and any error. Off by default, until an installation switches it on in the user exit."], ["check", "Tested on every release", "Every change runs against Standard ABAP and ABAP Cloud, is downported to NetWeaver 7.02 and opened in the browser on UI5 1.71 and the current release. An upgrade of the system or of UI5 does not break an app."], ["form", "Security reviewed in the open", "A strict Content Security Policy without unsafe-eval or inline script, CodeQL and a weekly dependency audit, an SBOM with every release, and a published security model a review starts from."], ["monitor", "Accessible", "Views are standard UI5 views, so every control is as accessible as UI5 makes it. Focus survives a roundtrip, a change can be announced to a screen reader, a high-contrast theme is one switch away."], @@ -318,7 +320,7 @@ const doors = [
FAQ
What if the maintainers stop, who do we call, will an upgrade break it, do we need BTP, when abap2UI5 and when a custom SAPUI5 app, will our users accept it: fifteen questions, answered on the FAQ page.
+What if the maintainers stop, who do we call, will an upgrade break it, do we need BTP, when abap2UI5 and when a custom SAPUI5 app, will our users accept it: twenty questions, answered on the FAQ page.