⭐ CODEGRAPHCONTEXT: /Users/home/Workspace/Apps/.code-analysis/monorepo-analysis.md ⭐ QUERIES: /Users/home/Workspace/Apps/.code-analysis/essential-queries.md Agent Context: /Users/home/Workspace/Apps/4Charm/AGENTS.md
| Action | Command | Notes |
|---|---|---|
| Push | razorpush 4Charm |
Commit and save 4Charm only |
| Build (Release) | 4charmbuild |
Full .app + DMG (~3m) |
| Verify | uv run pytest tests/ -q |
Fastest reliable repo-level check |
| Run | uv run python -m four_charm.main |
Dev run |
| Component | Location | Purpose |
|---|---|---|
| FourChanScraper | src/four_charm/core/scraper.py |
HTTP scraping, resume logic, duplicate checks, adaptive delay |
| MultiUrlDownloadWorker | src/four_charm/gui/workers.py |
QObject worker that coordinates thread-pool downloads |
| MainWindow | src/four_charm/gui/main_window.py |
URL input, progress tracking, folder selection, worker thread lifecycle |
| Config | src/four_charm/config.py |
Worker limits, delays, retries, user agent |
- Adaptive rate limiting with backoff
- SHA-256 duplicate detection
- Auto folder naming from board/thread/title
Ctrl+Returnstarts downloads from the URL editor
- Python Lock: STRICTLY 3.13.x.
- Imports: Absolute ONLY (
from four_charm.core import X). - Threading: Current download flow uses
QObjectworkers moved onto aQThread, withThreadPoolExecutorfor concurrent downloads. New long-running GUI/download work should follow repoAGENTS.mdguidance and preferrazorcore.threading.BaseWorkerwhen practical. - Version: Read from
pyproject.toml(SSOT).