Skip to content

Conversation

@Neiland85
Copy link
Owner

🔧 Cambios realizados

CI/CD Workflows

  • Corregido autenticación GHCR: Cambió de GHCR_PAT a GITHUB_TOKEN automático
  • Eliminada línea duplicada: Resuelto error de sintaxis YAML en lint.yml
  • Permisos configurados: Añadido packages: write para push de imágenes Docker

Beneficios

  • 🔐 Mayor seguridad: Usa token automático que se regenera en cada ejecución
  • 🚀 Sin configuración manual: No requiere crear PATs adicionales
  • Workflows limpios: Sintaxis YAML correcta sin errores

📋 Configuración pendiente (Post-merge)

Para que el deploy a Railway funcione, necesitas configurar:

1. Railway Token

# En GitHub: Settings → Secrets → Actions → New secret
Name: RAILWAY_TOKEN
Value: <tu-token-de-railway>

Para obtener el token de Railway:

  1. Ve a Railway Dashboard
  2. Genera un nuevo token
  3. Cópialo y agrégalo como secreto en GitHub

2. Service ID

Reemplaza en .github/workflows/deploy.yml línea 17:

SERVICE_ID: "REPLACE_ME"  # ← Reemplaza con tu Railway Service ID

Para obtener el Service ID:

railway status
# O desde Railway Dashboard → Project → Settings → Service ID

✅ Checklist

  • GITHUB_TOKEN configurado
  • Workflows sin errores de sintaxis
  • Permisos correctos en workflows
  • RAILWAY_TOKEN en secrets (configurar después del merge)
  • SERVICE_ID actualizado (configurar después del merge)

🧪 Testing

Los workflows están validados y listos. El deploy se ejecutará automáticamente al hacer merge a main.


🎯 Ready to merge - Los cambios de CI/CD están completos y funcionales.

Copilot AI review requested due to automatic review settings December 11, 2025 05:26
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR aims to fix GHCR (GitHub Container Registry) authentication and GitHub Actions workflow configuration by migrating from personal access tokens (GHCR_PAT) to the automatically provided GITHUB_TOKEN, adding proper package write permissions, and improving the deployment pipeline with fallback mechanisms.

Key Changes:

  • Switched main deployment workflow from GHCR_PAT to GITHUB_TOKEN for automatic authentication
  • Added comprehensive CI pipeline with quality checks, linting, and security scanning
  • Implemented multi-stage Docker build with security hardening and non-root user
  • Major documentation overhaul with new "glitch-themed" README style

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 17 comments.

Show a summary per file
File Description
.github/workflows/deploy.yml Complete rewrite with GITHUB_TOKEN auth, Railway CLI fallback, and GHCR integration
.github/workflows/ci.yml New quality checks workflow with Python 3.11/3.12 matrix testing
.github/workflows/test.yml Minor naming fix (dash instead of en-dash)
.github/workflows/security.yml Minor naming fix (dash instead of en-dash)
deploy_v2.yml Alternative deployment workflow (still using deprecated GHCR_PAT)
app/config.py Added BaseAppSettings class with telemetry and CI detection logic
app/telemetry.py New telemetry module with startup/shutdown event handlers
config.py New root config with pytest environment detection
Dockerfile Rewritten as secure multi-stage build with Python 3.11-slim
.python-version Specifies Python 3.11.8 for development
README.md Complete documentation rewrite with "glitch-themed" styling

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 53 to +55
```python
# Core Dependencies - requirements.txt
fastapi==0.104.1 # ⚡ Modern web framework
uvicorn[standard]==0.24.0 # 🚀 ASGI server
jinja2==3.1.3 # 🎭 Template engine
python-multipart==0.0.9 # 📤 File upload support
pydantic==2.5.0 # ✅ Data validation
```

