diff --git a/.forgejo/workflows/build+release.yml b/.forgejo/workflows/build+release.yml
deleted file mode 100644
index 2b43104..0000000
--- a/.forgejo/workflows/build+release.yml
+++ /dev/null
@@ -1,95 +0,0 @@
-name: 'Build and Release Docker Image'
-author: 'Neshura'
-
-on:
-  push:
-    tags:
-      - '[0-9]+.[0-9]+.[0-9]+'
-      - '[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+'
-jobs:
-  test:
-    runs-on: docker
-    steps:
-      -
-        name: Checking Out Repository Code
-        uses: https://code.forgejo.org/actions/checkout@v3
-      -
-        name: Get Yarn Cache Directory
-        id: yarn-cache-dir-path
-        run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
-      -
-        name: Set Up Yarn Cache
-        uses: actions/cache@v3
-        id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
-        with:
-          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
-          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
-          restore-keys: |
-            ${{ runner.os }}-yarn-
-      -
-        name: Install Dependencies
-        run: yarn install
-      -
-        name: Run Linter
-        run: yarn lint
-      -
-        name: Check if Version in package.json matches Tag
-        run: |
-          VERSION=$(cat package.json | grep "version" | sed 's/.*://' | tr -d , | tr -d \" | tr -d " " )
-          if test $VERSION != "${{  github.ref_name }}"; then 
-            echo "Expected Version is: '${{  github.ref_name }}' actual Version is: '$VERSION'"; 
-            exit 1
-          else 
-            echo "Version is: '$VERSION'"; 
-          fi                                        
-
-  build:
-    needs: test
-    if: success()
-    runs-on: dind
-    steps:
-      -
-        name: Set up Docker Buildx
-        uses: docker/setup-buildx-action@v3
-        with:
-          config-inline: |
-            [registry."docker.io"]
-              mirrors = ["https://docker-cache.neshweb.net"]
-      -
-        name: Login to Docker Hub
-        uses: docker/login-action@v3
-        with:
-          registry: forgejo.neshweb.net
-          username: ${{ secrets.FORGEJO_USERNAME }}
-          password: ${{ secrets.FORGEJO_TOKEN }}
-      -
-        name: Determine Docker tags
-        id: tags
-        run: |
-          if echo ${{ github.ref_name }} | grep -qi '\-rc' ; then
-            echo latest=forgejo.neshweb.net/neshweb-sites/${{ github.event.repository.name }}:preview >> $GITHUB_OUTPUT;
-          else
-            echo latest=forgejo.neshweb.net/neshweb-sites/${{ github.event.repository.name }}:latest >> $GITHUB_OUTPUT;
-          fi
-          echo version=forgejo.neshweb.net/neshweb-sites/${{ github.event.repository.name }}:${{ github.ref_name }} >> $GITHUB_OUTPUT;
-      -
-        name: Push to Package Registry
-        uses: docker/build-push-action@v5
-        with:
-          push: true
-          tags: ${{ steps.tags.outputs.version }}, ${{ steps.tags.outputs.latest }}
-
-  release:
-    needs: build
-    if: success()
-    runs-on: docker
-    steps:
-      -
-        name: Release New Version
-        uses: actions/forgejo-release@v1
-        with:
-          direction: upload
-          url: https://forgejo.neshweb.net
-          release-dir: release
-          token: ${{ secrets.FORGEJO_TOKEN }}
-          tag: ${{  github.ref_name }}
\ No newline at end of file
diff --git a/.forgejo/workflows/test.yml b/.forgejo/workflows/test.yml
deleted file mode 100644
index 570d370..0000000
--- a/.forgejo/workflows/test.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-name: 'Run Tests on Code'
-author: 'Neshura'
-
-on:
-  push:
-    tags-ignore:
-      - '**'
-    branches:
-      - '**'
-jobs:
-  test:
-    runs-on: docker
-    steps:
-      -
-        name: Checking Out Repository Code
-        uses: https://code.forgejo.org/actions/checkout@v3
-      -
-        name: Get Yarn Cache Directory
-        id: yarn-cache-dir-path
-        run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
-      -
-        name: Set Up Yarn Cache
-        uses: actions/cache@v3
-        id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
-        with:
-          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
-          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
-          restore-keys: |
-            ${{ runner.os }}-yarn-
-      -
-        name: Install Dependencies
-        run: yarn install
-      -
-        name: Run Linter
-        run: yarn lint
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 72d7a01..ddb6132 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,8 @@
 # do not track installed modules
-node_modules/
+/node_modules
 
 # do not track built files
-.vscode/
-.next/
+/.next
 *.tsbuildinfo
 next-env.d.ts
 
@@ -14,8 +13,6 @@ yarn-error.log*
 .pnpm-debug.log*
 
 # production
-build/
-data/
-confs/
-
-.idea/
+/build
+/data
+/confs
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..cb854ac
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,70 @@
+# avoids unecessary repulling of node modules
+cache:
+  paths:
+    - node_modules/
+
+stages:
+  - lint
+  #- test
+  - build
+  - deploy
+
+variables:
+  IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
+  IMAGE_LATEST: $CI_REGISTRY_IMAGE:develop
+
+
+.node:
+  image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/node:latest
+
+
+.docker:
+  image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/docker:20
+  rules:
+  - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_TAG
+    variables:
+      IMAGE_LATEST: $CI_REGISTRY_IMAGE:latest
+  - if: $CI_COMMIT_TAG
+
+
+linter:
+  image: !reference [.node, image]
+  stage: lint
+  before_script:
+    - yarn install
+  script:
+    - yarn lint
+
+
+build:
+  image: !reference [.docker, image]
+  stage: build
+  before_script:
+    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+  script:
+    - docker build -t $IMAGE_TAG .
+  after_script:
+    - docker save $IMAGE_TAG > docker.tar
+  artifacts:
+    expire_in: 30 mins
+    paths:
+      - docker.tar
+  rules:
+    - !reference [.docker, rules]
+
+
+push:
+  image: !reference [.docker, image]
+  stage: deploy
+  needs: 
+    - job: build
+      artifacts: true
+  before_script:
+    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+    - docker load -i docker.tar
+  script:
+    - docker tag $IMAGE_TAG $IMAGE_LATEST
+    - docker push $IMAGE_TAG
+    - docker push $IMAGE_LATEST
+  rules:
+    - !reference [.docker, rules]
diff --git a/Dockerfile b/Dockerfile
index 645c82d..cc2de22 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,18 +1,17 @@
 ## INIT STEP
 # Install dependencies only when needed
-FROM node:18-alpine AS deps
+FROM node:16-alpine AS deps
 
 RUN apk add --no-cache libc6-compat
 WORKDIR /app
 
 # Copy the files needed to install deps
 COPY package.json yarn.lock ./
-RUN yarn add sharp
 RUN yarn install --frozen-lockfile
 
 ## BUILD STEP
 # Rebuild the source code only when needed
-FROM node:18-alpine AS builder
+FROM node:16-alpine AS builder
 
 WORKDIR /app
 
@@ -24,10 +23,10 @@ COPY . .
 RUN yarn build
 
 ## RUN STEP
-FROM node:18-alpine AS runner
+FROM node:16-alpine AS runner
 
-LABEL author="neshura@neshweb.net"
-WORKDIR /usr/src/app
+LABEL author="neshura@proton.me"
+WORKDIR /usr/src/ap
 
 ENV NODE_ENV production
 
diff --git a/components/layout.tsx b/components/layout.tsx
index 7425eee..699bf27 100644
--- a/components/layout.tsx
+++ b/components/layout.tsx
@@ -11,12 +11,12 @@ const LayoutReadyOrNot = ({ children }: { children: React.ReactNode }) => {
         var _paq = window._paq = window._paq || [];
         /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
         _paq.push(["setDocumentTitle", document.domain + "/" + document.title]);
-        _paq.push(["setCookieDomain", "readyornot.neshweb.net"]);
+        _paq.push(["setCookieDomain", "readyornot.neshura-server.net"]);
         _paq.push(["disableCookies"]);
         _paq.push(['trackPageView']);
         _paq.push(['enableLinkTracking']);
         (function() {
-          var u="//tracking.neshweb.net/";
+          var u="//temp.neshura-server.net/";
           _paq.push(['setTrackerUrl', u+'matomo.php']);
           _paq.push(['setSiteId', '2']);
           var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
@@ -26,6 +26,7 @@ const LayoutReadyOrNot = ({ children }: { children: React.ReactNode }) => {
       </Script>
 
       <Sidebar />
+      <div className={styles.sidebarPlaceholder}></div>
       <main className={styles.main}>
         {children}
       </main>
diff --git a/components/sidebar.tsx b/components/sidebar.tsx
index cf5e055..113c438 100644
--- a/components/sidebar.tsx
+++ b/components/sidebar.tsx
@@ -4,8 +4,7 @@ import { useRouter } from 'next/router'
 import useSWR from 'swr';
 import ReadyOrNotMap from '../interfaces/ReadyOrNot';
 import React, { useState } from 'react';
-import Image from 'next/image';
-import useWindowSize from '../components/windowsize';
+import Image from 'next/image'
 
 const fetcher = (url: string) => fetch(url).then((res) => res.json())
 
@@ -13,55 +12,37 @@ function stopPropagation(e: any) {
   e.stopPropagation();
 }
 
+
 const Sidebar = () => {
-  const isMobile = useWindowSize();
   const router = useRouter();
-  const [active, setActive] = useState(isMobile);
-  const { maps, isLoading, isError }: { maps: ReadyOrNotMap[], isLoading: boolean, isError: boolean } = useNavbar();
+  const [active, setActive] = useState(true);
+  const { maps, isLoading, isError } = useNavbar();
 
-  if (typeof (isMobile) === "boolean" && typeof (active) === "undefined") {
-    setActive(!isMobile);
-  }
-
-  if (isError) {
-    return (
-      <>
-        <div><nav><a>Error loading Sidemenu</a></nav></div>
-        <div className={styles.sidebarPlaceholder}></div>
-      </>
-    )
-  }
+  if (isError) { return (<div><nav><a>Error loading Sidemenu</a></nav></div>) }
   else if (isLoading) {
     return (
-      <>
-        <div>
-          <nav>
-            <a>Loading...</a>
-          </nav>
-        </div>
-        <div className={styles.sidebarPlaceholder}></div>
-      </>
+      <div>
+        <nav>
+          <a>Loading...</a>
+        </nav>
+      </div>
     )
   }
   else {
+    // > is a placeholder
     return (
-      <>
-        <div className={styles.sidebar} onClick={() => setActive(!active)}>
-          <div className={[styles.sl_wrapper, (active ? styles.sl_active : styles.sl_inactive)].join(" ")}>
-            <nav className={styles.sidebarList}>
-              {maps.map((item) => (
-                <Link key={item.name} href={item.href}>
-                  <a className={[styles.navElem, (router.query.map == item.href ? styles.ne_active : styles.ne_inactive)].join(" ")} onClick={stopPropagation}>{item.name}</a>
-                </Link>
-              ))}
-            </nav>
-          </div>
-          <div className={styles.sidebarArrow}>
-            <Image src={active ? "/sidebar_arrow_flipped.webp" : "/sidebar_arrow.webp"} width={32} height={96} alt={active ? ">" : "<"} />
-          </div>
+      <div className={styles.sidebar} onClick={() => setActive(!active)}>
+        <nav className={[styles.sidebarList, (active ? styles.sl_active : styles.sl_inactive)].join(" ")}>
+          {maps.map((item: ReadyOrNotMap) => (
+            <Link key={item.name} href={item.href}>
+              <a className={[styles.navElem, (router.query.map == item.href ? styles.ne_active: styles.ne_inactive)].join(" ")} onClick={stopPropagation}>{item.name}</a>
+            </Link>
+          ))}
+        </nav>
+        <div className={styles.sidebarArrow}>
+          <Image src="/sidebar_arrow.webp" width={32} height={96} alt=">"/>
         </div>
-        <div className={styles.sidebarPlaceholder}></div>
-      </>
+      </div>
     );
   }
 }
diff --git a/components/windowsize.tsx b/components/windowsize.tsx
deleted file mode 100644
index 063fae5..0000000
--- a/components/windowsize.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import { useEffect, useState } from "react";
-
-interface ScreenSize {
-  width: number | undefined;
-  height: number | undefined;
-}
-
-export default function useWindowSize(): boolean | undefined {
-  const [windowSize, setWindowSize] = useState<ScreenSize>({
-    width: undefined,
-    height: undefined,
-  });
-
-  useEffect(() => {
-    function handleResize() {
-      setWindowSize({
-        width: window.innerWidth,
-        height: window.innerHeight,
-      });
-    }
-    
-    window.addEventListener("resize", handleResize);
-
-    handleResize();
-
-    return () => window.removeEventListener("resize", handleResize);
-  }, []);
-  if(typeof(windowSize.width) === "number") {
-    return windowSize.width <= 1080;
-  }
-  else {
-    return undefined;
-  }
-}
\ No newline at end of file
diff --git a/package.json b/package.json
index f5d1313..19e5582 100644
--- a/package.json
+++ b/package.json
@@ -1,12 +1,12 @@
 {
   "name": "readyornot",
-  "version": "0.1.8",
+  "version": "0.1.0",
   "private": true,
   "scripts": {
-    "dev:debug": "NODE_OPTIONS='--inspect' next dev -H :: -p 8002",
-    "dev": "next dev -H :: -p 8002",
+    "dev:debug": "NODE_OPTIONS='--inspect' next dev -p 4042",
+    "dev": "next dev",
     "build": "next build",
-    "start": "next start -H :: -p 8002",
+    "start": "next start",
     "lint": "next lint"
   },
   "dependencies": {
@@ -17,10 +17,9 @@
     "swr": "^1.3.0"
   },
   "devDependencies": {
-    "@types/node": "18.14.6",
-    "@types/react": "^18.0.14",
     "eslint": "^8.23.1",
     "eslint-config-next": "12.2.0",
+    "@types/react": "^18.0.14",
     "typescript": "4.9.3"
   }
 }
diff --git a/pages/[map].tsx b/pages/[map].tsx
index 922df1d..5676b61 100644
--- a/pages/[map].tsx
+++ b/pages/[map].tsx
@@ -6,12 +6,34 @@ import { NextPageWithLayout } from './_app';
 import React from 'react';
 import useSWR, { KeyedMutator, mutate } from 'swr';
 import { useRouter } from 'next/router';
-import Image from 'next/image';
+import Image from 'next/image'
 import ReadyOrNotMap from '../interfaces/ReadyOrNot';
-import useWindowSize from '../components/windowsize';
 
 const fetcher = (url: string) => fetch(url).then((res) => res.json())
 
+function useWindowSize() {
+  const [windowSize, setWindowSize] = useState({
+    width: 0,
+    height: 0,
+  });
+
+  useEffect(() => {
+    function handleResize() {
+      setWindowSize({
+        width: window.innerWidth,
+        height: window.innerHeight,
+      });
+    }
+    
+    window.addEventListener("resize", handleResize);
+
+    handleResize();
+
+    return () => window.removeEventListener("resize", handleResize);
+  }, []);
+  return windowSize.width <= 1080;
+}
+
 const ReadyOrNotMaps: NextPageWithLayout = () => {
   const [floor, setFloor] = useState(0);
   const { mapInfo, isLoadingInfo, isErrorInfo } = useMap(useRouter().query.map?.toString() || "a_lethal_obsession")
diff --git a/pages/api/navbar.tsx b/pages/api/navbar.tsx
index 1ec8953..18ea552 100644
--- a/pages/api/navbar.tsx
+++ b/pages/api/navbar.tsx
@@ -3,7 +3,7 @@ import fsPromises from 'fs/promises'
 import path from 'path'
 import ReadyOrNotMap from '../../interfaces/ReadyOrNot'
 
-export default async function SidebarAPI(req: any, res: any) {
+export default async function TobarApi(req: any, res: any) {
   try {
     // get list of all folders(maps) in the readyornot folder - maybe there is a cleaner way to do this?
     var fs = require('fs')
diff --git a/public/sidebar_arrow.webp b/public/sidebar_arrow.webp
index 9c00889..a78f750 100644
Binary files a/public/sidebar_arrow.webp and b/public/sidebar_arrow.webp differ
diff --git a/public/sidebar_arrow_flipped.webp b/public/sidebar_arrow_flipped.webp
deleted file mode 100644
index 482d5db..0000000
Binary files a/public/sidebar_arrow_flipped.webp and /dev/null differ
diff --git a/resources/sidebar_arrow.svg b/resources/sidebar_arrow.svg
index bd01371..870d15f 100644
--- a/resources/sidebar_arrow.svg
+++ b/resources/sidebar_arrow.svg
@@ -28,8 +28,8 @@
      inkscape:document-units="px"
      showgrid="true"
      inkscape:zoom="11.313709"
-     inkscape:cx="-3.1819804"
-     inkscape:cy="36.062444"
+     inkscape:cx="-3.1819805"
+     inkscape:cy="35.974057"
      inkscape:window-width="2560"
      inkscape:window-height="1391"
      inkscape:window-x="0"
@@ -52,7 +52,7 @@
      id="layer1">
     <path
        id="path1211"
-       style="fill:#999999;fill-opacity:1;stroke:#999999;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        d="M 8,3.9708715 V 19.970872 c 3.449498,11.952732 9.599609,28.000391 9.599609,28.000391 L 8,75.970872 v 16 L 24,47.971263 C 18.666759,33.304433 13.333375,18.637654 8,3.9708715 Z"
        sodipodi:nodetypes="ccccccc" />
   </g>
diff --git a/resources/sidebar_arrow.webp b/resources/sidebar_arrow.webp
index 9c00889..a78f750 100644
Binary files a/resources/sidebar_arrow.webp and b/resources/sidebar_arrow.webp differ
diff --git a/resources/sidebar_arrow_flipped.webp b/resources/sidebar_arrow_flipped.webp
deleted file mode 100644
index 482d5db..0000000
Binary files a/resources/sidebar_arrow_flipped.webp and /dev/null differ
diff --git a/styles/ReadyOrNot.module.css b/styles/ReadyOrNot.module.css
index 9c46365..2577839 100644
--- a/styles/ReadyOrNot.module.css
+++ b/styles/ReadyOrNot.module.css
@@ -174,16 +174,15 @@
 
 .sidebarList {
   overflow-y: scroll;
-  overflow-x: hidden;
   scrollbar-width: none;
   height: 100%;
   display: flex;
   flex-direction: column;
+  padding: 2rem;
   flex-wrap: nowrap;
   justify-content: flex-start;
   align-items: flex-start;
   background-color: var(--background_grey_opaque);
-  padding: 2rem;
 }
 
 .sidebar::-webkit-scrollbar {
@@ -191,28 +190,15 @@
   background: transparent;
 }
 
-.sl_wrapper {
-  height: 100%;
-  overflow: hidden;
-  transition-property: width, visibility;
-  transition-timing-function: ease-in-out, linear;
-  transition-duration: 0.3s, 0s;
-}
-
 .sl_active  {
-  visibility: visible;
-  width: 97%;
-  transition-delay: 0s, 0s;
+  display: flex;
 }
 
 .sl_inactive {
-  visibility: hidden;
-  width: 0;
-  transition-delay: 0s, 0.3s;
+  display: none;
 }
 
 .navElem {
-  white-space:nowrap;
   font-size: 14pt;
   width: auto;
   border-radius: 5px;
diff --git a/yarn.lock b/yarn.lock
index b9af874..23a6f54 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -166,11 +166,6 @@
   resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
   integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
 
-"@types/node@18.14.6":
-  version "18.14.6"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.6.tgz#ae1973dd2b1eeb1825695bb11ebfb746d27e3e93"
-  integrity sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==
-
 "@types/prop-types@*":
   version "15.7.5"
   resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"