This repository uses an activity-pack model. Each activity is a self-contained
folder under activities/ with its own settings, document list, content pages,
and data files.
The app shell lives at the repository root:
index.html- home page / activity launcherinbox.html- participant app for a selected activitycontrols.html- facilitator panel for advancing the activityactivities.json- catalog of available activitiesjs/- shared JavaScript used by the app shellcss/- shared styles used by the app shellassets/- shared images and logos used by the app shell
Each activity should live under activities/<activity-name>/.
Example:
activities/
artic-table-top/
settings.json
documents.json
documents/
data/
assets/
css/
settings.jsondocuments.jsondocuments/data/
assets/- activity-specific images, logos, screenshots, and mediacss/- activity-specific stylesheet files
Contains the activity metadata used by the inbox and control panel.
Typical fields:
{
"title": "ARTIC Table-Top exercise",
"description": "Exercise description",
"location": "Exercise location",
"date": "2025-10-25",
"pollInterval": 30000,
"jsonbinBinId": "",
"jsonbinAccessKey": ""
}Notes:
title,description,location, anddateare shown in the UI.pollIntervalis the default inbox polling interval in milliseconds. URL?interval=still overrides it.jsonbinBinIdandjsonbinAccessKeyare used by inbox/control panel to read the current day from JSONBin.
Lists the documents that appear in the inbox.
Typical shape:
[
{
"day": 0,
"title": "Introduction",
"description": "Welcome to the exercise",
"url": "documents/01_introduction.html",
"autoDeploy": true
},
{
"day": 1,
"title": "Situation Report 1",
"description": "First update",
"url": "documents/02_acdc_alert.html",
"autoDeploy": false
}
]Notes:
daycontrols when the document becomes visible in the inbox.urlis resolved relative to thedocuments.jsonfile.autoDeploycontrols whether the document is deployed automatically when a facilitator starts that day from controls. If omitted, it defaults totrue.- Keep the URLs activity-relative, not app-root-relative.
Contains the HTML pages that are shown inside the inbox iframe.
These pages should usually load shared or local assets with relative paths from themselves:
- CSS from the same activity:
../css/file.css - images from the same activity:
../assets/image.png - data pages from the same activity:
../data/page.html - shared app scripts from the repo root:
../../js/setup.jsonly if the page is still nested underdocuments/
Because the document pages sit inside activities/<activity-name>/documents/,
a link like ../css/acdc_sitrep.css resolves to
activities/<activity-name>/css/acdc_sitrep.css.
Contains supporting HTML and data files that are opened from the document pages.
Examples in this repo include Krona visualizations such as:
data/case_3_krona.htmldata/wastewater_krona.htmldata/pet_shop_env_krona.html
Those files should open correctly on the same server as the calling document. If they contain their own linked assets, keep those links relative to the data file location.
Use this for activity-specific logos, photos, and illustrations.
Example references from a document page:
<img src="../assets/who_logo.svg" alt="WHO emblem">
<img src="../assets/sitrep3_plot_map.png" alt="Map">Use this for activity-specific stylesheet files.
Example references from a document page:
<link rel="stylesheet" href="../css/acdc_sitrep.css">
<link rel="stylesheet" href="../css/social_media.css">-
Create a new folder under
activities/, for example:activities/new-activity/ -
Add the required files:
settings.jsondocuments.jsondocuments/data/
-
Add any activity-specific styling or media:
css/assets/
-
Fill out
settings.jsonwith the activity title, description, location, and start date. -
Create
documents.jsonwith the documents in the order they should appear. -
Make each HTML page in
documents/load the right assets using relative paths from the document location. -
If needed, add JSONBin details to
settings.jsonso the activity can be remotely synchronized:
jsonbinBinIdjsonbinAccessKey(optional for private bins; can be empty for public bins)pollInterval(optional but recommended)
- Add the activity to
activities.jsonso it appears on the launcher home page.
Example catalog entry:
{
"defaultActivity": "artic-table-top",
"activities": {
"artic-table-top": {
"url": "activities/artic-table-top/"
},
"new-activity": {
"url": "activities/new-activity/"
}
}
}The main ways to launch an activity are:
index.html- launcher pageinbox.html?activity=<activity-name>- participant inbox for a catalog activitycontrols.html?activity=<activity-name>- facilitator panel for a catalog activityinbox.html?url=<activity-folder-url>- participant inbox for a direct base URLcontrols.html?activityBase=<activity-folder-url>- controls for a direct base URL
Optional URL overrides for both inbox and controls:
?docs=<absolute-or-relative-documents.json-url>?settings=<absolute-or-relative-settings.json-url>?interval=<milliseconds>
- Keep each activity self-contained under its own folder.
- Prefer relative paths so the same activity can be served locally or remotely.
- Do not hardcode root-level paths inside activity documents.
- Store secrets such as JSONBin Master Keys only in the control panel session, not in the repo.
- If
activities.jsonpoints to a remote activity URL, ensure that URL hosts bothsettings.jsonanddocuments.json. - If you copy an existing activity, update the title, dates, document list, and any asset references that are activity-specific.
Before an activity is ready, confirm:
-
activities/<name>/settings.jsonexists -
activities/<name>/documents.jsonexists -
activities/<name>/documents/exists -
activities/<name>/data/exists -
activities/<name>/assets/exists if the activity uses custom media -
activities/<name>/css/exists if the activity uses custom styles -
activities.jsonincludes the new activity - document pages use the correct relative links
- the launcher opens the activity inbox and control panel correctly