Desktop application for keyword-based Depop search scraping, local SQLite history, median/IQR valuation heuristics, deal scoring, and optional desktop / Discord alerts. Includes a CLI for automation and CSV export.
Important: Automated access may conflict with Depop’s terms of use. Use conservative rate limits, do not bypass authentication, and comply with applicable laws and platform rules. This project is provided for education and legitimate personal use only.
Dark-themed desktop UI: keywords and options on the left, deals table on the right. If your Discord webhook is visible in a screenshot you share publicly, regenerate the webhook in Discord and treat the old URL as compromised.
- Do not commit Discord webhooks, API keys, or personal data. Use environment variables (
DEPOP_RESELLER_DISCORD_WEBHOOK) or a localconfig.toml/config.yaml— those filenames are gitignored. - Do not commit
data/(SQLite) orlogs/; they stay local by default. - Never paste live webhook URLs into GitHub issues or public chats.
Latest release includes a Windows amd64 zip built with PyInstaller. Extract it and run depop_reseller\depop_reseller.exe. You still need Chromium for Playwright on that machine (see the release notes or Build a Windows .exe).
- Python 3.10+ (3.11+ recommended;
tomllibis built-in on 3.11+) - Windows, macOS, or Linux (GUI tested for Windows; PySide6 is cross-platform)
- Playwright Chromium browser
cd "c:\Users\mpcon\Downloads\Depop Reseller"
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python -m playwright install chromiumUse python -m playwright (not bare playwright) if Windows reports 'playwright' is not recognized — the CLI often lives in %APPDATA%\Python\Python3xx\Scripts, which may not be on your PATH.
Development / CI: pip install -r requirements-dev.txt (includes everything in requirements.txt plus pinned dev tools).
Optional: copy config.example.toml to config.toml in the project root to tune delays, fees, and paths. (config.toml is not tracked by git.)
- Install Python 3.10+ and complete Setup once (
venv,pip install,playwrightas above). - Double-click
Run.batin the project root. It activates.venvif present, then runspython -m depop_reseller, and pauses so you can read any errors.
python -m depop_resellerOr after pip install -e .:
depop-reseller- File → Export results as CSV… saves the current table using the same columns as the CLI export.
- Last run panel shows per-keyword progress and errors without opening log files.
- Window layout, keywords, and options (except the Discord webhook) are restored via Qt
QSettingson this machine. Webhooks are not saved inQSettingsfor safety; useDEPOP_RESELLER_DISCORD_WEBHOOKorconfig.tomlfor a persistent default. - Brand multipliers default to the packaged
depop_reseller/brands/brand_multipliers.json(default_brand_multipliers_path()), independent of the current working directory.
After pip install -e ., the console entry point is depop-reseller-cli. You can also run:
python -m depop_reseller.cli version
python -m depop_reseller.cli scan -k "carhartt jacket" --no-headless
python -m depop_reseller.cli scan --keywords-file keywords.txt --expand-typos
python -m depop_reseller.cli export-deals -k "carhartt jacket" -o deals.csvscan— runs Playwright, writes to SQLite underdata/(or--data-dir).export-deals— reads the existing DB and prints CSV to stdout or-o/--output.version— prints the package version.
Common flags: --config path/to/config.toml, --data-dir to override the database directory, --max-pages, --concurrent (scan only).
DEPOP_RESELLER_CONFIG— path toconfig.toml/config.yamlDEPOP_RESELLER_DISCORD_WEBHOOK— default Discord webhook URLDEPOP_RESELLER_LOG_LEVEL— e.g.DEBUG
depop_reseller/
scraper/ Playwright search URL, scroll, DOM extract, rate limits, retries
storage/ SQLite (listings, price_observations, scrape_runs), WAL
processing/ Normalize prices, misspellings, CSV export
models/ Median/IQR valuation, fees, deal score
brands/ JSON multipliers + loader
orchestration/ Async multi-keyword scan, ScanService for GUI/CLI
gui/ PySide6 main window, results model, background worker
notify/ Desktop (plyer), Discord webhook
cli.py argparse entry for scan / export-deals / version
Data flow: scraper → SQLite → valuation + deal scoring → GUI table / CSV / alerts.
data/— SQLite DB (created at runtime; gitignored by default)logs/— rotatingdepop_reseller.logdepop_reseller.spec— PyInstaller spec (root); output underdist//build/(gitignored)
pytest tests -qGitHub Actions (.github/workflows/ci.yml) runs pytest on Python 3.11 and 3.12 on pushes/PRs to main/master.
| Issue | What to try |
|---|---|
playwright not found |
python -m playwright install chromium |
| Empty Title in results | Re-run scan; titles are inferred from card text if Depop omits aria-label. |
| Discord never alerts | Alerts only when Score ≥ Alert min score. Use Test webhook to verify the URL. |
| Wrong Brand path | Use Browse… or rely on the default packaged JSON; avoid fragile relative paths like brands\... from another working directory. |
- Complete setup above and verify
python -m depop_resellerruns. - Run PyInstaller from the repository root (the folder that contains the
depop_resellerpackage — needed if the path has spaces, e.g.Depop Reseller). - Playwright browsers are not bundled in the zip; run
python -m playwright install chromiumon the target PC (or copy%LOCALAPPDATA%\ms-playwrightfrom a machine that already has it).
cd "path\to\Depop Reseller"
pip install pyinstaller
pyinstaller depop_reseller.specOutputs appear under dist/depop_reseller/. Run dist\depop_reseller\depop_reseller.exe.
Notes:
- First startup may be slow; Windows Defender sometimes flags PyInstaller binaries (false positives). Code signing reduces friction.
- After copying the folder to another PC, install Chromium for Playwright on that PC if the app cannot find browsers.
Depop’s HTML changes. If scraping breaks, update selectors and extraction logic in depop_reseller/scraper/selectors.py and depop_scraper.py only.
Create an empty repository on GitHub (no README/license if you already have them in this folder). From the project root:
git init
git add .
git status
git commit -m "Initial commit: Depop Reseller"
git branch -M main
git remote add origin https://github.com/YOUR_USER/YOUR_REPO.git
git push -u origin mainReview git status before committing: you should not see config.toml, .env, data/, or logs/.
With GitHub CLI (gh auth login first):
gh repo create YOUR_REPO --public --source=. --remote=origin --pushMIT — see LICENSE.
