{"adoption": {"forks": 163, "observed_at": "2026-08-28T04:04:13.528036+00:00", "stars": 1279}, "canonical_url": "https://ross.abutalabs.com/products/sms4j", "card": {"archived": false, "artifact_type": "library", "description": "让简单的事情回归简单的本质。 SMS4J为短信聚合框架，帮您轻松集成多家短信服务，解决接入多个短信SDK的繁琐流程。 目前已接入数家常见的短信服务商，后续将会继续集成。后续的版本中我们还将推出更多的相关功能 你的 ⭐️ ⭐️⭐️Star⭐️⭐️ ⭐️，是我的动力！如果你觉得还不错，请点上一颗小星星", "domain": ["developer-tools", "backend", "apis"], "enriched": true, "function": ["sdk", "middleware", "configuration-management"], "health_score": 74, "homepage": "https://sms4j.com", "language": "Java", "license": "Apache-2.0", "license_family": "permissive", "maturity": "active", "member_repos": ["dromara/SMS4J"], "name": "dromara/SMS4J", "platform": ["jvm", "cross-platform"], "pushed_at": "2026-06-25T13:59:20+00:00", "repo": "dromara/SMS4J", "stars": 1279, "tags": ["sms", "sms-aggregation", "sms-provider", "spring-boot-starter", "unified-api", "notification", "java", "messaging", "springboot", "solon"], "topics": ["java", "sms", "springboot", "solon"], "urls": [], "use_cases": ["send SMS verification codes from a Java Spring Boot app", "integrate multiple SMS providers behind one unified API", "switch SMS vendors by changing config instead of code", "load-balance SMS sending across several providers", "avoid learning each SMS provider's SDK", "send template-based SMS messages in Java"], "what_it_is": "SMS4J is a Java SMS aggregation framework that unifies the APIs of many Chinese SMS providers (Aliyun, Tencent Cloud, Huawei Cloud, and 20+ others) behind a single interface. Providers can be switched or load-balanced purely through YAML configuration without code changes, with Spring Boot and Solon starters included.", "when_to_avoid": ["you need SMS outside China or providers not in its supported list", "you're not on the Java/JVM ecosystem", "you need full-featured vendor-specific capabilities beyond the unified abstraction", "you need two-way SMS, MMS, or advanced messaging features"], "when_to_choose": ["you're on the JVM (Spring Boot or Solon) and need SMS sending", "you want vendor-agnostic SMS with config-driven provider switching", "you use Chinese SMS providers like Aliyun, Tencent, or Huawei Cloud", "you need multiple provider configs with load balancing or failover"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/sms4j", "repo": "dromara/SMS4J", "role": "main", "score": 70}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.528036+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T05:02:41.103622+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "50de3d2b04805332dded036de9cc8daa3628b38608b7fc539fc9e15a78dae2a8", "fetched_at": "2026-08-28T04:04:13.528036+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dromara/SMS4J"}, {"content_hash": "c36b00db7366be38b8c59643ea6cc32087f4cece952ef51634efc9dc5c8f9eea", "fetched_at": "2026-08-29T12:13:18.082821+00:00", "kind": "homepage", "missing": false, "url": "https://sms4j.com"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.528036+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T05:02:41.103622+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "50de3d2b04805332dded036de9cc8daa3628b38608b7fc539fc9e15a78dae2a8", "fetched_at": "2026-08-28T04:04:13.528036+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dromara/SMS4J"}, {"content_hash": "c36b00db7366be38b8c59643ea6cc32087f4cece952ef51634efc9dc5c8f9eea", "fetched_at": "2026-08-29T12:13:18.082821+00:00", "kind": "homepage", "missing": false, "url": "https://sms4j.com"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T05:02:41.103622+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "50de3d2b04805332dded036de9cc8daa3628b38608b7fc539fc9e15a78dae2a8", "fetched_at": "2026-08-28T04:04:13.528036+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dromara/SMS4J"}, {"content_hash": "c36b00db7366be38b8c59643ea6cc32087f4cece952ef51634efc9dc5c8f9eea", "fetched_at": "2026-08-29T12:13:18.082821+00:00", "kind": "homepage", "missing": false, "url": "https://sms4j.com"}], "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:04:13.528036+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.528036+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.528036+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T05:02:41.103622+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "50de3d2b04805332dded036de9cc8daa3628b38608b7fc539fc9e15a78dae2a8", "fetched_at": "2026-08-28T04:04:13.528036+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dromara/SMS4J"}, {"content_hash": "c36b00db7366be38b8c59643ea6cc32087f4cece952ef51634efc9dc5c8f9eea", "fetched_at": "2026-08-29T12:13:18.082821+00:00", "kind": "homepage", "missing": false, "url": "https://sms4j.com"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.528036+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.528036+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T05:02:41.103622+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "50de3d2b04805332dded036de9cc8daa3628b38608b7fc539fc9e15a78dae2a8", "fetched_at": "2026-08-28T04:04:13.528036+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dromara/SMS4J"}, {"content_hash": "c36b00db7366be38b8c59643ea6cc32087f4cece952ef51634efc9dc5c8f9eea", "fetched_at": "2026-08-29T12:13:18.082821+00:00", "kind": "homepage", "missing": false, "url": "https://sms4j.com"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.528036+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.528036+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.528036+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T05:02:41.103622+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "50de3d2b04805332dded036de9cc8daa3628b38608b7fc539fc9e15a78dae2a8", "fetched_at": "2026-08-28T04:04:13.528036+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dromara/SMS4J"}, {"content_hash": "c36b00db7366be38b8c59643ea6cc32087f4cece952ef51634efc9dc5c8f9eea", "fetched_at": "2026-08-29T12:13:18.082821+00:00", "kind": "homepage", "missing": false, "url": "https://sms4j.com"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.528036+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.528036+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T05:02:41.103622+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "50de3d2b04805332dded036de9cc8daa3628b38608b7fc539fc9e15a78dae2a8", "fetched_at": "2026-08-28T04:04:13.528036+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dromara/SMS4J"}, {"content_hash": "c36b00db7366be38b8c59643ea6cc32087f4cece952ef51634efc9dc5c8f9eea", "fetched_at": "2026-08-29T12:13:18.082821+00:00", "kind": "homepage", "missing": false, "url": "https://sms4j.com"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T05:02:41.103622+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "50de3d2b04805332dded036de9cc8daa3628b38608b7fc539fc9e15a78dae2a8", "fetched_at": "2026-08-28T04:04:13.528036+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dromara/SMS4J"}, {"content_hash": "c36b00db7366be38b8c59643ea6cc32087f4cece952ef51634efc9dc5c8f9eea", "fetched_at": "2026-08-29T12:13:18.082821+00:00", "kind": "homepage", "missing": false, "url": "https://sms4j.com"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T05:02:41.103622+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "50de3d2b04805332dded036de9cc8daa3628b38608b7fc539fc9e15a78dae2a8", "fetched_at": "2026-08-28T04:04:13.528036+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dromara/SMS4J"}, {"content_hash": "c36b00db7366be38b8c59643ea6cc32087f4cece952ef51634efc9dc5c8f9eea", "fetched_at": "2026-08-29T12:13:18.082821+00:00", "kind": "homepage", "missing": false, "url": "https://sms4j.com"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T05:02:41.103622+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "50de3d2b04805332dded036de9cc8daa3628b38608b7fc539fc9e15a78dae2a8", "fetched_at": "2026-08-28T04:04:13.528036+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dromara/SMS4J"}, {"content_hash": "c36b00db7366be38b8c59643ea6cc32087f4cece952ef51634efc9dc5c8f9eea", "fetched_at": "2026-08-29T12:13:18.082821+00:00", "kind": "homepage", "missing": false, "url": "https://sms4j.com"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 89, "longevity": 89, "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": 1258, "days_push": 69, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 70, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}