| **🔧 Component** | **📂 Implementation** | **🎯 Purpose** |
|---|---|---|
| **Main App** | [`app/main.py`](./app/main.py) | FastAPI application setup, middleware, routing |
| **Dashboard Router** | [`app/backoffice/router.py`](./app/backoffice/router.py) | Admin panel endpoints and business logic |
| **Templates** | [`app/backoffice/templates/`](./app/backoffice/templates/) | Jinja2 HTML templates with Bootstrap 5 |
| **Authentication** | [`app/auth/dependencies.py`](./app/auth/dependencies.py) | API key authentication system |
| **Utilities** | [`app/utils/`](./app/utils/) | Logging, helpers, and common functions |

---

## 📂 **Project Structure**

```
🏦 NeuroBank-FastAPI-Toolkit/
├── 📱 app/ # Main application
│ ├── 🏠 main.py # FastAPI app configuration
│ ├── 🔐 auth/ # Authentication system
│ │ └── dependencies.py # API key verification
│ ├── 🎯 backoffice/ # Admin dashboard
│ │ ├── 🔗 router.py # Dashboard routes & APIs
│ │ └── 🎨 templates/ # HTML templates
│ │ ├── basic_dashboard.html # Main dashboard
│ │ ├── admin_transactions.html # Transaction management
│ │ └── dashboard.html # Advanced dashboard
│ ├── 📊 routers/ # API routers
│ │ └── operator.py # Banking operations
│ └── 🛠️ utils/ # Utilities
│ └── logging.py # Structured logging
├── 🚀 deploy_production.sh # One-click deployment
├── 🐳 docker-compose.prod.yml # Production Docker setup
├── 🔧 start_production.sh # Production startup script
├── ⚙️ neurobank-fastapi.service # Systemd service
├── 🌐 nginx/nginx.conf # Reverse proxy config
├── 📋 requirements.txt # Python dependencies
├── 📖 README.md # This amazing documentation
├── 📄 PRODUCTION_README.md # Production deployment guide
├── 🔢 VERSION # Semantic versioning
└── 🗃️ data/ # Database & logs
└── app.log # Application logs
```

### **🎯 Key Files Deep Dive**

| **📄 File** | **🎪 Lines** | **🎯 Key Functions** | **💡 Description** |
|---|---|---|---|
| [`app/main.py`](./app/main.py) | 241 lines | `create_app()`, CORS setup | Main FastAPI application with middleware |
| [`app/backoffice/router.py`](./app/backoffice/router.py) | 200+ lines | Dashboard routes, APIs | Complete admin panel backend |
| [`deploy_production.sh`](./deploy_production.sh) | 300+ lines | Production deployment | Automated deployment script |
| [`templates/basic_dashboard.html`](./app/backoffice/templates/basic_dashboard.html) | 400+ lines | Dashboard UI | Professional banking interface |

---

## 🌐 **API Endpoints**

### 📊 **Backoffice Dashboard APIs**

```mermaid
graph TD
subgraph "🎯 Dashboard Endpoints"
A[🏠 GET /backoffice/] --> A1[📊 Main Dashboard]
B[💳 GET /backoffice/admin/transactions] --> B1[💼 Transaction Management]
C[👥 GET /backoffice/admin/users] --> C1[👤 User Administration]
D[📈 GET /backoffice/admin/reports] --> D1[📋 Financial Reports]
end
subgraph "🔧 Data APIs"
E[📊 GET /backoffice/api/metrics] --> E1[📈 Real-time Metrics]
F[🔍 GET /backoffice/api/transactions/search] --> F1[🔎 Transaction Search]
G[🏥 GET /backoffice/api/system-health] --> G1[❤️ System Health]
H[ℹ️ GET /backoffice/info] --> H1[📋 System Information]
end
style A fill:#1e3a8a,stroke:#fff,color:#fff
style E fill:#10b981,stroke:#fff,color:#fff
```

### **🎯 Endpoint Details**

<details>
<summary><b>🏠 Dashboard Endpoints</b></summary>

