diff --git a/semag/box/index.html b/semag/box/index.html
new file mode 100644
index 00000000..2a29e655
--- /dev/null
+++ b/semag/box/index.html
@@ -0,0 +1,16803 @@
+
+
+
+
+
+ Sandboxels - Experiment with Pixels
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Loading...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Controls
+
+ Draw pixels | Left Click |
+ Erase pixels | Right Click |
+ Pick element | Middle Click |
+ Pause simulation | Space or P |
+ Intensify effect | Shift + Heat/Cool/Drag/Mix |
+ Draw line | Shift + Click |
+ Change cursor size | Scroll or +- or [] |
+ Change category | ←→ |
+ Select by name | E |
+ Element info | I or / |
+ Open settings | \ |
+ Reset canvas | R |
+ Single step | > |
+ Fullscreen | F or F11 |
+ Change view | 1234 |
+ Toggle GUI | F1 |
+ Capture screenshot | C or F2 |
+ More controls |
+
+
+
+
+
+
+
+
+
diff --git a/semag/box/service-worker.js b/semag/box/service-worker.js
new file mode 100644
index 00000000..c8778125
--- /dev/null
+++ b/semag/box/service-worker.js
@@ -0,0 +1,16 @@
+self.addEventListener('fetch', function(event) {
+ if(!event.request.url.startsWith('http')){
+ return
+ }
+ event.respondWith(async function() {
+ try{
+ var res = await fetch(event.request);
+ var cache = await caches.open('cache');
+ cache.put(event.request.url, res.clone());
+ return res;
+ }
+ catch(error){
+ return caches.match(event.request);
+ }
+ }());
+ });
\ No newline at end of file