diff --git a/fastapi_jwt/Dockerfile b/fastapi_jwt/Dockerfile
new file mode 100644
index 0000000..4db1a1f
--- /dev/null
+++ b/fastapi_jwt/Dockerfile
@@ -0,0 +1,13 @@
+FROM python:3.10
+
+WORKDIR /api
+
+COPY ./requirements.txt /api/requirements.txt
+RUN pip install --no-cache-dir --upgrade -r /api/requirements.txt
+
+COPY ./app /api/app
+EXPOSE 80
+
+ENV JWT_SECRET_KEY=SECRET
+
+CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
\ No newline at end of file
diff --git a/fastapi_jwt/README.md b/fastapi_jwt/README.md
new file mode 100644
index 0000000..1dd1c72
--- /dev/null
+++ b/fastapi_jwt/README.md
@@ -0,0 +1,16 @@
+# FastAPI Todo App
+
+## Docs
+
+![FastAPI](./screen.PNG?raw=true)
+
+## Configure
+
+Change the `ENV JWT_SECRET_KEY=SECRET` in the Dockerfile to a secret key of your choice.
+
+## Build Docker
+
+```bash
+docker build -t fastapi_todo .
+docker run -d --name my_todo_app -p 80:80 fastapi_todo
+```
diff --git a/fastapi_jwt/static/style/main.css b/fastapi_jwt/app/__init__.py
similarity index 100%
rename from fastapi_jwt/static/style/main.css
rename to fastapi_jwt/app/__init__.py
diff --git a/fastapi_jwt/db.py b/fastapi_jwt/app/db.py
similarity index 96%
rename from fastapi_jwt/db.py
rename to fastapi_jwt/app/db.py
index 2abedca..0a76598 100644
--- a/fastapi_jwt/db.py
+++ b/fastapi_jwt/app/db.py
@@ -2,7 +2,7 @@
 import sqlalchemy
 
 # SQLAlchemy specific code, as with any other app
-DATABASE_URL = "sqlite:///./sqlite.db"
+DATABASE_URL = "sqlite:///./app/sqlite.db"
 # DATABASE_URL = "postgresql://user:password@postgresserver/db"
 
 database = databases.Database(DATABASE_URL)
diff --git a/fastapi_jwt/main.py b/fastapi_jwt/app/main.py
similarity index 93%
rename from fastapi_jwt/main.py
rename to fastapi_jwt/app/main.py
index 2310f44..da0ec26 100644
--- a/fastapi_jwt/main.py
+++ b/fastapi_jwt/app/main.py
@@ -2,10 +2,10 @@
 from fastapi.templating import Jinja2Templates
 from fastapi.staticfiles import StaticFiles
 from fastapi.responses import RedirectResponse
-from user import user_router, JWTBearer, TokenData, UserLogin, UserIn
-from user import login as user_login
-from user import register as user_register
-from todo import todo_router, get_todos, create_todo, update_todo_by_id, TodoIn
+from .user import user_router, JWTBearer, TokenData, UserLogin, UserIn
+from .user import login as user_login
+from .user import register as user_register
+from .todo import todo_router, get_todos, create_todo, update_todo_by_id, TodoIn
 import json
 
 app = FastAPI(docs_url = "/api/docs")
@@ -30,9 +30,9 @@ async def root():
     return {"message": "Hello World"}
 
 
-app.mount("/static", StaticFiles(directory="static"), name="static")
+app.mount("/static", StaticFiles(directory="app/static"), name="static")
 
-templates = Jinja2Templates(directory="templates")
+templates = Jinja2Templates(directory="app/templates")
 
 def is_logged_in(request: Request) -> TokenData if True else False:
     token = request.cookies.get("access_token")
diff --git a/fastapi_jwt/app/static/script/main.js b/fastapi_jwt/app/static/script/main.js
new file mode 100644
index 0000000..f7e960c
--- /dev/null
+++ b/fastapi_jwt/app/static/script/main.js
@@ -0,0 +1,7 @@
+const update_todo = (id) => {
+    var todo = document.getElementById(`todo-${id}`);
+    var todo_name = todo.querySelector('h1').innerText;
+    var todo_description = todo.querySelector('p').innerText;
+    var todo_status = todo.querySelector('[name="status"]').value;
+    console.log(todo_name, todo_description, todo_status);
+}
diff --git a/fastapi_jwt/app/static/style/main.css b/fastapi_jwt/app/static/style/main.css
new file mode 100644
index 0000000..e69de29
diff --git a/fastapi_jwt/templates/home.html b/fastapi_jwt/app/templates/home.html
similarity index 73%
rename from fastapi_jwt/templates/home.html
rename to fastapi_jwt/app/templates/home.html
index 0711e75..94b2b62 100644
--- a/fastapi_jwt/templates/home.html
+++ b/fastapi_jwt/app/templates/home.html
@@ -29,13 +29,13 @@
     {% for todo in todos %}
         <div class="todo" id="todo-{{ todo.id }}">
             <h1>{{ todo.title }}</h1>
