diff --git a/utils/app/reaction_contributions/.dockerignore b/utils/app/reaction_contributions/.dockerignore
new file mode 100644
index 00000000..521d55f5
--- /dev/null
+++ b/utils/app/reaction_contributions/.dockerignore
@@ -0,0 +1,4 @@
+.git
+node_modules
+docker-compose.yml
+*.log
diff --git a/utils/app/reaction_contributions/Dockerfile b/utils/app/reaction_contributions/Dockerfile
new file mode 100644
index 00000000..dd74578f
--- /dev/null
+++ b/utils/app/reaction_contributions/Dockerfile
@@ -0,0 +1,5 @@
+FROM nginx:alpine
+
+COPY . /usr/share/nginx/html
+
+EXPOSE 80
diff --git a/utils/app/reaction_contributions/index.html b/utils/app/reaction_contributions/index.html
new file mode 100644
index 00000000..aa8878c1
--- /dev/null
+++ b/utils/app/reaction_contributions/index.html
@@ -0,0 +1,682 @@
+
+
+
+
+ Reaction Contributions Explorer
+
+
+
+
+
+
+
+
+
+
+
diff --git a/utils/app/reaction_contributions/readme.md b/utils/app/reaction_contributions/readme.md
new file mode 100644
index 00000000..a3c2e6ff
--- /dev/null
+++ b/utils/app/reaction_contributions/readme.md
@@ -0,0 +1,20 @@
+# Reaction Contribution Web App
+This small static web app allows you to load up a reactions contributions JSON file and visualize the contributions of different reactions to different species. This is useful for debugging.
+
+The JSON file must have the schema
+
+```json
+{
+ i: {
+ t: float,
+ dt: float,
+ reaction_contribution: {
+ Species: {
+ reaction: float
+ }
+ }
+ }
+}
+
+```
+where i counts from 0 -> the number of timesteps, Species is the species name (so if at one timestep there are 10 species tracked there will be 10 species entries), and reaction is the projectile-ejectile name of a reaction.