{"adoption": {"forks": 73, "observed_at": "2026-08-28T04:03:50.214400+00:00", "stars": 1166}, "canonical_url": "https://ross.abutalabs.com/products/workflow", "card": {"archived": false, "artifact_type": "library", "description": "A Swift and Kotlin library for making composable state machines, and UIs driven by those state machines.", "domain": ["mobile-development", "frontend", "developer-tools"], "enriched": true, "function": ["state-management", "ui-components", "testing"], "health_score": 79, "homepage": "https://square.github.io/workflow", "language": "Shell", "license": "Apache-2.0", "license_family": "permissive", "maturity": "active", "member_repos": ["square/workflow", "square/workflow-kotlin"], "name": "Workflow", "platform": ["jvm"], "pushed_at": "2026-08-21T06:39:00+00:00", "repo": "square/workflow", "stars": 1166, "tags": ["unidirectional-data-flow", "state-machine", "navigation", "reactive", "composable-architecture", "android", "ios", "swift", "mobile"], "topics": ["reactive", "ui", "state-machine", "kotlin", "android", "swift", "ios", "workflow"], "urls": [{"kind": "homepage", "url": "https://square.github.io/workflow"}], "use_cases": ["manage app state with unidirectional data flow on Android and iOS", "model complex navigation flows as composable state machines", "write unit-testable business logic for mobile apps", "build scalable multi-screen mobile features with recursive workflows", "share architectural patterns between Kotlin and Swift teams"], "what_it_is": "Workflow is a unidirectional data flow library by Square that lets developers model business logic and navigation as composable state machines in Kotlin and Swift. It includes UI binding frameworks for Android and iOS plus a testing framework for validating workflow logic.", "when_to_avoid": ["building web or desktop applications, since it targets mobile UI frameworks", "you want a lightweight state container without an opinionated navigation model", "your team prefers Jetpack Compose state hoisting or SwiftUI-native patterns without extra abstraction"], "when_to_choose": ["building Android or iOS apps that benefit from strict unidirectional data flow", "you need navigation treated as managed presenter state rather than a separate concern", "you want a testing framework for state machine business logic", "you prefer a TCA-like architecture in Kotlin or Swift"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/repos/square/workflow", "repo": "square/workflow", "role": "main", "score": 67}, {"path": "/repos/square/workflow-kotlin", "repo": "square/workflow-kotlin", "role": "mirror", "score": 99}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.214400+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:28:57.866394+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "978c1148c4aad6166b26dac082e81df6eb2cee22715cc257836a8616def32eb6", "fetched_at": "2026-08-28T04:03:50.214400+00:00", "kind": "readme", "missing": false, "url": "https://github.com/square/workflow"}, {"content_hash": "de3aac681a0e6b5b81b18312b9de10441c91778f28d145d9701e91db5ac1f731", "fetched_at": "2026-08-29T12:35:01.126265+00:00", "kind": "homepage", "missing": false, "url": "https://square.github.io/workflow"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.214400+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:28:57.866394+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "978c1148c4aad6166b26dac082e81df6eb2cee22715cc257836a8616def32eb6", "fetched_at": "2026-08-28T04:03:50.214400+00:00", "kind": "readme", "missing": false, "url": "https://github.com/square/workflow"}, {"content_hash": "de3aac681a0e6b5b81b18312b9de10441c91778f28d145d9701e91db5ac1f731", "fetched_at": "2026-08-29T12:35:01.126265+00:00", "kind": "homepage", "missing": false, "url": "https://square.github.io/workflow"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:28:57.866394+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "978c1148c4aad6166b26dac082e81df6eb2cee22715cc257836a8616def32eb6", "fetched_at": "2026-08-28T04:03:50.214400+00:00", "kind": "readme", "missing": false, "url": "https://github.com/square/workflow"}, {"content_hash": "de3aac681a0e6b5b81b18312b9de10441c91778f28d145d9701e91db5ac1f731", "fetched_at": "2026-08-29T12:35:01.126265+00:00", "kind": "homepage", "missing": false, "url": "https://square.github.io/workflow"}], "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:03:50.214400+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.214400+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.214400+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:28:57.866394+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "978c1148c4aad6166b26dac082e81df6eb2cee22715cc257836a8616def32eb6", "fetched_at": "2026-08-28T04:03:50.214400+00:00", "kind": "readme", "missing": false, "url": "https://github.com/square/workflow"}, {"content_hash": "de3aac681a0e6b5b81b18312b9de10441c91778f28d145d9701e91db5ac1f731", "fetched_at": "2026-08-29T12:35:01.126265+00:00", "kind": "homepage", "missing": false, "url": "https://square.github.io/workflow"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.214400+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.214400+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:28:57.866394+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "978c1148c4aad6166b26dac082e81df6eb2cee22715cc257836a8616def32eb6", "fetched_at": "2026-08-28T04:03:50.214400+00:00", "kind": "readme", "missing": false, "url": "https://github.com/square/workflow"}, {"content_hash": "de3aac681a0e6b5b81b18312b9de10441c91778f28d145d9701e91db5ac1f731", "fetched_at": "2026-08-29T12:35:01.126265+00:00", "kind": "homepage", "missing": false, "url": "https://square.github.io/workflow"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.214400+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.214400+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.214400+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:28:57.866394+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "978c1148c4aad6166b26dac082e81df6eb2cee22715cc257836a8616def32eb6", "fetched_at": "2026-08-28T04:03:50.214400+00:00", "kind": "readme", "missing": false, "url": "https://github.com/square/workflow"}, {"content_hash": "de3aac681a0e6b5b81b18312b9de10441c91778f28d145d9701e91db5ac1f731", "fetched_at": "2026-08-29T12:35:01.126265+00:00", "kind": "homepage", "missing": false, "url": "https://square.github.io/workflow"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.214400+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:50.214400+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:28:57.866394+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "978c1148c4aad6166b26dac082e81df6eb2cee22715cc257836a8616def32eb6", "fetched_at": "2026-08-28T04:03:50.214400+00:00", "kind": "readme", "missing": false, "url": "https://github.com/square/workflow"}, {"content_hash": "de3aac681a0e6b5b81b18312b9de10441c91778f28d145d9701e91db5ac1f731", "fetched_at": "2026-08-29T12:35:01.126265+00:00", "kind": "homepage", "missing": false, "url": "https://square.github.io/workflow"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:28:57.866394+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "978c1148c4aad6166b26dac082e81df6eb2cee22715cc257836a8616def32eb6", "fetched_at": "2026-08-28T04:03:50.214400+00:00", "kind": "readme", "missing": false, "url": "https://github.com/square/workflow"}, {"content_hash": "de3aac681a0e6b5b81b18312b9de10441c91778f28d145d9701e91db5ac1f731", "fetched_at": "2026-08-29T12:35:01.126265+00:00", "kind": "homepage", "missing": false, "url": "https://square.github.io/workflow"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:28:57.866394+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "978c1148c4aad6166b26dac082e81df6eb2cee22715cc257836a8616def32eb6", "fetched_at": "2026-08-28T04:03:50.214400+00:00", "kind": "readme", "missing": false, "url": "https://github.com/square/workflow"}, {"content_hash": "de3aac681a0e6b5b81b18312b9de10441c91778f28d145d9701e91db5ac1f731", "fetched_at": "2026-08-29T12:35:01.126265+00:00", "kind": "homepage", "missing": false, "url": "https://square.github.io/workflow"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:28:57.866394+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "978c1148c4aad6166b26dac082e81df6eb2cee22715cc257836a8616def32eb6", "fetched_at": "2026-08-28T04:03:50.214400+00:00", "kind": "readme", "missing": false, "url": "https://github.com/square/workflow"}, {"content_hash": "de3aac681a0e6b5b81b18312b9de10441c91778f28d145d9701e91db5ac1f731", "fetched_at": "2026-08-29T12:35:01.126265+00:00", "kind": "homepage", "missing": false, "url": "https://square.github.io/workflow"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 98, "longevity": 100, "rhythm": 8}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2848, "days_push": 12, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 67, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}