Repository: matthiaskoenig/fbc_curation (language: python)

Issue:
Incorrect flux written in FVA for objective
This is probably a bug in the latest version.


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 4e83976..ec94734 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -8,12 +8,12 @@ jobs:
       fail-fast: false
       matrix:
         os: [ubuntu-latest]  # [ubuntu-latest, macos-latest, windows-latest]
-        python-version: ["3.8", "3.9", "3.10"]
+        python-version: ["3.8", "3.9", "3.10", "3.11"]
 
     steps:
-    - uses: actions/checkout@v2
+    - uses: actions/checkout@v3
     - name: Set up Python ${{ matrix.python-version }}
-      uses: actions/setup-python@v2
+      uses: actions/setup-python@v4
       with:
         python-version: ${{ matrix.python-version }}
     - name: Install dependencies
@@ -34,12 +34,12 @@ jobs:
     strategy:
       matrix:
         os: [ubuntu-latest]
-        python-version: [3.9]
+        python-version: ["3.10"]
 
     steps:
-    - uses: actions/checkout@v2
+    - uses: actions/checkout@v3
     - name: Set up Python ${{ matrix.python-version }}
-      uses: actions/setup-python@v2
+      uses: actions/setup-python@v4
       with:
         python-version: ${{ matrix.python-version }}
     - name: Get tag
diff --git a/DEPLOY.md b/DEPLOY.md
deleted file mode 100644
index a4804ca..0000000
--- a/DEPLOY.md
+++ /dev/null
@@ -1,54 +0,0 @@
-# Deployment `sbml4humans`
-This document provides instructions to deploy `frog-site` on a server. 
-In many configurations a proxy server is used which proxies the requests 
-to the services running in docker containers. The setup consists normally of 
-setting up the proxy server (with https certificates) and the server with running 
-the docker containers.
-
-## Setup proxy
-- login to proxy server `denbi-head`
-
-**Activate page**  
-The page must be copied and activated. Make sure to **update the IP** of the server 
-in nginx configuration!
-```
-sudo cp <repo>/nginx/runfrog.de /etc/nginx/sites-available/runfrog.de
-sudo ln -s /etc/nginx/sites-available/runfrog.de /etc/nginx/sites-enabled/
-```
-
-### Certificates
-#### Initial certificates
-Get certificates for `runfrog.de,www.runfrog.de`
-```
-sudo service nginx stop
-sudo certbot certonly
-sudo service nginx start
-sudo service nginx status
-```
-
-#### Certificate renewal
-```
-sudo mkdir -p /usr/share/nginx/letsencrypt
-sudo certbot certonly --webroot
-```
-
-## Setup server
-On the actual server the containers are orchestrated using `docker-compose`.
-Login to server `denbi-node-4`.
-
-### Initial setup
-```
-cd /var/git
-git clone https://github.com/matthiaskoenig/sbmlutils.git
-git checkout sbml4humans
-```
-
-**start containers**
-Pull latest changes 
-```
-./deploy.sh
-```
-
-
-
-
diff --git a/Dockerfile b/Dockerfile
index 5947cc2..b041912 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -28,7 +28,7 @@ COPY ./LICENSE /code/LICENSE
 
 WORKDIR /code
 
-# Install sbmlutils
+# Install fbc_curation
 RUN --mount=type=cache,target=/root/.cache \
      pip install -e .
 # RUN pip install -e .
diff --git a/README.rst b/README.rst
index f3a4679..ea45102 100644
--- a/README.rst
+++ b/README.rst
@@ -106,7 +106,7 @@ After installation FROG analysis can be performed using the :code:`runfrog` comm
     
     ──────────────────────────────────────────────────────────────────────────────────
     🐸 FBC CURATION FROG ANALYSIS 🐸
