{"id":28396223,"url":"https://github.com/ssbc/patchcore","last_synced_at":"2025-07-23T16:32:33.629Z","repository":{"id":17345943,"uuid":"81715796","full_name":"ssbc/patchcore","owner":"ssbc","description":"A shared library of depject modules to build Secure Scuttlebutt social network apps","archived":false,"fork":false,"pushed_at":"2022-12-30T17:11:27.000Z","size":880,"stargazers_count":74,"open_issues_count":9,"forks_count":17,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-07-08T09:38:35.805Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ssbc.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}},"created_at":"2017-02-12T09:33:01.000Z","updated_at":"2023-08-15T22:00:45.000Z","dependencies_parsed_at":"2023-01-13T19:17:20.866Z","dependency_job_id":null,"html_url":"https://github.com/ssbc/patchcore","commit_stats":null,"previous_names":[],"tags_count":104,"template":false,"template_full_name":null,"purl":"pkg:github/ssbc/patchcore","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssbc%2Fpatchcore","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssbc%2Fpatchcore/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssbc%2Fpatchcore/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssbc%2Fpatchcore/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ssbc","download_url":"https://codeload.github.com/ssbc/patchcore/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssbc%2Fpatchcore/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266351936,"owners_count":23915755,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-21T11:47:31.412Z","response_time":64,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2025-05-31T21:37:26.804Z","updated_at":"2025-07-23T16:32:33.518Z","avatar_url":"https://github.com/ssbc.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# patchcore\n\na shared library to build [ssb](https://scuttlebot.io) apps\n\nor _the shared assumptions of all (or most) ssb related applications_\n\n\n## required sbot plugins\n\n- [ssb-private](https://github.com/ssbc/ssb-private)\n- [ssb-backlinks](https://github.com/ssbc/ssb-backlinks)\n- [ssb-about](https://github.com/ssbc/ssb-about) (NOTE: requires `ssb-about@2`)\n\n## apps\n\nhere's a list of apps in the wild using `patchcore`:\n\n- [`patchbay`](https://github.com/ssbc/patchbay)\n- [`patchlite`](https://github.com/ssbc/patchlite)\n- [(add yours here)](https://github.com/ssbc/patchcore/edit/master/README.md)\n\n## plugins\n\nhere's a list of plugins that build on top of `patchcore`:\n\n- [`patch-gatherings`](https://github.com/pietgeursen/patch-gatherings)\n- [`patch-intl`](https://github.com/ssbc/patch-intl)\n- [(add yours here)](https://github.com/ssbc/patchcore/edit/master/README.md)\n\n## depject\n\nto use this you must understand [depject](https://github.com/depject/depject)\nbut also the historical context - depject is short for ~dependency injection\"\nit was intended to make software that was very easy to add features to,\nbut this didn't really work out. And most of the applications built on it\nembrace \"strong opinions\" but still happen to use depject, which is now inconvienient\nto change, because it's used throughout the entire app.\n\n## directory structure\n\nthe `patchcore` files are organized in the following hierarchy:\n\n\u003e ${topic} / ${type} / ${module}.js\n\nor when module name is different from file name (this only happens within message/html):\n\n\u003e ${topic} / ${type} / ${module} / ${file}.js\n\nsome cases, the module is skipped (in topics: about, contact, backlinks, feed)\n\n\u003e ${topic} / ${type}.js\n\nand, (only in backlinks/obs topic/type) the type and module are part of the same name.\n\n\u003e {$topic=backlinks} / ${type=obs}-$name}\n\nfinally, the config, emoji, keys, and sbot topics types. it's just a single javascript.\n\n\u003e ${topic}.js\n\n### topics\n\n- lib (junk that isn't part of any topic and should really be published as a reusable module, but too lazy)\n- [about](./docs/index.md#about) - functions relating to `about` messages, for setting avatars and names.\n- [blob](./docs/index.md#blob) - related to images and files\n- [config](./docs/index.md#config) - `config.sync.load` method that loads config.\n- [contact](./docs/index.md#contact) - related to contact messages, for following and blocking.\n- [emoji](./docs/index.md#emoji) - :dancer: :tada: :joy_cat: :haircut_woman:\n- [feed](./docs/index.md#feed - stuff related to feeds - aka streams of messages by one or more user\n- [invite](./docs/index.md#invite) - using invite codes\n- [keys](./docs/index.md#keys) - load the main identity\n- [message](./docs/index.md#message) - relating to messages generically, i.e. publishing messages or rendering things that are the same for multiple different message types.\n- [router](./docs/index.md#router)\n- [sbot](./sbot/index.md#sbot)\n\n### types\n\n- `sync` a function that returns an ordinary javascript value, such as a string or number. Usually a simple utility function.\n- `async` a function that takes a callback, and does IO. It may query the database or publish a message.\n- `pull` returns [pull-stream](https://github.com/pull-stream/pull-stream) [source](https://github.com/pull-stream/pull-stream#source-readable-stream-that-produces-values), [sink](https://github.com/pull-stream/pull-stream#sink-reader-or-writable-stream-that-consumes-values), or [through](https://github.com/pull-stream/pull-stream#through). Sometimes pull type returns a function that then creates a pull stream.\n- `obs` sometimes, return a [mutant observable](https://github.com/mmckegg/mutant#readme) this is generally for things that change in real time or may load slowly, and you usually want to display them as a single thing (i.e. number of likes, or an avatar name). sometimes obs really just wrap async methods, but obs play more nicely with mutant than async functions do, other times `obs` functions directly expose a obs, or expose a function that you pass the listener to.  \n- `html` returns an HtmlElement this may have dynamic behaviour.\n\n## license\n\nAGPL-3.0\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fssbc%2Fpatchcore","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fssbc%2Fpatchcore","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fssbc%2Fpatchcore/lists"}