{"adoption": {"forks": 147, "observed_at": "2026-08-28T04:06:08.781196+00:00", "stars": 2044}, "canonical_url": "https://ross.abutalabs.com/products/tinyraycaster", "card": {"archived": false, "artifact_type": "learning-resource", "description": "486 lines of C++: old-school FPS in a weekend", "domain": ["graphics", "education", "tutorials"], "enriched": true, "function": ["graphics", "game-engine", "simulation", "developer-tools"], "health_score": 20, "homepage": "https://github.com/ssloy/tinyraycaster/wiki", "language": "C++", "license": "WTFPL", "license_family": "permissive", "maturity": "maintenance", "member_repos": ["ssloy/tinyraycaster"], "name": "ssloy/tinyraycaster", "platform": ["cpp", "cross-platform"], "pushed_at": "2019-02-20T13:55:42+00:00", "repo": "ssloy/tinyraycaster", "stars": 2044, "tags": ["raycasting", "software-rendering", "fps", "sdl2", "project-based-learning", "tutorial", "computer-graphics", "game-development", "linux"], "topics": ["c-plus-plus", "picture", "graphics", "fps", "rendering", "raycasting", "fun", "images", "pixels", "computer-graphics", "opengl", "rendering-engine", "engine", "tutorial", "3d", "3d-graphics", "cpp", "rasterizer", "learning", "software-rendering"], "urls": [], "use_cases": ["learn how raycasting engines work", "build a simple FPS from scratch in C++", "project-based learning for computer graphics", "understand software rendering without OpenGL", "teaching material for a graphics programming course", "starting point for a student game project"], "what_it_is": "A tiny 486-line C++ raycasting project that walks learners through building an old-school FPS in a weekend, accompanied by a detailed wiki tutorial. It is explicitly a teaching stub rather than a production game or engine.", "when_to_avoid": ["you need a production-ready game engine or complete game", "you want modern rendering features, design patterns, or architecture guidance", "you expect active development or bug-free code"], "when_to_choose": ["you want a short, readable codebase to learn 3D rendering fundamentals", "you prefer project-based tutorials with a written wiki walkthrough", "you want a minimal blank slate to hack on rather than a full engine"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/tinyraycaster", "repo": "ssloy/tinyraycaster", "role": "main", "score": 32}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:06:08.781196+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:58:04.877568+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "87c2872111bc406366e406bd8cf299fd458c36fc9cefda60d6b8dfcdcd9297cf", "fetched_at": "2026-08-28T04:06:08.781196+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ssloy/tinyraycaster"}, {"content_hash": "3504bf1839dc147814a0dc2b9c5e4537580f6a9aeb6d66edef403842c51f86b0", "fetched_at": "2026-08-29T10:38:08.422923+00:00", "kind": "homepage", "missing": false, "url": "https://github.com/ssloy/tinyraycaster/wiki"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:06:08.781196+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:58:04.877568+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "87c2872111bc406366e406bd8cf299fd458c36fc9cefda60d6b8dfcdcd9297cf", "fetched_at": "2026-08-28T04:06:08.781196+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ssloy/tinyraycaster"}, {"content_hash": "3504bf1839dc147814a0dc2b9c5e4537580f6a9aeb6d66edef403842c51f86b0", "fetched_at": "2026-08-29T10:38:08.422923+00:00", "kind": "homepage", "missing": false, "url": "https://github.com/ssloy/tinyraycaster/wiki"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:58:04.877568+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "87c2872111bc406366e406bd8cf299fd458c36fc9cefda60d6b8dfcdcd9297cf", "fetched_at": "2026-08-28T04:06:08.781196+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ssloy/tinyraycaster"}, {"content_hash": "3504bf1839dc147814a0dc2b9c5e4537580f6a9aeb6d66edef403842c51f86b0", "fetched_at": "2026-08-29T10:38:08.422923+00:00", "kind": "homepage", "missing": false, "url": "https://github.com/ssloy/tinyraycaster/wiki"}], "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:08.781196+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:06:08.781196+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:06:08.781196+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:58:04.877568+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "87c2872111bc406366e406bd8cf299fd458c36fc9cefda60d6b8dfcdcd9297cf", "fetched_at": "2026-08-28T04:06:08.781196+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ssloy/tinyraycaster"}, {"content_hash": "3504bf1839dc147814a0dc2b9c5e4537580f6a9aeb6d66edef403842c51f86b0", "fetched_at": "2026-08-29T10:38:08.422923+00:00", "kind": "homepage", "missing": false, "url": "https://github.com/ssloy/tinyraycaster/wiki"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:06:08.781196+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:06:08.781196+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:58:04.877568+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "87c2872111bc406366e406bd8cf299fd458c36fc9cefda60d6b8dfcdcd9297cf", "fetched_at": "2026-08-28T04:06:08.781196+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ssloy/tinyraycaster"}, {"content_hash": "3504bf1839dc147814a0dc2b9c5e4537580f6a9aeb6d66edef403842c51f86b0", "fetched_at": "2026-08-29T10:38:08.422923+00:00", "kind": "homepage", "missing": false, "url": "https://github.com/ssloy/tinyraycaster/wiki"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:06:08.781196+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:06:08.781196+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:06:08.781196+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:58:04.877568+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "87c2872111bc406366e406bd8cf299fd458c36fc9cefda60d6b8dfcdcd9297cf", "fetched_at": "2026-08-28T04:06:08.781196+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ssloy/tinyraycaster"}, {"content_hash": "3504bf1839dc147814a0dc2b9c5e4537580f6a9aeb6d66edef403842c51f86b0", "fetched_at": "2026-08-29T10:38:08.422923+00:00", "kind": "homepage", "missing": false, "url": "https://github.com/ssloy/tinyraycaster/wiki"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:06:08.781196+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:06:08.781196+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:58:04.877568+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "87c2872111bc406366e406bd8cf299fd458c36fc9cefda60d6b8dfcdcd9297cf", "fetched_at": "2026-08-28T04:06:08.781196+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ssloy/tinyraycaster"}, {"content_hash": "3504bf1839dc147814a0dc2b9c5e4537580f6a9aeb6d66edef403842c51f86b0", "fetched_at": "2026-08-29T10:38:08.422923+00:00", "kind": "homepage", "missing": false, "url": "https://github.com/ssloy/tinyraycaster/wiki"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:58:04.877568+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "87c2872111bc406366e406bd8cf299fd458c36fc9cefda60d6b8dfcdcd9297cf", "fetched_at": "2026-08-28T04:06:08.781196+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ssloy/tinyraycaster"}, {"content_hash": "3504bf1839dc147814a0dc2b9c5e4537580f6a9aeb6d66edef403842c51f86b0", "fetched_at": "2026-08-29T10:38:08.422923+00:00", "kind": "homepage", "missing": false, "url": "https://github.com/ssloy/tinyraycaster/wiki"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:58:04.877568+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "87c2872111bc406366e406bd8cf299fd458c36fc9cefda60d6b8dfcdcd9297cf", "fetched_at": "2026-08-28T04:06:08.781196+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ssloy/tinyraycaster"}, {"content_hash": "3504bf1839dc147814a0dc2b9c5e4537580f6a9aeb6d66edef403842c51f86b0", "fetched_at": "2026-08-29T10:38:08.422923+00:00", "kind": "homepage", "missing": false, "url": "https://github.com/ssloy/tinyraycaster/wiki"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:58:04.877568+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "87c2872111bc406366e406bd8cf299fd458c36fc9cefda60d6b8dfcdcd9297cf", "fetched_at": "2026-08-28T04:06:08.781196+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ssloy/tinyraycaster"}, {"content_hash": "3504bf1839dc147814a0dc2b9c5e4537580f6a9aeb6d66edef403842c51f86b0", "fetched_at": "2026-08-29T10:38:08.422923+00:00", "kind": "homepage", "missing": false, "url": "https://github.com/ssloy/tinyraycaster/wiki"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2784, "days_push": 2751, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 32, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}