diff --git a/docker-compose.yml b/docker-compose.yml
index 3cb6c3469d641152bcc76123e7fa7f11bb473d42..43d0a2b14c4884a5bc5ce99baf9ec2c5429a402f 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -16,10 +16,6 @@ services:
     image: "redis:alpine"
     ports:
       - "6379:6379"
-  redis-client:
-    build: ./redis
-    depends_on:
-      - redis
   sg-backend:
     build: ./sg-backend
     command: sh -c "/wait && uvicorn main:app --reload --host 0.0.0.0"
diff --git a/redis/Dockerfile b/redis-test/Dockerfile
similarity index 100%
rename from redis/Dockerfile
rename to redis-test/Dockerfile
diff --git a/redis-test/client_example.py b/redis-test/client_example.py
new file mode 100644
index 0000000000000000000000000000000000000000..82818051f641fadcacf7a99a03850a034f55cc47
--- /dev/null
+++ b/redis-test/client_example.py
@@ -0,0 +1,6 @@
+import redis
+
+r = redis.Redis(host='redis-test', port=6379, db=0)
+r.set('foo', 'bar')
+result = r.get('foo')
+print(result)
\ No newline at end of file
diff --git a/redis/requirements.txt b/redis-test/requirements.txt
similarity index 100%
rename from redis/requirements.txt
rename to redis-test/requirements.txt
diff --git a/redis/client_example.py b/redis/client_example.py
deleted file mode 100644
index 092bffdb8001bbc5ec2c6146e7d19b31217fa4e6..0000000000000000000000000000000000000000
--- a/redis/client_example.py
+++ /dev/null
@@ -1,6 +0,0 @@
-import redis
-
-r = redis.Redis(host='redis', port=6379, db=0)
-r.set('foo', 'bar')
-result = r.get('foo')
-print(result)
diff --git a/sg-backend/cache.py b/sg-backend/cache.py
new file mode 100644
index 0000000000000000000000000000000000000000..95a0cf009771b2c0a7dd532dbf422c944e428688
--- /dev/null
+++ b/sg-backend/cache.py
@@ -0,0 +1,15 @@
+from fastapi_cache import FastAPICache
+from fastapi_cache.backends.redis import RedisBackend
+
+from redis import asyncio as aioredis
+
+
+class RedisCache:
+    def __init__(self):
+        redis = aioredis.from_url("redis://redis", encoding="utf8", decode_responses=True)
+        FastAPICache.init(RedisBackend(redis), prefix="fastapi-cache")
+
+    @staticmethod
+    async def clear_softwares_cache():
+        await FastAPICache.clear(key="software")
+        await FastAPICache.clear(key="software-graph")
\ No newline at end of file
diff --git a/sg-backend/main.py b/sg-backend/main.py
index 8b40e1920f2e7e92dd4228f55bc2b579c4b8e10d..006d15eb447edc226e057c9f745f9fe42a9b43db 100644
--- a/sg-backend/main.py
+++ b/sg-backend/main.py
@@ -3,9 +3,11 @@ import os
 import random
 
 from fastapi import FastAPI
+from fastapi_cache.decorator import cache
 from pydantic import BaseModel
 from starlette.middleware.cors import CORSMiddleware
 
+from cache import RedisCache
 from db import Neo4j
 
 
@@ -29,40 +31,29 @@ app = FastAPI()
 
 origins = [
     os.getenv("FRONTEND_URL"),
+    "http://localhost",
+    "http://localhost:4173",
+    "http://localhost:5173",
 ]
 
 app.add_middleware(
     CORSMiddleware,
-    allow_origins=['*'],
+    allow_origins=origins,
     allow_credentials=True,
     allow_methods=["*"],
     allow_headers=["*"],
 )
 
 
-@app.get("/")
-async def root():
-    return {"message": "Hello World"}
-
-
-@app.get("/hello/{name}")
-async def say_hello(name: str):
-    return {"message": f"Hello {name}"}
-
-
-@app.get("/graph")
-async def graph():
-    results = driver.get_graph_data()
-    return json.loads(results[0]['data'])
-
-
 @app.get("/software")
+@cache(expire=60, key_builder=lambda *args, **kwargs: "software")
 async def software():
     results = driver.get_softwares()
     return {"softwares": json.loads(json.dumps(results))}
 
 
 @app.get("/software-graph")
