{"adoption": {"forks": 186, "observed_at": "2026-08-28T04:06:58.747124+00:00", "stars": 2529}, "canonical_url": "https://ross.abutalabs.com/products/betterbahn", "card": {"archived": false, "artifact_type": "application", "description": "BetterBahn is an open-source project that aims to improve the train travel experience in germany. The current focus is on split-ticketing. However, further functions are planned to follow in the future.", "domain": ["travel", "web-development"], "enriched": true, "function": ["web-framework", "web-scraping", "search-engine", "self-hosted"], "health_score": 79, "homepage": "https://betterbahn.de", "language": "TypeScript", "license": "AGPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["BetterBahn/betterbahn"], "name": "BetterBahn/betterbahn", "platform": ["self-hosted", "cross-platform"], "pushed_at": "2026-08-21T09:53:09+00:00", "repo": "BetterBahn/betterbahn", "stars": 2529, "tags": ["split-ticketing", "deutsche-bahn", "train-travel", "journey-planner", "nextjs", "ticket-savings", "germany", "automation", "nodejs", "docker", "web-server"], "topics": ["deutsche-bahn", "open-source", "railway"], "urls": [], "use_cases": ["find cheaper train tickets in germany via split ticketing", "search deutsche bahn journeys from home server", "self-host a train journey planner", "save money on german rail travel", "compare split ticket prices for bahn routes"], "what_it_is": "BetterBahn is an open-source Next.js web app for finding train journeys in Germany, with a focus on split-ticketing to help users save money on Deutsche Bahn fares. It uses the db-vendo-client to access Deutsche Bahn ticketing data and is designed to be self-hosted locally.", "when_to_avoid": ["you need a hosted public website (none is officially available due to API blocking and legal concerns)", "you plan to serve many simultaneous users from cloud IPs, which Deutsche Bahn blocks", "you need features beyond journey search and split-ticketing, which are still planned"], "when_to_choose": ["you want to reduce Deutsche Bahn ticket costs with split-ticketing", "you can run the app locally on a residential IP to avoid API blocking", "you prefer an open-source, self-hosted journey planner"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/betterbahn", "repo": "BetterBahn/betterbahn", "role": "main", "score": 62}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.747124+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:25:21.723162+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "198dc138e9bd96a180803b4ed1b96c2eae3e57077a0658621cb5e990a5f41b56", "fetched_at": "2026-08-28T04:06:58.747124+00:00", "kind": "readme", "missing": false, "url": "https://github.com/BetterBahn/betterbahn"}, {"content_hash": "f7bd9f743d4b612bfea9bf3af2cf946309283d8eca6d694e0d6aecdff92d89d3", "fetched_at": "2026-08-29T10:07:58.451101+00:00", "kind": "homepage", "missing": false, "url": "https://betterbahn.de"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.747124+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:25:21.723162+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "198dc138e9bd96a180803b4ed1b96c2eae3e57077a0658621cb5e990a5f41b56", "fetched_at": "2026-08-28T04:06:58.747124+00:00", "kind": "readme", "missing": false, "url": "https://github.com/BetterBahn/betterbahn"}, {"content_hash": "f7bd9f743d4b612bfea9bf3af2cf946309283d8eca6d694e0d6aecdff92d89d3", "fetched_at": "2026-08-29T10:07:58.451101+00:00", "kind": "homepage", "missing": false, "url": "https://betterbahn.de"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:25:21.723162+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "198dc138e9bd96a180803b4ed1b96c2eae3e57077a0658621cb5e990a5f41b56", "fetched_at": "2026-08-28T04:06:58.747124+00:00", "kind": "readme", "missing": false, "url": "https://github.com/BetterBahn/betterbahn"}, {"content_hash": "f7bd9f743d4b612bfea9bf3af2cf946309283d8eca6d694e0d6aecdff92d89d3", "fetched_at": "2026-08-29T10:07:58.451101+00:00", "kind": "homepage", "missing": false, "url": "https://betterbahn.de"}], "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:58.747124+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.747124+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.747124+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:25:21.723162+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "198dc138e9bd96a180803b4ed1b96c2eae3e57077a0658621cb5e990a5f41b56", "fetched_at": "2026-08-28T04:06:58.747124+00:00", "kind": "readme", "missing": false, "url": "https://github.com/BetterBahn/betterbahn"}, {"content_hash": "f7bd9f743d4b612bfea9bf3af2cf946309283d8eca6d694e0d6aecdff92d89d3", "fetched_at": "2026-08-29T10:07:58.451101+00:00", "kind": "homepage", "missing": false, "url": "https://betterbahn.de"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.747124+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.747124+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:25:21.723162+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "198dc138e9bd96a180803b4ed1b96c2eae3e57077a0658621cb5e990a5f41b56", "fetched_at": "2026-08-28T04:06:58.747124+00:00", "kind": "readme", "missing": false, "url": "https://github.com/BetterBahn/betterbahn"}, {"content_hash": "f7bd9f743d4b612bfea9bf3af2cf946309283d8eca6d694e0d6aecdff92d89d3", "fetched_at": "2026-08-29T10:07:58.451101+00:00", "kind": "homepage", "missing": false, "url": "https://betterbahn.de"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.747124+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.747124+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.747124+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:25:21.723162+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "198dc138e9bd96a180803b4ed1b96c2eae3e57077a0658621cb5e990a5f41b56", "fetched_at": "2026-08-28T04:06:58.747124+00:00", "kind": "readme", "missing": false, "url": "https://github.com/BetterBahn/betterbahn"}, {"content_hash": "f7bd9f743d4b612bfea9bf3af2cf946309283d8eca6d694e0d6aecdff92d89d3", "fetched_at": "2026-08-29T10:07:58.451101+00:00", "kind": "homepage", "missing": false, "url": "https://betterbahn.de"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.747124+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.747124+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:25:21.723162+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "198dc138e9bd96a180803b4ed1b96c2eae3e57077a0658621cb5e990a5f41b56", "fetched_at": "2026-08-28T04:06:58.747124+00:00", "kind": "readme", "missing": false, "url": "https://github.com/BetterBahn/betterbahn"}, {"content_hash": "f7bd9f743d4b612bfea9bf3af2cf946309283d8eca6d694e0d6aecdff92d89d3", "fetched_at": "2026-08-29T10:07:58.451101+00:00", "kind": "homepage", "missing": false, "url": "https://betterbahn.de"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:25:21.723162+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "198dc138e9bd96a180803b4ed1b96c2eae3e57077a0658621cb5e990a5f41b56", "fetched_at": "2026-08-28T04:06:58.747124+00:00", "kind": "readme", "missing": false, "url": "https://github.com/BetterBahn/betterbahn"}, {"content_hash": "f7bd9f743d4b612bfea9bf3af2cf946309283d8eca6d694e0d6aecdff92d89d3", "fetched_at": "2026-08-29T10:07:58.451101+00:00", "kind": "homepage", "missing": false, "url": "https://betterbahn.de"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:25:21.723162+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "198dc138e9bd96a180803b4ed1b96c2eae3e57077a0658621cb5e990a5f41b56", "fetched_at": "2026-08-28T04:06:58.747124+00:00", "kind": "readme", "missing": false, "url": "https://github.com/BetterBahn/betterbahn"}, {"content_hash": "f7bd9f743d4b612bfea9bf3af2cf946309283d8eca6d694e0d6aecdff92d89d3", "fetched_at": "2026-08-29T10:07:58.451101+00:00", "kind": "homepage", "missing": false, "url": "https://betterbahn.de"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:25:21.723162+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "198dc138e9bd96a180803b4ed1b96c2eae3e57077a0658621cb5e990a5f41b56", "fetched_at": "2026-08-28T04:06:58.747124+00:00", "kind": "readme", "missing": false, "url": "https://github.com/BetterBahn/betterbahn"}, {"content_hash": "f7bd9f743d4b612bfea9bf3af2cf946309283d8eca6d694e0d6aecdff92d89d3", "fetched_at": "2026-08-29T10:07:58.451101+00:00", "kind": "homepage", "missing": false, "url": "https://betterbahn.de"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 98, "longevity": 27, "rhythm": 35}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 383, "days_push": 12, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 62, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}