-            <p>{{ todo.description }}</p>
+            <p name="desc">{{ todo.description }}</p>
             {% if todo.completed %}
-                <input type="checkbox" onclick="complete_todo('{{todo.id}}'); return;" checked>Completed</input>
+                <input name="completed" type="checkbox" onclick="update_todo('{{todo.id}}'); return;" checked>Completed</input>
             {% else %}
-                <input type="checkbox" onclick="complete_todo('{{ todo.id }}'); return;">Completed</input>
+                <input name="completed" type="checkbox" onclick="update_todo('{{ todo.id }}'); return;">Completed</input>
             {% endif %}
-            <button class="delete" todo-id="{{ todo.id }}" onclick="delete_todo('{{todo.id}}'); return;">Delete</button>
+            <button name="delete" class="delete" todo-id="{{ todo.id }}" onclick="delete_todo('{{todo.id}}'); return;">Delete</button>
         </div>
     {% endfor %}
 </body>
diff --git a/fastapi_jwt/templates/index.html b/fastapi_jwt/app/templates/index.html
similarity index 100%
rename from fastapi_jwt/templates/index.html
rename to fastapi_jwt/app/templates/index.html
diff --git a/fastapi_jwt/templates/login.html b/fastapi_jwt/app/templates/login.html
similarity index 100%
rename from fastapi_jwt/templates/login.html
rename to fastapi_jwt/app/templates/login.html
diff --git a/fastapi_jwt/templates/register.html b/fastapi_jwt/app/templates/register.html
similarity index 100%
rename from fastapi_jwt/templates/register.html
rename to fastapi_jwt/app/templates/register.html
diff --git a/fastapi_jwt/todo.py b/fastapi_jwt/app/todo.py
similarity index 97%
rename from fastapi_jwt/todo.py
rename to fastapi_jwt/app/todo.py
index 4cf39fb..1d7ab31 100644
--- a/fastapi_jwt/todo.py
+++ b/fastapi_jwt/app/todo.py
@@ -1,8 +1,8 @@
 from fastapi import APIRouter, HTTPException
 from pydantic import BaseModel
-from db import database, todos
+from .db import database, todos
 from fastapi import Depends
-from user import JWTBearer, TokenData
+from .user import JWTBearer, TokenData
 
 todo_router = APIRouter()
 
diff --git a/fastapi_jwt/user.py b/fastapi_jwt/app/user.py
similarity index 97%
rename from fastapi_jwt/user.py
rename to fastapi_jwt/app/user.py
index 9b8a290..2ef284c 100644
--- a/fastapi_jwt/user.py
+++ b/fastapi_jwt/app/user.py
@@ -3,12 +3,13 @@
 from fastapi import APIRouter, Depends
 from fastapi import HTTPException
 from pydantic import BaseModel
-from db import database, users
+from .db import database, users
 from passlib.context import CryptContext
+import os
 
 user_router = APIRouter()
 
-JWT_SECRET_KEY = "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7"
+JWT_SECRET_KEY = os.environ.get("JWT_SECRET_KEY")
 
 pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
 
diff --git a/fastapi_jwt/requirements.txt b/fastapi_jwt/requirements.txt
index e998f61..d43fa7a 100644
--- a/fastapi_jwt/requirements.txt
+++ b/fastapi_jwt/requirements.txt
@@ -20,7 +20,6 @@ httpx==0.24.1
 idna==3.4
 itsdangerous==2.1.2
 Jinja2==3.1.2
-MarkupSafe==2.1.3
 orjson==3.9.1
 passlib==1.7.4
 pyasn1==0.5.0
@@ -40,4 +39,3 @@ typing_extensions==4.6.3
 ujson==5.8.0
 uvicorn==0.22.0
 watchfiles==0.19.0
-websockets==11.0.3
diff --git a/fastapi_jwt/screen.PNG b/fastapi_jwt/screen.PNG
new file mode 100644
index 0000000..86b4882
Binary files /dev/null and b/fastapi_jwt/screen.PNG differ
diff --git a/fastapi_jwt/sqlite.db b/fastapi_jwt/sqlite.db
deleted file mode 100644
index 233f156..0000000
Binary files a/fastapi_jwt/sqlite.db and /dev/null differ
diff --git a/fastapi_jwt/static/script/main.js b/fastapi_jwt/static/script/main.js
deleted file mode 100644
index b28b04f..0000000
--- a/fastapi_jwt/static/script/main.js
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
