{"adoption": {"forks": 284, "observed_at": "2026-08-28T04:05:21.967938+00:00", "stars": 1685}, "canonical_url": "https://ross.abutalabs.com/products/soft-and-hard", "card": {"archived": false, "artifact_type": "learning-resource", "description": "《软硬结合——从零打造物联网》 基于JS的物联网教程。", "domain": ["iot", "tutorials", "web-development", "developer-tools"], "enriched": true, "function": ["iot", "websocket", "http-server", "data-visualization", "machine-learning"], "health_score": 22, "homepage": "https://www.scaugreen.cn/posts/44755/", "language": "JavaScript", "license": null, "license_family": "other", "maturity": "active", "member_repos": ["alwxkxk/soft-and-hard"], "name": "alwxkxk/soft-and-hard", "platform": ["cross-platform"], "pushed_at": "2025-01-29T09:23:46+00:00", "repo": "alwxkxk/soft-and-hard", "stars": 1685, "tags": ["iot-tutorial", "javascript", "nodemcu", "arduino", "mqtt", "esp8266", "hardware-software", "beginner-friendly", "mongodb", "echarts", "electron", "wechat-miniprogram", "nodejs"], "topics": [], "urls": [], "use_cases": ["learn how to build an IoT system from scratch", "display sensor data from hardware in a web dashboard", "control hardware remotely through a web interface", "understand TCP/IP, HTTP, and MQTT basics for IoT", "build a full-stack IoT demo with Node.js and MongoDB", "learn Arduino development on NodeMCU with JavaScript web tooling"], "what_it_is": "A free Chinese-language IoT tutorial ('软硬结合——从零打造物联网') with accompanying demo source code that teaches building a complete IoT system from hardware to web interface. It uses NodeMCU/Arduino on the hardware side and JavaScript across web, mini-program, desktop, and server development, covering TCP/IP, HTTP, MQTT, WebSocket, MongoDB, and data visualization.", "when_to_avoid": ["you need production-grade IoT platform code rather than teaching demos", "you want a licensed, reusable codebase (no license is provided)", "you need non-JavaScript backend stacks or industrial protocols", "you require STM32-level embedded development depth"], "when_to_choose": ["you are a beginner wanting an end-to-end IoT walkthrough from hardware to cloud server to UI", "you prefer JavaScript across the whole stack", "you want cheap hardware (NodeMCU) and free tutorials with videos", "you learn best by running working demos first, then studying theory"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/soft-and-hard", "repo": "alwxkxk/soft-and-hard", "role": "main", "score": 34}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:21.967938+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:39:16.009719+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "962badfd0d7561b26e9077c377c42f476be92bf98cb97fdcbef99ec93d5e9c73", "fetched_at": "2026-08-28T04:05:21.967938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/alwxkxk/soft-and-hard"}, {"content_hash": "dca285772a6927cdc04ae3a2938cf6b77754c605bdd52a50838e09aac7a8ffe5", "fetched_at": "2026-08-29T11:14:13.026461+00:00", "kind": "homepage", "missing": false, "url": "https://www.scaugreen.cn/posts/44755/"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:21.967938+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:39:16.009719+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "962badfd0d7561b26e9077c377c42f476be92bf98cb97fdcbef99ec93d5e9c73", "fetched_at": "2026-08-28T04:05:21.967938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/alwxkxk/soft-and-hard"}, {"content_hash": "dca285772a6927cdc04ae3a2938cf6b77754c605bdd52a50838e09aac7a8ffe5", "fetched_at": "2026-08-29T11:14:13.026461+00:00", "kind": "homepage", "missing": false, "url": "https://www.scaugreen.cn/posts/44755/"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:39:16.009719+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "962badfd0d7561b26e9077c377c42f476be92bf98cb97fdcbef99ec93d5e9c73", "fetched_at": "2026-08-28T04:05:21.967938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/alwxkxk/soft-and-hard"}, {"content_hash": "dca285772a6927cdc04ae3a2938cf6b77754c605bdd52a50838e09aac7a8ffe5", "fetched_at": "2026-08-29T11:14:13.026461+00:00", "kind": "homepage", "missing": false, "url": "https://www.scaugreen.cn/posts/44755/"}], "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:05:21.967938+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:21.967938+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:21.967938+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:39:16.009719+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "962badfd0d7561b26e9077c377c42f476be92bf98cb97fdcbef99ec93d5e9c73", "fetched_at": "2026-08-28T04:05:21.967938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/alwxkxk/soft-and-hard"}, {"content_hash": "dca285772a6927cdc04ae3a2938cf6b77754c605bdd52a50838e09aac7a8ffe5", "fetched_at": "2026-08-29T11:14:13.026461+00:00", "kind": "homepage", "missing": false, "url": "https://www.scaugreen.cn/posts/44755/"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:21.967938+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:21.967938+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:39:16.009719+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "962badfd0d7561b26e9077c377c42f476be92bf98cb97fdcbef99ec93d5e9c73", "fetched_at": "2026-08-28T04:05:21.967938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/alwxkxk/soft-and-hard"}, {"content_hash": "dca285772a6927cdc04ae3a2938cf6b77754c605bdd52a50838e09aac7a8ffe5", "fetched_at": "2026-08-29T11:14:13.026461+00:00", "kind": "homepage", "missing": false, "url": "https://www.scaugreen.cn/posts/44755/"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:21.967938+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:21.967938+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:21.967938+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:39:16.009719+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "962badfd0d7561b26e9077c377c42f476be92bf98cb97fdcbef99ec93d5e9c73", "fetched_at": "2026-08-28T04:05:21.967938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/alwxkxk/soft-and-hard"}, {"content_hash": "dca285772a6927cdc04ae3a2938cf6b77754c605bdd52a50838e09aac7a8ffe5", "fetched_at": "2026-08-29T11:14:13.026461+00:00", "kind": "homepage", "missing": false, "url": "https://www.scaugreen.cn/posts/44755/"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:21.967938+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:21.967938+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:39:16.009719+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "962badfd0d7561b26e9077c377c42f476be92bf98cb97fdcbef99ec93d5e9c73", "fetched_at": "2026-08-28T04:05:21.967938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/alwxkxk/soft-and-hard"}, {"content_hash": "dca285772a6927cdc04ae3a2938cf6b77754c605bdd52a50838e09aac7a8ffe5", "fetched_at": "2026-08-29T11:14:13.026461+00:00", "kind": "homepage", "missing": false, "url": "https://www.scaugreen.cn/posts/44755/"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:39:16.009719+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "962badfd0d7561b26e9077c377c42f476be92bf98cb97fdcbef99ec93d5e9c73", "fetched_at": "2026-08-28T04:05:21.967938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/alwxkxk/soft-and-hard"}, {"content_hash": "dca285772a6927cdc04ae3a2938cf6b77754c605bdd52a50838e09aac7a8ffe5", "fetched_at": "2026-08-29T11:14:13.026461+00:00", "kind": "homepage", "missing": false, "url": "https://www.scaugreen.cn/posts/44755/"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:39:16.009719+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "962badfd0d7561b26e9077c377c42f476be92bf98cb97fdcbef99ec93d5e9c73", "fetched_at": "2026-08-28T04:05:21.967938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/alwxkxk/soft-and-hard"}, {"content_hash": "dca285772a6927cdc04ae3a2938cf6b77754c605bdd52a50838e09aac7a8ffe5", "fetched_at": "2026-08-29T11:14:13.026461+00:00", "kind": "homepage", "missing": false, "url": "https://www.scaugreen.cn/posts/44755/"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:39:16.009719+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "962badfd0d7561b26e9077c377c42f476be92bf98cb97fdcbef99ec93d5e9c73", "fetched_at": "2026-08-28T04:05:21.967938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/alwxkxk/soft-and-hard"}, {"content_hash": "dca285772a6927cdc04ae3a2938cf6b77754c605bdd52a50838e09aac7a8ffe5", "fetched_at": "2026-08-29T11:14:13.026461+00:00", "kind": "homepage", "missing": false, "url": "https://www.scaugreen.cn/posts/44755/"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 4, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases", "no_license"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 3058, "days_push": 581, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 34, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}