diff --git a/compose.yml b/compose.yml
index 7be013d..ce2b02c 100644
--- a/compose.yml
+++ b/compose.yml
@@ -10,4 +10,17 @@ services:
      - PYTHONDONTWRITEBYTECODE="1"
     entrypoint: ["gunicorn", "-w", "1", "-k", "aiohttp.worker.GunicornWebWorker", "snek.gunicorn:app","--bind","0.0.0.0:8081"]
     #["python","-m","snek.app"]
-   
\ No newline at end of file
+  snecssh:
+    build:
+      context: .
+      dockerfile: DockerfileDrive
+    restart: always
+    ports:
+      - "2225:2225"
+    volumes:
+      - ./:/code
+    environment:
+     - PYTHONDONTWRITEBYTECODE="1"
+    entrypoint: ["python","-m","snekssh.app2"]
+    #["python","-m","snek.app"]
+   
diff --git a/pyproject.toml b/pyproject.toml
index 22ec4eb..a2a0ccb 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -24,6 +24,7 @@ dependencies = [
     "mistune",
     "aiohttp-session",
     "cryptography",
-    "requests"
+    "requests",
+    "asyncssh"
 ]
 
diff --git a/src/snek/static/base.css b/src/snek/static/base.css
index 42d4b33..46b9fef 100644
--- a/src/snek/static/base.css
+++ b/src/snek/static/base.css
@@ -4,6 +4,29 @@
   box-sizing: border-box;
 }
 
+.gallery {
+  padding: 50px;
+  height: auto;
+  overflow: auto;
+  flex: 1;
+  &.tile {
+  width: 100px;
+  height: 100px;
+  object-fit: cover;
+  margin-right: 10px;
+  border-radius: 5px;
+  margin: 20px;
+  }
+}
+.tile {
+  
+    width: 100px;
+    height: 100px;
+    object-fit: cover;
+    margin-right: 10px;
+    border-radius: 5px;
+    margin: 20px;
+}
 
 body {
   font-family: Arial, sans-serif;
diff --git a/src/snek/static/chat-window.js b/src/snek/static/chat-window.js
index bdad37e..58845b4 100644
--- a/src/snek/static/chat-window.js
+++ b/src/snek/static/chat-window.js
@@ -23,6 +23,7 @@ class ChatWindowElement extends HTMLElement {
         const chatHeader = document.createElement("div")
         chatHeader.classList.add("chat-header")
         
+
         
         
         const chatTitle = document.createElement('h2')
@@ -37,7 +38,13 @@ class ChatWindowElement extends HTMLElement {
         channelElement.setAttribute("channel", channel.uid)
         //channelElement.classList.add("chat-messages")
         this.container.appendChild(channelElement)
-
+        //const tileElement = document.createElement('tile-grid')
+        //tileElement.classList.add("message-list")
+        //this.container.appendChild(tileElement)
+        //const uploadButton = document.createElement('upload-button')
+        //uploadButton.grid = tileElement
+        //uploadButton.setAttribute('grid', "#grid")
+        //this.container.appendChild(uploadButton)
         const chatInput = document.createElement('chat-input')
         
         chatInput.addEventListener("submit",(e)=>{
diff --git a/src/snek/templates/web.html b/src/snek/templates/web.html
index b2e9677..3882548 100644
--- a/src/snek/templates/web.html
+++ b/src/snek/templates/web.html
@@ -4,6 +4,7 @@
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Snek</title>
+  <script src="/media-upload.js"></script>
   <script src="/html-frame.js"></script>
   <script src="/schedule.js"></script>
   <script src="/app.js"></script>
diff --git a/src/snek/view/rpc.py b/src/snek/view/rpc.py
index b48f4d0..3619bd6 100644
--- a/src/snek/view/rpc.py
+++ b/src/snek/view/rpc.py
@@ -1,5 +1,6 @@
 from aiohttp import web  
 from snek.system.view import BaseView
+import traceback
 
 
 class RPCView(BaseView):
@@ -117,7 +118,11 @@ class RPCView(BaseView):
                 method = getattr(self,method_name.replace(".","_"),None)
                 if not method:
                     raise Exception("Method not found")
-                result = await method(*args)
+                try:
+                    result = await method(*args)
+                except Exception as ex:
+                    result = dict({"callId":call_id,"success": False, "data":{"exception":str(ex),"traceback":traceback.format_exc()}}) 
+                    #dict(error=ex=str(ex),traceback=traceback.format_exc())
                 await self.ws.send_json({"callId":call_id,"success":True,"data":result})
             except Exception as ex:
                 await self.ws.send_json({"callId":call_id,"success":False,"data":str(ex)})
@@ -145,4 +150,4 @@ class RPCView(BaseView):
 
         await self.services.socket.delete(ws)
         print("WebSocket connection closed")
-        return ws
\ No newline at end of file
+        return ws