Merge branch 'main' into copilot/add-apprise-alerting-capabilities

This commit is contained in:
Christian Krakau-Louis
2026-03-26 19:39:27 +01:00
committed by GitHub
63 changed files with 1601 additions and 223 deletions
+8 -8
View File
@@ -1,4 +1,4 @@
# POP3 Forwarder SaaS - Multi-Tenant Architecture
# InboxConverge - Multi-Tenant Architecture
This document describes the new multi-tenant SaaS architecture for the POP3/IMAP email forwarder.
@@ -20,7 +20,7 @@ The project has been transformed from a single-user Docker application into a fu
## 📁 Project Structure
```
pop_puller_to_gmail/
inboxconverge/
├── backend/ # FastAPI backend application
│ ├── app/
│ │ ├── api/ # API endpoints
@@ -50,7 +50,7 @@ pop_puller_to_gmail/
│ └── .env.example # Environment template
├── frontend/ # React/Next.js frontend (to be implemented)
├── docker-compose.new.yml # Docker Compose for all services
├── pop3_forwarder.py # Legacy single-user script
├── inbox_converge.py # Legacy single-user script
└── README.md # This file
```
@@ -68,8 +68,8 @@ pop_puller_to_gmail/
1. **Clone and navigate to repository**
```bash
git clone https://github.com/christianlouis/pop_puller_to_gmail.git
cd pop_puller_to_gmail
git clone https://github.com/christianlouis/inboxconverge.git
cd inboxconverge
```
2. **Configure backend environment**
@@ -329,7 +329,7 @@ Coming soon: Kubernetes manifests and Helm charts.
## 🔄 Migration from Legacy Version
To migrate from the single-user `pop3_forwarder.py`:
To migrate from the single-user `inbox_converge.py`:
1. **Export existing configuration** from `.env` file
2. **Create user account** via API or admin panel
@@ -404,8 +404,8 @@ MIT License - See [LICENSE](../LICENSE) file
## 🆘 Support
- **Issues**: https://github.com/christianlouis/pop_puller_to_gmail/issues
- **Discussions**: https://github.com/christianlouis/pop_puller_to_gmail/discussions
- **Issues**: https://github.com/christianlouis/inboxconverge/issues
- **Discussions**: https://github.com/christianlouis/inboxconverge/discussions
- **Email**: support@example.com
## 🙏 Acknowledgments
+1 -1
View File
@@ -1,6 +1,6 @@
# Coding Patterns and Best Practices
This document outlines the coding patterns, conventions, and best practices for the POP3 to Gmail Forwarder project.
This document outlines the coding patterns, conventions, and best practices for the InboxConverge project.
## Table of Contents
- [General Principles](#general-principles)
+7 -7
View File
@@ -1,6 +1,6 @@
# Deployment Checklist and Next Steps
This document provides a checklist for deploying the multi-tenant POP3 Forwarder with web interface.
This document provides a checklist for deploying the multi-tenant InboxConverge with web interface.
## 🚀 Pre-Deployment Checklist
@@ -48,7 +48,7 @@ This document provides a checklist for deploying the multi-tenant POP3 Forwarder
#### Database
- [ ] PostgreSQL 15+ instance running
- [ ] Database created: `pop3_forwarder`
- [ ] Database created: `inbox_converge`
- [ ] Connection details configured in backend/.env
- [ ] Backups configured
@@ -89,8 +89,8 @@ sudo certbot --nginx -d yourdomain.com -d api.yourdomain.com
```bash
# On production server
cd /opt
sudo git clone https://github.com/christianlouis/pop_puller_to_gmail.git
cd pop_puller_to_gmail
sudo git clone https://github.com/christianlouis/inboxconverge.git
cd inboxconverge
```
### Step 2: Configure Environment
@@ -195,9 +195,9 @@ curl -X POST https://api.yourdomain.com/api/v1/auth/register \
# Automated daily backup script
cat > /usr/local/bin/backup-pop3-db.sh << 'EOF'
#!/bin/bash
BACKUP_DIR=/var/backups/pop3_forwarder
BACKUP_DIR=/var/backups/inbox_converge
DATE=$(date +%Y%m%d_%H%M%S)
docker exec pop3-postgres pg_dump -U postgres pop3_forwarder | gzip > $BACKUP_DIR/backup_$DATE.sql.gz
docker exec inboxconverge-postgres pg_dump -U postgres inbox_converge | gzip > $BACKUP_DIR/backup_$DATE.sql.gz
find $BACKUP_DIR -type f -mtime +30 -delete
EOF
@@ -394,4 +394,4 @@ Use this checklist after deployment:
## 🎉 Congratulations!
If all checkboxes above are complete, your multi-tenant POP3 Forwarder with web interface is successfully deployed and ready to serve users!
If all checkboxes above are complete, your multi-tenant InboxConverge with web interface is successfully deployed and ready to serve users!
+50 -50
View File
@@ -1,6 +1,6 @@
# Deployment Guide
This guide walks you through deploying **POP3 to Gmail Forwarder** from scratch — whether you just want a single container pulling emails, a full multi-service SaaS stack with Docker Compose, or a production-grade Kubernetes setup.
This guide walks you through deploying **InboxConverge** from scratch — whether you just want a single container pulling emails, a full multi-service SaaS stack with Docker Compose, or a production-grade Kubernetes setup.
---
@@ -52,13 +52,13 @@ You will also need:
## Option 1 — Legacy Single-Container Deployment
The legacy mode runs a single Python script (`pop3_forwarder.py`) that polls POP3 mailboxes and forwards email via SMTP. No database, no web UI — just a container and an `.env` file.
The legacy mode runs a single Python script (`inbox_converge.py`) that polls POP3 mailboxes and forwards email via SMTP. No database, no web UI — just a container and an `.env` file.
### 1. Create the environment file
```bash
git clone https://github.com/christianlouis/pop_puller_to_gmail.git
cd pop_puller_to_gmail
git clone https://github.com/christianlouis/inboxconverge.git
cd inboxconverge
cp .env.example .env
```
@@ -97,12 +97,12 @@ The repository ships `docker-compose.yml` for this mode. Here is the content for
version: "3.8"
services:
pop3-forwarder:
inbox-converge:
# Build from source
build: .
# Or use the pre-built image:
# image: ghcr.io/christianlouis/pop_puller_to_gmail:latest
container_name: pop3-gmail-forwarder
# image: ghcr.io/christianlouis/inboxconverge:latest
container_name: inboxconverge
restart: unless-stopped
env_file:
- .env
@@ -149,7 +149,7 @@ Save both values — you will need them below.
### 2. Create the backend environment file
```bash
cd pop_puller_to_gmail
cd inboxconverge
cp backend/.env.example backend/.env
```
@@ -157,7 +157,7 @@ Edit `backend/.env`:
```ini
# ── Database ──────────────────────────────────────────────
DATABASE_URL=postgresql+asyncpg://postgres:change-me@postgres:5432/pop3_forwarder
DATABASE_URL=postgresql+asyncpg://postgres:change-me@postgres:5432/inbox_converge
# ── Security (paste the values you generated above) ──────
SECRET_KEY=<your-64-char-hex-secret>
@@ -198,12 +198,12 @@ services:
# ── PostgreSQL ───────────────────────────────────────────
postgres:
image: postgres:15-alpine
container_name: pop3-postgres
container_name: inboxconverge-postgres
restart: unless-stopped
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: change-me # must match DATABASE_URL
POSTGRES_DB: pop3_forwarder
POSTGRES_DB: inbox_converge
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
@@ -219,7 +219,7 @@ services:
# ── Redis ────────────────────────────────────────────────
redis:
image: redis:7-alpine
container_name: pop3-redis
container_name: inboxconverge-redis
restart: unless-stopped
command: redis-server --appendonly yes
volumes:
@@ -235,7 +235,7 @@ services:
build:
context: ./backend
dockerfile: Dockerfile
container_name: pop3-backend
container_name: inboxconverge-backend
restart: unless-stopped
ports:
- "8000:8000"
@@ -260,7 +260,7 @@ services:
build:
context: ./backend
dockerfile: Dockerfile
container_name: pop3-celery-worker
container_name: inboxconverge-celery-worker
restart: unless-stopped
env_file:
- ./backend/.env
@@ -278,7 +278,7 @@ services:
build:
context: ./backend
dockerfile: Dockerfile
container_name: pop3-celery-beat
container_name: inboxconverge-celery-beat
restart: unless-stopped
env_file:
- ./backend/.env
@@ -296,7 +296,7 @@ services:
build:
context: ./frontend
dockerfile: Dockerfile
container_name: pop3-frontend
container_name: inboxconverge-frontend
restart: unless-stopped
ports:
- "3000:3000"
@@ -358,7 +358,7 @@ Below is a set of example Kubernetes manifests to get you started. Adapt namespa
apiVersion: v1
kind: Namespace
metadata:
name: pop3-forwarder
name: inbox-converge
```
### Secrets
@@ -369,13 +369,13 @@ Store sensitive values in a Kubernetes Secret. In production, consider using an
apiVersion: v1
kind: Secret
metadata:
name: pop3-forwarder-secrets
namespace: pop3-forwarder
name: inbox-converge-secrets
namespace: inbox-converge
type: Opaque
stringData:
SECRET_KEY: "<your-64-char-hex-secret>"
ENCRYPTION_KEY: "<your-64-char-hex-encryption-key>"
DATABASE_URL: "postgresql+asyncpg://postgres:change-me@postgres:5432/pop3_forwarder"
DATABASE_URL: "postgresql+asyncpg://postgres:change-me@postgres:5432/inbox_converge"
REDIS_URL: "redis://redis:6379/0"
CELERY_BROKER_URL: "redis://redis:6379/0"
CELERY_RESULT_BACKEND: "redis://redis:6379/0"
@@ -396,7 +396,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
namespace: pop3-forwarder
namespace: inbox-converge
spec:
replicas: 1
selector:
@@ -416,11 +416,11 @@ spec:
- name: POSTGRES_USER
value: postgres
- name: POSTGRES_DB
value: pop3_forwarder
value: inbox_converge
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: pop3-forwarder-secrets
name: inbox-converge-secrets
key: POSTGRES_PASSWORD
volumeMounts:
- name: pgdata
@@ -439,7 +439,7 @@ apiVersion: v1
kind: Service
metadata:
name: postgres
namespace: pop3-forwarder
namespace: inbox-converge
spec:
selector:
app: postgres
@@ -451,7 +451,7 @@ apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
namespace: pop3-forwarder
namespace: inbox-converge
spec:
accessModes: [ReadWriteOnce]
resources:
@@ -466,7 +466,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: pop3-forwarder
namespace: inbox-converge
spec:
replicas: 1
selector:
@@ -493,7 +493,7 @@ apiVersion: v1
kind: Service
metadata:
name: redis
namespace: pop3-forwarder
namespace: inbox-converge
spec:
selector:
app: redis
@@ -509,7 +509,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
namespace: pop3-forwarder
namespace: inbox-converge
spec:
replicas: 2
selector:
@@ -522,22 +522,22 @@ spec:
spec:
initContainers:
- name: run-migrations
image: ghcr.io/christianlouis/pop_puller_to_gmail-backend:latest
image: ghcr.io/christianlouis/inboxconverge-backend:latest
command: ["alembic", "upgrade", "head"]
envFrom:
- secretRef:
name: pop3-forwarder-secrets
name: inbox-converge-secrets
env:
- name: DEBUG
value: "false"
containers:
- name: backend
image: ghcr.io/christianlouis/pop_puller_to_gmail-backend:latest
image: ghcr.io/christianlouis/inboxconverge-backend:latest
ports:
- containerPort: 8000
envFrom:
- secretRef:
name: pop3-forwarder-secrets
name: inbox-converge-secrets
env:
- name: HOST
value: "0.0.0.0"
@@ -567,7 +567,7 @@ apiVersion: v1
kind: Service
metadata:
name: backend
namespace: pop3-forwarder
namespace: inbox-converge
spec:
selector:
app: backend
@@ -583,7 +583,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: celery-worker
namespace: pop3-forwarder
namespace: inbox-converge
spec:
replicas: 2
selector:
@@ -596,7 +596,7 @@ spec:
spec:
containers:
- name: worker
image: ghcr.io/christianlouis/pop_puller_to_gmail-backend:latest
image: ghcr.io/christianlouis/inboxconverge-backend:latest
command:
- celery
- -A
@@ -606,7 +606,7 @@ spec:
- --concurrency=2
envFrom:
- secretRef:
name: pop3-forwarder-secrets
name: inbox-converge-secrets
resources:
requests:
cpu: 250m
@@ -625,7 +625,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: celery-beat
namespace: pop3-forwarder
namespace: inbox-converge
spec:
replicas: 1 # Must be exactly 1
strategy:
@@ -640,7 +640,7 @@ spec:
spec:
containers:
- name: beat
image: ghcr.io/christianlouis/pop_puller_to_gmail-backend:latest
image: ghcr.io/christianlouis/inboxconverge-backend:latest
command:
- celery
- -A
@@ -649,7 +649,7 @@ spec:
- --loglevel=info
envFrom:
- secretRef:
name: pop3-forwarder-secrets
name: inbox-converge-secrets
resources:
requests:
cpu: 100m
@@ -666,7 +666,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
namespace: pop3-forwarder
namespace: inbox-converge
spec:
replicas: 2
selector:
@@ -679,7 +679,7 @@ spec:
spec:
containers:
- name: frontend
image: ghcr.io/christianlouis/pop_puller_to_gmail-frontend:latest
image: ghcr.io/christianlouis/inboxconverge-frontend:latest
ports:
- containerPort: 3000
env:
@@ -697,7 +697,7 @@ apiVersion: v1
kind: Service
metadata:
name: frontend
namespace: pop3-forwarder
namespace: inbox-converge
spec:
selector:
app: frontend
@@ -714,8 +714,8 @@ The Ingress below assumes you have an Ingress controller installed (e.g., [ingre
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pop3-forwarder-ingress
namespace: pop3-forwarder
name: inbox-converge-ingress
namespace: inbox-converge
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/proxy-body-size: "10m"
@@ -725,7 +725,7 @@ spec:
- hosts:
- your-domain.com
- api.your-domain.com
secretName: pop3-forwarder-tls
secretName: inbox-converge-tls
rules:
- host: your-domain.com
http:
@@ -754,7 +754,7 @@ spec:
If you manage many environments (staging, production, etc.) consider wrapping the manifests above into a Helm chart:
```text
helm/pop3-forwarder/
helm/inbox-converge/
├── Chart.yaml
├── values.yaml # defaults for all environments
├── values-staging.yaml
@@ -782,8 +782,8 @@ replicaCount:
frontend: 2
image:
backend: ghcr.io/christianlouis/pop_puller_to_gmail-backend
frontend: ghcr.io/christianlouis/pop_puller_to_gmail-frontend
backend: ghcr.io/christianlouis/inboxconverge-backend
frontend: ghcr.io/christianlouis/inboxconverge-frontend
tag: latest
ingress:
@@ -862,7 +862,7 @@ In production you should place a reverse proxy in front of the backend and front
### Example: nginx
```nginx
# /etc/nginx/sites-available/pop3-forwarder
# /etc/nginx/sites-available/inbox-converge
# Frontend
server {
@@ -969,7 +969,7 @@ If you prefer Traefik, add it as a service in your Compose file and use labels o
## Upgrading
```bash
cd pop_puller_to_gmail
cd inboxconverge
# Pull latest code
git pull origin main
+1 -1
View File
@@ -1,6 +1,6 @@
# Error Codes and Messages
This document catalogs all error codes used in the POP3 to Gmail Forwarder application.
This document catalogs all error codes used in the InboxConverge application.
## Error Code Format
+3 -3
View File
@@ -2,7 +2,7 @@
## 🎯 Mission Accomplished
This document summarizes the completion of the web interface and multitenancy features for the POP3 to Gmail Forwarder project.
This document summarizes the completion of the web interface and multitenancy features for the InboxConverge project.
## 📦 What Was Delivered
@@ -320,7 +320,7 @@ These are potential future improvements outside the current task:
### What Was Accomplished
**Complete implementation of web interface and multitenancy features**
The POP3 to Gmail Forwarder now has:
The InboxConverge now has:
- A modern, responsive web interface
- Complete user authentication system
- Full mail account management capabilities
@@ -356,7 +356,7 @@ The implementation is **complete and ready for**:
## 👏 Thank You
This implementation represents a significant milestone in transforming the POP3 Forwarder from a simple script into a production-ready multi-tenant SaaS application. The web interface makes the service accessible to users of all technical levels, while maintaining the robust backend infrastructure.
This implementation represents a significant milestone in transforming the InboxConverge from a simple script into a production-ready multi-tenant SaaS application. The web interface makes the service accessible to users of all technical levels, while maintaining the robust backend infrastructure.
**The multitenancy and web interface implementation is now complete and ready for deployment!** 🎉
+11 -11
View File
@@ -1,6 +1,6 @@
# Implementation Guide
This guide provides step-by-step instructions for setting up and deploying the multi-tenant POP3 Forwarder SaaS application.
This guide provides step-by-step instructions for setting up and deploying the multi-tenant InboxConverge application.
## Table of Contents
@@ -36,8 +36,8 @@ This guide provides step-by-step instructions for setting up and deploying the m
```bash
# Clone repository
git clone https://github.com/christianlouis/pop_puller_to_gmail.git
cd pop_puller_to_gmail
git clone https://github.com/christianlouis/inboxconverge.git
cd inboxconverge
# Create backend environment file
cp backend/.env.example backend/.env
@@ -49,7 +49,7 @@ Edit `backend/.env` with your settings:
```bash
# Minimum required for development
DATABASE_URL=postgresql+asyncpg://postgres:password@postgres:5432/pop3_forwarder
DATABASE_URL=postgresql+asyncpg://postgres:password@postgres:5432/inbox_converge
SECRET_KEY=$(openssl rand -hex 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
GOOGLE_CLIENT_ID=your-client-id
@@ -176,7 +176,7 @@ ADMIN_EMAIL=admin@yourdomain.com
Use nginx or Traefik as reverse proxy:
```nginx
# /etc/nginx/sites-available/pop3-forwarder
# /etc/nginx/sites-available/inbox-converge
server {
listen 443 ssl http2;
server_name api.yourdomain.com;
@@ -202,7 +202,7 @@ cat > /etc/cron.daily/backup-postgres << 'EOF'
#!/bin/bash
BACKUP_DIR=/var/backups/postgres
DATE=$(date +%Y%m%d_%H%M%S)
docker exec pop3-postgres pg_dump -U postgres pop3_forwarder | gzip > $BACKUP_DIR/backup_$DATE.sql.gz
docker exec inboxconverge-postgres pg_dump -U postgres inbox_converge | gzip > $BACKUP_DIR/backup_$DATE.sql.gz
find $BACKUP_DIR -type f -mtime +7 -delete # Keep 7 days
EOF
@@ -348,10 +348,10 @@ docker-compose -f docker-compose.new.yml exec celery-worker celery -A app.worker
```bash
# Check connections
docker exec pop3-postgres psql -U postgres -d pop3_forwarder -c "SELECT count(*) FROM pg_stat_activity;"
docker exec inboxconverge-postgres psql -U postgres -d inbox_converge -c "SELECT count(*) FROM pg_stat_activity;"
# Check table sizes
docker exec pop3-postgres psql -U postgres -d pop3_forwarder -c "
docker exec inboxconverge-postgres psql -U postgres -d inbox_converge -c "
SELECT
schemaname,
tablename,
@@ -376,7 +376,7 @@ docker-compose -f docker-compose.new.yml ps postgres
docker-compose -f docker-compose.new.yml logs postgres
# Test connection
docker exec pop3-postgres psql -U postgres -c "SELECT version();"
docker exec inboxconverge-postgres psql -U postgres -c "SELECT version();"
```
#### Celery Worker Not Processing
@@ -480,8 +480,8 @@ redis:
For additional help:
- **Documentation**: See [ARCHITECTURE.md](ARCHITECTURE.md)
- **Issues**: https://github.com/christianlouis/pop_puller_to_gmail/issues
- **Discussions**: https://github.com/christianlouis/pop_puller_to_gmail/discussions
- **Issues**: https://github.com/christianlouis/inboxconverge/issues
- **Discussions**: https://github.com/christianlouis/inboxconverge/discussions
---
+2 -2
View File
@@ -1,6 +1,6 @@
# Migration Guide: Single-User to Multi-Tenant SaaS
This guide helps you migrate from the legacy single-user `pop3_forwarder.py` script to the new multi-tenant SaaS application.
This guide helps you migrate from the legacy single-user `inbox_converge.py` script to the new multi-tenant SaaS application.
## Overview
@@ -230,7 +230,7 @@ docker-compose -f docker-compose.yml down
# Archive old configuration
mkdir -p archive
mv pop3_forwarder.py archive/
mv inbox_converge.py archive/
mv .env.legacy.backup archive/
mv docker-compose.yml archive/docker-compose.legacy.yml
+10 -10
View File
@@ -1,6 +1,6 @@
# Quick Start Guide
Get your POP3 to Gmail forwarder running in under 10 minutes!
Get your InboxConverge instance running in under 10 minutes!
## Prerequisites
@@ -13,8 +13,8 @@ Get your POP3 to Gmail forwarder running in under 10 minutes!
### 1. Clone the Repository
```bash
git clone https://github.com/christianlouis/pop_puller_to_gmail.git
cd pop_puller_to_gmail
git clone https://github.com/christianlouis/inboxconverge.git
cd inboxconverge
```
### 2. Generate Gmail App Password
@@ -23,7 +23,7 @@ cd pop_puller_to_gmail
2. Sign in to your Google Account
3. Select "App passwords" under Security
4. Choose "Mail" and "Other (Custom name)"
5. Enter "POP3 Forwarder" as the name
5. Enter "InboxConverge" as the name
6. Click "Generate"
7. **Copy the 16-character password** (you'll need this in step 3)
@@ -66,10 +66,10 @@ docker-compose logs -f
You should see:
```
pop3-gmail-forwarder | INFO - POP3 to Gmail Forwarder starting...
pop3-gmail-forwarder | INFO - Loaded POP3 account: ...
pop3-gmail-forwarder | INFO - Configuration validated successfully
pop3-gmail-forwarder | INFO - Starting email processing cycle
inboxconverge | INFO - InboxConverge starting...
inboxconverge | INFO - Loaded POP3 account: ...
inboxconverge | INFO - Configuration validated successfully
inboxconverge | INFO - Starting email processing cycle
```
### 6. Test the Forwarder
@@ -192,13 +192,13 @@ Restart after changes: `docker-compose restart`
## Need Help?
- Open an issue: https://github.com/christianlouis/pop_puller_to_gmail/issues
- Open an issue: https://github.com/christianlouis/inboxconverge/issues
- Check existing discussions
- Review troubleshooting section in README.md
## Success! 🎉
Your POP3 to Gmail forwarder is now running. Emails will be automatically forwarded every 5 minutes (or your configured interval).
Your InboxConverge instance is now running. Emails will be automatically forwarded every 5 minutes (or your configured interval).
**Remember**:
- The forwarder deletes emails from POP3 after successful forwarding
+4 -4
View File
@@ -39,8 +39,8 @@ This project has been **completely transformed** from a single-user Docker scrip
```bash
# Clone repository
git clone https://github.com/christianlouis/pop_puller_to_gmail.git
cd pop_puller_to_gmail
git clone https://github.com/christianlouis/inboxconverge.git
cd inboxconverge
# Configure environment
cp backend/.env.example backend/.env
@@ -330,8 +330,8 @@ MIT License - See [LICENSE](../LICENSE) file for details.
## 🆘 Support
- **Documentation**: See docs in repository
- **Issues**: https://github.com/christianlouis/pop_puller_to_gmail/issues
- **Discussions**: https://github.com/christianlouis/pop_puller_to_gmail/discussions
- **Issues**: https://github.com/christianlouis/inboxconverge/issues
- **Discussions**: https://github.com/christianlouis/inboxconverge/discussions
- **Email**: support@example.com (for Enterprise customers)
## 🎉 Acknowledgments
+1 -1
View File
@@ -1,7 +1,7 @@
# Roadmap
## Vision
Create a robust, scalable, and user-friendly POP3 to Gmail forwarding solution that serves as a complete replacement for Gmail's discontinued POP3 import feature.
Create a robust, scalable, and user-friendly InboxConverge email-forwarding solution that serves as a complete replacement for Gmail's discontinued POP3 import feature.
---
+1 -1
View File
@@ -2,7 +2,7 @@
## Overview
Security analysis completed on February 1, 2026 for the Multi-Tenant POP3 Forwarder SaaS application.
Security analysis completed on February 1, 2026 for the Multi-Tenant InboxConverge application.
## CodeQL Security Scan
+1 -1
View File
@@ -25,7 +25,7 @@ This guide will help you test the complete multi-tenant web interface with the b
3. Edit the `.env` file and update the following critical values:
```bash
# Database - should point to Docker service
DATABASE_URL=postgresql+asyncpg://postgres:password@postgres:5432/pop3_forwarder
DATABASE_URL=postgresql+asyncpg://postgres:password@postgres:5432/inbox_converge
# Redis - should point to Docker service
REDIS_URL=redis://redis:6379/0
+15 -3
View File
@@ -2,6 +2,12 @@
Comprehensive task breakdown for repository improvements and production readiness.
## ✅ Recently Completed
- [x] Rename entire project to **InboxConverge**: all user-visible strings, Docker container/image names, DB defaults, monitoring, and docs updated.
- [x] Domain updated to `inboxconverge.com`; contact email defaults to `christian@inboxconverge.com`.
- [x] New configurable env vars: `CONTACT_EMAIL`, `APP_URL`, `NEXT_PUBLIC_APP_NAME`.
## 🔴 Critical - Security (In Progress)
### Completed ✅
@@ -178,7 +184,7 @@ Comprehensive task breakdown for repository improvements and production readines
### Not Started 📋
- [ ] Integrate Sentry for error tracking
- [ ] Add structured logging with correlation IDs
- [x] Add structured logging with correlation IDs (per-email ProcessingLog entries now captured in DB)
- [ ] Add APM (Application Performance Monitoring)
- [ ] Set up uptime monitoring
- [ ] Create runbook for common issues
@@ -193,9 +199,11 @@ Comprehensive task breakdown for repository improvements and production readines
- [x] Account enable/disable toggle (UX + backend)
- [x] Per-user SMTP configuration (UX + backend)
- [x] Gmail API one-click OAuth grant flow with token refresh and revocation handling
- [x] Configurable Gmail import labels (default `{{source_email}}` + `imported`, editable in Settings with reset-to-default action)
- [x] Unified Google OAuth flow: sign-in requests all Gmail scopes; single `/auth/callback` redirect URI needed in Google Console
- [x] Message deduplication (POP3 UIDL + IMAP \Seen flag + DB tracking)
- [x] **Debug email**: "Send Debug Email" button in Settings injects a test message (from christian@docuelevate.org, dated today, labelled `test` + `imported`, placed in inbox) to verify end-to-end Gmail API delivery
- [x] **Logging & reporting**: per-email ProcessingLog capture in worker; user `/logs` page; admin `/admin/logs` page; GDPR masking utilities (`gdpr.py`)
- [ ] Implement GDPR data export endpoint
- [x] Complete notification service integration (Apprise)
- [ ] Add advanced email filtering
@@ -232,6 +240,8 @@ because the API client layer is missing.
- [x] `AuthGuard` for protected routes
- [x] Fix wizard grey screen (Tailwind v4 `bg-opacity``/75` syntax, modal restructure)
- [x] `/auth/gmail-callback` page for Gmail OAuth one-click flow
- [x] **`/logs` page** — user processing history: paginated runs table with expandable per-email log panel (subject, sender, size, status)
- [x] **Dashboard** — "Recent Processing Runs" now wired to real `/processing-runs` endpoint; shows account name and links to `/logs`
### Not Started 📋
- [ ] End-to-end testing of frontend against backend API
@@ -248,10 +258,11 @@ because the API client layer is missing.
- [x] Admin overview page (`/admin`) with system-wide stats
- [x] User management page (`/admin/users`) — list, edit, delete users; assign plans; promote/demote admin
- [x] Plan management page (`/admin/plans`) — full CRUD for subscription plans (mailboxes, emails/day, interval, pricing)
- [x] `ADMIN_EMAIL` env var with default `christianlouis@gmail.com`; admin auto-promoted on login and on every application startup (fixes pre-existing accounts)
- [x] `ADMIN_EMAIL` env var with default `christian@inboxconverge.com`; admin auto-promoted on login and on every application startup (fixes pre-existing accounts)
- [x] `is_superuser` exposed in `/users/me` response
- [x] Admin badge (purple shield) shown in top bar for superusers
- [x] Fix blank page on direct navigation to `/admin*`: moved superuser guard inside `<AuthGuard>` so auth check always runs on fresh load
- [x] **`/admin/logs` page** — system-wide processing activity: expandable run table + flat per-email log table with GDPR-masked sender addresses; filterable by user ID, status, log level
---
@@ -351,7 +362,8 @@ because the API client layer is missing.
1. **Immediate** (Today):
- [x] Create `frontend/src/lib/api.ts` (frontend is broken without it)
- [x] Fix remaining security issues (bare excepts, datetime, redirect_uri)
- [ ] Add backend endpoint for processing runs (needed by dashboard)
- [x] Add backend endpoint for processing runs (needed by dashboard)
- [x] Build logging & reporting: per-email ProcessingLog capture, user `/logs` page, admin `/admin/logs` page, GDPR masking
2. **This Week**:
- [ ] Enable rate limiting
+2 -2
View File
@@ -1,6 +1,6 @@
# Web Interface Quick Start Guide
The POP3 to Gmail Forwarder now includes a modern web interface built with Next.js, making it easy to manage your email forwarding without API calls.
The InboxConverge now includes a modern web interface built with Next.js, making it easy to manage your email forwarding without API calls.
## 🌐 Accessing the Web Interface
@@ -104,7 +104,7 @@ frontend:
build:
context: ./frontend
dockerfile: Dockerfile
container_name: pop3-frontend
container_name: inboxconverge-frontend
ports:
- "3000:3000"
environment:
+1 -1
View File
@@ -126,7 +126,7 @@ elif version == 'v2':
def get_or_create_user_salt(user_id: int) -> bytes:
# Use deterministic salt based on user_id + global salt
# OR store random salt in database per user
return hashlib.sha256(f'pop3_forwarder_user_{user_id}'.encode()).digest()
return hashlib.sha256(f'inbox_converge_user_{user_id}'.encode()).digest()
```
## Security Best Practices
+1 -1
View File
@@ -64,7 +64,7 @@ async def lifespan(app: FastAPI):
# Shutdown: cleanup
app = FastAPI(
title="POP3 Forwarder API",
title="InboxConverge API",
lifespan=lifespan,
openapi_url="/api/openapi.json",
docs_url="/api/docs",