{"id":50472499,"url":"https://github.com/semcod/wup","last_synced_at":"2026-06-01T11:04:16.476Z","repository":{"id":354674696,"uuid":"1224671567","full_name":"semcod/wup","owner":"semcod","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-21T10:40:51.000Z","size":5732,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-21T17:50:18.183Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/semcod.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2026-04-29T14:07:02.000Z","updated_at":"2026-05-21T10:40:54.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/semcod/wup","commit_stats":null,"previous_names":["semcod/wup"],"tags_count":38,"template":false,"template_full_name":null,"purl":"pkg:github/semcod/wup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fwup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fwup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fwup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fwup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/semcod","download_url":"https://codeload.github.com/semcod/wup/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fwup/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33771635,"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-06-01T02:00:06.963Z","response_time":115,"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-06-01T11:04:15.313Z","updated_at":"2026-06-01T11:04:16.461Z","avatar_url":"https://github.com/semcod.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WUP (What's Up)\n\n\n## AI Cost Tracking\n\n![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.64-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)\n![AI Cost](https://img.shields.io/badge/AI%20Cost-$3.49-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-31.7h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)\n\n- 🤖 **LLM usage:** $3.4940 (76 commits)\n- 👤 **Human dev:** ~$3168 (31.7h @ $100/h, 30min dedup)\n\nGenerated on 2026-05-27 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)\n\n---\n\n![PyPI](https://img.shields.io/badge/pypi-wup-blue) ![Version](https://img.shields.io/badge/version-0.2.64-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)\n\n**WUP (What's Up)** - Intelligent file watcher for regression testing in large projects.\n\nWUP monitors file changes and runs intelligent regression tests using a 3-layer approach:\n1. **Detection Layer**: File watching with heuristics\n2. **Priority Layer**: Quick tests of related services (3 endpoints max)\n3. **Detail Layer**: Full tests with blame reports (only on failure)\n\n## Features\n\n- 🎯 **Intelligent Testing**: Only tests related services when files change\n- ⚡ **CPU Throttling**: Respects system resources with configurable CPU limits\n- 🔄 **3-Layer Architecture**: Quick smoke tests first, detailed tests only on failure\n- 📊 **Live Dashboard**: Real-time status monitoring with Rich CLI\n- 🔍 **Dependency Mapping**: Automatic detection of files → endpoints → services\n- 🚀 **Framework Support**: FastAPI, Flask, Django, Express.js, and more\n- 📝 **Blame Reports**: Detailed regression reports with file/line/commit info\n- ⚙️ **Configuration System**: Declarative configuration via `wup.yaml` file\n- 🎛️ **Per-Service Settings**: Custom test strategies per service\n- 🧪 **TestQL Integration**: Native support for TestQL scenarios\n- 🔧 **CLI/Shell Automation**: Auto-detection and configuration of CLI tools and shell scripts\n\n## Installation\n\n```bash\n# Install from source\npip install -e .\n\n# Install with development dependencies\npip install -e \".[dev]\"\n```\n\n## Quick Start\n\n```bash\n# 1. Interactive configuration (recommended)\nwup assistant\n\n# 2. Or quick auto-setup\nwup assistant --quick --template fastapi\n\n# 3. Build dependency map (one-time setup)\nwup map-deps ./my-project\n\n# 4. Start watching (TestQL + live probes every 60s by default)\nwup watch ./my-project\n\n# 5. Start with live dashboard\n\n\nwup watch ./my-project --dashboard\n```\n\n## Usage\n\n### Build Dependency Map\n\n```bash\n# Auto-detect framework\nwup map-deps ./my-project\n\n# Specify framework\nwup map-deps ./my-project --framework fastapi\n\n# Custom output file\nwup map-deps ./my-project --output my-deps.json\n```\n\n### Watch Project\n\n```bash\n# Basic watching: TestQL mode + live HTTP probes every 60s (uses wup.yaml if present)\nwup watch ./my-project\n\n# Legacy HTTP-only watcher (no TestQL, no periodic probes unless configured)\nwup watch ./my-project --mode default --probe-interval 0\n\n# With custom settings\nwup watch ./my-project \\\n  --cpu-throttle 0.5 \\\n  --debounce 3 \\\n  --cooldown 600 \\\n  --probe-interval 120\n\n# With live dashboard\nwup watch ./my-project --dashboard\n\n# Use specific config file\nwup watch ./my-project --config custom-config.yaml\n\n# Discover endpoints from TestQL scenarios\nwup testql-endpoints /path/to/scenarios --output testql-deps.json\n```\n\n### Initialize Configuration\n\n```bash\n# Generate default wup.yaml configuration\nwup init\n\n# Generate with custom output path\nwup init --output .wup.yaml\n\n# Auto-detect and configure CLI/shell services\nwup init-cli ./my-project\n\n# Merge CLI configuration with existing wup.yaml\nwup init-cli ./my-project --merge\n```\n\n### Check Status\n\n```bash\n# View dependency map status\nwup status\n\n# Custom deps file\nwup status --deps my-deps.json\n```\n\n### CLI/Shell Automation\n\nWUP can automatically detect and configure CLI tools and shell scripts for testing:\n\n```bash\n# Auto-detect CLI commands and generate configuration\nwup init-cli ./my-project\n\n# Merge with existing wup.yaml\nwup init-cli ./my-project --merge\n\n# Custom output paths\nwup init-cli ./my-project --output-config custom.yaml --output-scenarios custom-scenarios\n\n# Skip argument inference (faster)\nwup init-cli ./my-project --no-infer-args\n```\n\nThe `init-cli` command:\n- Scans `pyproject.toml`, `setup.py`, `setup.cfg` for entry points\n- Detects packages with `__main__.py` modules\n- Generates shell service configuration in `wup.yaml`\n- Creates TestQL scenarios for CLI commands in `testql-scenarios/`\n- Supports merging with existing configurations\n\n**Generated files:**\n- `cli-smoke.testql.toon.yaml` - Smoke tests for all CLI commands\n- `cli-{command}.testql.toon.yaml` - Detailed tests for each command\n\n## Architecture\n\n### 3-Layer Testing Approach\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│                    DETECTION LAYER                          │\n│  File watching with watchdog + heuristics                   │\n│  Skips: .git, __pycache__, node_modules, .venv              │\n└──────────────────────┬──────────────────────────────────────┘\n                       │ File change\n                       ▼\n┌─────────────────────────────────────────────────────────────┐\n│                   PRIORITY LAYER                            │\n│  Quick test: 3 endpoints max per service                    │\n│  Duration: ~1-2 seconds                                     │\n│  Result: Pass → Done, Fail → Escalate                       │\n└──────────────────────┬──────────────────────────────────────┘\n                       │ Failure\n                       ▼\n┌─────────────────────────────────────────────────────────────┐\n│                    DETAIL LAYER                             │\n│  Full test: All endpoints with blame report                 │\n│  Duration: ~3-5 seconds                                     │\n│  Result: Regression report with file/line/commit            │\n└─────────────────────────────────────────────────────────────┘\n```\n\n### Performance Characteristics\n\n```\nIdle:           0.1% CPU, 10MB RAM\nFile change:    5s test → 2% CPU spike\nFull regression: 15s test → 15% CPU spike\n200+ files/min: 100 req/s → OK (throttled)\n```\n\n## Configuration\n\n### Service Types\n\nWUP supports three service types for coincidence detection and intelligent testing:\n\n- **web** - HTTP/API services (FastAPI, Flask, Django, Express.js, etc.)\n- **shell** - CLI tools, scripts, and command-line services\n- **auto** - Automatic detection (default)\n\nCoincidence detection allows WUP to identify related services. For example, if you have `users-web` and `users-shell`, WUP will detect they share the same domain and test both when relevant files change.\n\n### wup.yaml Configuration File\n\nWUP supports declarative configuration via `wup.yaml` (or `.wup.yaml`) in your project root. This allows you to define watch paths, service-specific settings, and test strategies.\n\nGenerate a default configuration:\n\n```bash\nwup init\n```\n\nThe generated `wup.yaml` includes:\n- **Metadata header**: Version, generation date, documentation links\n- **Dependencies info**: WUP version and optional wupbro dashboard\n- **Quick start guide**: Common commands to get started\n\nExample `wup.yaml`:\n\n```yaml\nproject:\n  name: \"my-project\"\n  description: \"My awesome project\"\n\nwatch:\n  # Folders to watch (supports glob patterns)\n  paths:\n    - \"app/**\"\n    - \"src/**\"\n    - \"routes/**\"\n    - \"!tests/**\"         # exclusion\n    - \"!node_modules/**\"\n\n  # Global exclude patterns\n  exclude_patterns:\n    - \"*.md\"\n    - \"*.txt\"\n    - \"migrations/**\"\n\n  # File types to watch (empty = watch all files)\n  # Only changes to these file extensions will trigger tests\n  file_types:\n    - \".py\"\n    - \".ts\"\n    - \".jsx\"\n\nservices:\n  # Service configurations - simplified with auto-detection\n  # If paths are empty, WUP auto-detects files by service name\n  \n  - name: \"users-shell\"\n    type: \"shell\"\n    # Auto-detects files containing \"users-shell\"\n  \n  - name: \"users-web\"\n    type: \"web\"\n    # Auto-detects files containing \"users-web\"\n    # Will detect coincidence with users-shell\n  \n  # Or use explicit paths (old style still works)\n  - name: \"payments\"\n    paths:\n      - \"app/payments/**\"\n    type: \"auto\"\n\ntest_strategy:\n  quick:\n    debounce_s: 2\n    max_queue: 5\n    timeout_s: 10\n  detail:\n    debounce_s: 10\n    max_queue: 1\n    timeout_s: 30\n\ntestql:\n  # TestQL-specific configuration\n  scenario_dir: \"scenarios/tests\"\n  smoke_scenario: \"smoke.testql.toon.yaml\"\n  output_format: \"json\"\n  extra_args:\n    - \"--timeout 10s\"\n```\n\n### CLI Options\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `--config` | auto | Path to wup.yaml config file |\n| `--cpu-throttle` | 0.8 | CPU usage threshold (0.0-1.0) |\n| `--debounce` | 2 | Debounce time in seconds |\n| `--cooldown` | 300 | Test cooldown in seconds |\n| `--dashboard` | false | Enable live dashboard |\n| `--deps` | deps.json | Dependency map file path |\n| `--mode` | default | Watcher mode: default or testql |\n\n### Environment Variables\n\n```bash\n# Set default CPU throttle\nexport WUP_CPU_THROTTLE=0.5\n\n# Set default debounce time\nexport WUP_DEBOUNCE=3\n```\n\nFull list of supported variables (see `.env.example`):\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `WUP_CPU_THROTTLE` | — | CPU usage threshold (0.0-1.0) |\n| `WUP_DEBOUNCE` | — | Debounce time in seconds |\n| `WUPBRO_ENDPOINT` | — | wupbro backend URL |\n| `WUP_BASE_URL` | — | Base URL for visual diff page scanning |\n| `OPENROUTER_API_KEY` | *(not set)* | Required for LLM features (https://openrouter.ai/keys) |\n| `LLM_MODEL` | `openrouter/qwen/qwen3-coder-next` | LLM model for assistant |\n| `PFIX_AUTO_APPLY` | `true` | Apply fixes without asking |\n| `PFIX_AUTO_INSTALL_DEPS` | `true` | Auto pip/uv install missing deps |\n| `PFIX_AUTO_RESTART` | `false` | Restart process after fix |\n| `PFIX_MAX_RETRIES` | `3` | Max fix retries |\n| `PFIX_DRY_RUN` | `false` | Dry-run mode (no changes written) |\n| `PFIX_ENABLED` | `true` | Enable/disable pfix |\n| `PFIX_GIT_COMMIT` | `false` | Auto-commit fixes |\n| `PFIX_GIT_PREFIX` | `pfix:` | Commit message prefix |\n| `PFIX_CREATE_BACKUPS` | `false` | Create .pfix_backups/ directory |\n\n## Visual DOM Diff\n\nWUP optionally scans configured pages with Playwright after each successful quick test, compares the DOM structure to the previous snapshot, and reports significant changes.\n\n### Setup\n\n```bash\npip install playwright\nplaywright install chromium\n```\n\n### Configuration\n\n```yaml\nvisual_diff:\n  enabled: true\n  base_url: \"http://localhost:8100\"   # or leave empty and set WUP_BASE_URL env var\n  base_url_env: \"WUP_BASE_URL\"\n  delay_seconds: 5.0      # wait after file change before scanning\n  max_depth: 10            # DOM snapshot depth\n  pages:\n    - \"/health\"\n    - \"/dashboard\"\n  pages_from_endpoints: true   # also scan endpoints from testql config\n  threshold_added: 3           # min node additions to report as \"changed\"\n  threshold_removed: 3\n  threshold_changed: 5\n  headless: true\n```\n\nOr set the base URL in `.wup.env` in the project root (not committed to git):\n\n```bash\n# .wup.env\nWUP_BASE_URL=http://localhost:8100\n```\n\n### Output\n\n- **Snapshots** — `.wup/visual-snapshots/\u003cservice\u003e/\u003cpage\u003e.json`\n- **Diff events** — `.wup/visual-diffs/\u003cservice\u003e/\u003cpage\u003e.jsonl` (appended on each change)\n\nVisible in `wup status` as a \"Visual DOM diffs\" section.\n\n### Graceful degradation\n\nIf Playwright is not installed, the visual diff module logs a warning and skips scanning — it does **not** break the watcher.\n\n## Web Dashboard (wupbro)\n\nOptional FastAPI backend that receives events from WUP agents and renders a live dashboard.\n\n### Run\n\n```bash\npip install -e wupbro/\nwupbro --reload --port 8000\n```\n\nOpen \u003chttp://localhost:8000/\u003e to see regressions, passes, anomalies, visual diffs, and health transitions in real time.\n\n### Configure agent → backend\n\n```yaml\n# wup.yaml\nweb:\n  enabled: true\n  endpoint: \"http://localhost:8000\"\n  timeout_s: 2.0\n```\n\nOr via env:\n\n```bash\nexport WUPBRO_ENDPOINT=http://localhost:8000\n```\n\nThe agent fire-and-forgets `REGRESSION`, `PASS`, `ANOMALY`, `VISUAL_DIFF`, and `HEALTH_TRANSITION` events. Network errors never break the watcher (soft-fail).\n\nSee `wupbro/README.md` for full API reference and driver endpoints (DOM diff, browserless, anomaly).\n\n## Project Structure\n\n```\nwup/\n├── wup/\n│   ├── __init__.py            # Package exports\n│   ├── anomaly_detector.py    # AnomalyDetector: hash, YAML structure, AST diff\n│   ├── assistant.py           # WupAssistant: interactive configuration wizard\n│   ├── cli.py                 # CLI: watch, map-deps, status, init, testql-endpoints, assistant, version, init-cli\n│   ├── cli_scanner.py         # CLIScanner: detects CLI commands from pyproject.toml, setup.py, etc.\n│   ├── cli_config_generator.py # CLIConfigGenerator: generates wup.yaml for shell services\n│   ├── testql_cli_generator.py # TestQLCliGenerator: generates TestQL scenarios for CLI commands\n│   ├── config.py              # Config loading/saving + .wup.env support\n│   ├── core.py                # WupWatcher: detection, inference, scheduling\n│   ├── dependency_mapper.py   # DependencyMapper: codebase → deps.json\n│   ├── testql_discovery.py    # TestQLEndpointDiscovery: scenario parsing\n│   ├── testql_monitor.py      # TestQLMonitor: extracts live HTTP probes and Docker services\n│   ├── testql_watcher.py      # TestQLWatcher: scenario runner + health tracking\n│   ├── visual_diff.py         # VisualDiffer: Playwright DOM snapshot + diff engine\n│   ├── web_client.py          # WebClient: async HTTP event sink → wupbro\n│   ├── monitoring_manifest.py # Builds and patches the wup.yaml monitoring block\n│   ├── planfile_reporter.py   # PlanfileReporter: creates and deduplicates Planfile tickets\n│   └── models/\n│       ├── __init__.py\n│       └── config.py          # Dataclasses: WupConfig, ServiceConfig, WatchConfig, TestStrategyConfig, TestQLConfig, VisualDiffConfig, WebConfig, AnomalyDetectionConfig...\n├── wupbro/                   # Optional FastAPI dashboard (separate package)\n│   ├── wupbro/\n│   │   ├── main.py            # FastAPI app\n│   │   ├── routers/           # events, drivers, dashboard\n│   │   ├── storage.py         # EventStore (in-memory + JSONL)\n│   │   └── templates/         # index.html dashboard\n│   └── tests/                 # FastAPI endpoint tests (pytest + TestClient)\n├── tests/\n│   ├── test_wup.py            # unit/integration tests (incl. VisualDiffer, config)\n│   ├── test_testql_watcher.py # TestQLWatcher + VisualDiffer integration tests\n│   ├── test_web_client.py     # WebClient + WebConfig tests\n│   └── test_e2e.py            # end-to-end CLI tests\n├── examples/\n│   ├── fastapi-app/           # FastAPI example project\n│   ├── flask-app/             # Flask example project\n│   ├── multi-service/         # Multi-service example\n│   ├── testql_demo.py         # TestQL simulation demo\n│   ├── testql_integration.py  # Custom TestQLWatcher + visual diff example\n│   └── visual_diff_demo.py    # Visual DOM diff demo (no Playwright required)\n├── docs/\n│   └── TESTQL_INTEGRATION.md  # TestQL integration guide\n├── testql-scenarios/          # Auto-generated TestQL scenarios\n├── pyproject.toml             # Package config (setuptools)\n└── README.md\n```\n\n## Development\n\n### Running Tests\n\n```bash\n# Run all tests\npython3 -m pytest tests/ -v\n\n# Run specific suite\npython3 -m pytest tests/test_wup.py -v\npython3 -m pytest tests/test_testql_watcher.py -v\n\n# Run with coverage\npython3 -m pytest tests/ --cov=wup\n```\n\n### Goal wrapper (local `.venv`)\n\nWhen `goal` is installed globally, it may inherit another project's `VIRTUAL_ENV`.\nUse the local wrapper to force `wup/.venv` before running `goal` commands:\n\n```bash\n# Default: runs goal -a\nbash scripts/goal-local\n\n# Explicit arguments\nbash scripts/goal-local -a\nbash scripts/goal-local --dry-run\n```\n\nIf needed, point to a specific `goal` binary:\n\n```bash\nGOAL_BIN=/home/tom/.local/bin/goal bash scripts/goal-local -a\n```\n\n### Examples\n\n```bash\n# Visual diff demo (no Playwright required)\npython3 examples/visual_diff_demo.py\n\n# With live page scan (requires playwright)\npython3 examples/visual_diff_demo.py http://localhost:8100/health\n\n# TestQL + visual diff integration\npython3 examples/testql_integration.py /path/to/project\n\n# Monorepo analysis (c2004-style large projects)\npython3 examples/c2004_monorepo_demo.py /path/to/monorepo\n\n# CI/CD integration patterns\npython3 examples/ci_cd_integration.py\n\n# Generate GitHub Actions workflow\npython3 examples/ci_cd_integration.py --generate-github-actions\n\n# Webhook notifications (Slack, Teams, Discord)\npython3 examples/webhook_notifications.py\n```\n\n### Building \u0026 Publishing\n\n```bash\npython -m build\n```\n\n## Real-World Testing\n\nWUP has been tested on production-scale projects:\n\n- **c2004 Project** (maskservice/c2004): Large IoT platform with 21+ connect-* modules\n  - 29 services auto-detected by assistant\n  - 100+ YAML configuration files monitored\n  - Anomaly detection: 0.06s for 5 config files (~1ms/file)\n  - Framework: Custom Python/FastAPI hybrid\n\n## Documentation\n\nComprehensive documentation is available in the `docs/` directory:\n\n- **[Configuration Assistant](docs/WUP_ASSISTANT.md)** - Interactive setup guide for `wup.yaml`\n  - `wup assistant` - Interactive configuration wizard\n  - Auto-detects framework and services\n  - Intelligent suggestions and validation\n  - `wup init-cli` - Automated CLI/shell project setup\n\n- **[Anomaly Detection](docs/ANOMALY_DETECTION.md)** - Fast alternatives to Playwright\n  - Hash-based change detection (~1ms per file)\n  - YAML structure analysis\n  - Python AST diff for API changes\n  - Configure with `anomaly_detection:` in wup.yaml\n\n- **[Browser Notifications](docs/NOTIFICATIONS.md)** - Real-time alerts in wupbro\n  - 7 notification types (regressions, status changes, recoveries)\n  - Configurable per-type with cooldown\n  - Server-Sent Events for instant delivery\n  - Browser Notifications API integration\n\n- **[TestQL Integration](docs/TESTQL_INTEGRATION.md)** - TestQL scenario support\n  - `wup init-cli` - Automated CLI command detection and TestQL scenario generation\n  - Shell service configuration for CLI tools\n  - TestQL scenarios for CLI commands\n\n## License\n\nLicensed under Apache-2.0.\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemcod%2Fwup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsemcod%2Fwup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemcod%2Fwup/lists"}