+@cache(expire=60, key_builder=lambda *args, **kwargs: "software-graph")
 async def software():
     nodes = driver.get_nodes()
     jnodes = json.loads(json.dumps(nodes))
@@ -106,10 +97,27 @@ async def software_search(search: SoftwareSearch):
 @app.post("/software-insert")
 async def software_insert(insert_data: SoftwareInsert):
     res = driver.insert_software(insert_data)
+    await RedisCache.clear_softwares_cache()
     return res
 
 
 @app.post("/relation-insert")
 async def software_insert(insert_data: RelationInsert):
     res = driver.relation_insert(insert_data)
+    await RedisCache.clear_softwares_cache()
     return res
+
+
+@app.get("/")
+async def root():
+    return {"message": "Hello World"}
+
+
+@app.on_event("startup")
+async def startup():
+    RedisCache()
+
+# @app.get("/graph")
+# async def graph():
+#     results = driver.get_graph_data()
+#     return json.loads(results[0]['data'])
\ No newline at end of file
diff --git a/sg-frontend/src/components/RelationInsert.svelte b/sg-frontend/src/components/RelationInsert.svelte
index 78e5e6b927d2e10e1b33e2ece980fd1a09c71694..7d0386f95ac05d78dba22e7da7dd285618c402e2 100644
--- a/sg-frontend/src/components/RelationInsert.svelte
+++ b/sg-frontend/src/components/RelationInsert.svelte
@@ -11,7 +11,7 @@
     onMount(async () => {
 
         const relationAddButton = document.getElementById("relationAddButton");
-        relationAddButton.addEventListener("click", async () => {
+        relationAddButton.addEventListener("click", async (e) => {
             const response = await fetch(BACKEND_URL + "/relation-insert", {
                 method: "POST",
                 headers: {
@@ -27,6 +27,7 @@
                 result = await response.json();
                 node = result.node;
             }
+            e.preventDefault();
         });
 
         await fetch(BACKEND_URL + "/software")
@@ -113,4 +114,4 @@
     label {
         margin: 0 0 10px;
     }
-</style>
+</style>
\ No newline at end of file
diff --git a/sg-frontend/src/components/SoftwareInsert.svelte b/sg-frontend/src/components/SoftwareInsert.svelte
index 429da71f89f20face74a964eb8b4260dc99f3dcc..702fc318d9c8038854a6d5720fca4907f8bc4019 100644
--- a/sg-frontend/src/components/SoftwareInsert.svelte
+++ b/sg-frontend/src/components/SoftwareInsert.svelte
@@ -13,8 +13,9 @@
         const softwareName = document.getElementById("softwareName");
         const newNodeButton = document.getElementById("newNodeButton");
 
-        newNodeButton.addEventListener("click", () => {
+        newNodeButton.addEventListener("click", (e) => {
             postSoftwareInsert();
+            e.preventDefault();
         });
 
         async function postSoftwareInsert() {
@@ -84,4 +85,4 @@
     label {
         margin: 0 0 10px;
     }
-</style>
+</style>
\ No newline at end of file
diff --git a/sg-frontend/src/routes/AddNode.svelte b/sg-frontend/src/routes/AddNode.svelte
index 649088b4007cd82495b384997cee1466ba7f2040..e869809e21f7da454c2e149543b3f294485f6246 100644
--- a/sg-frontend/src/routes/AddNode.svelte
+++ b/sg-frontend/src/routes/AddNode.svelte
@@ -5,17 +5,13 @@
     import RelationInsert from "../components/RelationInsert.svelte";
 
     onMount(() => {
-        fetch("http://localhost:8000/add-node")
-            .then(response => response.json())
-            .then(data => {
-                // Retrieve some useful DOM elements:
-                const link = document.getElementById("sigma") as HTMLElement;
-                const home = document.getElementById("home") as HTMLElement;
-                const add = document.getElementById("add") as HTMLElement;
-                add.classList.add("active");
-                home.classList.remove("active");
-                link.classList.remove("active");
-            })
+        const link = document.getElementById("sigma") as HTMLElement;
+        const home = document.getElementById("home") as HTMLElement;
+        const add = document.getElementById("add") as HTMLElement;
+        add.classList.add("active");
+        home.classList.remove("active");
+        link.classList.remove("active");
+
     });
 </script>
 <div id="app-base">