CloudScript.io NikoNiko Calendar
CloudScript.io NikoNiko Calendar is a Confluence Cloud app, built on Atlassian Forge, that keeps a niko-niko calendar on a Confluence page. Each person on the calendar records one entry a day for themselves, choosing a value from a picker on their own row, and the team's entries build up into a shared grid of smiley, square or cat glyphs on a scale of either three or five options.
The niko-niko calendar is an Agile team practice: a shared calendar on which every member marks each day on a small scale, reviewed together at stand-ups and retrospectives. Teams that run one usually keep it on a whiteboard or in a hand-edited table. This macro keeps it on the team's own Confluence page instead: recording an entry takes a moment, the window follows the sprint, and a trend row under the grid plots each day's team average.
The app runs on Atlassian Forge: values are stored inside Atlassian's Forge infrastructure and displayed on your Confluence page. The calendar is sized for a single team rather than an organisation: the grid is capped at 50 people and a 35-day window, and the trend row is designed for roughly five to nine people. Entries stay under their owners' control: each person can overwrite or permanently delete their own entries from the calendar, and Confluence site administrators can delete any person's stored entries from an administration screen (see Deleting entries).
Adding a calendar
Edit a Confluence page and insert the Niko Niko Calendar macro, either by typing /niko in the editor or by choosing it from the macro browser. The configuration panel, titled Niko Niko Calendar configuration, holds eight fields:
- People (required). Type two or more characters to search the site's user directory and add each team member. The calendar stores account IDs only; names and avatars are looked up fresh each time the grid renders.
- Start date of Sprint. A native date field, pre-filled with the Monday of the current week when a new macro is inserted. Editing an existing calendar never rewrites the saved date.
- Duration in Weeks. 1 to 4; the default is 2.
- 5 day week. Ticked by default, showing weekdays only. Untick it to show weekends too.
- Number of options. The scale size; the helper text reads "You can select a scale of either 3 or 5 options", and the default is 5.
- Theme. Smileys, Squares or Cats.
- Show team trend. Ticked by default; controls the trend row described below.
- Label (optional). Free text, up to 120 characters, shown above the grid. The label names the question this calendar asks — "Sprint 14 confidence", "How is the migration going?" — which matters most when one page carries more than one calendar (see The calendar grid).
Saving needs at least one person and a valid start date, so with the seeded date a new calendar takes two actions: choose the people, then save. Cmd/Ctrl+Enter saves and Escape cancels. Pages that already contain the macro from earlier versions keep rendering without reconfiguration.
Recording an entry
Only your own row is editable, and only for today and earlier dates. Those cells are buttons: activating one, by click or by keyboard, opens the entry picker under the grid, offering the active scale's glyphs. In 5-option mode the choices are No entry, Terrible, Bad, Okay, Good and Great; in 3-option mode they are No entry, Bad, Okay and Good. Choosing one records it for that date, updates the cell immediately and closes the picker; recording again for the same date overwrites the earlier value. Arrow keys move through the picker without recording, Enter or Space records, Escape closes without recording, and focus returns to the cell in every case. For screen readers the picker announces itself with the date it records for, in the pattern "Choose your entry for {date}".
The app does not let users assign values for others: a user can only enter a value in their own row on the table. Similarly, the app does not let users assign values to future dates. Selecting No entry stores a value that renders identically to a day with nothing recorded; the underlying record remains. To remove the record itself rather than overwrite it, use the picker's delete option (see Deleting entries).
Deleting entries
Your own entries. The entry picker includes a delete option alongside the scale. Deleting removes the stored record for that date on this calendar only, which is different from choosing No entry (No entry is itself a stored value). You can also delete your entire entry history — every entry of yours, on every calendar — from the same place, behind a confirmation step, and that path works even for calendars on pages you can no longer view. Deletion is immediate and permanent; there is no undo.
Any person's entries (site administrators). Confluence site administrators will find a Niko Niko data management screen in Confluence administration that lists every account for which the app stores entries. The list is drawn from the app's own storage rather than the site's user directory, so people who have left the organisation, or whose accounts are deactivated, still appear. From there an administrator can permanently delete all entries for a chosen person, or all entries older than a chosen date. This screen enables an organisation to comply with privacy requests concerning a person's entries, including users who are no longer on the site.
The calendar grid
One row per person, one column per date. Each row begins with the person's avatar and name, resolved live from the Confluence directory; the app stores neither. Column labels follow the browser's locale, today's column is highlighted, and the Today, Previous sprint and Next sprint controls step the window by the configured duration, reloading data each time. Windows too wide for the page scroll horizontally inside the grid.
Entries belong to the calendar they were recorded on. A value recorded on one calendar never appears on any other, including a calendar on another page that lists the same person, and a copied page starts with an empty calendar rather than a copy of the entries. Several calendars can sit on one page, each with its own label and its own history, so a single page can track separate questions side by side — "How is the merge going?" above "How is the sprint in general?". Before serving or recording anything, the app checks that the person invoking the calendar can view the page it sits on.
Days without a recorded value render the theme's No entry glyph, identical to an explicitly chosen No entry. The grid follows Confluence's light and dark modes, and anyone who can view the page sees every entry on it.
The team trend row
When Show team trend is ticked and at least one day in the window has a recorded value, a row under the grid plots each day's average on a fixed 1-to-5 scale. Only recorded values are counted (a non-response is not included in the trend), and a day with no responses breaks the line instead of plotting a point. Dot size shows participation, grouped into four size classes at under 25%, 25 to 50%, 50 to 75%, and 75% or more of the calendar's people responding.
Trends remain accessible to screen readers, for which the graphic itself is hidden and a per-day list is exposed in its place, each item following the pattern "{date}: average {avg} from {n} of {total} responses", or naming the date as having no responses.
Themes and the scale
Three themes can be used to display entries: Smileys, Squares and Cats. The theme is set in the calendar macro and applies to all users.
The calendar macro allows users to choose either a three or five option scale. The 3-option scale offers the three mid-range values (Bad, Okay and Good), while the 5-option scale adds more extreme options that are deliberately intense. Use the 3-option mode for teams that want the gentler range. Switching modes never alters a stored value: a value outside the active set still renders as itself but is not offered by the picker for future choices.
Languages
The app ships in English and French. Configuration labels, value names, navigation controls and the trend row's text follow the user's Confluence locale, with English as the fallback for other locales. Date column labels, and the decimal separator in the trend average, come from the browser's locale. The error and licence notices below display in English in every locale.
Exporting the calendar
Confluence's Export → PDF includes the calendar as it appears on the page, and is the way to keep a point-in-time copy of what a calendar shows, for example before removing a macro or uninstalling the app. Confluence's Word export and Markdown export do not include the calendar: the page exports without it.
Good to know
The grid is capped at 50 people and a 35-day window. The duration field tops out at 4 weeks, which keeps every configurable window inside the day cap; a calendar listing more than 50 people shows an error in place of the grid.
Deletion is permanent. Deleting an entry, a person's history or an age range removes the stored records immediately and irreversibly; there is no undo. The app never deletes entries on a schedule of its own: every deletion is either an in-app action (see Deleting entries) or the automatic erasure that follows Atlassian reporting an account closed (see Security and privacy). The app has no uninstall handling of its own; removal of its storage on uninstall is governed by Atlassian's Forge platform lifecycle.
Entries are per calendar. Each calendar keeps its own history, an entry never appears on a page it was not recorded on, and a copied page starts empty (see The calendar grid). Deleting your history removes your entries from every calendar at once (see Deleting entries).
Entries are named. Every entry is displayed against its person's name and avatar to anyone who can view the page. There is no anonymous mode.
Word and Markdown exports omit the calendar. Confluence's PDF export includes it; its Word and Markdown exports do not (see Exporting the calendar).
The 3-option scale is the mid-range set. Bad, Okay and Good, a change from earlier versions of the app (see Themes and the scale).
On large calendars the trend row sits below the first screenful. The row renders as the table's footer, so its distance down the page grows with the number of people (see The team trend row).
A lapsed licence locks the app. The app is licensed per site through the Atlassian Marketplace, and a trial licence behaves identically to an active one. While the site's licence is inactive the calendar does not render and no entries are read or written; there is no read-only mode. Opening an existing macro's configuration shows a read-only summary of the saved parameter values, so the configuration survives the lapse, and stored entries are unchanged and show again once the licence is active.
Error messages
When the calendar cannot render, the macro shows a card naming what happened:
- Configuration. A card titled "This calendar needs its configuration fixed." names the field. With no people configured it reads: The "People" parameter is empty. Edit the macro and choose at least one person to show. With an invalid date: The "Start date of Sprint" parameter is not a valid YYYY-MM-DD date. Edit the macro and correct it. One edit and save through the editor restores the calendar; this is also the card shown for a macro configured by the pre-Forge version whose people list is stored as a single text value.
- Unexpected error. "The calendar hit an unexpected error."
- Licence. A notice titled "An active licence is required to use Niko Niko Calendar.", with the line "Ask a Confluence administrator to activate or renew the app licence for this site." and a link to this page.
Security and privacy
The manifest declares four permission scopes and nothing else: read:content-details:confluence (the people picker's directory search, name and avatar resolution when the grid renders, and the site-administrator check behind the data management screen), read:content.permission:confluence (the page-permission checks described below), storage:app (the entry store), and report:personal-data (Atlassian's personal data reporting flow, below). It declares no external network destinations and no remote hosts: the app has no Cloudscript-operated component, and a render makes no request to any origin outside Atlassian's infrastructure.
Each entry is stored in a Forge Custom Entity Store partition private to the installation, holding exactly five fields: the account ID, the date the entry is for, the value chosen, the time the entry was written, and a reference to the calendar it was recorded on. No name, avatar, email or free-text field is stored (the optional label lives in the Confluence page's own content, not in the app's storage), the write time is never shown to any viewer, and the calendar reference is never returned to the browser.
Visibility follows Confluence page permissions, checked rather than assumed: before the app serves a calendar's entries or records a new one, it verifies server-side that the person invoking it can view that page, and refuses if it cannot confirm the permission. Anyone who can view a page sees its calendar, with each entry displayed against its person's name and avatar.
Every seven days the app reports each stored account ID to Atlassian's personal data reporting API, a platform-internal call under the report:personal-data scope. When Atlassian returns an account as closed, every entry for that account is erased within one cycle, automatically. Alongside that automatic path, each person can permanently delete their own entries, and site administrators can delete any person's entries, or all entries older than a chosen date, from the app's administration screen (see Deleting entries). Administrative deletion is refused server-side for anyone who is not a site administrator, and the app never deletes entries on a schedule of its own.
The full detail is in the app's Privacy Policy and Data Processing Addendum, and our broader approach is described in the Security Policy and Trust Center.
Legal
Terms, privacy and data processing specific to this app: