{"id":37975038,"url":"https://github.com/dougmercer/signified","last_synced_at":"2026-01-16T18:28:39.015Z","repository":{"id":256979451,"uuid":"857097321","full_name":"dougmercer/signified","owner":"dougmercer","description":"A Python library for reactive programming (with kind-of working type narrowing).","archived":false,"fork":false,"pushed_at":"2025-07-23T03:55:08.000Z","size":735,"stargazers_count":67,"open_issues_count":10,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-08-30T20:32:19.777Z","etag":null,"topics":["python","reactive"],"latest_commit_sha":null,"homepage":"https://dougmercer.github.io/signified/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dougmercer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-09-13T19:51:16.000Z","updated_at":"2025-08-16T09:23:22.000Z","dependencies_parsed_at":"2024-10-28T23:25:26.948Z","dependency_job_id":"2bea254e-9996-479c-b1ff-2b73f4ea516a","html_url":"https://github.com/dougmercer/signified","commit_stats":null,"previous_names":["dougmercer/signified","dougmercer/significant"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/dougmercer/signified","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dougmercer%2Fsignified","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dougmercer%2Fsignified/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dougmercer%2Fsignified/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dougmercer%2Fsignified/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dougmercer","download_url":"https://codeload.github.com/dougmercer/signified/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dougmercer%2Fsignified/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28480807,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["python","reactive"],"created_at":"2026-01-16T18:28:38.408Z","updated_at":"2026-01-16T18:28:39.008Z","avatar_url":"https://github.com/dougmercer.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Signified\n\n[![PyPI - Downloads](https://img.shields.io/pypi/dw/signified)](https://pypi.org/project/signified/)\n[![PyPI - Version](https://img.shields.io/pypi/v/signified)](https://pypi.org/project/signified/)\n[![Tests Status](https://github.com/dougmercer/signified/actions/workflows/test.yml/badge.svg)](https://github.com/dougmercer/signified/actions/workflows/test.yml?query=branch%3Amain)\n\n---\n\n**Documentation**: [https://dougmercer.github.io/signified](https://dougmercer.github.io/signified)\n\n**Source Code**: [https://github.com/dougmercer/signified](https://github.com/dougmercer/signified)\n\n---\n\nA Python library for reactive programming (with kind-of working type narrowing).\n\n## Getting started\n\n```console\npip install signified\n```\n\n## Why care?\n\n`signified` is a reactive programming library that implements two primary data structures: `Signal` and `Computed`.\n\nBoth of these objects implement the *Observer* and *Observable* design patterns. This means that they can notify\nother *Observers* if they change, and they can subscribe to be notified if another *Observable* changes.\n\nThis allows us to create a network of computation, where one value being modified can trigger other objects to update.\n\nThis allows us to write more declarative code, like,\n\n```python\nx = Signal(3)\nx_squared = x ** 2  # currently equal to 9\nx.value = 10  # Will immediately notify x_squared, whose value will become 100.\n```\n\nHere, `x_squared` became a reactive expression (more specifically, a `Computed` object) whose value is always equal to `x ** 2`. Neat!\n\n`signified`'s `Signal` object effectively gives us a container which stores a value, and `Computed` gives us a container to store the current value of a function. In the above example, we generated the Computed object on-the-fly using overloaded Python operators like `**`, but we could have just as easily done,\n\n```python\nfrom signified import computed\n\n@computed\ndef power(x, n):\n    return x**n\n\nx_squared = power(x, 2)  # equivalent to the above\n```\n\nTogether, these data structures allow us to implement a wide variety of capabilities. In particular, I wrote this library to make my to-be-released animation library easier to maintain and more fun to work with.\n\n## ... what do you mean by \"kind of working type narrowing\"?\n\nOther reactive Python libraries don't really attempt to implement type hints (e.g., [param](https://param.holoviz.org/)).\n\n``signified`` is type hinted and supports type narrowing even for nested reactive values.\n\n```python\nfrom signified import Signal\n\na = Signal(1.0)\nb = Signal(Signal(Signal(2)))\nreveal_type(a + b)  # Computed[float | int]\n```\n\nUnfortunately, for the time being, our type hints only work with ``pyright``.\n\n## Ready to learn more?\n\nCheckout the docs at [https://dougmercer.github.io/signified](https://dougmercer.github.io/signified) or watch [my YouTube video about the library](https://youtu.be/nkuXqx-6Xwc).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdougmercer%2Fsignified","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdougmercer%2Fsignified","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdougmercer%2Fsignified/lists"}