{"id":86,"date":"2025-12-20T07:08:59","date_gmt":"2025-12-20T07:08:59","guid":{"rendered":"https:\/\/steadyrabbit.in\/blogs\/?p=86"},"modified":"2025-12-20T07:08:59","modified_gmt":"2025-12-20T07:08:59","slug":"fiori-in-two-sprints-lightning-fast-ui5-adaptive-cards-factory","status":"publish","type":"post","link":"https:\/\/steadyrabbit.in\/blogs\/fiori-in-two-sprints-lightning-fast-ui5-adaptive-cards-factory\/","title":{"rendered":"Fiori in Two Sprints: Lightning-Fast UI5 &amp; Adaptive Cards Factory"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\">TL;DR (\u2248 90 words)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">C-level sponsors want slick Fiori apps, but SAP backlogs say \u201csix-month rollout.\u201d In this guide we show how a Micro-GCC squad shipped <strong>six Fiori Elements apps in 20 working days<\/strong> by:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Autogenerating UIs straight from CDS annotations.<br><\/li>\n\n\n\n<li>Using an <strong>Adaptive Cards factory<\/strong> for micro-tasks (approve, reject, comment) that embed in MS Teams.<br><\/li>\n\n\n\n<li>Wiring a GitHub CI pipeline that builds, tests and cache-busts UI5 in under six minutes.<br><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Copy-paste Yeoman commands, CAP annotations, and Azure Bot JSON included.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Why Traditional Fiori Projects Drag\u00a0<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Waterfall Fiori plan:<\/em> design workshop \u279d SAP Build wire-frames \u279d hand-coded UI5 \u279d QA \u279d cut-over.<br>Pain points:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Five layers of hand-offs<\/strong>\u2014design \u2192 dev \u2192 Basis \u2192 QA \u2192 DevOps.<br><\/li>\n\n\n\n<li><strong>UI regression<\/strong> each transport\u2014static resources cached on every laptop.<br><\/li>\n\n\n\n<li><strong>Business users<\/strong> need micro-approvals in Teams, not another SAP tile.<br><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Our fix: <strong>Generate 80 % of UI from CDS<\/strong>, keep logic in CAP, deliver micro-approvals through Adaptive Cards\u2014<em>two-sprint<\/em> cadence.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Reference Stack\u00a0<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Layer<\/strong><\/td><td><strong>Tool<\/strong><\/td><td><strong>Why<\/strong><\/td><\/tr><tr><td>UI generator<\/td><td><strong>Fiori Elements + Fiori Tools Yeoman<\/strong><\/td><td>No hand-coded XML for CRUD screens<\/td><\/tr><tr><td>Micro-tasks<\/td><td><strong>Adaptive Cards + Teams Bot<\/strong><\/td><td>90-second approvals without launching SAP<\/td><\/tr><tr><td>OData service<\/td><td>CAP Node.js (srv)<\/td><td>Shares annotations &amp; logic<\/td><\/tr><tr><td>State<\/td><td>HANA Cloud<\/td><td>Single source of truth<\/td><\/tr><tr><td>CI\/CD<\/td><td>GitHub Actions + Cloud Transport Management (CTMS)<\/td><td>Zero manual transports<\/td><\/tr><tr><td>Cache busting<\/td><td>sap-ui-cachebuster + CDN headers<\/td><td>Users always get latest JS\/CSS<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Total dev image size: 850 MB; pipeline duration: \u2248 6 min.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Sprint 1 \u2014 Generate Three CRUD Apps\u00a0<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">3.1 Scaffold UI Project<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CopyEdit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">npm install -g @sap\/generator-fiori<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">yo @sap\/fiori-freestyle myorders \\<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&#8211;platform cp \\<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&#8211;odata https:\/\/&lt;cap&gt;\/v4\/sales \\<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&#8211;entity SalesOrder \\<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&#8211;list yes \\<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&#8211;detail yes<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Yeoman creates:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">markdown<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CopyEdit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">myorders\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;webapp\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;pages\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;manifest.json<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;ui5.yaml<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">3.2 Add CDS Annotations<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">db\/schema.cds<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cds<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CopyEdit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">using { cuid } from &#8216;@sap\/cds\/common&#8217;;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">entity SalesOrder : cuid {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;key SalesOrderID&nbsp; : String(10);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;@title&nbsp; : &#8216;Net Value&#8217;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;NetValue : Decimal(15,2);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;@title&nbsp; : &#8216;Currency&#8217;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;Currency : String(5);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">srv\/annotations.cds<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cds<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CopyEdit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">using my.sales as sales from &#8216;..\/db\/schema&#8217;;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">annotate sales.SalesOrder with {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;@UI : {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;LineItem&nbsp; : [ {Value : sales.SalesOrderID}, {Value : sales.NetValue} ],<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;Identifiable : { Title : {Value : sales.SalesOrderID} }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Re-run cds deploy \u2192 metadata changes auto-appear in UI after cache-buster.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">3.3 CI Build &amp; Deploy<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">ui5.yaml<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">yaml<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CopyEdit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">builder:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;customTasks:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&#8211; name: ui5-task-cachebuster<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">github\/workflows\/ui.yml<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">yaml<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CopyEdit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">jobs:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;build-deploy:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;runs-on: ubuntu-latest<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;steps:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211; uses: actions\/checkout@v4<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211; name: Install tooling<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run: npm ci<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211; name: Build<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run: ui5 build &#8211;all<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8211; name: Deploy<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run: cf deploy myorders.zip &#8211;dest dev-space<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pipeline time:<\/strong> 3 m 40 s.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By Sprint 1 Demo Friday, business users saw live list-report and object pages for Sales Orders, Customers, and Pricing Conditions.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Sprint 2 \u2014 Adaptive Cards Factory\u00a0<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">4.1 Adaptive Card Template<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">cards\/approve.json<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">json<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CopyEdit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&#8220;$schema&#8221;: &#8220;http:\/\/adaptivecards.io\/schemas\/adaptive-card.json&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&#8220;type&#8221;:&#8221;AdaptiveCard&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&#8220;version&#8221;:&#8221;1.5&#8243;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&#8220;body&#8221;:[<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;{&#8220;type&#8221;:&#8221;TextBlock&#8221;,&#8221;text&#8221;:&#8221;Sales Order ${SalesOrderID}&#8221;,&#8221;weight&#8221;:&#8221;Bolder&#8221;},<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;{&#8220;type&#8221;:&#8221;TextBlock&#8221;,&#8221;text&#8221;:&#8221;Net Value: ${NetValue} ${Currency}&#8221;},<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;{&#8220;type&#8221;:&#8221;Input.Text&#8221;,&#8221;id&#8221;:&#8221;comment&#8221;,&#8221;placeholder&#8221;:&#8221;Optional comment&#8221;}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;],<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&#8220;actions&#8221;:[<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;{&#8220;type&#8221;:&#8221;Action.Submit&#8221;,&#8221;title&#8221;:&#8221;Approve&#8221;,&#8221;data&#8221;:{&#8220;action&#8221;:&#8221;approve&#8221;}},<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;{&#8220;type&#8221;:&#8221;Action.Submit&#8221;,&#8221;title&#8221;:&#8221;Reject&#8221;,&#8221;style&#8221;:&#8221;destructive&#8221;,&#8221;data&#8221;:{&#8220;action&#8221;:&#8221;reject&#8221;}}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4.2 Node Bot for Teams<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">bot\/app.js<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">js<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CopyEdit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">const { TeamsActivityHandler, CardFactory } = require(&#8216;@microsoft\/teams-ai&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bot.onMessage(async (ctx) =&gt; {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;const so = await SELECT.one.from(SalesOrder).where({SalesOrderID: ctx.message.text});<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;const card = CardFactory.adaptiveCard(require(&#8216;.\/cards\/approve.json&#8217;), so);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;await ctx.sendActivity({ attachments: [ card ] });<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">});<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bot.onInvokeActivity(async (ctx) =&gt; {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;const { action } = ctx.activity.value;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;if (action === &#8216;approve&#8217;) await patchStatus(ctx, &#8216;APPROVED&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;else await patchStatus(ctx, &#8216;REJECTED&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;return { status: 200 };<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">});<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4.3 CI Deployment<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">bot\/workflows\/ci.yml builds Docker image, pushes to Azure Container Apps, updates Teams manifest via Graph API.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">4.4 Results<\/h5>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>KPI<\/strong><\/td><td><strong>Before (Email Workflow)<\/strong><\/td><td><strong>After (Adaptive Card)<\/strong><\/td><\/tr><tr><td>Median approval time<\/td><td>6 h 20 m<\/td><td><strong>21 m<\/strong><\/td><\/tr><tr><td>Missed SLA (&gt;24 h)<\/td><td>13 %<\/td><td><strong>0.5 %<\/strong><\/td><\/tr><tr><td>Mobile engagement<\/td><td>N\/A<\/td><td>72 % of actions<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Two-Sprint Timeline Overview\u00a0<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Day<\/strong><\/td><td><strong>Activity<\/strong><\/td><\/tr><tr><td><strong>Sprint 1 Day 1<\/strong><\/td><td>Yeoman scaffolds 3 apps; GitHub pipeline ready.<\/td><\/tr><tr><td>Day 3<\/td><td>CDS annotations complete; first demos.<\/td><\/tr><tr><td>Day 5<\/td><td>AT tests pass; deploy to QA.<\/td><\/tr><tr><td><strong>Sprint 2 Day 1<\/strong><\/td><td>Teams Bot scaffold; Adaptive card template.<\/td><\/tr><tr><td>Day 3<\/td><td>Webhook to CAP service for status updates.<\/td><\/tr><tr><td>Day 4<\/td><td>Security &amp; persona tests.<\/td><\/tr><tr><td>Day 5<\/td><td>20 % pilot group; cut-over Monday next sprint.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Total dev hours: ~64; feedback loop &lt; 24 h each sprint.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Pitfalls &amp; Fixes\u00a0<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Pitfall<\/strong><\/td><td><strong>Fix<\/strong><\/td><\/tr><tr><td>Cache-busting ignored<\/td><td>Add cachebuster-info.json &amp; CDN header cache-control: max-age=0<\/td><\/tr><tr><td>CDS enum not rendered in list<\/td><td>Use @Common.ValueList annotation referencing DDIC domain<\/td><\/tr><tr><td>Adaptive card timeout<\/td><td>Increase Bot Azure Timeout to 10 s or pre-warm function<\/td><\/tr><tr><td>CAP OData $batch not enabled<\/td><td>Set odata.version: 4 and odata.batch: true in package.json<\/td><\/tr><tr><td>Transport collisions (Neo)<\/td><td>Use Cloud Transport Management; lock older transport serial<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u00a0Time &amp; Cost Benchmarks\u00a0<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Metric<\/strong><\/td><td><strong>Legacy Workflow<\/strong><\/td><td><strong>Two-Sprint Factory<\/strong><\/td><\/tr><tr><td>Dev effort \/ CRUD app<\/td><td>120 h<\/td><td><strong>18 h<\/strong><\/td><\/tr><tr><td>Median user click \u2192 approve<\/td><td>6 h<\/td><td><strong>21 m<\/strong><\/td><\/tr><tr><td>UI regression bugs \/ rel.<\/td><td>9<\/td><td><strong>2<\/strong><\/td><\/tr><tr><td>Infra cost (BTP HTML5 repo)<\/td><td>\u20ac0.04\/hr<\/td><td>same<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">ROI: 6\u00d7 faster dev, 88 % faster approvals, happier auditors (mobile audit trail).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Take-Home Checklist\u00a0<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Scaffold Fiori Elements with Yeoman.<br><\/li>\n\n\n\n<li>Drive UI from CDS annotations, not XML.<br><\/li>\n\n\n\n<li>Ship CI build with cache-buster.<br><\/li>\n\n\n\n<li>Scaffold Adaptive Cards bot for micro-tasks.<br><\/li>\n\n\n\n<li>Route 20 % pilot traffic; measure approval SLA.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>TL;DR (\u2248 90 words) C-level sponsors want slick Fiori apps, but SAP backlogs say \u201csix-month rollout.\u201d In this guide we show how a Micro-GCC squad shipped six Fiori Elements apps in 20 working days by: Copy-paste Yeoman commands, CAP annotations, and Azure Bot JSON included. Why Traditional Fiori Projects Drag\u00a0 Waterfall Fiori plan: design workshop [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":20,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-86","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sap-modernization"],"_links":{"self":[{"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/posts\/86","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/comments?post=86"}],"version-history":[{"count":1,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/posts\/86\/revisions"}],"predecessor-version":[{"id":87,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/posts\/86\/revisions\/87"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/media\/20"}],"wp:attachment":[{"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/media?parent=86"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/categories?post=86"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/tags?post=86"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}