diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..dceff5b029f69a7dc5005c755621bb4268f82fe8
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,69 @@
+# Build frontend
+FROM node:18 as frontend-build
+WORKDIR /app/frontend
+COPY frontend/package*.json ./
+RUN npm install
+COPY frontend/ ./
+RUN npm run build
+
+# Build backend
+FROM python:3.12-slim as backend
+WORKDIR /app
+
+# Install dependencies including nginx
+RUN apt-get update && apt-get install -y nginx \
+ && rm -rf /var/lib/apt/lists/*
+
+COPY src/docker_requirements.txt /app/src/
+RUN pip install --upgrade pip wheel
+RUN pip install --cache-dir=~/.cache/pip --prefer-binary pyarrow pandas numpy scipy fsspec aiohttp tqdm --progress-bar off -v
+RUN pip install --cache-dir=~/.cache/pip -r /app/src/docker_requirements.txt -v --prefer-binary && rm -rf ~/.cache/pip
+COPY src/ /app/src/
+
+# Copy Nginx config (adjust path if needed)
+COPY nginx.conf /etc/nginx/nginx.conf
+
+COPY --from=frontend-build /app/frontend /app/frontend
+
+# Create non-root user
+RUN useradd -m -u 1000 user
+
+# Create and configure cache directory
+RUN mkdir -p /app/.cache && \
+ chown -R user:user /app
+
+# Environment variables
+ENV HF_HOME=/app/.cache \
+ HF_DATASETS_CACHE=/app/.cache \
+ INTERNAL_API_PORT=7861 \
+ PORT=7860
+
+WORKDIR /app
+COPY nginx.conf /etc/nginx/nginx.conf
+COPY start.sh /start.sh
+RUN chmod +x /start.sh
+RUN chown -R user:user /var/lib/nginx
+
+RUN apt-get update && apt-get install -y nginx \
+ && groupadd -r nginx && useradd -r -g nginx nginx
+
+#Give user nginx write permissions
+RUN mkdir -p /var/lib/nginx && chown -R user:user /var/lib/nginx
+RUN mkdir -p /var/log/nginx && chown -R user:user /var/log/nginx
+RUN mkdir -p /app/logs && chown -R user:user /app/logs
+RUN mkdir -p /run && touch /run/nginx.pid && chown -R user:user /run
+
+RUN apt-get update && apt-get install -y \
+ curl \
+ netcat-openbsd \
+ && curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
+ && apt-get install -y nodejs \
+ && rm -rf /var/lib/apt/lists/*
+
+
+# Note: HF_TOKEN should be provided at runtime, not build time
+USER user
+EXPOSE 7860
+
+# Start both servers with wait-for
+CMD ["sh", "/start.sh"]
\ No newline at end of file
diff --git a/frontend/README.md b/frontend/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..29d10c639e5fa23d93018b4268a3e66c14bccc17
--- /dev/null
+++ b/frontend/README.md
@@ -0,0 +1,38 @@
+This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
+
+## Getting Started
+
+First, run the development server:
+
+```bash
+npm install
+
+npm run dev
+# or
+yarn dev
+# or
+pnpm dev
+# or
+bun dev
+```
+
+Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
+
+You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file.
+
+This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
+
+## Learn More
+
+To learn more about Next.js, take a look at the following resources:
+
+- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
+- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
+
+You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
+
+## Deploy on Vercel
+
+The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
+
+Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
diff --git a/frontend/cole.pdf b/frontend/cole.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..dc486fbbfece0d3e19e9b9a96e40c59c0b657a93
--- /dev/null
+++ b/frontend/cole.pdf
@@ -0,0 +1,4707 @@
+%PDF-1.7
+%
+1 0 obj
+<< /Metadata 3 0 R /Names 4 0 R /OpenAction 5 0 R /PageMode /UseOutlines /Pages 6 0 R /Type /Catalog >>
+endobj
+2 0 obj
+<< /Author (David Beauchemin; Yan Tremblay; Mohamed Amine Youssef; Richard Khoury) /Creator (arXiv GenPDF \(tex2pdf:\)) /DOI (https://doi.org/10.48550/arXiv.2510.05046) /License (http://creativecommons.org/licenses/by-sa/4.0/) /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.28 \(TeX Live 2025\) kpathsea version 6.4.1) /Producer (pikepdf 8.15.1) /Title (COLE: a Comprehensive Benchmark for French Language Understanding Evaluation) /Trapped /False /arXivID (https://arxiv.org/abs/2510.05046v2) >>
+endobj
+3 0 obj
+<< /Subtype /XML /Type /Metadata /Length 1673 >>
+stream
+
+
+
+ COLE: a Comprehensive Benchmark for French Language Understanding EvaluationDavid BeaucheminYan TremblayMohamed Amine YoussefRichard Khouryhttp://creativecommons.org/licenses/by-sa/4.0/cs.CL
+
+
+
+
+endstream
+endobj
+4 0 obj
+<< /Dests 7 0 R >>
+endobj
+5 0 obj
+<< /D [ 8 0 R /Fit ] /S /GoTo >>
+endobj
+6 0 obj
+<< /Count 19 /Kids [ 9 0 R 10 0 R 11 0 R 12 0 R ] /Type /Pages >>
+endobj
+7 0 obj
+<< /Kids [ 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R ] /Limits [ (Doc-Start) (table.caption.24) ] >>
+endobj
+8 0 obj
+<< /Annots [ 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R ] /Contents [ 45 0 R 46 0 R 47 0 R 48 0 R ] /MediaBox [ 0 0 595.276 841.89 ] /Parent 9 0 R /Resources 49 0 R /Type /Page >>
+endobj
+9 0 obj
+<< /Count 6 /Kids [ 8 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R ] /Parent 6 0 R /Type /Pages >>
+endobj
+10 0 obj
+<< /Count 6 /Kids [ 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R ] /Parent 6 0 R /Type /Pages >>
+endobj
+11 0 obj
+<< /Count 6 /Kids [ 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R ] /Parent 6 0 R /Type /Pages >>
+endobj
+12 0 obj
+<< /Count 1 /Kids [ 67 0 R ] /Parent 6 0 R /Type /Pages >>
+endobj
+13 0 obj
+<< /Kids [ 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R 73 0 R ] /Limits [ (Doc-Start) (cite.10.5555/2387636.2387697) ] >>
+endobj
+14 0 obj
+<< /Kids [ 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R ] /Limits [ (cite.N18-1101) (cite.deepthink1) ] >>
+endobj
+15 0 obj
+<< /Kids [ 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R ] /Limits [ (cite.deepthink2) (cite.rajpurkar-etal-2016-squad) ] >>
+endobj
+16 0 obj
+<< /Kids [ 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R ] /Limits [ (cite.rastogi2025magistral) (page.2) ] >>
+endobj
+17 0 obj
+<< /Kids [ 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R ] /Limits [ (page.3) (subsection.5.1) ] >>
+endobj
+18 0 obj
+<< /Kids [ 98 0 R 99 0 R 100 0 R ] /Limits [ (subsection.5.2) (table.caption.24) ] >>
+endobj
+19 0 obj
+<< /A << /D (cite.thirunavukarasu2023large) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 213.254 230.099 290.13 241.849 ] /Subtype /Link /Type /Annot >>
+endobj
+20 0 obj
+<< /A << /D (cite.thirunavukarasu2023large) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 69.87 216.549 93.172 228.3 ] /Subtype /Link /Type /Annot >>
+endobj
+21 0 obj
+<< /A << /D (cite.thirunavukarasu2023large) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 96.659 216.549 120.579 228.3 ] /Subtype /Link /Type /Annot >>
+endobj
+22 0 obj
+<< /A << /D (cite.beauchemin2024quebec) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 160.666 203.409 241.58 214.751 ] /Subtype /Link /Type /Annot >>
+endobj
+23 0 obj
+<< /A << /D (cite.beauchemin2024quebec) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 245.066 203.409 269.007 214.751 ] /Subtype /Link /Type /Annot >>
+endobj
+24 0 obj
+<< /A << /D (cite.wang-etal-2018-glue) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 209.524 135.254 258.899 147.005 ] /Subtype /Link /Type /Annot >>
+endobj
+25 0 obj
+<< /A << /D (cite.wang-etal-2018-glue) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 261.887 135.254 285.261 147.005 ] /Subtype /Link /Type /Annot >>
+endobj
+26 0 obj
+<< /A << /D (cite.le2020flaubert) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 405.754 601.834 442.309 613.176 ] /Subtype /Link /Type /Annot >>
+endobj
+27 0 obj
+<< /A << /D (cite.le2020flaubert) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 445.575 601.834 468.95 613.176 ] /Subtype /Link /Type /Annot >>
+endobj
+28 0 obj
+<< /A << /D (cite.xu-etal-2020-clue) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 346.273 588.285 385.225 599.627 ] /Subtype /Link /Type /Annot >>
+endobj
+29 0 obj
+<< /A << /D (cite.xu-etal-2020-clue) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 388.666 588.285 412.258 599.627 ] /Subtype /Link /Type /Annot >>
+endobj
+30 0 obj
+<< /A << /D (cite.le2020flaubert) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 445.282 520.539 482.718 531.881 ] /Subtype /Link /Type /Annot >>
+endobj
+31 0 obj
+<< /A << /D (cite.le2020flaubert) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 486.18 520.539 509.991 531.881 ] /Subtype /Link /Type /Annot >>
+endobj
+32 0 obj
+<< /A << /D (cite.gross1984lexicon) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 465.088 371.089 492.811 382.839 ] /Subtype /Link /Type /Annot >>
+endobj
+33 0 obj
+<< /A << /D (cite.gross1984lexicon) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 496.289 371.089 520.339 382.839 ] /Subtype /Link /Type /Annot >>
+endobj
+34 0 obj
+<< /A << /D (cite.rowlett2007syntax) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 397.903 357.54 433.964 369.29 ] /Subtype /Link /Type /Annot >>
+endobj
+35 0 obj
+<< /A << /D (cite.rowlett2007syntax) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 437.4 357.54 461.08 369.29 ] /Subtype /Link /Type /Annot >>
+endobj
+36 0 obj
+<< /A << /D (cite.abeille2002syntactic) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 399.425 343.991 491.368 355.741 ] /Subtype /Link /Type /Annot >>
+endobj
+37 0 obj
+<< /A << /D (cite.abeille2002syntactic) /S /GoTo >> /Border [ 0 0 0 ] /C [ 0 1 0 ] /H /I /Rect [ 496.035 343.991 520.282 355.741 ] /Subtype /Link /Type /Annot >>
+endobj
+38 0 obj
+<< /A << /S /URI /Type /Action /URI (https://huggingface.co/datasets/graalul/COLE-public) >> /Border [ 0 0 0 ] /C [ 0 1 1 ] /H /I /Rect [ 382.809 167.851 525.406 179.601 ] /Subtype /Link /Type /Annot >>
+endobj
+39 0 obj
+<< /A << /D (Hfootnote.1) /S /GoTo >> /Border [ 0 0 0 ] /C [ 1 0 0 ] /H /I /Rect [ 472.42 140.753 478.895 154.469 ] /Subtype /Link /Type /Annot >>
+endobj
+40 0 obj
+<< /A << /D (section.2) /S /GoTo >> /Border [ 0 0 0 ] /C [ 1 0 0 ] /H /I /Rect [ 480.784 113.654 525.406 125.405 ] /Subtype /Link /Type /Annot >>
+endobj
+41 0 obj
+<< /A << /D (section.3) /S /GoTo >> /Border [ 0 0 0 ] /C [ 1 0 0 ] /H /I /Rect [ 440.042 100.105 482.528 111.855 ] /Subtype /Link /Type /Annot >>
+endobj
+42 0 obj
+<< /A << /D (section.4) /S /GoTo >> /Border [ 0 0 0 ] /C [ 1 0 0 ] /H /I /Rect [ 354.94 86.556 399.559 98.306 ] /Subtype /Link /Type /Annot >>
+endobj
+43 0 obj
+<< /A << /S /URI /Type /Action /URI (https://huggingface.co/datasets/graalul/COLE-public) >> /Border [ 0 0 0 ] /C [ 0 1 1 ] /H /I /Rect [ 321.285 66.881 512.708 79.724 ] /Subtype /Link /Type /Annot >>
+endobj
+44 0 obj
+<< /A << /S /URI /URI (https://arxiv.org/abs/2510.05046v2) >> /BS << /W 0 >> /NM (fitz-L0) /Rect [ 12 253.185 32 588.705 ] /Subtype /Link >>
+endobj
+45 0 obj
+<< /Length 10 /Filter /FlateDecode >>
+stream
+x+ |
+endstream
+endobj
+46 0 obj
+<< /Filter /FlateDecode /Length 4400 >>
+stream
+xڥ[m6_cv0BB@>9moS+'3Lxf[켔v@$~[Co_ċ/^RhI!"/i <TFB_{6Iehus:Qh܈8XzwǓi?&a͗^b5a0f~_mޗa?`F4D(It,JfƍjeSc^4ukۊ\FEmdpn6IRq&lўJA/PhT 9tu$s;wC_&OCS&S!t_+fya9Y^+XBuʰBjPzu|>D#Æ]mrw4-Ofhxth
+3~6Ù} -/Κt(K/dWZ{[U<-h j-}]:؈4-,'j1N^}u)ei>{G ś݀_
%[Б*bP~ˇ>**_Ԑkw3x2uԷ}jHSh'RȭA]H#_mK:}p|πnq$l%l&oͮ_BQ6g *HtAh{~ڮX[of95-!2Ύ(ͰmS:H`E釖@\@ HFGqSQyLr\xh،.憞jJT8.t9hǼt7(#J^IRvXƗ ?XXL@(q3pNTv~aZtS_]ܗUٗCP9|iW
UQ$QWAag<9ԦzJLlZs>;ԆA 9К gGQkj?x,#=1b8WӄQ[C:t|}(;Fg0b趵&8O'^d_PFNbB}ÿGhX5Dm
+~dyhѤxBIT²yEHC\"(8W:~NV&ۯz%,İ3_{$
+Qh%жNרcE "qN p:vhiCwz,GǞWF]yɫmx9xzUD"՟RMښ*Č-ݰVzm}8nTb10RQSv^B1eBn GVU>(6TP# .Qx=lL8Xn 76p_A߷t3BsFc<dkѶJ߽⤶[@`{j{܀ʵQ}@ kd3@nyT8\ !bQ2/"e{Yx;9Զt#w2N0oЯƊTk]I