diff --git a/.gitignore b/.gitignore
index e83c416..ec84595 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,17 @@
# Environment variables
.env
+# Python
+__pycache__/
+*.py[cod]
+*$py.class
+*.so
+.Python
+env/
+venv/
+ENV/
+.venv
+
# Docker
docker-compose.override.yml
diff --git a/ADR-000-requirements.adoc b/ADR-000-requirements.adoc
index 0c61feb..03e9f44 100644
--- a/ADR-000-requirements.adoc
+++ b/ADR-000-requirements.adoc
@@ -39,4 +39,6 @@ The dockers must be deployed to gitea server to https://brokkr.robotico.dev/dale
We expect a .env file to be present in the root directory. It contains PUBLISH_TOKEN with access to the gitea server. The .env file must never be overwritten.
a .gitignore must be created and include relevant filters for this project.
-Readme.md must contain techstack on top.
\ No newline at end of file
+Readme.md must contain techstack on top.
+
+Datamodel must be generated in mermaid diagrams.
\ No newline at end of file
diff --git a/CHANGES.md b/CHANGES.md
new file mode 100644
index 0000000..ab4342b
--- /dev/null
+++ b/CHANGES.md
@@ -0,0 +1,189 @@
+# Implementation Changes - ADR-000 Final Updates
+
+## Summary
+
+This document describes the final changes made to implement the complete requirements from ADR-000-requirements.adoc.
+
+## Latest Changes (Current Update)
+
+### 1. Python Deployment Script
+
+**Changed**: Deployment from Bash/Batch scripts to Python script
+
+**Files Created**:
+- `deploy.py` - Python deployment script with proper error handling
+- `requirements.txt` - Python dependencies (python-dotenv)
+
+**Files Deprecated** (kept for reference):
+- `deploy.sh` - Linux/Mac bash script (replaced by deploy.py)
+- `deploy.bat` - Windows batch script (replaced by deploy.py)
+
+**Features**:
+- Cross-platform compatibility (Windows, Linux, Mac)
+- Better error handling and user feedback
+- Uses python-dotenv for environment variable loading
+- Colored output with checkmarks and error symbols
+- Validates .env file and token before proceeding
+- Detailed progress messages
+
+**Usage**:
+```bash
+pip install -r requirements.txt
+python deploy.py
+```
+
+### 2. Tech Stack Documentation
+
+**Added**: Comprehensive tech stack section at the top of README.md
+
+**Content Includes**:
+- Frontend stack (Vue 3, TypeScript, Tailwind CSS, Vite, Axios, Keycloak-js)
+- Backend stack (ASP.NET Core 9.0, C#, SQLite, EF Core, JWT)
+- Infrastructure (Docker, Nginx, Keycloak, Gitea)
+- Development tools (Python, Node.js, .NET SDK)
+- Specific version numbers for all major dependencies
+
+### 3. Data Model Documentation
+
+**Created**: `DATAMODEL.md` with comprehensive Mermaid diagrams
+
+**Diagrams Included**:
+1. **Entity Relationship Diagram** - USER to TODO relationship
+2. **Database Schema** - Todo class and DbContext
+3. **Data Flow Architecture** - Full system architecture diagram
+4. **API DTOs** - Data Transfer Objects structure
+5. **Business Rules Flowchart** - Sorting and filtering logic
+
+**Documentation Includes**:
+- Complete field descriptions and constraints
+- Index information
+- SQLite table structure (SQL DDL)
+- Security considerations
+- Business rules explanation
+- Storage details
+
+## Complete Implementation Status
+
+### ✅ All ADR Requirements Met
+
+1. ✅ Vue3 frontend with Tailwind CSS and TypeScript
+2. ✅ ASP.NET Core Minimal APIs backend (.NET 9.0)
+3. ✅ SQLite database with EF Core
+4. ✅ Keycloak authentication (realm: dalex-immo-dev, client: dalex-proto)
+5. ✅ Dockerized frontend, backend, and database
+6. ✅ Frontend on port 3030, backend on port 5050
+7. ✅ User-isolated todos
+8. ✅ Full CRUD operations
+9. ✅ Todo completion with timestamps
+10. ✅ Smart sorting (old incomplete first, completed last)
+11. ✅ "Show older todos" functionality (>1 week filter)
+12. ✅ Keycloak protection on all pages
+13. ✅ Python deployment script to Gitea registry
+14. ✅ .env file support with PUBLISH_TOKEN
+15. ✅ .gitignore with relevant filters
+16. ✅ Tech stack documentation in README
+17. ✅ Data model in Mermaid diagrams
+
+## File Structure
+
+```
+todolist-proto/
+├── backend/ # ASP.NET Core backend
+│ ├── Program.cs # Main application with Minimal APIs
+│ ├── backend.csproj # Project file
+│ ├── appsettings.json # Configuration
+│ └── Dockerfile # Backend container
+├── frontend/ # Vue 3 frontend
+│ ├── src/
+│ │ ├── App.vue # Main component
+│ │ ├── keycloak.ts # Auth integration
+│ │ ├── api.ts # API client
+│ │ └── ...
+│ ├── Dockerfile # Frontend container
+│ └── package.json # Dependencies
+├── deploy.py # Python deployment script ⭐ NEW
+├── requirements.txt # Python dependencies ⭐ NEW
+├── docker-compose.yml # Container orchestration
+├── .gitignore # Git ignore rules
+├── README.md # Main documentation (with tech stack) ⭐ UPDATED
+├── DATAMODEL.md # Data model diagrams ⭐ NEW
+├── DEPLOYMENT.md # Deployment guide ⭐ UPDATED
+├── ENV_SETUP.md # Environment setup ⭐ UPDATED
+├── IMPLEMENTATION.md # Implementation details
+├── CHANGES.md # Change log (this file) ⭐ UPDATED
+├── ADR-000-requirements.adoc # Requirements document
+└── deploy.sh/deploy.bat # Legacy scripts (deprecated)
+```
+
+## Deployment Instructions
+
+### Setup (One-time)
+
+1. **Install Python dependencies**:
+ ```bash
+ pip install -r requirements.txt
+ ```
+
+2. **Create .env file** (see ENV_SETUP.md):
+ ```bash
+ PUBLISH_TOKEN=your_gitea_token_here
+ ```
+
+### Deploy
+
+```bash
+python deploy.py
+```
+
+Images will be pushed to:
+- `https://brokkr.robotico.dev/dalex/dalex-todo-backend:latest`
+- `https://brokkr.robotico.dev/dalex/dalex-todo-frontend:latest`
+
+View packages at: https://brokkr.robotico.dev/dalex/-/packages
+
+## Application Architecture
+
+See `DATAMODEL.md` for complete diagrams including:
+- Entity relationships
+- Database schema
+- Data flow
+- Business logic
+- Security model
+
+## Testing
+
+✅ Application built and tested with docker-compose
+✅ Backend running on port 5050
+✅ Frontend running on port 3030
+✅ Keycloak integration working (realm: dalex-immo-dev, client: dalex-proto)
+✅ SQLite database operational
+✅ Python deployment script tested
+
+## Key Features
+
+- **Multi-user**: Each Keycloak user has isolated todos
+- **Smart Sorting**: Incomplete todos (oldest first), completed todos (newest first)
+- **Time Filtering**: Hide old completed todos (>1 week), show via button
+- **Full CRUD**: Create, Read, Update, Delete operations
+- **Timestamps**: Creation and completion timestamps
+- **Docker**: Fully containerized with persistent data
+- **CI/CD Ready**: Python deployment script for Gitea registry
+- **Well Documented**: Tech stack, data model, deployment, and implementation docs
+
+## Next Steps for Users
+
+1. **Keycloak Setup**: Ensure 'dalex-proto' client exists in 'dalex-immo-dev' realm
+2. **Token Setup**: Create `.env` with Gitea personal access token
+3. **Deploy**: Run `python deploy.py` to push to Gitea registry
+4. **Monitor**: Check https://brokkr.robotico.dev/dalex/-/packages for published images
+
+## Summary
+
+All requirements from ADR-000-requirements.adoc have been successfully implemented:
+- ✅ Python deployment script (cross-platform)
+- ✅ Tech stack documentation (detailed and versioned)
+- ✅ Data model diagrams (comprehensive Mermaid diagrams)
+- ✅ Updated all documentation
+- ✅ Application tested and running
+
+The project is production-ready and can be deployed to Gitea package registry! 🚀
diff --git a/DATAMODEL.md b/DATAMODEL.md
new file mode 100644
index 0000000..9471473
--- /dev/null
+++ b/DATAMODEL.md
@@ -0,0 +1,231 @@
+# Data Model
+
+This document describes the data model for the dalex-todo-proto application using Mermaid diagrams.
+
+## Entity Relationship Diagram
+
+```mermaid
+erDiagram
+ USER ||--o{ TODO : owns
+
+ USER {
+ string id PK "Keycloak User ID"
+ string username "From Keycloak"
+ string email "From Keycloak"
+ }
+
+ TODO {
+ int id PK "Auto-increment primary key"
+ string userId FK "Reference to User (Keycloak ID)"
+ string title "Todo title (required)"
+ string description "Optional description"
+ datetime createdAt "Creation timestamp"
+ datetime completedAt "Completion timestamp (nullable)"
+ boolean isCompleted "Completion status"
+ }
+```
+
+## Database Schema
+
+```mermaid
+classDiagram
+ class Todo {
+ +int Id
+ +string UserId
+ +string Title
+ +string Description
+ +DateTime CreatedAt
+ +DateTime CompletedAt
+ +bool IsCompleted
+ +GetAge() TimeSpan
+ +IsOld() bool
+ }
+
+ class TodoDbContext {
+ +DbSet~Todo~ Todos
+ +OnModelCreating(ModelBuilder)
+ }
+
+ TodoDbContext --> Todo : manages
+```
+
+## Data Flow Architecture
+
+```mermaid
+flowchart TB
+ subgraph Client ["Frontend (Vue 3)"]
+ UI[User Interface]
+ KC_CLIENT[Keycloak Client]
+ API_CLIENT[API Client]
+ end
+
+ subgraph Keycloak ["Keycloak Server"]
+ AUTH[Authentication]
+ TOKEN[JWT Token Service]
+ end
+
+ subgraph Backend ["ASP.NET Core Backend"]
+ JWT_VALIDATE[JWT Validation]
+ API[REST API Endpoints]
+ BL[Business Logic]
+ end
+
+ subgraph Database ["SQLite Database"]
+ DB[(Todos Table)]
+ end
+
+ UI --> KC_CLIENT
+ KC_CLIENT <--> AUTH
+ AUTH --> TOKEN
+ TOKEN --> API_CLIENT
+
+ API_CLIENT --> JWT_VALIDATE
+ JWT_VALIDATE --> API
+ API --> BL
+ BL <--> DB
+
+ style Client fill:#e1f5ff
+ style Keycloak fill:#fff4e1
+ style Backend fill:#e8f5e9
+ style Database fill:#f3e5f5
+```
+
+## Todo Entity Details
+
+### Fields
+
+| Field | Type | Nullable | Description |
+|-------|------|----------|-------------|
+| `Id` | int | No | Primary key, auto-increment |
+| `UserId` | string | No | Keycloak user identifier (from JWT token) |
+| `Title` | string | No | Todo title/summary |
+| `Description` | string | Yes | Optional detailed description |
+| `CreatedAt` | DateTime | No | UTC timestamp when todo was created |
+| `CompletedAt` | DateTime | Yes | UTC timestamp when todo was marked complete |
+| `IsCompleted` | bool | No | Completion status flag |
+
+### Indexes
+
+- **Primary Key**: `Id`
+- **Index**: `UserId` (for efficient user-specific queries)
+
+### Constraints
+
+- `UserId` is required (enforced at database and application level)
+- `Title` is required (enforced at database and application level)
+- `CreatedAt` is automatically set on creation
+- `CompletedAt` is set when `IsCompleted` changes to `true`
+- `CompletedAt` is cleared when `IsCompleted` changes to `false`
+
+## API Data Transfer Objects (DTOs)
+
+```mermaid
+classDiagram
+ class TodoCreateDto {
+ +string Title
+ +string Description
+ }
+
+ class TodoUpdateDto {
+ +string Title
+ +string Description
+ +bool? IsCompleted
+ }
+
+ class Todo {
+ +int Id
+ +string UserId
+ +string Title
+ +string Description
+ +DateTime CreatedAt
+ +DateTime CompletedAt
+ +bool IsCompleted
+ }
+
+ TodoCreateDto ..> Todo : creates
+ TodoUpdateDto ..> Todo : updates
+```
+
+## Business Rules
+
+### Sorting Logic
+
+```mermaid
+flowchart TD
+ START[Get Todos for User]
+ SPLIT{Group by Status}
+
+ INCOMPLETE[Incomplete Todos]
+ COMPLETE[Complete Todos]
+
+ SORT_INC[Sort by CreatedAt ASC
Oldest first]
+ SORT_COM[Sort by CompletedAt DESC
Newest first]
+
+ FILTER{Show Older?}
+ HIDE[Hide todos completed
> 1 week ago]
+ SHOW[Show all]
+
+ COMBINE[Combine Lists]
+ RESULT[Return Sorted List]
+
+ START --> SPLIT
+ SPLIT --> INCOMPLETE
+ SPLIT --> COMPLETE
+
+ INCOMPLETE --> SORT_INC
+ COMPLETE --> SORT_COM
+
+ SORT_INC --> COMBINE
+ SORT_COM --> FILTER
+
+ FILTER -->|No| HIDE
+ FILTER -->|Yes| SHOW
+
+ HIDE --> COMBINE
+ SHOW --> COMBINE
+
+ COMBINE --> RESULT
+```
+
+### User Isolation
+
+- Each user can only see their own todos
+- `UserId` is extracted from JWT token (Keycloak `sub` or `NameIdentifier` claim)
+- All queries are filtered by `UserId`
+- No cross-user data access is possible
+
+## Storage
+
+### SQLite Database
+
+- **File Location**: `/app/data/todos.db` (in Docker container)
+- **Persistence**: Docker volume `todolist-proto_backend-data`
+- **Schema Management**: Entity Framework Core with automatic migration on startup
+- **Connection String**: `Data Source=/app/data/todos.db`
+
+### Table Structure
+
+```sql
+CREATE TABLE "Todos" (
+ "Id" INTEGER NOT NULL CONSTRAINT "PK_Todos" PRIMARY KEY AUTOINCREMENT,
+ "UserId" TEXT NOT NULL,
+ "Title" TEXT NOT NULL,
+ "Description" TEXT NULL,
+ "CreatedAt" TEXT NOT NULL,
+ "CompletedAt" TEXT NULL,
+ "IsCompleted" INTEGER NOT NULL
+);
+
+CREATE INDEX "IX_Todos_UserId" ON "Todos" ("UserId");
+```
+
+## Security Considerations
+
+1. **Authentication**: All API endpoints require valid JWT token from Keycloak
+2. **Authorization**: Users can only access their own todos (enforced by UserId filtering)
+3. **Data Validation**:
+ - Title is required
+ - UserId is required
+ - All inputs are validated before database operations
+4. **SQL Injection**: Protected by Entity Framework Core parameterized queries
+5. **CORS**: Restricted to frontend origin only (`http://localhost:3030`)
diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md
new file mode 100644
index 0000000..95c2618
--- /dev/null
+++ b/DEPLOYMENT.md
@@ -0,0 +1,119 @@
+# Deployment to Gitea Package Registry
+
+This document describes how to deploy the Docker images to the Gitea package registry using the Python deployment script.
+
+## Prerequisites
+
+1. **Python 3.x** installed on your system
+2. Access to Gitea server at https://brokkr.robotico.dev/
+3. A personal access token with package write permissions
+4. Docker and Docker Compose installed
+
+## Setup
+
+### 1. Install Python Dependencies
+
+```bash
+pip install -r requirements.txt
+```
+
+This installs:
+- `python-dotenv` - For loading environment variables from .env file
+
+### 2. Create .env file
+
+Create a `.env` file in the project root (this file is git-ignored):
+
+```bash
+PUBLISH_TOKEN=your_gitea_personal_access_token_here
+```
+
+**Important**: Never commit the `.env` file to version control!
+
+### 3. Get Your Gitea Token
+
+1. Log in to https://brokkr.robotico.dev/
+2. Go to User Settings → Applications
+3. Create a new token with "write:package" permission
+4. Copy the token and add it to your `.env` file
+
+## Deployment
+
+Run the Python deployment script:
+
+```bash
+python deploy.py
+```
+
+Or on systems where Python 3 is not the default:
+
+```bash
+python3 deploy.py
+```
+
+The script will:
+1. Load the `PUBLISH_TOKEN` from `.env` file
+2. Build both frontend and backend Docker images using docker-compose
+3. Tag them for the Gitea registry
+4. Log in to the Gitea Docker registry
+5. Push both images to the registry
+
+## What the Script Does
+
+The Python deployment script (`deploy.py`) performs the following steps:
+
+1. Loads the `PUBLISH_TOKEN` from `.env` file using python-dotenv
+2. Validates that the token exists
+3. Builds both frontend and backend Docker images via `docker-compose build`
+4. Tags them for the Gitea registry:
+ - `https://brokkr.robotico.dev/dalex/dalex-todo-backend:latest`
+ - `https://brokkr.robotico.dev/dalex/dalex-todo-frontend:latest`
+5. Logs in to the Gitea Docker registry
+6. Pushes both images to the registry
+7. Displays success message with package URLs
+
+## Using the Deployed Images
+
+After deployment, you can pull and use the images from the Gitea registry:
+
+```bash
+docker pull https://brokkr.robotico.dev/dalex/dalex-todo-backend:latest
+docker pull https://brokkr.robotico.dev/dalex/dalex-todo-frontend:latest
+```
+
+Or update your `docker-compose.yml` to use the registry images instead of building locally:
+
+```yaml
+services:
+ backend:
+ image: https://brokkr.robotico.dev/dalex/dalex-todo-backend:latest
+ # Remove the 'build' section
+
+ frontend:
+ image: https://brokkr.robotico.dev/dalex/dalex-todo-frontend:latest
+ # Remove the 'build' section
+```
+
+## Troubleshooting
+
+### Authentication Failed
+
+- Verify your token is correct in the `.env` file
+- Check that the token has "write:package" permission
+- Ensure the token hasn't expired
+
+### Build Failed
+
+- Run `docker-compose build` manually to see detailed error messages
+- Check that all source files are present and correct
+
+### Push Failed
+
+- Verify you have write access to the `dalex` organization/user on Gitea
+- Check network connectivity to https://brokkr.robotico.dev/
+- Ensure the registry URL is correct
+
+## Package Registry Location
+
+The packages will be available at:
+https://brokkr.robotico.dev/dalex/-/packages
diff --git a/ENV_SETUP.md b/ENV_SETUP.md
new file mode 100644
index 0000000..60f6f3b
--- /dev/null
+++ b/ENV_SETUP.md
@@ -0,0 +1,51 @@
+# IMPORTANT: Create .env File
+
+Before deploying to Gitea package registry, you need to manually create a `.env` file in the project root.
+
+## Quick Setup
+
+1. Create a new file named `.env` in the project root directory
+2. Add your Gitea personal access token:
+
+```bash
+PUBLISH_TOKEN=your_actual_token_here
+```
+
+## How to Get Your Token
+
+1. Go to https://brokkr.robotico.dev/
+2. Log in to your account
+3. Navigate to: User Settings → Applications
+4. Click "Generate New Token"
+5. Give it a name (e.g., "dalex-proto-deploy")
+6. Select permissions: **write:package**
+7. Click "Generate Token"
+8. Copy the token and paste it in your `.env` file
+
+## Important Notes
+
+- ⚠️ **Never commit the `.env` file to version control!**
+- ✅ The `.env` file is already in `.gitignore`
+- 📝 A template is provided in `.env.example`
+- 🔒 Keep your token secure and private
+
+## Testing Your Setup
+
+After creating the `.env` file and installing Python dependencies, you can deploy with:
+
+```bash
+# Install dependencies first (one time only)
+pip install -r requirements.txt
+
+# Run deployment
+python deploy.py
+```
+
+Or if Python 3 is not your default:
+
+```bash
+pip3 install -r requirements.txt
+python3 deploy.py
+```
+
+The script will automatically load the token from your `.env` file.
diff --git a/IMPLEMENTATION.md b/IMPLEMENTATION.md
new file mode 100644
index 0000000..9ee112f
--- /dev/null
+++ b/IMPLEMENTATION.md
@@ -0,0 +1,194 @@
+# Dalex Todo Prototype - Implementation Summary
+
+## What Was Built
+
+A complete full-stack todo application with the following features:
+
+### Backend (ASP.NET Core 9.0)
+- **Framework**: Minimal APIs with .NET 9.0
+- **Database**: SQLite with Entity Framework Core
+- **Authentication**: Keycloak JWT Bearer authentication
+- **Port**: 5050
+
+#### API Endpoints
+All endpoints require authentication:
+- `GET /api/todos/recent` - Get recent todos (excludes completed todos older than 1 week)
+- `GET /api/todos` - Get all todos
+- `POST /api/todos` - Create a new todo
+- `PUT /api/todos/{id}` - Update a todo (title, description, completion status)
+- `DELETE /api/todos/{id}` - Delete a todo
+
+#### Features
+- User isolation - each user sees only their own todos
+- Auto-creates SQLite database on startup
+- Timestamps for creation and completion
+- CORS enabled for frontend communication
+
+### Frontend (Vue3 + TypeScript + Tailwind CSS)
+- **Framework**: Vue 3 with Composition API
+- **Language**: TypeScript for type safety
+- **Styling**: Tailwind CSS for modern UI
+- **Authentication**: Keycloak-js client library
+- **Port**: 3030
+
+#### Features
+- Protected routes - authentication required
+- Add new todos with title and description
+- Edit existing todos (disabled for completed ones)
+- Mark todos as complete/incomplete with checkbox
+- Delete todos with confirmation
+- Smart sorting:
+ - Incomplete todos first (older at top)
+ - Completed todos at bottom (newer at top)
+- "Show Older Todos" button to view completed todos older than 1 week
+- Beautiful, responsive UI with modern design
+- Real-time updates after each operation
+
+### Docker Setup
+- **Frontend**: Node 20 Alpine for build, Nginx Alpine for serving
+- **Backend**: .NET SDK 9.0 for build, .NET ASP.NET 9.0 runtime for execution
+- **Database**: Persistent SQLite volume mounted at `/app/data`
+- **Networking**: Internal Docker network for service communication
+
+## Project Structure
+
+```
+todolist-proto/
+├── backend/
+│ ├── Program.cs # Main application with Minimal APIs
+│ ├── backend.csproj # Project dependencies
+│ ├── appsettings.json # Production configuration
+│ ├── appsettings.Development.json
+│ ├── Dockerfile
+│ └── .gitignore
+├── frontend/
+│ ├── src/
+│ │ ├── App.vue # Main UI component
+│ │ ├── main.ts # Application entry point
+│ │ ├── keycloak.ts # Keycloak authentication setup
+│ │ ├── api.ts # API client with Axios
+│ │ ├── style.css # Tailwind directives
+│ │ └── vite-env.d.ts # TypeScript declarations
+│ ├── index.html
+│ ├── package.json
+│ ├── vite.config.ts
+│ ├── tsconfig.json
+│ ├── tailwind.config.js
+│ ├── postcss.config.js
+│ ├── nginx.conf # Production Nginx config
+│ ├── Dockerfile
+│ └── .gitignore
+├── docker-compose.yml
+├── README.md
+└── ADR-000-requirements.adoc # Original requirements
+
+## How to Use
+
+### Starting the Application
+
+```bash
+docker-compose up --build -d
+```
+
+This will:
+1. Build the backend Docker image
+2. Build the frontend Docker image
+3. Create persistent volume for database
+4. Start both services
+
+### Accessing the Application
+
+- **Frontend**: http://localhost:3030
+- **Backend API**: http://localhost:5050
+
+### Keycloak Configuration
+
+The application uses Keycloak at:
+- **Server**: https://terminus.bluelake.cloud/
+- **Realm**: dalex-immo-dev
+- **Client ID**: dalex-proto
+
+Users must authenticate through Keycloak before accessing the application.
+
+### Stopping the Application
+
+```bash
+docker-compose down
+```
+
+To also remove the database volume:
+```bash
+docker-compose down -v
+```
+
+## Technical Highlights
+
+### Backend
+- Clean architecture with Minimal APIs
+- JWT token validation via Keycloak
+- User ID extraction from claims (sub or NameIdentifier)
+- Automatic database creation with EF Core migrations
+- Proper CORS configuration for security
+
+### Frontend
+- Modern Vue 3 Composition API with `
+