-    Version 0.2.0 (https://github.com/matthiaskoenig/fbc_curation)
+    Version 0.2.1 (https://github.com/matthiaskoenig/fbc_curation)
     Citation https://doi.org/10.5281/zenodo.3708271
     ──────────────────────────────────────────────────────────────────────────────────
     Usage: runfrog [options]
@@ -130,7 +130,17 @@ FROG can be execute via the REST API `https://runfrog.de/docs <https://runfrog.d
 
 Python
 ------
-To run FROG programmatically via python see the following example
+To run FROG programmatically via python use the `run_frog` function
+
+
+.. code:: python
+
+    from fbc_curation.worker import run_frog
+    
+    run_frog(model_path, omex_path)
+
+
+Here a complete example with comparison of the FROG results
 
 .. code:: python
 
@@ -138,20 +148,19 @@ To run FROG programmatically via python see the following example
     from pathlib import Path
     
     from fbc_curation.compare import FrogComparison
-    from fbc_curation.worker import frog_task
+    from fbc_curation.worker import run_frog
     
     
     def create_frog(model_path: Path, omex_path: Path) -> None:
-        """Creates FROG report and writes OMEX for given model."""
+        """Create FROG report and writes OMEX for given model."""
     
-        # create FROG in OMEX
-        frog_task(
-            source_path_str=str(model_path),
-            input_is_temporary=False,
-            omex_path_str=str(omex_path),
+        # create FROG and write to COMBINE archive
+        run_frog(
+            source_path=model_path,
+            omex_path=omex_path,
         )
     
-        # compare FROG results in OMEX
+        # compare FROG results in created COMBINE archive
         model_reports = FrogComparison.read_reports_from_omex(omex_path=omex_path)
         for _, reports in model_reports.items():
             FrogComparison.compare_reports(reports=reports)
@@ -161,38 +170,42 @@ To run FROG programmatically via python see the following example
         base_path = Path(".")
         create_frog(
             model_path=base_path / "e_coli_core.xml",
-            omex_path=base_path / "e_coli_core_FROG.omex"
+            omex_path=base_path / "e_coli_core_FROG.omex",
         )
 
-The typically output of a FROG analyis is depicted below
+The typically output of a FROG analysis is depicted below
 
 .. code:: bash
 
-    INFO     Loading 'e_coli_core.xml'                                    worker.py:44
-    WARNING  Omex path 'e_coli_core.xml' is not a zip archive.             omex.py:487
-    ────────────────────────────── FROG CuratorCobrapy ───────────────────────────────
-    INFO     * metadata                                                 curator.py:107
-    INFO     * objectives                                               curator.py:110
-    Scaling...
-     A: min|aij| =  1.000e+00  max|aij| =  1.000e+00  ratio =  1.000e+00
-    Problem data seem to be well scaled
-    INFO     * fva                                                      curator.py:113
-    INFO     * reactiondeletions                                        curator.py:116
-    INFO     * genedeletions                                            curator.py:119
-    INFO     FROG created in '0.86' [s]                                  worker.py:144
-    ─────────────────────────────── FROG CuratorCameo ────────────────────────────────
-    INFO     * metadata                                                 curator.py:107
-    INFO     * objectives                                               curator.py:110
-    INFO     * fva                                                      curator.py:113
-    INFO     * reactiondeletions                                        curator.py:116
-    INFO     * genedeletions                                            curator.py:119
-    INFO     FROG created in '1.14' [s]                                  worker.py:144
-    ─────────────────────────────────── Write OMEX ───────────────────────────────────
-    WARNING  Existing omex is overwritten: 'e_coli_core_FROG.omex'         omex.py:667
-    INFO     Reports in omex:                                            compare.py:60
-             {'./model.xml': ['cobrapy', 'cobrapy_tsv', 'cameo',                      
-             'cameo_tsv']}                                                            
-    ─────────────────────────── Comparison of FROGReports ────────────────────────────
+    runfrog -i e_coli_core.xml -o e_coli_core.omex
+
+    ───────────────────────────────────────────────────────────────────────────────────────
+    🐸 FBC CURATION FROG ANALYSIS 🐸
+    Version 0.2.3 (https://github.com/matthiaskoenig/fbc_curation)
+    Citation https://doi.org/10.5281/zenodo.3708271
+    ───────────────────────────────────────────────────────────────────────────────────────
+    INFO     Loading 'e_coli_core.xml'                                         worker.py:70
+    WARNING  Omex path 'e_coli_core.xml' is not a zip archive.                  omex.py:500
+    ───────────────────────────────── FROG CuratorCobrapy ─────────────────────────────────
+    INFO     * metadata                                                      curator.py:107
+    INFO     * objectives                                                    curator.py:110
+    INFO     * fva                                                           curator.py:113
+    INFO     * reactiondeletions                                             curator.py:116
+    INFO     * genedeletions                                                 curator.py:119
+    INFO     FROG created in '0.977' [s]                                      worker.py:178
+    ────────────────────────────────── FROG CuratorCameo ──────────────────────────────────
+    INFO     * metadata                                                      curator.py:107
+    INFO     * objectives                                                    curator.py:110
+    INFO     * fva                                                           curator.py:113
+    INFO     * reactiondeletions                                             curator.py:116
+    INFO     * genedeletions                                                 curator.py:119
+    INFO     FROG created in '1.219' [s]                                      worker.py:178
+    ───────────────────────────────────── Write OMEX ──────────────────────────────────────
+    WARNING  Existing omex is overwritten: 'e_coli_core.omex'                   omex.py:680
+    INFO     Reports in omex:                                                 compare.py:60
+             {'./e_coli_core.xml': ['cobrapy', 'cobrapy_tsv', 'cameo',                     
+             'cameo_tsv']}                                                                 
+    ────────────────────────────── Comparison of FROGReports ──────────────────────────────
     --- objective ---
                  cobrapy  cobrapy_tsv  cameo  cameo_tsv
     cobrapy            1            1      1          1
@@ -217,9 +230,10 @@ The typically output of a FROG analyis is depicted below
     cobrapy_tsv        1            1      1          1
     cameo              1            1      1          1
     cameo_tsv          1            1      1          1
-    ──────────────────────────────────────────────────────────────────────────────────
+    ───────────────────────────────────────────────────────────────────────────────────────
     Equal: True
-    ──────────────────────────────────────────────────────────────────────────────────
+    ───────────────────────────────────────────────────────────────────────────────────────
+
 
 License
 =======
diff --git a/RELEASE.md b/README_package_release.md
similarity index 53%
rename from RELEASE.md
rename to README_package_release.md
index bc94dec..9ba2a68 100644
--- a/RELEASE.md
+++ b/README_package_release.md
@@ -1,7 +1,8 @@
 # Release information
 
-* update schema using `schema.py`
-* update documentation
+* update schema using `src/fbc_curation/schema.py` and update `docs_builder/schema.rst`
+* rerun examples `src/fbc_curation/examples.py`
+* update documentation (`README.rst` and `docs_builder`)
 * make sure all tests run (`tox -p`)
 * update release notes in `release-notes`
 * bump version (`bumpversion [major|minor|patch]`)
@@ -11,6 +12,6 @@
 
 * test installation in virtualenv from pypi
 ```
-mkvirtualenv test --python=python3.9
-(test) pip install fbcgit s_curation
+mkvirtualenv test --python=python3.10
+(test) pip install fbc_curation
 ```
diff --git a/README_site_deploy.md b/README_site_deploy.md
new file mode 100644
index 0000000..40cd4dd
--- /dev/null
+++ b/README_site_deploy.md
@@ -0,0 +1,71 @@
+# Deployment `runfrog.de`
+This document provides information on how to deploy the `frog-site` on a server
+(https://runfrog.de). For development see [./README_site_develop.md](./README_site_develop.md).
+
+The `runfrog` stack is provided as docker containers managed by `docker-compose`.
+In typical setups a proxy server acceps all requests on a given IP and 
+proxies the requests to the respective services. 
+
+Necessary steps for the setup are
+* test that sites works locally
+* setup the proxy server (register service in nginx under endpoint)
+* create SSH certificates for proxy server
+The setup consists normally of 
+setting up the proxy server (with https certificates) and the server with running 
+the docker containers.
+
+## Test site
+See instructions in 
+
+## Setup proxy
+**Setup domain**
+First the domain must be setup to point to the correct IP. 
+
+**Login to server**  
+Login via SSH to the proxy server `denbi-head`
+
+**Activate page**  
+The page must be copied and activated. Make sure to **update the IP** of the server 
+in nginx configuration!
+```
+sudo cp <repo>/nginx/runfrog.de /etc/nginx/sites-available/runfrog.de
+sudo ln -s /etc/nginx/sites-available/runfrog.de /etc/nginx/sites-enabled/
+```
+
+### SSH Certificates
+#### Initial certificates
+Get certificates for `runfrog.de,www.runfrog.de`
+```
+sudo service nginx stop
+sudo certbot certonly
+sudo service nginx start
+sudo service nginx status
+```
+Setup webroot for renewal (check)
+
+#### Certificate renewal
+```
+sudo mkdir -p /usr/share/nginx/letsencrypt
+sudo certbot certonly --webroot
+```
+
+## Setup server
+On the actual server the containers are orchestrated using `docker-compose`.
+Login to server `denbi-node-4`.
+
+### Initial setup
+```
+cd /var/git
+git clone https://github.com/matthiaskoenig/fbc_curation.git
+git checkout develop
+```
+
+**start containers**
+Pull latest changes 
+```
+./deploy.sh
+```
+
+
+
+
diff --git a/README_site_develop.md b/README_site_develop.md
new file mode 100644
index 0000000..c1d6be2
--- /dev/null
+++ b/README_site_develop.md
@@ -0,0 +1,61 @@
+# runfrog-site 
+This document describes how to setup and run the `runfrog-site` 
+([https://runfrog.de](https://runfrog.de))site for local development. 
+For information on how to deploy the page see 
+[./README_site_deploy.md](./README_site_deploy.md).
+
+## Technology
+The following technology is used in the `runfrog-site`:
+1. Backend API: `fbc_curation` python package served using FastAPI [https://fastapi.tiangolo.com/]
+2. Frontend User Interface: Vue.js 3 [https://vuejs.org/]
+    - TypeScript + SCSS
+    - Vuex
+    - Vue Router
+3. Frontend UI/UX Package: PrimeVue
+
+## Vue.js devtools
+Vue 3 is only working with the beta version of the devtools available from
+https://github.com/vuejs/vue-devtools/releases.
+For setup download and install the `xpi` package.
+
+## Run local development server
+
+Development should be run with node version 14. 
+See here for installation instructions
+https://github.com/nodesource/distributions/blob/master/README.md#deb
+```
+curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash -
+sudo apt-get install -y nodejs
+```
+
+
+### Install all dependencies
+```
+cd runfrog-site
+npm install
+```
+
+### Start development server
+To run the local development server on http://localhost:4567/
+```
+npm run serve
+```
+In addition, the API must be served locally via 
+
+```
+(frog) python src/fbc_curation/api.py 
+```
+
+## Run local docker server
+
+Buildkit must be enabled via
+https://docs.docker.com/develop/develop-images/build_enhancements/#to-enable-buildkit-builds
+To enable docker BuildKit by default, set daemon configuration in /etc/docker/daemon.json feature to true and restart the daemon:
+```
+{ "features": { "buildkit": true } }
+```
+
+
+```
+docker-compose -f docker-compose-develop.yml up --detach
+```
diff --git a/docker-compose-develop.yml b/docker-compose-develop.yml
index 537799c..3626eac 100644
--- a/docker-compose-develop.yml
+++ b/docker-compose-develop.yml
@@ -26,12 +26,12 @@ services:
     container_name: frog_frontend
     restart: always
     build:
-      context: ./frog-site
+      context: runfrog-site
       dockerfile: Dockerfile-develop
     ports:
       - "8085:4567"
     volumes:
-      - ./frog-site:/app
+      - ./runfrog-site:/app
       - node_modules:/app/node_modules/
       - vue_dist:/usr/share/nginx/html
 
@@ -70,7 +70,7 @@ services:
   redis:
     restart: always
     container_name: frog_redis
-    image: redis:6-alpine
+    image: redis:7-alpine
 
   flower:
     restart: always
diff --git a/docker-compose-production.yml b/docker-compose-production.yml
index e4aebd7..0fea154 100644
--- a/docker-compose-production.yml
+++ b/docker-compose-production.yml
@@ -25,11 +25,11 @@ services:
     environment:
       - API_BASE_URL=https://runfrog.de
     build:
-      context: ./frog-site
+      context: runfrog-site
       dockerfile: Dockerfile-production
     command: tail -f /dev/null
     volumes:
-      - ./frog-site:/app
+      - ./runfrog-site:/app
       - node_modules:/app/node_modules/
       - vue_dist:/vue
 
@@ -69,7 +69,7 @@ services:
   redis:
     restart: always
     container_name: frog_redis
-    image: redis:6-alpine
+    image: redis:7-alpine
 
   flower:
     restart: always
@@ -89,9 +89,9 @@ services:
   nginx:
     container_name: frog_nginx
     environment:
-      - API_BASE_URL=https://sbml4humans.de
+      - API_BASE_URL=https://runfrog.de
     restart: always
-    image: nginx:1.21.3
+    image: nginx:1.21.6
     expose:
       - "8086"
     ports:
diff --git a/docs_builder/README.md b/docs_builder/README.md
index 2f902dc..3822c53 100644
--- a/docs_builder/README.md
+++ b/docs_builder/README.md
@@ -1,4 +1,11 @@
 # Documentation
+The documentation is hosted on `readthedocs` at https://fbc-curation.readthedocs.io.
+The documentation is build using `sphinx` with the 
+[sphinx-rtd-theme](https://sphinx-rtd-theme.readthedocs.io/en/latest/configuring.html).
+
+## Update documentation
+First update the documentation 
+
 
 To create the documentation use
 ```bash
@@ -8,5 +15,4 @@ To create the documentation use
 (frog) ./make_docs.sh
 ```
 
-The documentation is build using `sphinx` with the 
-[sphinx-rtd-theme](https://sphinx-rtd-theme.readthedocs.io/en/latest/configuring.html) 
+
diff --git a/docs_builder/conf.py b/docs_builder/conf.py
index 5ff832f..2b6a930 100644
--- a/docs_builder/conf.py
+++ b/docs_builder/conf.py
@@ -51,7 +51,7 @@
 # List of patterns, relative to source directory, that match files and
 # directories to ignore when looking for source files.
 # This pattern also affects html_static_path and html_extra_path.
-exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "README.md"]
+exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "README_site_develop.md"]
 
 
 # -- Options for HTML output -------------------------------------------------
diff --git a/docs_builder/introduction.rst b/docs_builder/introduction.rst
index a33ccad..ef6e36f 100644
--- a/docs_builder/introduction.rst
+++ b/docs_builder/introduction.rst
@@ -72,7 +72,7 @@ After installation FROG analysis can be performed using the :code:`runfrog` comm
     
     ──────────────────────────────────────────────────────────────────────────────────
     🐸 FBC CURATION FROG ANALYSIS 🐸
-    Version 0.2.0 (https://github.com/matthiaskoenig/fbc_curation)
+    Version 0.2.3 (https://github.com/matthiaskoenig/fbc_curation)
     Citation https://doi.org/10.5281/zenodo.3708271
     ──────────────────────────────────────────────────────────────────────────────────
     Usage: runfrog [options]
@@ -96,7 +96,17 @@ FROG can be execute via the REST API `https://runfrog.de/docs <https://runfrog.d
 
 Python
 ------
-To run FROG programmatically via python see the following example
+To run FROG programmatically via python use the `run_frog` function
+
+
+.. code:: python
+
+    from fbc_curation.worker import run_frog
+    
+    run_frog(model_path, omex_path)
+
+
+Here a complete example with comparison of the FROG results
 
 .. code:: python
 
@@ -104,20 +114,19 @@ To run FROG programmatically via python see the following example
     from pathlib import Path
     
     from fbc_curation.compare import FrogComparison
-    from fbc_curation.worker import frog_task
+    from fbc_curation.worker import run_frog
     
     
     def create_frog(model_path: Path, omex_path: Path) -> None:
-        """Creates FROG report and writes OMEX for given model."""
+        """Create FROG report and writes OMEX for given model."""
     
-        # create FROG in OMEX
-        frog_task(
-            source_path_str=str(model_path),
-            input_is_temporary=False,
-            omex_path_str=str(omex_path),
+        # create FROG and write to COMBINE archive
+        run_frog(
+            source_path=model_path,
+            omex_path=omex_path,
         )
     
-        # compare FROG results in OMEX
+        # compare FROG results in created COMBINE archive
         model_reports = FrogComparison.read_reports_from_omex(omex_path=omex_path)
         for _, reports in model_reports.items():
             FrogComparison.compare_reports(reports=reports)
@@ -127,38 +136,42 @@ To run FROG programmatically via python see the following example
         base_path = Path(".")
         create_frog(
             model_path=base_path / "e_coli_core.xml",
-            omex_path=base_path / "e_coli_core_FROG.omex"
+            omex_path=base_path / "e_coli_core_FROG.omex",
         )
 
-The typically output of a FROG analyis is depicted below
+The typically output of a FROG analysis is depicted below
 
 .. code:: bash
 
-    INFO     Loading 'e_coli_core.xml'                                    worker.py:44
-    WARNING  Omex path 'e_coli_core.xml' is not a zip archive.             omex.py:487
-    ────────────────────────────── FROG CuratorCobrapy ───────────────────────────────
-    INFO     * metadata                                                 curator.py:107
-    INFO     * objectives                                               curator.py:110
-    Scaling...
-     A: min|aij| =  1.000e+00  max|aij| =  1.000e+00  ratio =  1.000e+00
-    Problem data seem to be well scaled
-    INFO     * fva                                                      curator.py:113
-    INFO     * reactiondeletions                                        curator.py:116
-    INFO     * genedeletions                                            curator.py:119
-    INFO     FROG created in '0.86' [s]                                  worker.py:144
-    ─────────────────────────────── FROG CuratorCameo ────────────────────────────────
-    INFO     * metadata                                                 curator.py:107
-    INFO     * objectives                                               curator.py:110
-    INFO     * fva                                                      curator.py:113
-    INFO     * reactiondeletions                                        curator.py:116
-    INFO     * genedeletions                                            curator.py:119
-    INFO     FROG created in '1.14' [s]                                  worker.py:144
-    ─────────────────────────────────── Write OMEX ───────────────────────────────────
-    WARNING  Existing omex is overwritten: 'e_coli_core_FROG.omex'         omex.py:667
-    INFO     Reports in omex:                                            compare.py:60
-             {'./model.xml': ['cobrapy', 'cobrapy_tsv', 'cameo',                      
-             'cameo_tsv']}                                                            
-    ─────────────────────────── Comparison of FROGReports ────────────────────────────
+    runfrog -i e_coli_core.xml -o e_coli_core.omex
+
+    ───────────────────────────────────────────────────────────────────────────────────────
+    🐸 FBC CURATION FROG ANALYSIS 🐸
+    Version 0.2.3 (https://github.com/matthiaskoenig/fbc_curation)
+    Citation https://doi.org/10.5281/zenodo.3708271
+    ───────────────────────────────────────────────────────────────────────────────────────
+    INFO     Loading 'e_coli_core.xml'                                         worker.py:70
+    WARNING  Omex path 'e_coli_core.xml' is not a zip archive.                  omex.py:500
+    ───────────────────────────────── FROG CuratorCobrapy ─────────────────────────────────
+    INFO     * metadata                                                      curator.py:107
+    INFO     * objectives                                                    curator.py:110
+    INFO     * fva                                                           curator.py:113
+    INFO     * reactiondeletions                                             curator.py:116
+    INFO     * genedeletions                                                 curator.py:119
+    INFO     FROG created in '0.977' [s]                                      worker.py:178
+    ────────────────────────────────── FROG CuratorCameo ──────────────────────────────────
+    INFO     * metadata                                                      curator.py:107
+    INFO     * objectives                                                    curator.py:110
+    INFO     * fva                                                           curator.py:113
+    INFO     * reactiondeletions                                             curator.py:116
+    INFO     * genedeletions                                                 curator.py:119
+    INFO     FROG created in '1.219' [s]                                      worker.py:178
+    ───────────────────────────────────── Write OMEX ──────────────────────────────────────
+    WARNING  Existing omex is overwritten: 'e_coli_core.omex'                   omex.py:680
+    INFO     Reports in omex:                                                 compare.py:60
+             {'./e_coli_core.xml': ['cobrapy', 'cobrapy_tsv', 'cameo',                     
+             'cameo_tsv']}                                                                 
+    ────────────────────────────── Comparison of FROGReports ──────────────────────────────
     --- objective ---
                  cobrapy  cobrapy_tsv  cameo  cameo_tsv
     cobrapy            1            1      1          1
@@ -183,9 +196,9 @@ The typically output of a FROG analyis is depicted below
     cobrapy_tsv        1            1      1          1
     cameo              1            1      1          1
     cameo_tsv          1            1      1          1
-    ──────────────────────────────────────────────────────────────────────────────────
+    ───────────────────────────────────────────────────────────────────────────────────────
     Equal: True
-    ──────────────────────────────────────────────────────────────────────────────────
+    ───────────────────────────────────────────────────────────────────────────────────────
 
 License
 =======
diff --git a/docs_builder/reference_files.md b/docs_builder/reference_files.md
index 6c830f1..106f16d 100644
--- a/docs_builder/reference_files.md
+++ b/docs_builder/reference_files.md
@@ -2,62 +2,71 @@
 In the following the four created reference files and the metadata file are described and examples provided for the [`e_coli_core.xml`](https://raw.githubusercontent.com/matthiaskoenig/fbc_curation/develop/src/fbc_curation/examples/models/e_coli_core.xml) model. All output files are tab separated files (TSV) with the first three columns being `model`, `objective`, and `status`. The column `model` encodes the SBML model id. The column `objective` encodes the SBML objective id, which is the objective which was optimized in the respective simulation. The column `status` encodes the status of the simulation. The status can be either `optimal` (optimization worked) or `infeasible` (no solution found or problem in simulation).  
 
 ## Metadata file
-A required metadata file `metadata.json` encodes information about the curation run and the used software and library.
-The following fields are required or optional
+A required metadata file `metadata.json` encodes information about the curation run and the used software and library. The information is documented at the JSON schema `frog-schema-version-1.json <https://raw.githubusercontent.com/matthiaskoenig/fbc_curation/develop/src/fbc_curation/resources/schema/frog-schema-version-1.json>`__
+
+The following fields are required:
 
 - `software.name` (required): software used to create the reference files,
 - `software.version` (required): software version
-- `software.url` (optional): url to software
-- `environment` (optional): information on operating system and environment
-- `model.filename` (required): SBML model filename
-- `model.md5` (required): MD5 hash of model
+- `model.location` (required): SBML model filename
 - `solver.name` (required): solver used for optimization,
 - `solver.version` (required): solver version
 
 A concrete example of the metadata is shown below
 ```
 {
-  "software.name": "fbc_curation",
-  "software.version": "0.1.1",
-  "software.url": "https://doi.org/10.5281/zenodo.3708271",
-  "environment": "posix, Linux, 5.4.0-48-generic",
-  "model.filename": "e_coli_core.xml",
-  "model.md5": "4574760460afe9e1b3388dc15f354706",
-  "solver.name": "cobrapy (glpk)",
-  "solver.version": "0.20.0"
+  "model_location": "./e_coli_core.xml",
+  "model_md5": "4574760460afe9e1b3388dc15f354706",
+  "frog_id": "cobrapy_tsv",
+  "frog_software": {
+    "name": "fbc_curation",
+    "version": "0.2.2",
+    "url": "https://doi.org/10.5281/zenodo.3708271"
+  },
+  "curators": [],
+  "software": {
+    "name": "cobrapy",
+    "version": "0.26.0",
+    "url": "https://github.com/opencobra/cobrapy"
+  },
+  "solver": {
+    "name": "glpk",
+    "version": "5.0",
+    "url": null
+  },
+  "environment": "posix, Linux, 5.15.0-53-generic"
 }
 ```
-
-For an example file see [`e_coli_core/metadata.json`](https://raw.githubusercontent.com/matthiaskoenig/fbc_curation/develop/src/fbc_curation/examples/results/e_coli_core/cobrapy/metadata.json).
+See [`e_coli_core/metadata.json`](https://raw.githubusercontent.com/matthiaskoenig/fbc_curation/develop/src/fbc_curation/examples/results/e_coli_core/cobrapy/metadata.json).
 
 ## 01 Objective value
 The objective value file `01_objective.tsv` contains the four columns with the headers `model`, `objective`, `status`, and `value`. The `model` column stores the SBML model filename. 
 The `value` is the optimal value of the respective objective function when the model is optimized. If the status is `infeasible`, no value is provided, i.e., the value is empty.
 ```
 model	objective	status	value
-e_coli_core.xml	obj	optimal	0.873922
+./e_coli_core.xml	obj	optimal	0.8739215069684295
 ```
 For an example file see [`e_coli_core/01_objective.tsv`](https://raw.githubusercontent.com/matthiaskoenig/fbc_curation/develop/src/fbc_curation/examples/results/e_coli_core/cobrapy/01_objective.tsv). For more information on how to simulate the FBA see [https://cobrapy.readthedocs.io/en/latest/simulating.html](https://cobrapy.readthedocs.io/en/latest/simulating.html).
 
 ## 02 Flux variability analysis (FVA)
 The FVA file `02_fva.tsv` contains six columns with the headers `model`, `objective`, `reaction`, `flux`, `status`, `minimum` and `maximum`. The `model` column stores the SBML model filename. The `reaction` column stores the SBML reaction id. The `minimum` and `maximum` columns contain the minimum and maximum values of the FVA. The rows are sorted based on the SBML reaction identifier. The `status` contains the status of the optimization (`optimal` or `infeasible`). If the status is `infeasible` the value is empty.
-Flux variability is calculated with `fraction_optimum = 1.0`, i.e. the objective of the model is set to its maximum in secondary optimization (percent of optimum is 100%). The `flux` column stores the reference flux.
+Flux variability is calculated with `fraction_optimum = 1.0`, i.e. the objective of the model is set to its maximum in secondary optimization (percent of optimum is 100%). The `flux` column stores the reference flux through the objective reaction which is `objective_value * fraction_optimum`. In case of `fraction_optimum = 1.0` this is identical to the `value` in `01_objective.tsv
 ```
-model	objective	reaction	flux	status	minimum	maximum
-e_coli_core.xml	obj	R_ACALD	0.0	optimal	0.0	0.0
-e_coli_core.xml	obj	R_ACALDt	0.0	optimal	0.0	0.0
-e_coli_core.xml	obj	R_ACKr	0.0	optimal	0.0	0.0
-e_coli_core.xml	obj	R_ACONTa	6.00725	optimal	6.00725	6.00725
-e_coli_core.xml	obj	R_ACONTb	6.00725	optimal	6.00725	6.00725
-e_coli_core.xml	obj	R_ACt2r	0.0	optimal	0.0	0.0
-e_coli_core.xml	obj	R_ADK1	0.0	optimal	0.0	0.0
-e_coli_core.xml	obj	R_AKGDH	5.064376	optimal	5.064376	5.064376
-e_coli_core.xml	obj	R_AKGt2r	0.0	optimal	0.0	0.0
-e_coli_core.xml	obj	R_ALCD2x	0.0	optimal	0.0	0.0
-e_coli_core.xml	obj	R_ATPM	8.39	optimal	8.39	8.39
-e_coli_core.xml	obj	R_ATPS4r	45.51401	optimal	45.51401	45.51401
-e_coli_core.xml	obj	R_BIOMASS_Ecoli_core_w_GAM	0.873922	optimal	0.873922	0.873922
-e_coli_core.xml	obj	R_CO2t	-22.809833	optimal	-22.809833	-22.809833
+model	objective	reaction	flux	status	minimum	maximum	fraction_optimum
+./e_coli_core.xml	obj	R_ACALD	0.8739215069684295	optimal	1.1348525979450152e-14	0.0	1.0
+./e_coli_core.xml	obj	R_ACALDt	0.8739215069684295	optimal	3.662182303830574e-15	0.0	1.0
+./e_coli_core.xml	obj	R_ACKr	0.8739215069684295	optimal	0.0	0.0	1.0
+./e_coli_core.xml	obj	R_ACONTa	0.8739215069684295	optimal	6.007249575350388	6.007249575350355	1.0
+./e_coli_core.xml	obj	R_ACONTb	0.8739215069684295	optimal	6.007249575350388	6.007249575350264	1.0
+./e_coli_core.xml	obj	R_ACt2r	0.8739215069684295	optimal	1.772023695401875e-14	0.0	1.0
+./e_coli_core.xml	obj	R_ADK1	0.8739215069684295	optimal	0.0	-3.4583850794047745e-14	1.0
+./e_coli_core.xml	obj	R_AKGDH	0.8739215069684295	optimal	5.064375661482467	5.0643756614820665	1.0
+./e_coli_core.xml	obj	R_AKGt2r	0.8739215069684295	optimal	0.0	0.0	1.0
+./e_coli_core.xml	obj	R_ALCD2x	0.8739215069684295	optimal	9.884200046617872e-15	0.0	1.0
+./e_coli_core.xml	obj	R_ATPM	0.8739215069684295	optimal	8.39	8.389999999999924	1.0
+./e_coli_core.xml	obj	R_ATPS4r	0.8739215069684295	optimal	45.51400977451763	45.514009774517376	1.0
+./e_coli_core.xml	obj	R_BIOMASS_Ecoli_core_w_GAM	0.8739215069684295	optimal	0.873921506968431	0.8739215069684305	1.0
+./e_coli_core.xml	obj	R_CO2t	0.8739215069684295	optimal	-22.80983331020497	-22.80983331020505	1.0
 ...
 ```
 See for instance: [`e_coli_core/02_fva.tsv`](https://raw.githubusercontent.com/matthiaskoenig/fbc_curation/develop/src/fbc_curation/examples/results/e_coli_core/cobrapy/02_fva.tsv). For more information: [https://cobrapy.readthedocs.io/en/latest/simulating.html#Running-FVA](https://cobrapy.readthedocs.io/en/latest/simulating.html#Running-FVA)
@@ -67,16 +76,16 @@ The gene deletion file `03_gene_deletion.tsv` contains five columns with the hea
 The `gene` column contains the SBML gene identifiers. The `status` and `value` columns contain the status of the optimization (`optimal` or `infeasible`) and optimal value under the given gene deletion. If the status is `infeasible` the value is empty. The rows are sorted based on gene identifier.
 ```
 model	objective	gene	status	value
-e_coli_core.xml	obj	G_b0008	optimal	0.873922
-e_coli_core.xml	obj	G_b0114	optimal	0.796696
-e_coli_core.xml	obj	G_b0115	optimal	0.796696
-e_coli_core.xml	obj	G_b0116	optimal	0.782351
-e_coli_core.xml	obj	G_b0118	optimal	0.873922
-e_coli_core.xml	obj	G_b0351	optimal	0.873922
-e_coli_core.xml	obj	G_b0356	optimal	0.873922
+./e_coli_core.xml	obj	G_b0008	optimal	0.873921506968431
+./e_coli_core.xml	obj	G_b0114	optimal	0.7966959254309566
+./e_coli_core.xml	obj	G_b0115	optimal	0.7966959254309566
+./e_coli_core.xml	obj	G_b0116	optimal	0.7823510529477393
+./e_coli_core.xml	obj	G_b0118	optimal	0.8739215069684314
+./e_coli_core.xml	obj	G_b0351	optimal	0.8739215069684306
+./e_coli_core.xml	obj	G_b0356	optimal	0.873921506968431
 ...
-e_coli_core.xml	obj	G_b2415	infeasible	
-e_coli_core.xml	obj	G_b2416	infeasible	
+./e_coli_core.xml	obj	G_b2415	infeasible	NaN
+./e_coli_core.xml	obj	G_b2416	infeasible	NaN
 ...
 ```
 See for instance: [`e_coli_core/03_gene_deletion.tsv`](https://raw.githubusercontent.com/matthiaskoenig/fbc_curation/develop/src/fbc_curation/examples/results/e_coli_core/cobrapy/03_gene_deletion.tsv). For more information: [https://cobrapy.readthedocs.io/en/latest/deletions.html](https://cobrapy.readthedocs.io/en/latest/deletions.html)
@@ -86,14 +95,14 @@ The reaction deletion file `04_reaction_deletion.tsv` contains five columns with
 The `reaction` column contains the SBML reaction identifiers. The `status` and `value` columns contain the status of the optimization (`optimal` or `infeasible`) and optimal value under the given reaction deletion. If the status is `infeasible` the value is empty. The rows are sorted based on reaction identifier.
 ```
 model	objective	reaction	status	value
-e_coli_core.xml	obj	R_ACALD	optimal	0.873922
-e_coli_core.xml	obj	R_ACALDt	optimal	0.873922
-e_coli_core.xml	obj	R_ACKr	optimal	0.873922
-e_coli_core.xml	obj	R_ACONTa	optimal	0.0
-e_coli_core.xml	obj	R_ACONTb	optimal	0.0
-e_coli_core.xml	obj	R_ACt2r	optimal	0.873922
-e_coli_core.xml	obj	R_ADK1	optimal	0.873922
-e_coli_core.xml	obj	R_AKGDH	optimal	0.858307
+./e_coli_core.xml	obj	R_ACALD	optimal	0.873921506968431
+./e_coli_core.xml	obj	R_ACALDt	optimal	0.873921506968431
+./e_coli_core.xml	obj	R_ACKr	optimal	0.8739215069684305
+./e_coli_core.xml	obj	R_ACONTa	optimal	-3.2790312837402413e-15
+./e_coli_core.xml	obj	R_ACONTb	optimal	-4.655434573658402e-15
+./e_coli_core.xml	obj	R_ACt2r	optimal	0.8739215069684313
+./e_coli_core.xml	obj	R_ADK1	optimal	0.873921506968431
+./e_coli_core.xml	obj	R_AKGDH	optimal	0.8583074080226888
 ...
 ```
 See for instance: [`e_coli_core/04_reaction_deletion.tsv`](https://raw.githubusercontent.com/matthiaskoenig/fbc_curation/develop/src/fbc_curation/examples/results/e_coli_core/cobrapy/04_reaction_deletion.tsv). For more information: [https://cobrapy.readthedocs.io/en/latest/deletions.html](https://cobrapy.readthedocs.io/en/latest/deletions.html).
diff --git a/docs_builder/runfrog.md b/docs_builder/runfrog.md
deleted file mode 100644
index b1b840e..0000000
--- a/docs_builder/runfrog.md
+++ /dev/null
@@ -1,86 +0,0 @@
-# Usage
-
-## Create reference files
-To create FBC curation files for a given SBML model use the `fbc_curation` command line tool. The reference files are created for the provided objective in the model, if no objective is provided the `active` objective or default objective is used.
-```bash
-$ fbc_curation
-    __________  ______   ________  ______  ___  ______________  _   __
-   / ____/ __ )/ ____/  / ____/ / / / __ \/   |/_  __/  _/ __ \/ | / /
-  / /_  / __  / /      / /   / / / / /_/ / /| | / /  / // / / /  |/ / 
- / __/ / /_/ / /___   / /___/ /_/ / _, _/ ___ |/ / _/ // /_/ / /|  /  
-/_/   /_____/\____/   \____/\____/_/ |_/_/  |_/_/ /___/\____/_/ |_/   
-                                                                      
-
-        Version 0.1.0 (https://github.com/matthiaskoenig/fbc_curation)
-        Citation https://doi.org/10.5281/zenodo.3708271
-
-Required argument '--model' missing
-Usage: fbc_curation [options]
-
-Options:
-  -h, --help            show this help message and exit
-  -m MODEL_PATH, --model=MODEL_PATH
-                        (required) path to SBML model with fbc information
-  -p OUTPUT_PATH, --path=OUTPUT_PATH
-                        (required) directory path to write output files to
-  -c CURATOR, --curator=CURATOR
-                        (optional) curator tool to create reference files:
-                        Select from ['cobrapy', 'cameo', 'all']
-  -o OBJECTIVE, --objective=OBJECTIVE
-                        (optional) objective to use in optimization, defaults
-                        to active objective
-  -r REFERENCE_PATH, --reference=REFERENCE_PATH
-                        (optional) directory path to reference output
-                        (comparison is performed)
-```
-For instance to create the reference files for the `e_coli_core.xml` example use
-```
-fbc_curation --model ./fbc_curation/examples/models/e_coli_core.xml \
---path ./fbc_curation/examples/results/e_coli_core 
-```
-This creates the FBC curation files for the `model` in the output `path`.
-
-## Compare existing reference files
-In addition, existing reference files can be compared with the solutions by `cobrapy` and `cameo`. The `--reference` argument can be used to provide the path to the reference files.
-```
-fbc_curation --model ./fbc_curation/examples/models/e_coli_core.xml \
---path ./fbc_curation/examples/results/e_coli_core 
-```
-The comparison results are provided as a matrix for the various reference files with `1` being equal output and `0` if differences exist between the respective reference files. If all matrices are one matrices the results are equal.
-```
-========================================
-Comparison of results
-========================================
---- objective ---
-           reference  cobrapy  cameo
-reference          1        1      1
-cobrapy            1        1      1
-cameo              1        1      1
---- fva ---
-           reference  cobrapy  cameo
-reference          1        1      1
-cobrapy            1        1      1
-cameo              1        1      1
---- gene_deletion ---
-           reference  cobrapy  cameo
-reference          1        1      1
-cobrapy            1        1      1
-cameo              1        1      1
---- reaction_deletion ---
-           reference  cobrapy  cameo
-reference          1        1      1
-cobrapy            1        1      1
-cameo              1        1      1
-========================================
-Equal: True
-========================================
-```
-
-## Examples
-The examples can be run via
-```
-fbc_curation_examples
-```
-Example models are from the [BiGG Database](http://bigg.ucsd.edu/)
-
-King ZA, Lu JS, Dräger A, Miller PC, Federowicz S, Lerman JA, Ebrahim A, Palsson BO, and Lewis NE. BiGG Models: A platform for integrating, standardizing, and sharing genome-scale models (2016) Nucleic Acids Research 44(D1):D515-D522. doi:10.1093/nar/gkv1049
diff --git a/frog-site/README.md b/frog-site/README.md
deleted file mode 100644
index 9d09096..0000000
--- a/frog-site/README.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# FROG
-
-## Technology
-1. Backend API: `fbc_curation` Python package served using FastAPI service [https://fastapi.tiangolo.com/]
-2. Frontend User Interface: Build using Vue.js 3 [https://vuejs.org/]
-    - TypeScript + SCSS
-    - Vuex
-    - Vue Router
-3. Frontend UI/UX Package: PrimeVue
-
-## Vue.js devtools
-Vue 3 is only working with the beta version of the devtools available from
-https://github.com/vuejs/vue-devtools/releases
-
-- download xpi file
-
-## Project setup
-
-### Install all dependencies
-```
-cd frog-site
-npm install
-```
-
-### Compiles and hot-reloads for development
-```
-npm run serve
-```
-
-### Compiles and minifies for production
-```
-npm run build
-```
diff --git a/release-notes/0.2.1.md b/release-notes/0.2.1.md
new file mode 100644
index 0000000..b2a87cd
--- /dev/null
+++ b/release-notes/0.2.1.md
@@ -0,0 +1,24 @@
+# Release notes for fbc_curation 0.2.1
+
+![fbc_curation](https://raw.githubusercontent.com/matthiaskoenig/fbc_curation/develop/docs/images/icon/frog_icon_mirror-100x80-300dpi.png)
+
+We are pleased to release the next version of `fbc_curation` and `runfrog` ([https://runfrog.de]()).
+The project `fbc_curation` implements the FROG analysis for reproducibility of constraint-based models in Python.
+
+For more information see [https://github.com/matthiaskoenig/fbc_curation](https://github.com/matthiaskoenig/fbc_curation) 
+and [https://fbc-curation.readthedocs.io](https://fbc-curation.readthedocs.io). 
+
+
+This release includes the following changes:
+- Fix #86, update readthedocs configuration
+- Fix #88, tests for workers added
+- Fix #74, better file naming of OMEX
+- Fix #90, NaN serialization bug
+- Fix #89, docker container and dependency updates
+- Fix #87, updated website dependencies
+- update `cobrapy==0.26.0`
+- update github actions
+- python3.11 support
+- Fix #94, models named according to input files
+
+Your `fbc_curation` team
diff --git a/release-notes/0.2.2.md b/release-notes/0.2.2.md
new file mode 100644
index 0000000..7c79588
--- /dev/null
+++ b/release-notes/0.2.2.md
@@ -0,0 +1,15 @@
+# Release notes for fbc_curation 0.2.2
+
+![fbc_curation](https://raw.githubusercontent.com/matthiaskoenig/fbc_curation/develop/docs/images/icon/frog_icon_mirror-100x80-300dpi.png)
+
+We are pleased to release the next version of `fbc_curation` and `runfrog` ([https://runfrog.de]()).
+The project `fbc_curation` implements the FROG analysis for reproducibility of constraint-based models in Python.
+
+For more information see [https://github.com/matthiaskoenig/fbc_curation](https://github.com/matthiaskoenig/fbc_curation) 
+and [https://fbc-curation.readthedocs.io](https://fbc-curation.readthedocs.io). 
+
+
+This release includes the following changes:
+- Fix #96, incorrect FVA flux values. Clarification and documentation added.
+
+Your `fbc_curation` team
diff --git a/release-notes/0.2.3.md b/release-notes/0.2.3.md
new file mode 100644
index 0000000..8c2e701
--- /dev/null
+++ b/release-notes/0.2.3.md
@@ -0,0 +1,15 @@
+# Release notes for fbc_curation 0.2.3
+
+![fbc_curation](https://raw.githubusercontent.com/matthiaskoenig/fbc_curation/develop/docs/images/icon/frog_icon_mirror-100x80-300dpi.png)
+
+We are pleased to release the next version of `fbc_curation` and `runfrog` ([https://runfrog.de]()).
+The project `fbc_curation` implements the FROG analysis for reproducibility of constraint-based models in Python.
+
+For more information see [https://github.com/matthiaskoenig/fbc_curation](https://github.com/matthiaskoenig/fbc_curation) 
+and [https://fbc-curation.readthedocs.io](https://fbc-curation.readthedocs.io). 
+
+
+This release includes the following changes:
+- Fix #96, incorrect FVA flux values. Clarification and documentation added.
+
+Your `fbc_curation` team
diff --git a/frog-site/.env.development b/runfrog-site/.env.development
similarity index 100%
rename from frog-site/.env.development
rename to runfrog-site/.env.development
diff --git a/frog-site/.env.production b/runfrog-site/.env.production
similarity index 100%
rename from frog-site/.env.production
rename to runfrog-site/.env.production
diff --git a/frog-site/.gitignore b/runfrog-site/.gitignore
similarity index 98%
rename from frog-site/.gitignore
rename to runfrog-site/.gitignore
index ddcb063..378378d 100644
--- a/frog-site/.gitignore
+++ b/runfrog-site/.gitignore
@@ -1,5 +1,6 @@
 .DS_Store
 node_modules
+.npm
 /dist
 
 /tests/e2e/videos/
diff --git a/frog-site/Dockerfile-develop b/runfrog-site/Dockerfile-develop
similarity index 71%
rename from frog-site/Dockerfile-develop
rename to runfrog-site/Dockerfile-develop
index 607f770..a912f37 100644
--- a/frog-site/Dockerfile-develop
+++ b/runfrog-site/Dockerfile-develop
@@ -1,6 +1,7 @@
-FROM node:14.11.0 as build-stage
+FROM node:14.19.3
 WORKDIR /app
-COPY package*.json /app/
+COPY package.json /app/
+RUN
 RUN --mount=type=cache,target=/app/.npm \
     npm set cache /app/.npm && \
     npm install
diff --git a/frog-site/Dockerfile-production b/runfrog-site/Dockerfile-production
similarity index 89%
rename from frog-site/Dockerfile-production
rename to runfrog-site/Dockerfile-production
index 1591e90..7da451e 100644
--- a/frog-site/Dockerfile-production
+++ b/runfrog-site/Dockerfile-production
@@ -1,5 +1,5 @@
 # build stage
-FROM node:14.11.0 as build-stage
+FROM node:14.19.3 as build-stage
 WORKDIR /app
 COPY package*.json /app/
 RUN --mount=type=cache,target=/app/.npm \
@@ -9,6 +9,9 @@ RUN --mount=type=cache,target=/app/.npm \
 COPY . /app/
 RUN npm run build
 
+
+
+
 # production stage
 FROM alpine:3.12 as production-stage
 RUN mkdir -p /vue
diff --git a/frog-site/babel.config.js b/runfrog-site/babel.config.js
similarity index 100%
rename from frog-site/babel.config.js
rename to runfrog-site/babel.config.js
diff --git a/frog-site/cypress.json b/runfrog-site/cypress.json
similarity index 100%
rename from frog-site/cypress.json
rename to runfrog-site/cypress.json
diff --git a/frog-site/package.json b/runfrog-site/package.json
similarity index 94%
rename from frog-site/package.json
rename to runfrog-site/package.json
index ea81420..a483400 100644
--- a/frog-site/package.json
+++ b/runfrog-site/package.json
@@ -1,6 +1,6 @@
 {
   "name": "FROG",
-  "version": "0.1.0",
+  "version": "0.2.1",
   "author": "Matthias König <konigmatt@googlemail.com> (https://livermetabolism.com)",
   "private": true,
   "scripts": {
@@ -13,17 +13,17 @@
   "dependencies": {
     "@fortawesome/fontawesome-svg-core": "^1.2.36",
     "@fortawesome/free-solid-svg-icons": "^5.15.4",
-    "@fortawesome/vue-fontawesome": "^3.0.0-4",
+    "@fortawesome/vue-fontawesome": "^3.0.0-5",
     "core-js": "^3.6.5",
     "emotion": "^10.0.27",
     "glob-parent": "^6.0.1",
     "jszip": "^3.6.0",
     "lodash": "^4.17.21",
     "minimist": "^1.2.5",
-    "primeicons": "^4.1.0",
-    "primevue": "^3.6.0",
+    "primeicons": "^5.0.0",
+    "primevue": "^3.12.6",
     "register-service-worker": "^1.7.1",
-    "vue": "^3.0.0",
+    "vue": "^3.2.35",
     "vue-class-component": "^8.0.0-0",
     "vue-gtag-next": "^1.14.0",
     "vue-router": "^4.0.0-0",
diff --git a/frog-site/privacy_notice.md b/runfrog-site/privacy_notice.md
similarity index 100%
rename from frog-site/privacy_notice.md
rename to runfrog-site/privacy_notice.md
diff --git a/frog-site/public/about.txt b/runfrog-site/public/about.txt
similarity index 100%
rename from frog-site/public/about.txt
rename to runfrog-site/public/about.txt
diff --git a/frog-site/public/android-chrome-192x192.png b/runfrog-site/public/android-chrome-192x192.png
similarity index 100%
rename from frog-site/public/android-chrome-192x192.png
rename to runfrog-site/public/android-chrome-192x192.png
diff --git a/frog-site/public/android-chrome-512x512.png b/runfrog-site/public/android-chrome-512x512.png
similarity index 100%
rename from frog-site/public/android-chrome-512x512.png
rename to runfrog-site/public/android-chrome-512x512.png
diff --git a/frog-site/public/apple-touch-icon.png b/runfrog-site/public/apple-touch-icon.png
similarity index 100%
rename from frog-site/public/apple-touch-icon.png
rename to runfrog-site/public/apple-touch-icon.png
diff --git a/frog-site/public/favicon-16x16.png b/runfrog-site/public/favicon-16x16.png
similarity index 100%
rename from frog-site/public/favicon-16x16.png
rename to runfrog-site/public/favicon-16x16.png
diff --git a/frog-site/public/favicon-32x32.png b/runfrog-site/public/favicon-32x32.png
similarity index 100%
rename from frog-site/public/favicon-32x32.png
rename to runfrog-site/public/favicon-32x32.png
diff --git a/frog-site/public/favicon.ico b/runfrog-site/public/favicon.ico
similarity index 100%
rename from frog-site/public/favicon.ico
rename to runfrog-site/public/favicon.ico
diff --git a/frog-site/public/index.html b/runfrog-site/public/index.html
similarity index 100%
rename from frog-site/public/index.html
rename to runfrog-site/public/index.html
diff --git a/frog-site/public/robots.txt b/runfrog-site/public/robots.txt
similarity index 100%
rename from frog-site/public/robots.txt
rename to runfrog-site/public/robots.txt
diff --git a/frog-site/public/site.webmanifest b/runfrog-site/public/site.webmanifest
similarity index 100%
rename from frog-site/public/site.webmanifest
rename to runfrog-site/public/site.webmanifest
diff --git a/frog-site/src/App.vue b/runfrog-site/src/App.vue
similarity index 100%
rename from frog-site/src/App.vue
rename to runfrog-site/src/App.vue
diff --git a/frog-site/src/assets/images/FROG_analysis_white_BG_outline.svg b/runfrog-site/src/assets/images/FROG_analysis_white_BG_outline.svg
similarity index 100%
rename from frog-site/src/assets/images/FROG_analysis_white_BG_outline.svg
rename to runfrog-site/src/assets/images/FROG_analysis_white_BG_outline.svg
diff --git a/frog-site/src/assets/images/archive.png b/runfrog-site/src/assets/images/archive.png
similarity index 100%
rename from frog-site/src/assets/images/archive.png
rename to runfrog-site/src/assets/images/archive.png
diff --git a/frog-site/src/assets/images/frog-192x192.png b/runfrog-site/src/assets/images/frog-192x192.png
similarity index 100%
rename from frog-site/src/assets/images/frog-192x192.png
rename to runfrog-site/src/assets/images/frog-192x192.png
diff --git a/frog-site/src/assets/images/frog_icon.svg b/runfrog-site/src/assets/images/frog_icon.svg
similarity index 100%
rename from frog-site/src/assets/images/frog_icon.svg
rename to runfrog-site/src/assets/images/frog_icon.svg
diff --git a/frog-site/src/assets/images/frog_icon_mirrored.svg b/runfrog-site/src/assets/images/frog_icon_mirrored.svg
similarity index 100%
rename from frog-site/src/assets/images/frog_icon_mirrored.svg
rename to runfrog-site/src/assets/images/frog_icon_mirrored.svg
diff --git a/frog-site/src/assets/images/lisym.png b/runfrog-site/src/assets/images/lisym.png
similarity index 100%
rename from frog-site/src/assets/images/lisym.png
rename to runfrog-site/src/assets/images/lisym.png
diff --git a/frog-site/src/assets/images/people/koenig.png b/runfrog-site/src/assets/images/people/koenig.png
similarity index 100%
rename from frog-site/src/assets/images/people/koenig.png
rename to runfrog-site/src/assets/images/people/koenig.png
diff --git a/frog-site/src/assets/images/sbml-icon.png b/runfrog-site/src/assets/images/sbml-icon.png
similarity index 100%
rename from frog-site/src/assets/images/sbml-icon.png
rename to runfrog-site/src/assets/images/sbml-icon.png
diff --git a/frog-site/src/assets/images/sbml-logo.png b/runfrog-site/src/assets/images/sbml-logo.png
similarity index 100%
rename from frog-site/src/assets/images/sbml-logo.png
rename to runfrog-site/src/assets/images/sbml-logo.png
diff --git a/frog-site/src/assets/styles/scss/App.scss b/runfrog-site/src/assets/styles/scss/App.scss
similarity index 100%
rename from frog-site/src/assets/styles/scss/App.scss
rename to runfrog-site/src/assets/styles/scss/App.scss
diff --git a/frog-site/src/assets/styles/scss/Menu.scss b/runfrog-site/src/assets/styles/scss/Menu.scss
similarity index 100%
rename from frog-site/src/assets/styles/scss/Menu.scss
rename to runfrog-site/src/assets/styles/scss/Menu.scss
diff --git a/frog-site/src/assets/styles/scss/Table.scss b/runfrog-site/src/assets/styles/scss/Table.scss
similarity index 100%
rename from frog-site/src/assets/styles/scss/Table.scss
rename to runfrog-site/src/assets/styles/scss/Table.scss
diff --git a/frog-site/src/components/layout/About.vue b/runfrog-site/src/components/layout/About.vue
similarity index 100%
rename from frog-site/src/components/layout/About.vue
rename to runfrog-site/src/components/layout/About.vue
diff --git a/frog-site/src/components/layout/DetailViewNav.vue b/runfrog-site/src/components/layout/DetailViewNav.vue
similarity index 100%
rename from frog-site/src/components/layout/DetailViewNav.vue
rename to runfrog-site/src/components/layout/DetailViewNav.vue
diff --git a/frog-site/src/components/layout/Examples.vue b/runfrog-site/src/components/layout/Examples.vue
similarity index 100%
rename from frog-site/src/components/layout/Examples.vue
rename to runfrog-site/src/components/layout/Examples.vue
diff --git a/frog-site/src/components/layout/FileUploadForm.vue b/runfrog-site/src/components/layout/FileUploadForm.vue
similarity index 100%
rename from frog-site/src/components/layout/FileUploadForm.vue
rename to runfrog-site/src/components/layout/FileUploadForm.vue
diff --git a/frog-site/src/components/layout/Frog.vue b/runfrog-site/src/components/layout/Frog.vue
similarity index 100%
rename from frog-site/src/components/layout/Frog.vue
rename to runfrog-site/src/components/layout/Frog.vue
diff --git a/frog-site/src/components/layout/Heading.vue b/runfrog-site/src/components/layout/Heading.vue
similarity index 100%
rename from frog-site/src/components/layout/Heading.vue
rename to runfrog-site/src/components/layout/Heading.vue
diff --git a/frog-site/src/components/layout/Home.vue b/runfrog-site/src/components/layout/Home.vue
similarity index 80%
rename from frog-site/src/components/layout/Home.vue
rename to runfrog-site/src/components/layout/Home.vue
index dc3212d..b520f4a 100644
--- a/frog-site/src/components/layout/Home.vue
+++ b/runfrog-site/src/components/layout/Home.vue
@@ -1,20 +1,19 @@
 <template>
     <div>
-        <div class="p-grid">
-            <div class="p-col-12 p-lg-6">
+        <div class="grid">
+            <div class="col-12 col-offset-0 md:col-8 md:col-offset-2 ">
                 <div>
-                    <div class="p-m-3">
+                    <div class="m-3">
                         <submit-options />
                     </div>
                 </div>
-            </div>
-            <div class="p-col-12 p-lg-6">
-                <div class="p-m-3">
+                <div class="m-3">
                     <!--<about />-->
                     <examples />
                     <!--<task-queue />-->
                 </div>
             </div>
+
         </div>
     </div>
 </template>
diff --git a/frog-site/src/components/layout/Loading.vue b/runfrog-site/src/components/layout/Loading.vue
similarity index 100%
rename from frog-site/src/components/layout/Loading.vue
rename to runfrog-site/src/components/layout/Loading.vue
diff --git a/frog-site/src/components/layout/Navbar.vue b/runfrog-site/src/components/layout/Navbar.vue
similarity index 90%
rename from frog-site/src/components/layout/Navbar.vue
rename to runfrog-site/src/components/layout/Navbar.vue
index 93c4d69..c8ac21b 100644
--- a/frog-site/src/components/layout/Navbar.vue
+++ b/runfrog-site/src/components/layout/Navbar.vue
@@ -12,7 +12,7 @@
                 </router-link>
 
                 <router-link to="/">
-                    <span class="frog p-mx-3" style="color: black">FROG Analysis</span>
+                    <span class="frog p-mx-3" style="color: black">Run FROG</span>
                 </router-link>
             </div>
         </template>
@@ -51,7 +51,12 @@ export default defineComponent({
                     url: "https://github.com/matthiaskoenig/fbc_curation/issues/new/choose",
                 },
                 {
-                    label: "Source",
+                    label: "Documentation",
+                    icon: "pi pi-fw pi-info-circle",
+                    url: "https://fbc-curation.readthedocs.io",
+                },
+                {
+                    label: "Code",
                     icon: "pi pi-fw pi-github",
                     url: "https://github.com/matthiaskoenig/fbc_curation",
                 },
diff --git a/frog-site/src/components/layout/OMEXTree.vue b/runfrog-site/src/components/layout/OMEXTree.vue
similarity index 100%
rename from frog-site/src/components/layout/OMEXTree.vue
rename to runfrog-site/src/components/layout/OMEXTree.vue
diff --git a/frog-site/src/components/layout/PasteSBML.vue b/runfrog-site/src/components/layout/PasteSBML.vue
similarity index 100%
rename from frog-site/src/components/layout/PasteSBML.vue
rename to runfrog-site/src/components/layout/PasteSBML.vue
diff --git a/frog-site/src/components/layout/Report.vue b/runfrog-site/src/components/layout/Report.vue
similarity index 100%
rename from frog-site/src/components/layout/Report.vue
rename to runfrog-site/src/components/layout/Report.vue
diff --git a/frog-site/src/components/layout/SBMLLink.vue b/runfrog-site/src/components/layout/SBMLLink.vue
similarity index 100%
rename from frog-site/src/components/layout/SBMLLink.vue
rename to runfrog-site/src/components/layout/SBMLLink.vue
diff --git a/frog-site/src/components/layout/SubmitOptions.vue b/runfrog-site/src/components/layout/SubmitOptions.vue
similarity index 100%
rename from frog-site/src/components/layout/SubmitOptions.vue
rename to runfrog-site/src/components/layout/SubmitOptions.vue
diff --git a/frog-site/src/components/layout/TablesContainer.vue b/runfrog-site/src/components/layout/TablesContainer.vue
similarity index 100%
rename from frog-site/src/components/layout/TablesContainer.vue
rename to runfrog-site/src/components/layout/TablesContainer.vue
diff --git a/frog-site/src/components/layout/URLUpload.vue b/runfrog-site/src/components/layout/URLUpload.vue
similarity index 100%
rename from frog-site/src/components/layout/URLUpload.vue
rename to runfrog-site/src/components/layout/URLUpload.vue
diff --git a/frog-site/src/components/tables/ObjectiveTable.vue b/runfrog-site/src/components/tables/ObjectiveTable.vue
similarity index 100%
rename from frog-site/src/components/tables/ObjectiveTable.vue
rename to runfrog-site/src/components/tables/ObjectiveTable.vue
diff --git a/frog-site/src/components/tables/SpeciesTable.vue b/runfrog-site/src/components/tables/SpeciesTable.vue
similarity index 100%
rename from frog-site/src/components/tables/SpeciesTable.vue
rename to runfrog-site/src/components/tables/SpeciesTable.vue
diff --git a/frog-site/src/data/allSBMLMap.ts b/runfrog-site/src/data/allSBMLMap.ts
similarity index 100%
rename from frog-site/src/data/allSBMLMap.ts
rename to runfrog-site/src/data/allSBMLMap.ts
diff --git a/frog-site/src/data/colorScheme.ts b/runfrog-site/src/data/colorScheme.ts
similarity index 100%
rename from frog-site/src/data/colorScheme.ts
rename to runfrog-site/src/data/colorScheme.ts
diff --git a/frog-site/src/data/fontAwesome.ts b/runfrog-site/src/data/fontAwesome.ts
similarity index 100%
rename from frog-site/src/data/fontAwesome.ts
rename to runfrog-site/src/data/fontAwesome.ts
diff --git a/frog-site/src/data/listOfSBMLTypes.ts b/runfrog-site/src/data/listOfSBMLTypes.ts
similarity index 100%
rename from frog-site/src/data/listOfSBMLTypes.ts
rename to runfrog-site/src/data/listOfSBMLTypes.ts
diff --git a/frog-site/src/data/sbmlComponents.ts b/runfrog-site/src/data/sbmlComponents.ts
similarity index 100%
rename from frog-site/src/data/sbmlComponents.ts
rename to runfrog-site/src/data/sbmlComponents.ts
diff --git a/frog-site/src/helpers/additionalInfoUtils.ts b/runfrog-site/src/helpers/additionalInfoUtils.ts
similarity index 100%
rename from frog-site/src/helpers/additionalInfoUtils.ts
rename to runfrog-site/src/helpers/additionalInfoUtils.ts
diff --git a/frog-site/src/helpers/omexInitialization.ts b/runfrog-site/src/helpers/omexInitialization.ts
similarity index 100%
rename from frog-site/src/helpers/omexInitialization.ts
rename to runfrog-site/src/helpers/omexInitialization.ts
diff --git a/frog-site/src/helpers/reportInitialization.ts b/runfrog-site/src/helpers/reportInitialization.ts
similarity index 100%
rename from frog-site/src/helpers/reportInitialization.ts
rename to runfrog-site/src/helpers/reportInitialization.ts
diff --git a/frog-site/src/main.ts b/runfrog-site/src/main.ts
similarity index 100%
rename from frog-site/src/main.ts
rename to runfrog-site/src/main.ts
diff --git a/frog-site/src/mixins/tableMixin.ts b/runfrog-site/src/mixins/tableMixin.ts
similarity index 100%
rename from frog-site/src/mixins/tableMixin.ts
rename to runfrog-site/src/mixins/tableMixin.ts
diff --git a/frog-site/src/registerServiceWorker.ts b/runfrog-site/src/registerServiceWorker.ts
similarity index 100%
rename from frog-site/src/registerServiceWorker.ts
rename to runfrog-site/src/registerServiceWorker.ts
diff --git a/frog-site/src/router/index.ts b/runfrog-site/src/router/index.ts
similarity index 100%
rename from frog-site/src/router/index.ts
rename to runfrog-site/src/router/index.ts
diff --git a/frog-site/src/shims-vue.d.ts b/runfrog-site/src/shims-vue.d.ts
similarity index 100%
rename from frog-site/src/shims-vue.d.ts
rename to runfrog-site/src/shims-vue.d.ts
diff --git a/frog-site/src/store/index.ts b/runfrog-site/src/store/index.ts
similarity index 100%
rename from frog-site/src/store/index.ts
rename to runfrog-site/src/store/index.ts
diff --git a/frog-site/tsconfig.json b/runfrog-site/tsconfig.json
similarity index 100%
rename from frog-site/tsconfig.json
rename to runfrog-site/tsconfig.json
diff --git a/frog-site/vue.config.js b/runfrog-site/vue.config.js
similarity index 100%
rename from frog-site/vue.config.js
rename to runfrog-site/vue.config.js
diff --git a/setup.cfg b/setup.cfg
index 424d57d..07e068f 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.2.0
+current_version = 0.2.3
 commit = True
 tag = True
 parse = (?P<major>\d+)
@@ -28,9 +28,10 @@ classifiers =
 	Intended Audience :: Science/Research
 	License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)
 	Operating System :: OS Independent
-	Programming Language :: Python :: 3.7
 	Programming Language :: Python :: 3.8
 	Programming Language :: Python :: 3.9
+	Programming Language :: Python :: 3.10
+	Programming Language :: Python :: 3.11
 	Programming Language :: Python :: Implementation :: CPython
 	Topic :: Scientific/Engineering
 	Topic :: Scientific/Engineering :: Bio-Informatics
@@ -46,27 +47,27 @@ keywords =
 
 [options]
 zip_safe = True
-python_requires = >=3.7
+python_requires = >=3.8
 install_requires = 
-	pymetadata>=0.2.9
-	pandas>=1.3.0
-	cobra==0.25.0
+	pymetadata>=0.3.6
+	pandas>=1.4.2
+	cobra==0.26.0
 	cameo==0.13.6
 	
-	fastapi>=0.75.0
-	uvicorn>=0.17.0
+	fastapi>=0.87.0
+	uvicorn>=0.19.0
 	python-multipart>=0.0.5
-	celery>=5.2.6
-	flower>=1.0.0
-	redis>=4.2.2
-	orjson>=3.6.8
+	celery>=5.2.7
+	flower>=1.2.0
+	redis>=4.3.4
+	orjson>=3.8.1
 	
-	jinja2>=3.1.0
-	markupsafe>=2.1.0
+	jinja2>=3.1.2
+	markupsafe>=2.1.1
 	
-	numpy>=1.22.0
-	rich>=12.3.0
-	pydantic>=1.9.0
+	numpy>=1.23.4
+	rich>=12.6.0
+	pydantic>=1.10.2
 tests_require = 
 	tox
 packages = find:
@@ -90,6 +91,7 @@ development =
 	tox
 	pytest>=6.1
 	pytest-cov>=2.8.1
+	pytest-celery
 
 [bdist_wheel]
 universal = 1
diff --git a/setup.py b/setup.py
index c0f4c62..3f33a66 100644
--- a/setup.py
+++ b/setup.py
@@ -4,4 +4,4 @@
 
 
 if __name__ == "__main__":
-    setup(version="0.2.0")
+    setup(version="0.2.3")
diff --git a/src/fbc_curation/__init__.py b/src/fbc_curation/__init__.py
index 6a2e071..7250e40 100644
--- a/src/fbc_curation/__init__.py
+++ b/src/fbc_curation/__init__.py
@@ -1,7 +1,7 @@
 from pathlib import Path
 
 __software__ = "fbc_curation"
-__version__ = "0.2.0"
+__version__ = "0.2.3"
 __citation__ = "https://doi.org/10.5281/zenodo.3708271"
 
 
diff --git a/src/fbc_curation/api.py b/src/fbc_curation/api.py
index 3330ff3..f17a470 100644
--- a/src/fbc_curation/api.py
+++ b/src/fbc_curation/api.py
@@ -121,7 +121,7 @@ def get_status_for_task(task_id: str) -> JSONResponse:
 async def get_combine_archive_for_task(task_id: str) -> FileResponse:
     """Get COMBINE archive (omex) for FROG task with `task_id`."""
 
-    omex_path = Path("/frog_data") / f"{task_id}.omex"
+    omex_path = Path("/frog_data") / f"FROG_{task_id}.omex"
 
     if not omex_path:
         raise HTTPException(
@@ -187,7 +187,7 @@ def frog_from_bytes(content: bytes) -> Dict[str, Any]:
         with open(path, "w+b") as f_tmp:
             f_tmp.write(content)
             f_tmp.close()
-        task = frog_task.delay(str(path), True)
+        task = frog_task.delay(str(path))
         return {"task_id": task.id}
 
     except Exception as e:
diff --git a/src/fbc_curation/curator/cameo_curator.py b/src/fbc_curation/curator/cameo_curator.py
index db1164d..6508a88 100644
--- a/src/fbc_curation/curator/cameo_curator.py
+++ b/src/fbc_curation/curator/cameo_curator.py
@@ -98,14 +98,16 @@ def objectives(self) -> FrogObjectives:
 
         return FrogObjectives.from_df(df)
 
-    def fva(self) -> FrogFVA:
+    def fva(self, fraction_of_optimum: float = 1.0) -> FrogFVA:
         """Perform FVA."""
         model = self.read_model()
         result = fba(model)
-        fluxes = result.fluxes
+        objective_value = result.objective_value
         try:
             fva_result: FluxVariabilityResult = flux_variability_analysis(
-                model, reactions=model.reactions, fraction_of_optimum=1.0
+                model,
+                reactions=model.reactions,
+                fraction_of_optimum=fraction_of_optimum,
             )
             df = fva_result.data_frame
             df_out = pd.DataFrame(
@@ -113,11 +115,11 @@ def fva(self) -> FrogFVA:
                     "model": self.model_location,
                     "objective": self.objective_id,
                     "reaction": df.index,
-                    "flux": fluxes,
+                    "flux": objective_value * fraction_of_optimum,
                     "status": StatusCode.OPTIMAL,
                     "minimum": df.lower_bound,
                     "maximum": df.upper_bound,
-                    "fraction_optimum": 1.0,
+                    "fraction_optimum": fraction_of_optimum,
                 }
             )
         except Exception as e:
@@ -127,7 +129,7 @@ def fva(self) -> FrogFVA:
                     "model": self.model_location,
                     "objective": self.objective_id,
                     "reaction": [r.id for r in model.reactions],
-                    "flux": fluxes,
+                    "flux": CuratorConstants.VALUE_INFEASIBLE,
                     "status": StatusCode.INFEASIBLE,
                     "minimum": CuratorConstants.VALUE_INFEASIBLE,
                     "maximum": CuratorConstants.VALUE_INFEASIBLE,
diff --git a/src/fbc_curation/curator/cobrapy_curator.py b/src/fbc_curation/curator/cobrapy_curator.py
index dd58575..78fc76b 100644
--- a/src/fbc_curation/curator/cobrapy_curator.py
+++ b/src/fbc_curation/curator/cobrapy_curator.py
@@ -94,7 +94,7 @@ def objectives(self) -> FrogObjectives:
             )
         return FrogObjectives.from_df(df)
 
-    def fva(self) -> FrogFVA:
+    def fva(self, fraction_of_optimum: float = 1.0) -> FrogFVA:
         """Create DataFrame file with minimum and maximum value of FVA.
 
         Runs flux variability analysis.
@@ -102,21 +102,21 @@ def fva(self) -> FrogFVA:
         """
         model = self.read_model()
         solution = model.optimize()
-        fluxes = solution.fluxes
+        objective_value = solution.objective_value
         try:
             df = flux_variability_analysis(
-                model, model.reactions, fraction_of_optimum=1.0
+                model, model.reactions, fraction_of_optimum=fraction_of_optimum
             )
             df_out = pd.DataFrame(
                 {
                     "model": self.model_location,
                     "objective": self.objective_id,
                     "reaction": df.index,
-                    "flux": fluxes,
+                    "flux": objective_value * fraction_of_optimum,
                     "status": StatusCode.OPTIMAL,
                     "minimum": df.minimum,
                     "maximum": df.maximum,
-                    "fraction_optimum": 1.0,
+                    "fraction_optimum": fraction_of_optimum,
                 }
             )
         except OptimizationError as e:
@@ -126,7 +126,7 @@ def fva(self) -> FrogFVA:
                     "model": self.model_location,
                     "objective": self.objective_id,
                     "reaction": [r.id for r in model.reactions],
-                    "flux": fluxes,
+                    "flux": CuratorConstants.VALUE_INFEASIBLE,
                     "status": StatusCode.INFEASIBLE,
                     "minimum": CuratorConstants.VALUE_INFEASIBLE,
                     "maximum": CuratorConstants.VALUE_INFEASIBLE,
diff --git a/src/fbc_curation/examples.py b/src/fbc_curation/examples.py
index 435a831..5c84082 100644
--- a/src/fbc_curation/examples.py
+++ b/src/fbc_curation/examples.py
@@ -7,7 +7,7 @@
 
 from fbc_curation import EXAMPLE_DIR
 from fbc_curation.compare import FrogComparison
-from fbc_curation.worker import frog_task
+from fbc_curation.worker import run_frog
 
 
 logger = log.get_logger(__name__)
@@ -50,10 +50,9 @@ def run_example(filename: str) -> Path:
     model_path = EXAMPLE_DIR / "models" / filename
     omex_path = EXAMPLE_DIR / "frogs" / f"{filename.split('.')[0]}_FROG.omex"
 
-    frog_task(
-        source_path_str=str(model_path),
-        input_is_temporary=False,
-        omex_path_str=str(omex_path),
+    run_frog(
+        source_path=model_path,
+        omex_path=omex_path,
     )
     model_reports = FrogComparison.read_reports_from_omex(omex_path=omex_path)
     for _, reports in model_reports.items():
diff --git a/src/fbc_curation/frog.py b/src/fbc_curation/frog.py
index 1e5d2bc..4c237d2 100644
--- a/src/fbc_curation/frog.py
+++ b/src/fbc_curation/frog.py
@@ -11,7 +11,7 @@
 import orjson
 import pandas as pd
 from pydantic import BaseModel as PydanticBaseModel
-from pydantic import Field, ValidationError
+from pydantic import Field, ValidationError, validator
 from pymetadata import log
 from pymetadata.omex import EntryFormat, ManifestEntry, Omex
 
@@ -24,12 +24,13 @@
 class BaseModel(PydanticBaseModel):
     """Base model."""
 
-    pass
-    # @validator("*")
-    # def change_nan_to_none(cls, v: Any, field: Any) -> Any:
-    #     if field.outer_type_ is float and isnan(v):
-    #         return None
-    #     return v
+    # pass
+    @validator("*")
+    def change_nan_to_none(cls, v: Any, field: Any) -> Any:
+        """Replace NaN to None values."""
+        if (field.outer_type_ is float) and (v is not None) and (np.isnan(v)):
+            return None
+        return v
 
 
 class CuratorConstants:
diff --git a/src/fbc_curation/resources/examples/frogs/e_coli_core_FROG.omex b/src/fbc_curation/resources/examples/frogs/e_coli_core_FROG.omex
index 57deeb8..ef5ce9e 100644
Binary files a/src/fbc_curation/resources/examples/frogs/e_coli_core_FROG.omex and b/src/fbc_curation/resources/examples/frogs/e_coli_core_FROG.omex differ
diff --git a/src/fbc_curation/resources/examples/frogs/e_coli_core_no_genes_FROG.omex b/src/fbc_curation/resources/examples/frogs/e_coli_core_no_genes_FROG.omex
index 4b0c2e5..1d764e8 100644
Binary files a/src/fbc_curation/resources/examples/frogs/e_coli_core_no_genes_FROG.omex and b/src/fbc_curation/resources/examples/frogs/e_coli_core_no_genes_FROG.omex differ
diff --git a/src/fbc_curation/resources/examples/frogs/iCGB21FR_FROG.omex b/src/fbc_curation/resources/examples/frogs/iCGB21FR_FROG.omex
index 3c0d861..1d4fdb8 100644
Binary files a/src/fbc_curation/resources/examples/frogs/iCGB21FR_FROG.omex and b/src/fbc_curation/resources/examples/frogs/iCGB21FR_FROG.omex differ
diff --git a/src/fbc_curation/resources/examples/frogs/iJR904_FROG.omex b/src/fbc_curation/resources/examples/frogs/iJR904_FROG.omex
index 682a251..189ce42 100644
Binary files a/src/fbc_curation/resources/examples/frogs/iJR904_FROG.omex and b/src/fbc_curation/resources/examples/frogs/iJR904_FROG.omex differ
diff --git a/src/fbc_curation/resources/examples/models/e_coli_core_FROG.omex b/src/fbc_curation/resources/examples/models/e_coli_core_FROG.omex
index 19e1b67..39b836b 100644
Binary files a/src/fbc_curation/resources/examples/models/e_coli_core_FROG.omex and b/src/fbc_curation/resources/examples/models/e_coli_core_FROG.omex differ
diff --git a/src/fbc_curation/resources/examples/models/example_docs.py b/src/fbc_curation/resources/examples/models/example_docs.py
index c87c27f..a81f04c 100644
--- a/src/fbc_curation/resources/examples/models/example_docs.py
+++ b/src/fbc_curation/resources/examples/models/example_docs.py
@@ -2,20 +2,19 @@
 from pathlib import Path
 
 from fbc_curation.compare import FrogComparison
-from fbc_curation.worker import frog_task
+from fbc_curation.worker import run_frog
 
 
 def create_frog(model_path: Path, omex_path: Path) -> None:
     """Create FROG report and writes OMEX for given model."""
 
-    # create FROG in OMEX
-    frog_task(
-        source_path_str=str(model_path),
-        input_is_temporary=False,
-        omex_path_str=str(omex_path),
+    # create FROG and write to COMBINE archive
+    run_frog(
+        source_path=model_path,
+        omex_path=omex_path,
     )
 
-    # compare FROG results in OMEX
+    # compare FROG results in created COMBINE archive
     model_reports = FrogComparison.read_reports_from_omex(omex_path=omex_path)
     for _, reports in model_reports.items():
         FrogComparison.compare_reports(reports=reports)
diff --git a/src/fbc_curation/runfrog.py b/src/fbc_curation/runfrog.py
index 893cc3d..4d318ba 100644
--- a/src/fbc_curation/runfrog.py
+++ b/src/fbc_curation/runfrog.py
@@ -6,7 +6,7 @@
 
 from fbc_curation import __citation__, __version__
 from fbc_curation.compare import FrogComparison
-from fbc_curation.worker import frog_task
+from fbc_curation.worker import run_frog
 
 
 logger = log.get_logger(__name__)
@@ -96,10 +96,9 @@ def _parser_message(text: str) -> None:
     #             f"valid reference path."
     #         )
 
-    frog_task(
-        source_path_str=str(input_path),
-        input_is_temporary=False,
-        omex_path_str=str(output_path),
+    run_frog(
+        source_path=input_path,
+        omex_path=output_path,
     )
 
     model_reports = FrogComparison.read_reports_from_omex(omex_path=output_path)
diff --git a/src/fbc_curation/scripts/runfrogs.py b/src/fbc_curation/scripts/runfrogs.py
new file mode 100644
index 0000000..527d740
--- /dev/null
+++ b/src/fbc_curation/scripts/runfrogs.py
@@ -0,0 +1,27 @@
+"""Helper script for running multiple frog analysis."""
+from pathlib import Path
+
+from pymetadata.omex import Omex
+
+from fbc_curation.worker import run_frog
+
+
+def runfrogs(models_dir: Path, extract_omex: bool = True):
+    """Run FROG reports for models."""
+    print(models_dir)
+    models = models_dir.glob("*/*.xml")
+    for model_path in models:
+        omex_path = model_path.parent / f"{model_path.stem}_FROG.omex"
+        print(f"{model_path} -> {omex_path}")
+        run_frog(
+            source_path=model_path,
+            omex_path=omex_path,
+        )
+        if extract_omex:
+            omex = Omex.from_omex(omex_path)
+            omex.to_directory(model_path.parent)
+
+
+if __name__ == "__main__":
+    models_dir: Path = Path("/home/mkoenig/Downloads/frog/models/")
+    runfrogs(models_dir=models_dir)
diff --git a/src/fbc_curation/worker.py b/src/fbc_curation/worker.py
index 68f0007..2db77e6 100644
--- a/src/fbc_curation/worker.py
+++ b/src/fbc_curation/worker.py
@@ -13,6 +13,7 @@
 from pymetadata.console import console
 from pymetadata.omex import EntryFormat, ManifestEntry, Omex
 
+from fbc_curation import FROG_PATH_PREFIX
 from fbc_curation.curator import Curator
 from fbc_curation.curator.cameo_curator import CuratorCameo
 from fbc_curation.curator.cobrapy_curator import CuratorCobrapy
@@ -28,18 +29,43 @@
     "CELERY_RESULT_BACKEND", "redis://localhost:6379"
 )
 
-# FIXME: ensure that files are removed from time to time
+# storage of data on server, only relevant for server
+FROG_STORAGE = "/frog_data"
+
+
+def run_frog(source_path: Path, omex_path: Path) -> None:
+    """Create FROG report for given SBML or OMEX source.
+
+    This function creates the FROG report and stores the results with the
+    model in a COMBINE archive.
+
+    :param source_path: Path for SBML model to create FROG for, or a COMBINE archive
+      (omex) which contains an SBML model.
+    :param omex_path: Path for COMBINE archive (omex) with FROG results. The content
+      of the file will be overwritten!
+    """
+    frog_task(
+        source_path_str=str(source_path),
+        omex_path_str=str(omex_path),
+    )
 
 
 @celery.task(name="frog_task")
 def frog_task(
     source_path_str: str,
-    input_is_temporary: bool = True,
+    input_is_temporary: bool = False,
     omex_path_str: Optional[str] = None,
+    frog_storage_path_str: str = FROG_STORAGE,
 ) -> Dict[str, Any]:
     """Run FROG task and create JSON for omex path.
 
-    Path can be either Omex or an SBML file.
+    This function should not be called directly. Use the `run_frog` function
+    instead. Path can be either Omex or an SBML file.
+
+    :param omex_path_str: Path to OMEX for results. In the celery context 'None' should
+        be used and the path is created from the task id.
+    :param input_is_temporary: Boolean flag if the input is temporary and will be
+        deleted after execution of FROG.
     """
     logger.info(f"Loading '{source_path_str}'")
 
@@ -60,7 +86,7 @@ def frog_task(
             omex.add_entry(
                 entry_path=omex_path,
                 entry=ManifestEntry(
-                    location="./model.xml", format=EntryFormat.SBML, master=True
+                    location=f"./{omex_path.name}", format=EntryFormat.SBML, master=True
                 ),
             )
 
@@ -75,12 +101,14 @@ def frog_task(
                 report_dict = {}
                 for curator_key in ["cobrapy", "cameo"]:
                     sbml_path: Path = omex.get_path(entry.location)
-                    report: FrogReport = frog_for_sbml(
+                    report: FrogReport = _frog_for_sbml(
                         source=sbml_path, curator_key=curator_key
                     )
 
                     # add FROG files to archive
-                    report.add_to_omex(omex, location_prefix=f"./FROG/{curator_key}/")
+                    report.add_to_omex(
+                        omex, location_prefix=f"./{FROG_PATH_PREFIX}/{curator_key}/"
+                    )
 
                     # add JSON to response
                     report_dict[curator_key] = report.dict()
@@ -89,10 +117,16 @@ def frog_task(
                 content["frogs"][entry.location] = report_dict
 
         # save archive for download
+        task_id = frog_task.request.id
+        if (not task_id) and (not omex_path_str):
+            raise ValueError(
+                "The 'omex_path_str' argument must be set (if not executed "
+                "within a celery Task)."
+            )
         if omex_path_str is None:
             # executed in task queue
-            task_id = frog_task.request.id
-            omex_path = Path("/frog_data") / f"{task_id}.omex"
+            # FIXME: ensure that files are removed from time to time
+            omex_path = Path(frog_storage_path_str) / f"FROG_{task_id}.omex"
         else:
             omex_path = Path(omex_path_str)
         console.rule("Write OMEX", style="white")
@@ -106,7 +140,7 @@ def frog_task(
     return content
 
 
-def frog_for_sbml(source: Union[Path, str, bytes], curator_key: str) -> FrogReport:
+def _frog_for_sbml(source: Union[Path, str, bytes], curator_key: str) -> FrogReport:
     """Create FROGReport for given SBML source.
 
     Source is either path to SBML file or SBML string.
diff --git a/tox.ini b/tox.ini
index 8dffea5..2c2d13f 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,12 +1,13 @@
 [tox]
-envlist = isort, black, flake8, safety, py3{8,9,10}
+envlist = isort, black, flake8, safety, py3{8,9,10,11}
 
 [gh-actions]
 # We ignore flake8 for the time being because there are tons of things to fix.
 python =
     3.8: py38
-    3.9: isort, black, flake8, mypy, safety, py39
-    3.10: py310
+    3.9: py39
+    3.10: isort, black, flake8, mypy, safety, py310
+    3.11: py311
 
 [testenv]
 deps=


Test patch:
diff --git a/frog-site/tests/e2e/.eslintrc.js b/runfrog-site/tests/e2e/.eslintrc.js
similarity index 100%
rename from frog-site/tests/e2e/.eslintrc.js
rename to runfrog-site/tests/e2e/.eslintrc.js
diff --git a/frog-site/tests/e2e/plugins/index.js b/runfrog-site/tests/e2e/plugins/index.js
similarity index 100%
rename from frog-site/tests/e2e/plugins/index.js
rename to runfrog-site/tests/e2e/plugins/index.js
diff --git a/frog-site/tests/e2e/specs/test.js b/runfrog-site/tests/e2e/specs/test.js
similarity index 100%
rename from frog-site/tests/e2e/specs/test.js
rename to runfrog-site/tests/e2e/specs/test.js
diff --git a/frog-site/tests/e2e/support/commands.js b/runfrog-site/tests/e2e/support/commands.js
similarity index 100%
rename from frog-site/tests/e2e/support/commands.js
rename to runfrog-site/tests/e2e/support/commands.js
diff --git a/frog-site/tests/e2e/support/index.js b/runfrog-site/tests/e2e/support/index.js
similarity index 100%
rename from frog-site/tests/e2e/support/index.js
rename to runfrog-site/tests/e2e/support/index.js
diff --git a/frog-site/tests/unit/example.spec.ts b/runfrog-site/tests/unit/example.spec.ts
similarity index 100%
rename from frog-site/tests/unit/example.spec.ts
rename to runfrog-site/tests/unit/example.spec.ts
diff --git a/tests/conftest.py b/tests/conftest.py
new file mode 100644
index 0000000..c65f97d
--- /dev/null
+++ b/tests/conftest.py
@@ -0,0 +1,19 @@
+"""Configuration for pytest."""
+from pathlib import Path
+from typing import Dict
+
+import pytest
+
+from fbc_curation import EXAMPLE_DIR
+
+
+@pytest.fixture(scope="session")
+def celery_config() -> Dict[str, str]:
+    """Celery configuration fixture."""
+    return {"broker_url": "amqp://", "result_backend": "redis://"}
+
+
+@pytest.fixture
+def ecoli_sbml_path() -> Path:
+    """Path to Ecoli core SBML model."""
+    return EXAMPLE_DIR / "models" / "e_coli_core.xml"
diff --git a/tests/test_api.py b/tests/test_api.py
index 8bc2709..22e3ceb 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -1,8 +1,12 @@
 """Test API functionality."""
+from pathlib import Path
 
 from fastapi.testclient import TestClient
+from starlette.responses import JSONResponse
 
 from fbc_curation.api import api
+from fbc_curation.frog import FrogReport
+from fbc_curation.worker import _frog_for_sbml
 
 
 client = TestClient(api)
@@ -33,3 +37,10 @@ def test_get_examples() -> None:
         "examples",
     ]:
         assert key in json
+
+
+def test_json_for_ecoli_frog(ecoli_sbml_path: Path) -> None:
+    """Test JSON serialization of results."""
+    report: FrogReport = _frog_for_sbml(source=ecoli_sbml_path, curator_key="cobrapy")
+    response = JSONResponse(report.dict())
+    assert response
diff --git a/tests/test_worker.py b/tests/test_worker.py
new file mode 100644
index 0000000..bfb914d
--- /dev/null
+++ b/tests/test_worker.py
@@ -0,0 +1,14 @@
+"""Testing worker."""
+
+from pathlib import Path
+
+from fbc_curation.worker import frog_task
+
+
+def test_frog_task(tmp_path: Path, ecoli_sbml_path: Path) -> None:
+    """Test execution of frog task."""
+    omex_path: Path = tmp_path / "test.omex"
+    content = frog_task(
+        source_path_str=str(ecoli_sbml_path), omex_path_str=str(omex_path)
+    )
+    assert content