ℹ Note:
- We recommend a Chromium-based web browser for local development with HTTP.
Safari enforces HTTPS; therefore, it doesn't allow localhost through HTTP. - For more information, visit our developer documentation.
- Run
npm ito install dependencies. - Run
npm startto start developing.
Your URL should be similar to this example:
http://localhost:3000
- Paste the URL under App URL in your app settings.
- Open a board; you should see your app in the app toolbar or in the Apps panel.
- Run
npm run build.
This generates a static output insidedist/, which you can host on a static hosting service.
The Vacation tab draws absence bars from JSON that this app does not fetch itself — the data lives in an SAP Fiori team calendar, which a Miro plugin inside an iframe cannot read. That extraction is a bookmarklet in a separate repo: SAPVac.
To get the data:
- Build the bookmarklet once: in the SAPVac repo run
./create_bookmarklet.sh -c sapvac.js(needsuglify-jsglobally) and save the clipboard contents as a browser bookmark. - Open the SAP Fiori team calendar and run the bookmark. It pages through nine months and copies the result to the clipboard.
- Paste it into Vacation Data here and press Draw Vacation.
Each entry looks like this — the field names are the contract between the two repos, so do not rename them on either side:
{
"employeeName": "Erika Mustermann",
"vacationPeriod": "2026-03-02 – 2026-03-06",
"vacationStartDate": "2026-03-02",
"vacationEndDate": "2026-03-06",
"vacationDuration": 5
}vacationStartDate/vacationEndDate(ISO) position the bar. A missingvacationEndDateis read as a same-day absence, not as an error.vacationPeriodis the label SAP rendered, passed through verbatim and printed on the bar under the employee name — so whatever wording the calendar uses ends up visible on the board.sapvac.jssplits it on an en dash.vacationDurationcounts working days (Mon–Fri) between the two dates.
Drawing used to live in SAPVac as drawshapes.js and moved here on purpose: as
a bookmarklet it could not read the plugin's shape metadata and had to align
bars relative to each other instead of to calendar dates, which brought the same
off-by-one back three times. There is now one column calculation, in
src/calendar.js, and it is covered by tests.
.
├── src
│ ├── assets
│ │ └── style.css
│ ├── app.js // The code for the app lives here
│ └── index.js // The code for the app entry point lives here
├── app.html // The app itself. It's loaded on the board inside the 'appContainer'
└── index.html // The app entry point. This is what you specify in the 'App URL' box in the Miro app settings
This sample app provides you with boilerplate setup and configuration that you can further customize to build your own app.
Built using create-miro-app.
This app uses Vite.
If you want to modify the vite.config.js configuration, see the Vite documentation.