{"id":46994293,"url":"https://github.com/jonmartin721/review-hound","last_synced_at":"2026-04-01T18:05:29.917Z","repository":{"id":327543334,"uuid":"1107475177","full_name":"jonmartin721/review-hound","owner":"jonmartin721","description":"Aggregate business reviews from TrustPilot, BBB, Yelp \u0026 Google Places. Sentiment analysis, email alerts, and web dashboard for reputation monitoring.","archived":false,"fork":false,"pushed_at":"2026-03-19T03:22:55.000Z","size":11044,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-19T14:00:35.149Z","etag":null,"topics":["beautifulsoup","business-reviews","cli","flask","google-places","python","reputation-monitoring","sentiment-analysis","sqlalchemy","trustpilot","web-scraping","yelp"],"latest_commit_sha":null,"homepage":"https://review-hound.vercel.app","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jonmartin721.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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":"2025-12-01T07:30:45.000Z","updated_at":"2026-03-19T03:22:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jonmartin721/review-hound","commit_stats":null,"previous_names":["jonmartin721/review-hound"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/jonmartin721/review-hound","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonmartin721%2Freview-hound","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonmartin721%2Freview-hound/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonmartin721%2Freview-hound/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonmartin721%2Freview-hound/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jonmartin721","download_url":"https://codeload.github.com/jonmartin721/review-hound/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonmartin721%2Freview-hound/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31290747,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["beautifulsoup","business-reviews","cli","flask","google-places","python","reputation-monitoring","sentiment-analysis","sqlalchemy","trustpilot","web-scraping","yelp"],"created_at":"2026-03-11T14:42:59.681Z","updated_at":"2026-04-01T18:05:29.908Z","avatar_url":"https://github.com/jonmartin721.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🐕 Review Hound\n\n[![PyPI](https://img.shields.io/pypi/v/reviewhound?style=flat)](https://pypi.org/project/reviewhound/)\n[![CI](https://img.shields.io/github/actions/workflow/status/jonmartin721/review-hound/ci.yml?branch=main\u0026style=flat)](https://github.com/jonmartin721/review-hound/actions)\n[![Python 3.12+](https://img.shields.io/badge/python-3.12+-3776ab?style=flat)](https://www.python.org)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green?style=flat)](LICENSE)\n[![codecov](https://codecov.io/gh/jonmartin721/review-hound/graph/badge.svg)](https://codecov.io/gh/jonmartin721/review-hound)\n\n\u003cp align=\"center\"\u003e\n  \u003cvideo src=\"https://github.com/jonmartin721/review-hound/raw/main/assets/hero-dark.mp4\" autoplay loop muted playsinline width=\"720\"\u003e\u003c/video\u003e\n\u003c/p\u003e\n\nStop checking review sites one by one. Review Hound pulls from TrustPilot, BBB, Yelp, Google Places, and the Yelp Fusion API—flags negative reviews and emails you before customers start talking.\n\n**Why?** Bad reviews spread. A 1-star complaint can sit for days before you notice. Review Hound catches them within hours.\n\n## Features\n\n- **Five review sources**: Scrape TrustPilot, BBB, and Yelp pages, or pull via Google Places and Yelp Fusion APIs\n- **Source search**: Find business pages on TrustPilot and BBB directly from the web UI\n- **Sentiment scoring**: Flags negative reviews automatically so you know what needs attention\n- **Web dashboard**: Next.js frontend with per-business stats, rating trends, and scrape controls\n- **Email alerts**: Get notified via SMTP or the Resend API when someone leaves a bad review\n- **Encrypted API keys**: API credentials are encrypted at rest with Fernet symmetric encryption\n- **CLI or web**: Use whichever fits your workflow\n- **Scheduled scraping**: Set it and forget it—runs every few hours\n- **CSV export**: Pull data out for spreadsheets or reporting\n\n## Screenshots\n\n### Dashboard\nTrack all your businesses at a glance with ratings, sentiment breakdowns, and source health indicators.\n\n![Dashboard](docs/screenshots/dashboard.png)\n\n### Business Detail\nSee per-business stats, rating trends, recent reviews, and scrape controls in one place.\n\n![Business Detail](docs/screenshots/business_detail.png)\n\n### Reviews\nBrowse and filter reviews by source and sentiment, with CSV export support.\n\n![Reviews](docs/screenshots/reviews.png)\n\n### Settings\nConfigure Google Places, Yelp Fusion, and optional Resend credentials, plus sentiment analysis tuning.\n\n![Settings](docs/screenshots/settings.png)\n\n## Quick Start\n\n### Install from PyPI\n\n```bash\npip install reviewhound\n```\n\nThat's it. Now run the web dashboard:\n\n```bash\nreviewhound web\n# → Starting web dashboard at http://127.0.0.1:5000\n```\n\nOr use the CLI directly:\n\n```bash\nreviewhound add \"Acme Corp\" --trustpilot \"https://trustpilot.com/review/acme.com\"\nreviewhound scrape --all\nreviewhound list\n```\n\n### Using Docker\n\n```bash\ngit clone https://github.com/jonmartin721/review-hound.git\ncd review-hound\ndocker-compose up -d\n# → Access at http://localhost:5000\n```\n\n### From Source\n\n```bash\ngit clone https://github.com/jonmartin721/review-hound.git\ncd review-hound\npip install -e .\nreviewhound web\n```\n\n## CLI Usage\n\n### Add a Business\n\n```bash\n# Add with TrustPilot URL\nreviewhound add \"Acme Corp\" --trustpilot \"https://www.trustpilot.com/review/acme.com\"\n\n# Add with multiple sources\nreviewhound add \"Acme Corp\" \\\n  --trustpilot \"https://www.trustpilot.com/review/acme.com\" \\\n  --bbb \"https://www.bbb.org/...\" \\\n  --yelp \"https://www.yelp.com/biz/acme-corp\"\n```\n\n### Scrape Reviews\n\n```bash\n# Scrape one business\nreviewhound scrape \"Acme\"\n# → Scraped 47 reviews from 3 sources\n\n# Scrape everything (grab coffee, this takes a minute)\nreviewhound scrape --all\n# → Scraped 203 reviews across 5 businesses\n```\n\n### View Reviews\n\n```bash\n# List all businesses\nreviewhound list\n\n# View reviews for a business\nreviewhound reviews 1 --limit 50\n\n# Filter by sentiment\nreviewhound reviews 1 --sentiment negative\n\n# View statistics\nreviewhound stats 1\n```\n\n### Export Data\n\n```bash\n# Export to CSV\nreviewhound export 1 -o acme_reviews.csv\n```\n\n### Email Alerts\n\n```bash\n# Configure alerts for negative reviews\nreviewhound alert 1 alerts@company.com --threshold 3.0\n\n# List alert configurations\nreviewhound alerts\n```\n\n### Scheduled Scraping\n\n```bash\n# Run scheduler (scrapes every 6 hours by default)\nreviewhound watch\n\n# Custom interval\nreviewhound watch --interval 2\n\n# Run web dashboard with scheduler\nreviewhound web --with-scheduler\n```\n\n## Configuration\n\nCreate a `.env` file in the project root:\n\n```env\n# Database\nDATABASE_PATH=data/reviews.db\n\n# Scraping\nREQUEST_DELAY_MIN=2.0\nREQUEST_DELAY_MAX=4.0\nMAX_PAGES_PER_SOURCE=3\n\n# Scheduler\nSCRAPE_INTERVAL_HOURS=6\n\n# Email Alerts (optional — SMTP)\nSMTP_HOST=smtp.gmail.com\nSMTP_PORT=587\nSMTP_USER=your-email@gmail.com\nSMTP_PASSWORD=your-app-password\nSMTP_FROM=alerts@yourdomain.com\n\n# Encryption (optional — auto-generated if not set)\nENCRYPTION_KEY=\n\n# Web Dashboard\nFLASK_SECRET_KEY=change-this-in-production\nFLASK_DEBUG=false\n```\n\nGoogle Places, Yelp Fusion, and Resend API keys are managed through the Settings page in the web UI and stored encrypted—they don't go in `.env`.\n\n## Web Dashboard\n\nThere are two web UIs depending on how you run Review Hound:\n\n**Next.js app** — the hosted frontend at [review-hound.vercel.app](https://review-hound.vercel.app/) and what you get when developing locally with `npm run dev` in `frontend/`. Built with React 19, shadcn/ui, Tailwind, and Chart.js.\n\n**Flask UI** — bundled with the CLI. Run `reviewhound web` and open `http://localhost:5000`. Server-rendered with Jinja2 templates, no build step required.\n\nBoth provide:\n\n- **Dashboard**: Overview of all businesses with sentiment bars and ratings\n- **Business Detail**: Per-business stats, rating trends, and recent reviews\n- **Reviews Page**: Filterable list of all reviews with CSV export\n- **One-Click Scraping**: Trigger scrapes directly from the UI\n- **Settings**: Manage API keys, configure sentiment thresholds\n\n## Public Demo\n\n**[Try it live →](https://review-hound.vercel.app/)**\n\nThe public web deployment is a limited browser-local demo of Review Hound, not the full product.\n\n### Demo Includes\n\n- Sample data plus an option to switch to an empty browser-local workspace\n- Browser storage for businesses, reviews, scrape logs, alert rules, API keys, and sentiment settings\n- TrustPilot and BBB source search\n- On-demand scraping from the web UI\n- Review filtering, charts, and CSV export\n- Google Places and Yelp lookups with user-supplied API keys\n- Email alerts with user-supplied Resend credentials and sender address\n- Automatic checks while the browser tab is open\n\n### Demo Limits\n\n- No server-side persistent workspace storage\n- No always-on background monitoring when the browser tab is closed\n- No CLI workflows\n- No Docker or self-hosted runtime controls\n- No built-in server-managed email delivery\n\nClone or fork the repo for the full self-hosted app:\n\n- GitHub: https://github.com/jonmartin721/review-hound\n\n## Project Structure\n\n```\nreview-hound/\n├── reviewhound/           # Python backend\n│   ├── scrapers/          # TrustPilot, BBB, Yelp, Google Places, Yelp Fusion\n│   ├── analysis/          # Sentiment scoring\n│   ├── alerts/            # SMTP + Resend email alerts\n│   └── web/               # Flask UI\n├── frontend/              # Next.js web app\n├── api/                   # Vercel serverless functions\n├── tests/\n├── Dockerfile\n└── docker-compose.yml\n```\n\n## Development\n\n### Backend\n\n```bash\ngit clone https://github.com/jonmartin721/review-hound.git\ncd review-hound\npip install -e \".[dev]\"\n\n# Run tests\npytest tests/ -v\n\n# Run Flask UI in debug mode\nreviewhound web --debug\n```\n\n### Frontend\n\n```bash\ncd frontend\nnpm install\n\n# Start dev server (http://localhost:3000)\nnpm run dev\n\n# Run tests\nnpx vitest\nnpx playwright test\n```\n\n## What's Next?\n\n- Set up email alerts: `reviewhound alert 1 you@email.com`\n- Run the scheduler for hands-off monitoring: `reviewhound watch`\n- Found a bug? [Open an issue](https://github.com/jonmartin721/review-hound/issues)\n\n## Disclaimer\n\nWeb scraping may violate some websites' Terms of Service. Use responsibly and respect rate limits.\n\n## License\n\nMIT License - see LICENSE file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonmartin721%2Freview-hound","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonmartin721%2Freview-hound","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonmartin721%2Freview-hound/lists"}