{"id":50425254,"url":"https://github.com/pablopunk/scanario","last_synced_at":"2026-05-31T10:02:26.884Z","repository":{"id":352679565,"uuid":"1216151875","full_name":"pablopunk/scanario","owner":"pablopunk","description":"Self-hosted doc scanner","archived":false,"fork":false,"pushed_at":"2026-04-29T14:55:11.000Z","size":13129,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-29T16:33:47.142Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pablopunk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2026-04-20T16:09:20.000Z","updated_at":"2026-04-29T14:56:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pablopunk/scanario","commit_stats":null,"previous_names":["pablopunk/scanario"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pablopunk/scanario","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pablopunk%2Fscanario","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pablopunk%2Fscanario/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pablopunk%2Fscanario/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pablopunk%2Fscanario/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pablopunk","download_url":"https://codeload.github.com/pablopunk/scanario/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pablopunk%2Fscanario/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33726719,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"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":[],"created_at":"2026-05-31T10:02:26.278Z","updated_at":"2026-05-31T10:02:26.873Z","avatar_url":"https://github.com/pablopunk.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# scanario\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/pablopunk/scanario/blob/main/src/assets/scanario.jpeg?raw=true\" width=\"200px\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/pablopunk/scanario/blob/main/src/assets/scanario.gif?raw=true\" width=\"90%\" /\u003e\n\u003c/p\u003e\n\n\u003e Self-hosted doc scanner. Take pictures with your phone, drop them into scanario, and get a clean PDF.\n\n## Features\n\n- **Drop images, get a PDF** — Drag multiple photos into the browser and download a clean, scan-quality PDF\n- **Works with messy photos** — Handles cluttered backgrounds, shadows, crumpled paper, even overlapping receipts\n- **Your documents stay private** — Self-hosted, runs entirely on your machine, nothing sent to the cloud\n- **Three ways to use it** — Web UI for quick scans, API for automation, CLI for scripting\n\n## Quick Start\n\n```bash\n# Create an API key\ndocker compose exec api python -m scanario.auth create\n```\n\n### Web\n\nOpen `http://localhost:8000` → drag images → download PDF/image.\n\n### API\n\n```bash\ncurl -X POST http://localhost:8000/scan \\\n  -H \"X-API-Key: $KEY\" \\\n  -F \"file=@doc.jpg\" \\\n  -F \"mode=gray\"\n\n# Returns: {\"job_id\": \"...\", \"status\": \"pending\"}\n# Poll /jobs/{job_id} until completed, then download from /images/{job_id}/{filename}\n```\n\n### CLI\n\n```bash\npython -m scanario.main scan photo.jpg\npython -m scanario.main pdf page1.jpg page2.jpg -o output.pdf\n```\n\n## Deploy with Docker Compose\n\n```yaml\nservices:\n  redis:\n    image: redis:7-alpine\n    container_name: scanario-redis\n    restart: unless-stopped\n    volumes:\n      - redis_data:/data\n\n  api:\n    image: ghcr.io/pablopunk/scanario:latest\n    container_name: scanario-api\n    restart: unless-stopped\n    ports:\n      - \"8000:8000\"\n    environment:\n      SCANARIO_REDIS_URL: redis://redis:6379/0\n      SCANARIO_DATA_DIR: /app/data\n      SCANARIO_MAX_AGE_DAYS: 7\n      SCANARIO_CLEANUP_INTERVAL_HOURS: 24\n      GEMINI_API_KEY: ${GEMINI_API_KEY}\n    volumes:\n      - scanario_data:/app/data\n    depends_on:\n      - redis\n    command: uvicorn scanario.api:app --host 0.0.0.0 --port 8000\n\n  worker:\n    image: ghcr.io/pablopunk/scanario:latest\n    container_name: scanario-worker\n    restart: unless-stopped\n    environment:\n      SCANARIO_REDIS_URL: redis://redis:6379/0\n      SCANARIO_DATA_DIR: /app/data\n      GEMINI_API_KEY: ${GEMINI_API_KEY}\n    volumes:\n      - scanario_data:/app/data\n    depends_on:\n      - redis\n    command: celery -A scanario.worker.celery_app worker --loglevel=info --concurrency=2\n\n  beat:\n    image: ghcr.io/pablopunk/scanario:latest\n    container_name: scanario-beat\n    restart: unless-stopped\n    environment:\n      SCANARIO_REDIS_URL: redis://redis:6379/0\n      SCANARIO_DATA_DIR: /app/data\n    volumes:\n      - scanario_data:/app/data\n    depends_on:\n      - redis\n    command: celery -A scanario.worker.celery_app beat --loglevel=info\n\nvolumes:\n  redis_data:\n  scanario_data:\n```\n\nSet `GEMINI_API_KEY` in a `.env` file next to this `docker-compose.yml`, then:\n\n```sh\ndocker compose up -d\n```\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpablopunk%2Fscanario","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpablopunk%2Fscanario","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpablopunk%2Fscanario/lists"}