{"adoption": {"forks": 184, "observed_at": "2026-08-28T04:06:40.278443+00:00", "stars": 2349}, "canonical_url": "https://ross.abutalabs.com/products/astuto", "card": {"archived": true, "artifact_type": "application", "description": "A free, open source, self-hosted customer feedback tool 🦊", "domain": ["developer-tools", "web-development", "self-hosted"], "enriched": true, "function": ["self-hosted", "web-framework", "api-framework", "webhook"], "health_score": 10, "homepage": null, "language": "TypeScript", "license": "AGPL-3.0", "license_family": "copyleft", "maturity": "abandoned", "member_repos": ["astuto/astuto"], "name": "astuto/astuto", "platform": ["self-hosted"], "pushed_at": "2026-01-09T17:46:45+00:00", "repo": "astuto/astuto", "stars": 2349, "tags": ["customer-feedback", "roadmap", "feedback-boards", "ruby-on-rails", "react", "feature-voting", "docker", "web-server"], "topics": ["customer-feedback", "self-hosted", "ruby-on-rails", "react", "docker", "feedback", "roadmap", "boards"], "urls": [], "use_cases": ["collect customer feedback on a self-hosted site", "run a public feature request board", "share a product roadmap with users", "let users vote on feature ideas", "moderate incoming feedback before publishing", "replace SaaS feedback tools like Canny"], "what_it_is": "Astuto is a free, open source, self-hosted customer feedback tool for collecting, managing, and prioritizing user feedback with roadmaps and feedback boards. It is built with Ruby on Rails and React, deployed via Docker, and is no longer maintained.", "when_to_avoid": ["you need an actively maintained project - Astuto is explicitly unmaintained", "you want a managed SaaS without running Docker and Postgres yourself", "you need advanced analytics or enterprise feedback workflows"], "when_to_choose": ["you want a self-hosted, open source alternative to Canny or Userback", "you need feedback boards, roadmaps, and voting under your own domain", "you want OAuth2 sign-in, webhooks, and a REST API for feedback management"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/astuto", "repo": "astuto/astuto", "role": "main", "score": 10}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:06:40.278443+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:36:57.264735+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5800a6bc0f48a78b3fd3c77f682b2f65733c6a502a5138545285843d6c3de3d1", "fetched_at": "2026-08-28T04:06:40.278443+00:00", "kind": "readme", "missing": false, "url": "https://github.com/astuto/astuto"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:06:40.278443+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:36:57.264735+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5800a6bc0f48a78b3fd3c77f682b2f65733c6a502a5138545285843d6c3de3d1", "fetched_at": "2026-08-28T04:06:40.278443+00:00", "kind": "readme", "missing": false, "url": "https://github.com/astuto/astuto"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:36:57.264735+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5800a6bc0f48a78b3fd3c77f682b2f65733c6a502a5138545285843d6c3de3d1", "fetched_at": "2026-08-28T04:06:40.278443+00:00", "kind": "readme", "missing": false, "url": "https://github.com/astuto/astuto"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:06:40.278443+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:06:40.278443+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:06:40.278443+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:36:57.264735+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5800a6bc0f48a78b3fd3c77f682b2f65733c6a502a5138545285843d6c3de3d1", "fetched_at": "2026-08-28T04:06:40.278443+00:00", "kind": "readme", "missing": false, "url": "https://github.com/astuto/astuto"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:06:40.278443+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:06:40.278443+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:36:57.264735+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5800a6bc0f48a78b3fd3c77f682b2f65733c6a502a5138545285843d6c3de3d1", "fetched_at": "2026-08-28T04:06:40.278443+00:00", "kind": "readme", "missing": false, "url": "https://github.com/astuto/astuto"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:06:40.278443+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:06:40.278443+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:06:40.278443+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:36:57.264735+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5800a6bc0f48a78b3fd3c77f682b2f65733c6a502a5138545285843d6c3de3d1", "fetched_at": "2026-08-28T04:06:40.278443+00:00", "kind": "readme", "missing": false, "url": "https://github.com/astuto/astuto"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:06:40.278443+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:06:40.278443+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:36:57.264735+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5800a6bc0f48a78b3fd3c77f682b2f65733c6a502a5138545285843d6c3de3d1", "fetched_at": "2026-08-28T04:06:40.278443+00:00", "kind": "readme", "missing": false, "url": "https://github.com/astuto/astuto"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:36:57.264735+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5800a6bc0f48a78b3fd3c77f682b2f65733c6a502a5138545285843d6c3de3d1", "fetched_at": "2026-08-28T04:06:40.278443+00:00", "kind": "readme", "missing": false, "url": "https://github.com/astuto/astuto"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:36:57.264735+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5800a6bc0f48a78b3fd3c77f682b2f65733c6a502a5138545285843d6c3de3d1", "fetched_at": "2026-08-28T04:06:40.278443+00:00", "kind": "readme", "missing": false, "url": "https://github.com/astuto/astuto"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:36:57.264735+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5800a6bc0f48a78b3fd3c77f682b2f65733c6a502a5138545285843d6c3de3d1", "fetched_at": "2026-08-28T04:06:40.278443+00:00", "kind": "readme", "missing": false, "url": "https://github.com/astuto/astuto"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 61, "longevity": 100, "rhythm": 28}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["archived"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2572, "days_push": 236, "days_rel": 548, "gap_med": 44, "n_releases_24m": 4}, "score": 10, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}