#### **Main Dashboard**
```http
GET /backoffice/
```
- **File**: [`app/backoffice/router.py:55`](./app/backoffice/router.py#L55)
- **Template**: [`basic_dashboard.html`](./app/backoffice/templates/basic_dashboard.html)
- **Features**: Real-time metrics, animated counters, system health

#### **Transaction Management**
```http
GET /backoffice/admin/transactions
```
- **File**: [`app/backoffice/router.py:155`](./app/backoffice/router.py#L155)
- **Features**: Advanced filtering, pagination, export functionality

</details>

<details>
<summary><b>🔧 API Endpoints</b></summary>

#### **Real-time Metrics**
```http
GET /backoffice/api/metrics
```
- **Response**:
```json
{
"total_transactions": 156,
"total_volume": 42350.00,
"active_accounts": 89,
"success_rate": 98.7,
"avg_response_time": 67.3,
"api_calls_today": 642
}
```

#### **Transaction Search**
```http
GET /backoffice/api/transactions/search?page=1&page_size=20&status=completed
```
- **Parameters**: `query`, `status`, `transaction_type`, `page`, `page_size`
- **Response**: Paginated transaction list with metadata

</details>

---

## 🚀 **Production Deployment**

### **🎯 Deployment Architecture**

```mermaid
graph TD
subgraph "☁️ Production Environment"
LB[🌐 Load Balancer<br/>Nginx + SSL]
subgraph "🚀 Application Servers"
APP1[⚡ FastAPI Instance 1<br/>Gunicorn + Uvicorn]
APP2[⚡ FastAPI Instance 2<br/>Gunicorn + Uvicorn]
APP3[⚡ FastAPI Instance 3<br/>Gunicorn + Uvicorn]
end
subgraph "💾 Data Layer"
DB[(🗄️ SQLite Database)]
CACHE[(🔄 Redis Cache)]
end
subgraph "📊 Monitoring"
HEALTH[🏥 Health Checks]
METRICS[📈 Metrics Collection]
LOGS[📋 Centralized Logging]
end
end
LB --> APP1
LB --> APP2
LB --> APP3
APP1 --> DB
APP2 --> DB
APP3 --> DB
APP1 --> CACHE
APP2 --> CACHE
APP3 --> CACHE
APP1 --> HEALTH
APP2 --> METRICS
APP3 --> LOGS
style LB fill:#10b981,stroke:#fff,color:#fff
style APP1 fill:#1e3a8a,stroke:#fff,color:#fff
style APP2 fill:#1e3a8a,stroke:#fff,color:#fff
style APP3 fill:#1e3a8a,stroke:#fff,color:#fff
```

### **🎪 Deployment Options**

| **🚀 Method** | **⚡ Command** | **🎯 Best For** | **📄 Config File** |
|---|---|---|---|
| **🐳 Docker** | `docker-compose -f docker-compose.prod.yml up -d` | Production | [`docker-compose.prod.yml`](./docker-compose.prod.yml) |
| **🔧 Direct** | `./start_production.sh` | Development/Testing | [`start_production.sh`](./start_production.sh) |
| **⚙️ Systemd** | `sudo systemctl start neurobank-fastapi` | Linux Servers | [`neurobank-fastapi.service`](./neurobank-fastapi.service) |
| **🎯 One-Click** | `./deploy_production.sh` | Full Setup | [`deploy_production.sh`](./deploy_production.sh) |

### **🔧 Production Configuration**

<details>
<summary><b>🐳 Docker Production Setup</b></summary>

```yaml
# docker-compose.prod.yml
version: '3.8'
services:
neurobank-api:
build:
context: .
dockerfile: Dockerfile.prod
ports:
- "8000:8000"
environment:
- APP_ENV=production
- LOG_LEVEL=info
restart: unless-stopped

nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
depends_on:
- neurobank-api
```
</details>
<details>
<summary><b>⚙️ Environment Variables</b></summary>
```bash
# .env.prod - Production Environment
APP_NAME=NeuroBank FastAPI Toolkit
APP_VERSION=1.0.0
ENVIRONMENT=production
DEBUG=false
LOG_LEVEL=info
HOST=0.0.0.0
PORT=8000
WORKERS=4
```

</details>

---

## 🧪 **Testing & Development**

### **🔬 Running Tests**

```bash
# Install test dependencies
pip install pytest pytest-asyncio httpx

# Run all tests
# nosec B104
uvicorn.run(app, host="0.0.0.0")
Copy link

Copilot AI Dec 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment "# nosec B104" is used to suppress security warnings about binding to 0.0.0.0. However, this comment appears on a line that is incomplete/malformed Python code. The code shows a partial uvicorn.run call without proper context. If this is meant to be documentation, it should be properly formatted in a code block.

Copilot uses AI. Check for mistakes.
<strong>🎯 Designed specifically to impress Banking Industry Recruiters</strong><br>
<em>Showcasing Enterprise-Level Python/FastAPI Development Skills</em>
</p>
yaml
Copy link

Copilot AI Dec 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inconsistent markdown formatting. The word "yaml" appears standalone on line 17 without proper code fence markers, suggesting incomplete markdown. This should either be removed or properly formatted as part of a code block.

Suggested change
yaml

Copilot uses AI. Check for mistakes.
Comment on lines +56 to +59
🧬 Config System (Pydantic v2)
python
Copiar código
class Settings(BaseSettings):
Copy link

Copilot AI Dec 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation shows incomplete/malformed code examples. Line 56 starts with "🧬 Config System (Pydantic v2)" followed by "python" on line 57 without proper markdown code fence formatting. These should be properly formatted as markdown headers and code blocks.

Copilot uses AI. Check for mistakes.
Comment on lines +68 to +76
Defaults

.env

.env.test (pytest only)

System env

CI overrides
Copy link

Copilot AI Dec 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation formatting is inconsistent. The section shows unformatted text without proper markdown structure. Lines 66-77 appear to be a bulleted list that's not properly formatted with markdown list syntax (missing - or * prefixes).

Suggested change
Defaults
.env
.env.test (pytest only)
System env
CI overrides
- Defaults
- .env
- .env.test (pytest only)
- System env
- CI overrides

Copilot uses AI. Check for mistakes.
Comment on lines +90 to +92
🐳 Docker (Secure Multi-Stage)
dockerfile
Copiar código
Copy link

Copilot AI Dec 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation shows unformatted text "🐳 Docker (Secure Multi-Stage)" followed by "dockerfile" without proper markdown code block formatting. This should be formatted as a proper markdown section with code fences.

Copilot uses AI. Check for mistakes.
Comment on lines +99 to +118
🔁 CI/CD Summary
Lint
black

isort

Test
pytest

# Run with coverage
pytest --cov=app --cov-report=html

# Run specific test file
pytest tests/test_backoffice.py -v
```

### **🛠️ Development Setup**

```bash
# 1. Clone and setup
git clone https://github.com/Neiland85/NeuroBank-FastAPI-Toolkit.git
cd NeuroBank-FastAPI-Toolkit

# 2. Create virtual environment
python -m venv venv
source venv/bin/activate # Linux/Mac
# venv\Scripts\activate # Windows

# 3. Install dependencies
pip install -r requirements.txt

# 4. Start development server
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

# 5. Open browser
open http://localhost:8000/backoffice/
```

### **🎯 Development Workflow**

```mermaid
graph LR
A[👨‍💻 Code Changes] --> B[🧪 Local Testing]
B --> C[🔄 Git Commit]
C --> D[📤 Push to Feature Branch]
D --> E[🔍 Pull Request Review]
E --> F[✅ Merge to Develop]
F --> G[🚀 Deploy to Production]
style A fill:#3b82f6,stroke:#fff,color:#fff
style G fill:#10b981,stroke:#fff,color:#fff
```

---

## 📊 **Monitoring & Health**

### **🏥 Health Check System**

| **🔍 Endpoint** | **📊 Metrics** | **🎯 Purpose** |
|---|---|---|
| [`/health`](http://localhost:8000/health) | System status, uptime, response time | Load balancer health checks |
| [`/backoffice/api/system-health`](http://localhost:8000/backoffice/api/system-health) | Database, cache, API gateway status | Detailed system monitoring |
| [`/backoffice/api/metrics`](http://localhost:8000/backoffice/api/metrics) | Business metrics, transaction stats | Real-time dashboard data |

### **📈 Monitoring Dashboard**

```mermaid
graph TB
subgraph "📊 Metrics Collection"
A[⚡ API Response Times]
B[💳 Transaction Volumes]
C[👥 Active Users]
D[💾 Database Health]
E[🔄 Cache Performance]
end
subgraph "🎯 Monitoring Tools"
F[📈 Grafana Dashboards]
G[🚨 Alerting System]
H[📋 Log Aggregation]
I[🔍 Performance Profiling]
end
A --> F
B --> F
C --> G
D --> H
E --> I
style F fill:#1e3a8a,stroke:#fff,color:#fff
style G fill:#ef4444,stroke:#fff,color:#fff
```

---

## 🔒 **Security Features**

### **🛡️ Security Implementation**

| **🔒 Feature** | **📂 Implementation** | **🎯 Protection** |
|---|---|---|
| **API Key Authentication** | [`app/auth/dependencies.py`](./app/auth/dependencies.py) | Endpoint protection |
| **CORS Configuration** | [`app/main.py:45`](./app/main.py#L45) | Cross-origin security |
| **Input Validation** | Pydantic models | Data integrity |
| **SQL Injection Prevention** | ORM usage | Database security |
| **Security Headers** | [`nginx/nginx.conf`](./nginx/nginx.conf) | HTTP security |

### **🔐 Authentication Flow**

```mermaid
sequenceDiagram
participant C as 👤 Client
participant A as 🔐 Auth Middleware
participant B as ⚡ Backend API
participant D as 💾 Database
C->>A: Request with API Key
A->>A: Validate API Key
alt ✅ Valid Key
A->>B: Forward Request
B->>D: Database Query
D->>B: Return Data
B->>C: ✅ Success Response
else ❌ Invalid Key
A->>C: ❌ 401 Unauthorized
end
```

---

## 📈 **Performance**

### **⚡ Performance Metrics**

| **🎯 Metric** | **📊 Target** | **🔍 Current** | **🛠️ Optimization** |
|---|---|---|---|
| **API Response Time** | < 100ms | ~67ms | ✅ Async/await patterns |
| **Database Queries** | < 50ms | ~23ms | ✅ Optimized queries |
| **Page Load Time** | < 2s | ~1.2s | ✅ CDN + caching |
| **Concurrent Users** | 1000+ | Tested 500+ | ✅ Async FastAPI |
| **Memory Usage** | < 512MB | ~180MB | ✅ Efficient data structures |

### **🚀 Performance Optimizations**

```mermaid
graph LR
subgraph "⚡ Backend Optimizations"
A[🔄 Async/Await<br/>FastAPI + Uvicorn]
B[📊 Data Validation<br/>Pydantic Models]
C[💾 Connection Pooling<br/>Database Optimization]
end
subgraph "🎨 Frontend Optimizations"
D[📦 CDN Assets<br/>Bootstrap + Chart.js]
E[🗜️ Minified Code<br/>CSS + JavaScript]
F[🖼️ Lazy Loading<br/>Images + Components]
end
subgraph "🌐 Infrastructure"
G[🔄 Load Balancing<br/>Nginx Proxy]
H[💨 Gzip Compression<br/>Static Assets]
I[⚡ HTTP/2 Support<br/>Modern Protocol]
end
A --> D
B --> E
C --> F
D --> G
E --> H
F --> I
style A fill:#10b981,stroke:#fff,color:#fff
style D fill:#3b82f6,stroke:#fff,color:#fff
style G fill:#1e3a8a,stroke:#fff,color:#fff
```

---

## 🎨 **UI/UX Design**

### **🎪 Design System**

<div align="center">

#### **🎨 Color Palette**

<div align="center">

| **Primary** | **Secondary** | **Success** | **Warning** | **Danger** |
|-------------|---------------|-------------|-------------|------------|
| ![#1e3a8a](https://img.shields.io/badge/-%231e3a8a-1e3a8a?style=flat-square&logoColor=white) | ![#3b82f6](https://img.shields.io/badge/-%233b82f6-3b82f6?style=flat-square&logoColor=white) | ![#10b981](https://img.shields.io/badge/-%2310b981-10b981?style=flat-square&logoColor=white) | ![#f59e0b](https://img.shields.io/badge/-%23f59e0b-f59e0b?style=flat-square&logoColor=white) | ![#ef4444](https://img.shields.io/badge/-%23ef4444-ef4444?style=flat-square&logoColor=white) |
| `#1e3a8a` | `#3b82f6` | `#10b981` | `#f59e0b` | `#ef4444` |

**Banking Theme****Professional Trust****Accessibility Compliant**

</div>

</div>

| **🎨 Component** | **🎯 Purpose** | **📱 Responsive** | **✨ Features** |
|---|---|---|---|
| **Navigation Bar** | Site navigation | ✅ Mobile-first | Collapsible menu, active states |
| **Metrics Cards** | Key statistics | ✅ Grid layout | Animated counters, hover effects |
| **Data Tables** | Transaction lists | ✅ Horizontal scroll | Sorting, filtering, pagination |
| **Charts & Graphs** | Data visualization | ✅ Responsive canvas | Interactive tooltips, zoom |
| **Forms** | Data input | ✅ Validation states | Real-time validation, error messages |

### **📱 Responsive Design**

```mermaid
graph TD
subgraph "📱 Mobile (< 768px)"
A[🔄 Stacked Layout<br/>Single Column]
B[☰ Hamburger Menu<br/>Collapsible Navigation]
C[📊 Simplified Charts<br/>Touch-Friendly]
end
subgraph "💻 Tablet (768px - 1024px)"
D[📦 Grid Layout<br/>2-Column Design]
E[📋 Side Navigation<br/>Expanded Menu]
F[📈 Full Charts<br/>Interactive Elements]
end
subgraph "🖥️ Desktop (> 1024px)"
G[🎯 Full Layout<br/>Multi-Column Grid]
H[🎪 Rich Navigation<br/>All Features Visible]
I[📊 Advanced Charts<br/>All Interactions]
end
A --> D --> G
B --> E --> H
C --> F --> I
style A fill:#ef4444,stroke:#fff,color:#fff
style D fill:#f59e0b,stroke:#fff,color:#fff
style G fill:#10b981,stroke:#fff,color:#fff
```

---

## 📖 **Documentation**

### **📚 Documentation Structure**

| **📄 Document** | **🎯 Purpose** | **👥 Audience** |
|---|---|---|
| [`README.md`](./README.md) | Project overview & quick start | Developers, Recruiters |
| [`PRODUCTION_README.md`](./PRODUCTION_README.md) | Production deployment guide | DevOps, Sysadmins |
| [API Docs](http://localhost:8000/docs) | Interactive API documentation | API Consumers |
| [Code Comments](./app/) | Inline code documentation | Developers |

### **🎯 API Documentation**

The application provides **comprehensive API documentation** through:

- **🚀 FastAPI Auto-generated Docs**: [localhost:8000/docs](http://localhost:8000/docs)
- **📋 ReDoc Interface**: [localhost:8000/redoc](http://localhost:8000/redoc)
- **📊 OpenAPI Schema**: [localhost:8000/openapi.json](http://localhost:8000/openapi.json)

---
Python 3.11 & 3.12 matrix

## 🤝 **Contributing**
Security
Trivy

### **🎯 Development Workflow**
GitGuardian

```bash
# 1. Fork the repository
git fork https://github.com/Neiland85/NeuroBank-FastAPI-Toolkit.git
CodeQL

# 2. Create feature branch
git checkout -b feature/amazing-new-feature
Deploy
Railway deploy temporarily disabled due to upstream installer issue.
Copy link

Copilot AI Dec 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The table formatting is broken. Lines 100-118 show what appears to be a table with incomplete structure. The table content is not properly aligned and includes malformed markdown syntax.

Copilot uses AI. Check for mistakes.
Comment on lines +78 to +80
📊 Telemetry Module
python
Copiar código
Copy link

Copilot AI Dec 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation shows unformatted text "📊 Telemetry Module" followed by "python" without proper markdown code block formatting. This should be formatted as a proper markdown section with code fences.

Copilot uses AI. Check for mistakes.
@Neiland85 Neiland85 merged commit d7f1756 into main Dec 11, 2025
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants