{"id":23916911,"url":"https://github.com/tiritibambix/itransfer","last_synced_at":"2026-04-18T11:04:07.076Z","repository":{"id":270214963,"uuid":"908634711","full_name":"Tiritibambix/iTransfer","owner":"Tiritibambix","description":"A simple file transfer application with web interface, secure backend, and email notifications.","archived":false,"fork":false,"pushed_at":"2026-04-14T18:19:53.000Z","size":1225,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-14T20:14:54.061Z","etag":null,"topics":["docker","docker-compose","file-sharing","transfer","wetransfer"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tiritibambix.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-12-26T15:02:48.000Z","updated_at":"2026-04-14T18:19:57.000Z","dependencies_parsed_at":"2025-02-08T00:18:02.189Z","dependency_job_id":"172a1526-8447-4671-a548-bbcc3ad29312","html_url":"https://github.com/Tiritibambix/iTransfer","commit_stats":null,"previous_names":["tiritibambix/itransfer_1minai","tiritibambix/itransfer"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Tiritibambix/iTransfer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tiritibambix%2FiTransfer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tiritibambix%2FiTransfer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tiritibambix%2FiTransfer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tiritibambix%2FiTransfer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tiritibambix","download_url":"https://codeload.github.com/Tiritibambix/iTransfer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tiritibambix%2FiTransfer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31966218,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T00:39:45.007Z","status":"online","status_checked_at":"2026-04-18T02:00:07.018Z","response_time":103,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-compose","file-sharing","transfer","wetransfer"],"created_at":"2025-01-05T12:15:11.011Z","updated_at":"2026-04-18T11:04:07.070Z","avatar_url":"https://github.com/Tiritibambix.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/tiritibambix/iTransfer/main/frontend/src/assets/banner.png\" width=\"400\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Platform-amd64%20%7C%20arm64-blue\" alt=\"Platform Support\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/License-GPL--3.0-purple\" alt=\"License\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Stack-Flask%20%2B%20React%20%2B%20MariaDB-darkviolet\" alt=\"Stack\" /\u003e\n\u003c/p\u003e\n\n# iTransfer\n\nSelf-hosted file transfer system. Upload files, share a download link, get notified by email when the recipient downloads. No cloud, no third party.\n\n## ⚠️ Security Notice\n\nThis application has been coded with the help of AI and is provided as-is. While reasonable security measures have been implemented (see the Security section below), no independent audit has been performed. You are responsible for reviewing the code, assessing the risks for your use case, and validating that the deployment meets your security requirements before exposing this to the internet. The repository owner accepts no liability for any damages or data loss resulting from the use of this software.\n\n## Features\n\n- Upload files or folders via drag \u0026 drop\n- Automatic ZIP packaging for multiple files, direct download for single files\n- Configurable link expiration: 3, 5, 7 or 10 days\n- Email notifications: recipient on upload, sender on upload and on download\n- Admin panel: list and delete transfers, configure SMTP\n- JWT authentication on protected routes\n- Rate limiting on login and upload endpoints\n- Server-side email validation\n- Automatic cleanup of expired files and database records\n- HTTPS enforcement and reverse proxy support\n- Multi-arch Docker images: `amd64` / `arm64`\n\n## Stack\n\n| Layer | Technology |\n|---|---|\n| Frontend | React 18 + Vite |\n| Backend | Python / Flask + Gunicorn |\n| Database | MariaDB |\n| Containerization | Docker + Docker Compose |\n\n## Project Structure\n\n```\n├── backend/\n│   ├── app/\n│   │   ├── __init__.py      # App factory, scheduler, CORS\n│   │   ├── auth.py          # JWT helpers\n│   │   ├── config.py        # Configuration\n│   │   ├── models.py        # Database models\n│   │   ├── paths.py         # Path sanitization (CodeQL sanitizer)\n│   │   └── routes.py        # API endpoints\n│   ├── Dockerfile\n│   ├── init.sql\n│   └── run.py\n├── frontend/\n│   ├── src/\n│   │   ├── Admin.jsx        # Admin panel (transfers + SMTP)\n│   │   ├── App.jsx          # Upload interface\n│   │   ├── Download.jsx     # Download page\n│   │   ├── Login.jsx        # Authentication\n│   │   ├── PrivateRoute.jsx # Route guard\n│   │   ├── main.jsx         # Entry point\n│   │   └── index.css        # Design system\n│   ├── Dockerfile\n│   ├── index.html\n│   ├── package.json\n│   └── vite.config.js\n├── docker-compose.yml\n└── requirements.txt\n```\n\n## Installation\n\n### Prerequisites\n\n- Docker\n- Docker Compose\n\n### Quick Start (local)\n\n```bash\ngit clone https://github.com/tiritibambix/iTransfer.git\ncd iTransfer\n```\n\nCreate a `docker-compose.yml`:\n\n```yaml\nservices:\n  frontend:\n    image: tiritibambix/itransfer-frontend\n    ports:\n      - \"3500:80\"\n    environment:\n      - BACKEND_URL=http://localhost:5500\n    depends_on:\n      - backend\n    networks:\n      - itransfer-network\n\n  backend:\n    image: tiritibambix/itransfer-backend\n    ports:\n      - \"5500:5000\"\n    environment:\n      - FRONTEND_URL=http://localhost:3500\n      - ADMIN_USERNAME=admin          # Change this\n      - ADMIN_PASSWORD=admin          # Change this\n      - DATABASE_URL=mysql+mysqldb://mariadb_user:mariadb_pass@db/mariadb_db\n      - TIMEZONE=Europe/Paris\n      - JWT_SECRET_KEY=changeme       # Change this\n    volumes:\n      - ./backend/data:/app/data\n      - ./backend/uploads:/app/uploads\n    depends_on:\n      db:\n        condition: service_healthy\n    networks:\n      - itransfer-network\n\n  db:\n    image: mariadb\n    environment:\n      MYSQL_ROOT_PASSWORD: root_password\n      MYSQL_DATABASE: mariadb_db\n      MYSQL_USER: mariadb_user\n      MYSQL_PASSWORD: mariadb_pass\n    volumes:\n      - ./db_data:/var/lib/mysql\n      - ./backend/init.sql:/docker-entrypoint-initdb.d/init.sql\n    healthcheck:\n      test: [\"CMD-SHELL\", \"mysqladmin ping -h 127.0.0.1 -u root --password=$MYSQL_ROOT_PASSWORD\"]\n      interval: 10s\n      timeout: 5s\n      retries: 3\n      start_period: 30s\n    networks:\n      - itransfer-network\n\nnetworks:\n  itransfer-network:\n    driver: bridge\n```\n\n```bash\ndocker compose up -d\n```\n\nAccess the app at `http://localhost:3500`.\n\n### Production (behind reverse proxy)\n\nReplace the environment variables with your public URLs:\n\n```yaml\nenvironment:\n  - BACKEND_URL=https://api.itransfer.yourdomain.tld   # frontend service\n  - FRONTEND_URL=https://itransfer.yourdomain.tld      # backend service\n  - FORCE_HTTPS=true\n```\n\nNginx example:\n\n```nginx\n# Frontend\nserver {\n    listen 443 ssl;\n    server_name itransfer.yourdomain.tld;\n    location / {\n        proxy_pass http://localhost:3500;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}\n\n# Backend\nserver {\n    listen 443 ssl;\n    server_name api.itransfer.yourdomain.tld;\n    location / {\n        proxy_pass http://localhost:5500;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}\n```\n\n## SMTP Configuration\n\nConfigure SMTP from the admin panel (`/admin` → SMTP tab) or directly via environment variables. The backend supports any SMTP server with SSL (port 465) or STARTTLS (port 587).\n\nTested with OVH, Gmail, Office 365 and generic SMTP.\n\nFor reliable delivery to Gmail/Yahoo, your domain needs SPF, DKIM and DMARC records. Without them, messages will be rejected.\n\n## Environment Variables\n\n| Variable | Required | Default | Description |\n|---|---|---|---|\n| `FRONTEND_URL` | yes | `http://localhost:3500` | Public frontend URL |\n| `BACKEND_URL` | yes | `http://localhost:5500` | Public backend URL |\n| `ADMIN_USERNAME` | yes | — | Admin login |\n| `ADMIN_PASSWORD` | yes | — | Admin password |\n| `DATABASE_URL` | yes | SQLite fallback | MariaDB connection string |\n| `JWT_SECRET_KEY` | yes | random | JWT signing key — set a stable value |\n| `TIMEZONE` | no | `Europe/Paris` | Timezone for expiry display |\n| `FORCE_HTTPS` | no | `true` | Enforce HTTPS in generated URLs |\n| `PROXY_COUNT` | no | `1` | Number of reverse proxies in front |\n\n## Troubleshooting\n\n**Files not received / emails rejected**\nCheck SPF, DKIM and DMARC records on your sending domain. Most major providers (Gmail, Yahoo) reject unauthenticated mail since early 2024.\n\n**Database not initializing**\nMake sure `backend/init.sql` exists before the first `docker compose up`. If the DB volume already exists without the table, run:\n```bash\ndocker compose down -v\ndocker compose up -d\n```\n\n**Logs**\n```bash\ndocker compose logs -f backend\ndocker compose logs -f frontend\n```\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Commit your changes\n4. Open a pull request\n\n## License\n\nGPL-3.0 — see [LICENSE](LICENSE).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftiritibambix%2Fitransfer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftiritibambix%2Fitransfer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftiritibambix%2Fitransfer/lists"}