{"id":39977213,"url":"https://github.com/seadonggyun4/truthound","last_synced_at":"2026-05-04T02:04:31.512Z","repository":{"id":329948002,"uuid":"1121027162","full_name":"seadonggyun4/truthound","owner":"seadonggyun4","description":"\"Sniffs out bad data\"","archived":false,"fork":false,"pushed_at":"2026-01-24T04:38:26.000Z","size":9675,"stargazers_count":12,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-24T05:54:51.269Z","etag":null,"topics":["anomaly-detection","data-quality","data-validation","polars","schema-inference","statistical-drift-detection"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/truthound/","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/seadonggyun4.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2025-12-22T10:17:35.000Z","updated_at":"2026-01-24T04:38:30.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/seadonggyun4/truthound","commit_stats":null,"previous_names":["seadonggyun4/truthound"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/seadonggyun4/truthound","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seadonggyun4%2Ftruthound","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seadonggyun4%2Ftruthound/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seadonggyun4%2Ftruthound/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seadonggyun4%2Ftruthound/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seadonggyun4","download_url":"https://codeload.github.com/seadonggyun4/truthound/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seadonggyun4%2Ftruthound/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28812367,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-27T07:41:26.337Z","status":"ssl_error","status_checked_at":"2026-01-27T07:41:08.776Z","response_time":168,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["anomaly-detection","data-quality","data-validation","polars","schema-inference","statistical-drift-detection"],"created_at":"2026-01-18T23:00:20.875Z","updated_at":"2026-05-04T02:04:31.504Z","avatar_url":"https://github.com/seadonggyun4.png","language":"Python","funding_links":[],"categories":["Libraries/Packages/Scripts"],"sub_categories":["Polars plugins"],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg width=\"500\" alt=\"Truthound Banner\" src=\"docs/assets/truthound_banner.png\" /\u003e\n\u003c/div\u003e\n\n\u003ch1 align=\"center\"\u003eTruthound\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eZero-Configuration Data Quality Framework Powered by Polars\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cem\u003eSniffs out bad data.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://truthound.netlify.app/\"\u003e\u003cimg src=\"https://img.shields.io/badge/docs-truthound.netlify.app-blue\" alt=\"Documentation\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://pypi.org/project/truthound/\"\u003e\u003cimg src=\"https://img.shields.io/pypi/v/truthound.svg\" alt=\"PyPI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.python.org/downloads/\"\u003e\u003cimg src=\"https://img.shields.io/badge/python-3.11+-blue.svg\" alt=\"Python\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://opensource.org/licenses/Apache-2.0\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-Apache%202.0-orange.svg\" alt=\"License\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://pola.rs/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Powered%20by-Polars-2563EB?logo=polars\u0026logoColor=white\" alt=\"Powered by Polars\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/ddotta/awesome-polars\"\u003e\u003cimg src=\"https://awesome.re/badge.svg\" alt=\"Awesome Polars\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://pepy.tech/project/truthound\"\u003e\n    \u003cimg src=\"https://img.shields.io/pepy/dt/truthound?color=brightgreen\" alt=\"Downloads\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003e Truthound 3.1.2 is a layered data quality system built around a Polars-first validation kernel, with first-party orchestration adapters, an additive AI review surface, and an operational console built on top of the same core runtime contract.\n\n---\n\n## Abstract\n\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"200\" alt=\"Truthound Icon\" src=\"docs/assets/Truthound_icon_banner.png\" /\u003e\n\u003c/p\u003e\n\nTruthound 3.1.2 is a layered data quality system. At the center is a small, durable, Polars-first validation kernel. Around that core sit an additive `truthound.ai` review surface, Truthound Orchestration for host-native execution inside schedulers and workflow systems, and Truthound Dashboard for operating Truthound through an installation-managed control-plane UI.\n\nThe point of the 3.x reset is not to hide the broader product line. It is to make the system boundary honest. The core validation kernel is the most rigorously validated contract in the ecosystem, while the AI review layer, orchestration adapters, and dashboard build on top of that contract instead of redefining it.\n\n**Documentation**: [truthound.netlify.app](https://truthound.netlify.app/)\n\n## What's New In 3.1.2\n\nTruthound 3.1.2 keeps the 3.1 review surface intact while tightening runtime\nbehavior in constrained CI environments and making the public packaging surface\nmore consistent.\n\n- validation runtime now falls back to sequential execution when thread-pool\n  startup is unavailable on resource-constrained runners\n- SQLite null-check parity now uses the intended pushdown path again in the\n  benchmarked SQL lane\n- reporter and checkpoint outer-layer contracts are cleaner and protected by\n  folder-level `ruff` ratchets in CI\n- the core package version surface now resolves from one canonical source\n  across runtime, plugin scaffolding, benchmark metadata, and current-release\n  docs links\n- AI prompt-to-proposal now uses a hardened Korean/English normalization path,\n  Unicode audit hashes, compiler rejection, and redacted rollout metrics\n- provider output now prefers strict structured output with bounded JSON-mode\n  fallback and repair telemetry\n- prompt readiness is protected by deterministic acceptance fixtures covering\n  200+ Korean prompts, mixed Korean/English prompts, ambiguous prompts, and\n  malformed provider fixtures\n\n## Truthound Product Line\n\n| Layer | Repository | Responsibility | Start Here |\n| --- | --- | --- | --- |\n| `Truthound Core` | [`truthound`](https://github.com/seadonggyun4/Truthound) | Validation kernel and data-plane: `th.check()`, `ValidationRunResult`, planner/runtime, zero-config workspace, reporters, checkpoints, Data Docs | [Core docs](https://truthound.netlify.app/) |\n| `Truthound AI` | `truthound.ai` | Optional review-layer APIs for prompt-to-proposal compilation, run analysis, approval history, and controlled apply | [`/ai/`](https://truthound.netlify.app/ai/) |\n| `Truthound Orchestration` | [`truthound-orchestration`](https://github.com/seadonggyun4/truthound-orchestration) | First-party execution integration layer for Airflow, Dagster, Prefect, dbt, Mage, and Kestra | [`/orchestration/`](https://truthound.netlify.app/orchestration/) |\n| `Truthound Dashboard` | separately distributed operational console | First-party control-plane for RBAC, sources, artifacts, incidents, secrets, observability, and AI review workflows | [`/dashboard/`](https://truthound.netlify.app/dashboard/) |\n\nTruthound is therefore not a monolithic platform with one flat feature surface. It is a layered system in which the core validation contract stays central, while the AI namespace, orchestration adapters, and dashboard expose first-party operational layers on top of it.\n\n## Why Start With Truthound Core\n\n- Polars-first execution and planner-driven aggregation instead of repeated validator-side scans\n- Extreme zero-configuration by default: `th.check(data)` creates and reuses a local `.truthound/` workspace automatically\n- Deterministic auto-suite selection that starts with schema/nullability/type/range/key heuristics instead of \"run everything\"\n- Canonical `ValidationRunResult` shared by checkpoints, reporters, validation docs, and plugins\n- Explicit contracts for contexts, check factories, backends, and artifact generation\n- Failure-first test lanes and migration diagnostics that make framework upgrades safer in production\n\n## Measured Advantages Of Truthound Core Over Great Expectations\n\nThe latest fixed-runner release-grade benchmark artifact set shows Truthound ahead of Great Expectations on every comparable workload in the current comparison catalog while preserving correctness parity.\n\n| Workload | Truthound Warm (s) | GX Warm (s) | Speedup | Memory Ratio |\n| --- | ---: | ---: | ---: | ---: |\n| local-mixed-core-suite | 0.028240 | 0.075232 | 2.66x | 44.29% |\n| local-null | 0.016487 | 0.024964 | 1.51x | 43.62% |\n| local-range | 0.002470 | 0.013219 | 5.35x | 43.84% |\n| local-schema | 0.001479 | 0.017303 | 11.70x | 35.88% |\n| local-unique | 0.002023 | 0.013785 | 6.81x | 42.28% |\n| sqlite-null | 0.007370 | 0.032909 | 4.47x | 48.16% |\n| sqlite-range | 0.006053 | 0.022355 | 3.69x | 43.80% |\n| sqlite-unique | 0.002066 | 0.015655 | 7.58x | 42.12% |\n\nThe practical reasons behind that result are straightforward and core-specific:\n\n- a Polars-first planner/runtime that deduplicates metric work instead of re-scanning through validator loops\n- deterministic auto-suite selection that keeps default work relevant and exact\n- a smaller zero-config context model that persists baselines and artifacts without forcing a heavy project bootstrap\n- one canonical result contract shared by reporters, checkpoints, and validation docs\n\nThis comparison is intentionally bounded. It covers comparable deterministic core checks and SQLite pushdown workloads. It is not a blanket claim about orchestration layers, dashboard operations, or every Great Expectations feature area.\n\nRead the published evidence in [Latest Verified Benchmark Summary](docs/releases/latest-benchmark-summary.md).\n\n## What Truthound Core Stabilizes\n\nTruthound Core 3.x centers the public contract around a smaller and more durable kernel:\n\n| Layer | Responsibility |\n| --- | --- |\n| `TruthoundContext` | Auto-discovered project workspace, baselines, run history, docs artifacts, plugin runtime, and resolved defaults |\n| `contracts` | Stable ports such as `DataAsset`, `ExecutionBackend`, `MetricRepository`, `ArtifactStore`, and plugin capabilities |\n| `suite` | Immutable validation intent via `ValidationSuite`, `CheckSpec`, `SchemaSpec`, evidence policy, and severity policy |\n| `planning` | Scan planning, backend routing, metric deduplication, and pushdown eligibility |\n| `runtime` | Session lifecycle, retries, timeout-safe execution, exception isolation, and evidence capture |\n| `results` | `CheckResult`, `ValidationRunResult`, and `ExecutionIssue` as the canonical output model |\n\nTruthound Orchestration and Truthound Dashboard build on these contracts instead of replacing them. That is the key layered-system boundary.\n\nThe design is grounded in proven ideas from Great Expectations, Soda, Deequ, and Pandera, but optimized for a simpler zero-config starting point and a Polars-first execution path.\n\nThe practical 3.x kernel changes are:\n\n- `th.check()` returns `ValidationRunResult` directly\n- the local `.truthound/` workspace is auto-created and reused\n- `validators=None` now means deterministic `AutoSuiteBuilder`, not \"run every built-in validator\"\n- `compare` moved to `truthound.drift.compare`\n- checkpoints standardize on `CheckpointResult.validation_run` and `CheckpointResult.validation_view`\n- reporters and validation docs consume `ValidationRunResult` directly through reporter contract v3\n\nThe practical current 3.x AI additions on top of that kernel are:\n\n- optional AI dependency bundle: `truthound[ai]`\n- public AI review APIs and CLI commands\n- persisted suite proposal, run analysis, and approval/apply artifacts\n- root AI support probes for downstream services and dashboards\n- prompt hardening for Korean, English, and mixed prompts through deterministic\n  normalization, structured provider output, compiler validation, and explicit\n  review artifacts\n\n## Quick Start\n\n### Installation\n\n```bash\npip install truthound\n```\n\n```bash\n# Optional AI review surface\npip install truthound[ai]\n```\n\n```bash\n# Development and docs workflows in this repository\nuv sync --extra dev --extra docs\n```\n\n### Python API\n\n```python\nimport truthound as th\nfrom truthound.datadocs import generate_validation_report\nfrom truthound.reporters import get_reporter\nfrom truthound.drift import compare\n\nrun = th.check(\n    {\"customer_id\": [1, 2, 2], \"email\": [\"a@example.com\", None, \"c@example.com\"]},\n)\n\nprint(run.execution_mode)\nprint([check.name for check in run.checks])\nprint(run.metadata[\"context_root\"])\n\njson_report = get_reporter(\"json\").render(run)\nvalidation_docs = generate_validation_report(run, title=\"Customer Quality Overview\")\n\ncontext = th.get_context()\nschema = th.learn({\"id\": [1, 2], \"status\": [\"active\", \"inactive\"]})\nmasked = th.mask(\n    {\"email\": [\"a@example.com\", \"b@example.com\"]},\n    columns=[\"email\"],\n    strategy=\"hash\",\n)\ndrift = compare({\"score\": [0.1, 0.2]}, {\"score\": [0.1, 0.8]})\n```\n\n### CLI\n\n```bash\ntruthound check data.csv --validators null,unique\ntruthound check --connection \"sqlite:///warehouse.db\" --table users --pushdown\ntruthound scan pii.csv\ntruthound profile data.csv\ntruthound doctor . --migrate-2to3\ntruthound doctor . --workspace\ntruthound plugins list --json\n```\n\n```bash\n# Optional AI review workflow\ntruthound ai suggest-suite data.csv --prompt \"Require customer_id to be unique\"\ntruthound ai proposals list\ntruthound ai explain-run --run-id \u003crun_id\u003e\n```\n\n## Public Surface\n\nThe root package intentionally exports a smaller API:\n\n- Stable facade: `check`, `scan`, `mask`, `profile`, `learn`, `read`, `get_context`\n- Core types: `TruthoundContext`, `ValidationSuite`, `CheckSpec`, `SchemaSpec`, `ValidationRunResult`, `CheckResult`\n- `th.check()` returns `ValidationRunResult` directly\n- Checkpoint runtime results: `CheckpointResult.validation_run` is canonical and `CheckpointResult.validation_view` is the compatibility projection for legacy action formatting\n- Reporter-facing types: `truthound.reporters.RunPresentation`, `truthound.reporters.ReporterContext`\n- Validation docs entry points: `truthound.datadocs.ValidationDocsBuilder`, `truthound.datadocs.generate_validation_report`\n- Drift comparison: import from `truthound.drift.compare`\n- Advanced systems: import by namespace, for example `truthound.ml`, `truthound.lineage`, `truthound.realtime`, or `truthound.datadocs`\n- Optional AI review surface: import `truthound.ai` after installing `truthound[ai]`\n\n## Optional AI Surface\n\nTruthound now ships an additive `truthound.ai` namespace that preserves the\ncore hot path and zero-config workflow while exposing a reviewable AI layer.\n\n- `suggest_suite(...)` compiles prompts into persisted suite proposal artifacts\n- `explain_run(...)` compiles run evidence into persisted analysis artifacts\n- `approve_proposal(...)`, `reject_proposal(...)`, and `apply_proposal(...)` keep approval and mutation in explicit human-reviewed steps\n- `has_ai_support()` and `get_ai_support_status()` let downstream integrations feature-gate the AI surface cleanly\n- Korean, English, and mixed prompt normalization converts common quality\n  requests into canonical validation intent candidates before provider guidance\n- ambiguous or unsupported prompt requests become reviewable rejected items\n  rather than route failures\n\nRead the technical docs in [docs/ai/index.md](docs/ai/index.md).\nRead the prompt safety contract in [docs/ai/prompt-hardening.md](docs/ai/prompt-hardening.md).\n\nThe public CLI surface is additive as well:\n\n- `truthound ai suggest-suite`\n- `truthound ai explain-run`\n- `truthound ai proposals list/show/approve/reject/apply/history`\n- `truthound ai analyses list/show`\n- `truthound ai smoke openai`\n- `truthound ai smoke openai-explain-run`\n\nThe experimental `use_engine` and `--use-engine` switches remain removed.\n\n## Zero-Config Workflow\n\nTruthound auto-creates a `.truthound/` workspace at your project root. By default it manages:\n\n- `.truthound/config.yaml`: resolved project defaults\n- `.truthound/catalog/`: asset fingerprints and source signatures\n- `.truthound/baselines/`: learned schemas and metric history\n- `.truthound/runs/`: persisted `ValidationRunResult` metadata\n- `.truthound/docs/`: generated validation docs\n- `.truthound/plugins/`: resolved plugin manifest and trust metadata\n\nIf you do nothing except call `th.check(data)`, Truthound will:\n\n1. detect the asset/backend\n2. resolve the active `TruthoundContext`\n3. load or create a baseline\n4. synthesize an auto-suite\n5. plan and execute the validation\n6. persist the run and validation docs when persistence is enabled\n\nUse `truthound doctor . --workspace` to verify that the local `.truthound/` layout, indexes, baselines, and persisted run artifacts are still structurally healthy.\n\n## Plugin Platform\n\nTruthound now uses one lifecycle runtime:\n\n- `PluginManager` is the canonical plugin manager\n- `EnterprisePluginManager` is an async, capability-driven facade over the same runtime\n- Plugins register through stable ports such as `register_check_factory`, `register_data_asset_provider`, `register_reporter`, `register_hook`, and `register_capability`\n- Reporter plugins should target the contract-v3 surface where `ValidationRunResult` is the canonical render input and `RunPresentation` is the shared render projection\n\n## Documentation\n\n- Main docs portal: [truthound.netlify.app](https://truthound.netlify.app/)\n- Core overview: [docs/index.md](docs/index.md)\n- Core getting started: [docs/getting-started/index.md](docs/getting-started/index.md)\n- Core architecture: [docs/concepts/architecture.md](docs/concepts/architecture.md)\n- Core zero-config context: [docs/concepts/zero-config.md](docs/concepts/zero-config.md)\n- Core guides: [docs/guides/index.md](docs/guides/index.md)\n- Core reference: [docs/reference/index.md](docs/reference/index.md)\n- AI docs: [docs/ai/index.md](docs/ai/index.md)\n- Orchestration layer: [truthound.netlify.app/orchestration/](https://truthound.netlify.app/orchestration/)\n- Orchestration getting started: [docs/orchestration/getting-started.md](docs/orchestration/getting-started.md)\n- Dashboard layer: [truthound.netlify.app/dashboard/](https://truthound.netlify.app/dashboard/)\n- Release notes: [docs/releases/truthound-3.1.2.md](docs/releases/truthound-3.1.2.md)\n- Latest verified benchmark summary: [docs/releases/latest-benchmark-summary.md](docs/releases/latest-benchmark-summary.md)\n- Migration guide: [docs/guides/migration-3.0.md](docs/guides/migration-3.0.md)\n- Legacy archive: [docs/legacy/index.md](docs/legacy/index.md)\n- ADRs: [docs/adr/001-validation-kernel.md](docs/adr/001-validation-kernel.md), [docs/adr/002-plugin-platform.md](docs/adr/002-plugin-platform.md), [docs/adr/003-result-model.md](docs/adr/003-result-model.md), [docs/adr/004-migration-compatibility.md](docs/adr/004-migration-compatibility.md)\n\n## Development\n\n```bash\nuv run --frozen --extra dev python -m pytest -q\nuv run --frozen --extra dev python -m pytest --collect-only -q tests\nuv run --frozen --extra dev python -m pytest -q -m \"contract or fault or e2e\" -p no:cacheprovider\nuv run --frozen --extra dev python -m pytest -q -m \"contract or fault or integration or soak or stress or scale_100m or e2e\" --run-integration --run-expensive --run-soak -p no:cacheprovider\nuv run --frozen --extra dev python -m pytest -q tests/test_truthound_3_0_contract.py tests/test_api.py tests/test_public_surface.py tests/test_checkpoint.py -p no:cacheprovider\nuv run --frozen --extra benchmarks python -m truthound.cli benchmark parity --suite pr-fast --frameworks truthound --backend local --strict\nuv run --frozen --extra benchmarks python -m truthound.cli benchmark parity --suite nightly-core --frameworks both --backend local --strict\nuv run --frozen --extra benchmarks python -m truthound.cli benchmark parity --suite nightly-sql --frameworks both --backend sqlite --strict\nuv run --frozen --extra benchmarks python -m truthound.cli benchmark parity --suite release-ga --frameworks both --strict\npython docs/scripts/prepare_public_docs.py --mode full\npython docs/scripts/prepare_public_docs.py --mode public\nuv run --frozen --extra dev python docs/scripts/check_links.py --mkdocs mkdocs.yml README.md CLAUDE.md build/full-docs\nuv run --frozen --extra dev --extra docs mkdocs build --strict\nuv run --frozen --extra dev --extra docs mkdocs build --strict -f mkdocs.public.yml\ntruthound doctor . --migrate-2to3\n```\n\nOfficial benchmark comparisons should cite the published fixed-runner artifact set: `release-ga.json`, `env-manifest.json`, and `latest-benchmark-summary.md`.\n\nTests now follow a failure-first lane model:\n\n- `contract`: stable public API and compatibility boundaries\n- `fault`: deterministic failure injection, timeout, corruption, and concurrency scenarios\n- `integration`: opt-in backend and external-service coverage\n- `soak` and `stress`: nightly-only load and chaos coverage\n\nThe default local run is intentionally fast. Manual verification artifacts live under `verification/phase6` and are intentionally kept out of pytest discovery.\n\nOfficial performance claims should come only from the verified release-grade parity artifacts under `.truthound/benchmarks/release/`. Nightly outputs are for trend visibility, not public benchmark positioning.\n\nWhen adding tests, prefer scenarios that protect public contracts or operational failure modes. Avoid adding default-value, getter/setter, enum-literal, `to_dict()` round-trip, or CSS-string existence tests unless they prove a compatibility boundary that has failed before.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseadonggyun4%2Ftruthound","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseadonggyun4%2Ftruthound","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseadonggyun4%2Ftruthound/lists"}