{"id":51528587,"url":"https://github.com/xscriptor/tengu","last_synced_at":"2026-07-09T00:30:48.434Z","repository":{"id":369348133,"uuid":"1289464182","full_name":"xscriptor/tengu","owner":"xscriptor","description":null,"archived":false,"fork":false,"pushed_at":"2026-07-04T19:50:04.000Z","size":201,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-04T21:13:18.297Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xscriptor.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","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-07-04T19:34:09.000Z","updated_at":"2026-07-04T19:50:07.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/xscriptor/tengu","commit_stats":null,"previous_names":["xscriptor/tengu"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/xscriptor/tengu","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xscriptor%2Ftengu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xscriptor%2Ftengu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xscriptor%2Ftengu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xscriptor%2Ftengu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xscriptor","download_url":"https://codeload.github.com/xscriptor/tengu/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xscriptor%2Ftengu/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35282897,"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-07-08T02:00:06.796Z","response_time":61,"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-07-09T00:30:45.894Z","updated_at":"2026-07-09T00:30:48.423Z","avatar_url":"https://github.com/xscriptor.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003ch1 align=\"center\"\u003eTengu\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003cp\u003e\u003cem\u003eWeb quality auditor -- Performance, SEO, Accessibility, Best Practices\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003ca href=\"README.md\"\u003eEnglish\u003c/a\u003e | \u003ca href=\"docs/esp/README.md\"\u003eEspanol\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cp\u003e\u003cem\u003e\u003ca href=\"https://github.com/xscriptor/tengu\"\u003eTengu\u003c/a\u003e\u003c/em\u003e : \u003cem\u003e\u003ca href=\"https://github.com/xscriptor/xwa\"\u003eXWA\u003c/a\u003e \u003cstrong\u003esubmodule focused\u003c/strong\u003e on web quality auditing -- under active development\u003c/em\u003e\u003c/p\u003e\n\n\u003chr\u003e\n\n\u003ch2\u003eOverview\u003c/h2\u003e\n\n\u003cp\u003eTengu is a web quality auditor that evaluates web applications across four dimensions:\u003c/p\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eCategory\u003c/th\u003e\n    \u003cth\u003eScope\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003ePerformance\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003ePage weight, Core Web Vitals (LCP, CLS, INP), resource waterfall, image optimization, font loading, cache policy, compression, third-party impact\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eSEO\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eTitle tags, meta descriptions, heading hierarchy, canonical URLs, Open Graph, Twitter Cards, JSON-LD, sitemaps, robots.txt, hreflang, redirect chains, broken links\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eAccessibility\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eAlt text, heading structure, ARIA attributes, landmark elements, color contrast (WCAG AA/AAA), keyboard navigation, form labels, link text, tables, iframes, viewport configuration\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eBest Practices\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eHTTPS enforcement, security headers (HSTS, CSP, XFO, etc.), cookie audit, GDPR banner detection, doctype validation, deprecated HTML, mixed content, SRI, console errors\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eInterface\u003c/th\u003e\n    \u003cth\u003eDirectory\u003c/th\u003e\n    \u003cth\u003eLanguage\u003c/th\u003e\n    \u003cth\u003eType\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eTengu Web\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003e/\u003c/code\u003e (monorepo root)\u003c/td\u003e\n    \u003ctd\u003eRust (Axum) + Angular 19\u003c/td\u003e\n    \u003ctd\u003eWeb application (standalone or Docker)\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003chr\u003e\n\n\u003ch2\u003eQuick Start\u003c/h2\u003e\n\n\u003ch3\u003eWeb Version (Docker Compose)\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003edocker compose up -d --build\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n  \u003cli\u003eWeb UI: \u003ccode\u003ehttp://localhost:8080\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch3\u003eStandalone (No Docker)\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003ecargo run --release\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eWeb UI at \u003ccode\u003ehttp://localhost:8080\u003c/code\u003e.\u003c/p\u003e\n\n\u003ch3\u003eEnvironment Variables\u003c/h3\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eVariable\u003c/th\u003e\u003cth\u003eDefault\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003ePORT\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e8080\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eHTTP listen port\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eRUST_LOG\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003etengu=info,tower_http=info\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eLogging verbosity\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n\u003chr\u003e\n\n\u003ch2\u003eRelated Documents\u003c/h2\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eDocument\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/manual.md\"\u003edocs/manual.md\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eDeployment and usage manual\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/ui-architecture.md\"\u003edocs/ui-architecture.md\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eFrontend architecture overview\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/rust-libraries.md\"\u003edocs/rust-libraries.md\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eRust backend dependency inventory\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/uses/audit.md\"\u003edocs/uses/audit.md\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eAudit usage guide\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ca href=\"ROADMAP.md\"\u003eROADMAP.md\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eDevelopment phases and milestones\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ca href=\"CHANGELOG.md\"\u003eCHANGELOG.md\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eRelease history and version log\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n\u003chr\u003e\n\n\u003ch2\u003eProject Structure\u003c/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003etengu/\n├── src/\n│   ├── main.rs              # Axum server entry point\n│   ├── config.rs            # Audit configuration, category filters\n│   ├── api/\n│   │   └── routes.rs        # REST API + WebSocket audit endpoint\n│   ├── auditor/\n│   │   ├── mod.rs           # Audit orchestrator + Finding model\n│   │   ├── performance.rs   # Page weight, resources, images, fonts\n│   │   ├── seo.rs           # Meta tags, structured data, sitemaps\n│   │   ├── a11y.rs          # WCAG compliance, ARIA, contrast\n│   │   └── best_practices.rs # Security headers, cookies, HTML validation\n│   ├── extractor/\n│   │   └── html.rs          # HTML metadata extraction\n│   └── storage/\n│       └── mod.rs           # In-memory audit record store\n├── frontend/                # Angular 19 SPA source\n│   ├── package.json\n│   ├── angular.json\n│   └── src/app/\n│       ├── components/      # App shell, sidebar, theme toggle\n│       └── features/\n│           ├── audit/       # Audit configuration and results\n│           └── history/     # Past audit records\n├── docs/                    # Technical documentation\n├── Dockerfile               # Multi-stage Rust build\n├── docker-compose.yml       # Single service Docker deployment\n├── Cargo.toml               # Rust dependencies\n├── ROADMAP.md               # Development roadmap\n└── CHANGELOG.md             # Release history\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003chr\u003e\n\n\u003ch2\u003eAPI Endpoints\u003c/h2\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eMethod\u003c/th\u003e\u003cth\u003ePath\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eGET\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e/api/health\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eHealth check\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eGET\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e/api/audit/live\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eWebSocket endpoint for real-time audit\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eGET\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e/api/audits\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eList all past audits\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eGET\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e/api/audits/:id\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eGet audit details\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eDELETE\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e/api/audits/:id\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eDelete an audit record\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eGET\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e/api/audits/export\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eExport all audit records as JSON\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003ePOST\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e/api/audits/import\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eImport audit records from JSON\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n\u003ch2\u003eLaunch Script\u003c/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003e./tengu.sh                    # Standalone ephemeral (privacy-first)\n./tengu.sh --docker            # via docker-compose\n./tengu.sh --docker -e         # Docker ephemeral (--rm)\n./tengu.sh --export file.json  # Save export to ./exports/\n./tengu.sh --import file.json  # Import audit JSON into running instance\u003c/code\u003e\u003c/pre\u003e\n\n\u003chr\u003e\n\n\u003cdiv id=\"x\" align=\"center\"\u003e\n\u003ch2\u003eX\u003c/h2\u003e\n\n\u003ca href=\"https://dev.xscriptor.com\"\u003e\n  \u003cimg src=\"https://xscriptor.github.io/icons/icons/code/product-design/xsvg/verified-filled.svg\" width=\"24\" alt=\"X Web\" /\u003e\n\u003c/a\u003e\n \u0026 \n\u003ca href=\"https://github.com/xscriptor\"\u003e\n  \u003cimg src=\"https://xscriptor.github.io/icons/icons/code/product-design/xsvg/github.svg\" width=\"24\" alt=\"X Github Profile\" /\u003e\n\u003c/a\u003e\n \u0026 \n\u003ca href=\"https://www.xscriptor.com\"\u003e\n  \u003cimg src=\"https://xscriptor.github.io/icons/icons/code/product-design/xsvg/quotes.svg\" width=\"24\" alt=\"Xscriptor web\" /\u003e\n\u003c/a\u003e\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxscriptor%2Ftengu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxscriptor%2Ftengu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxscriptor%2Ftengu/lists"}