{"id":38298553,"url":"https://github.com/arborchat/forest-go","last_synced_at":"2026-01-17T02:21:54.017Z","repository":{"id":133808333,"uuid":"185511602","full_name":"arborchat/forest-go","owner":"arborchat","description":"Golang utility library for working with the Arbor Forest, mirrored from sourcehut","archived":false,"fork":false,"pushed_at":"2020-10-31T21:22:25.000Z","size":527,"stargazers_count":4,"open_issues_count":1,"forks_count":2,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-10-09T06:22:11.600Z","etag":null,"topics":["arbor","arborchat","forest","go","library"],"latest_commit_sha":null,"homepage":"https://git.sr.ht/~whereswaldon/forest-go","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arborchat.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-05-08T02:18:33.000Z","updated_at":"2025-02-09T06:39:37.000Z","dependencies_parsed_at":"2023-06-28T09:57:27.200Z","dependency_job_id":null,"html_url":"https://github.com/arborchat/forest-go","commit_stats":{"total_commits":263,"total_committers":3,"mean_commits":87.66666666666667,"dds":"0.049429657794676785","last_synced_commit":"0e51e2b5d99c6097adcff494a0faf883601b0d18"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/arborchat/forest-go","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arborchat%2Fforest-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arborchat%2Fforest-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arborchat%2Fforest-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arborchat%2Fforest-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arborchat","download_url":"https://codeload.github.com/arborchat/forest-go/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arborchat%2Fforest-go/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28492214,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T00:50:05.742Z","status":"online","status_checked_at":"2026-01-17T02:00:07.808Z","response_time":85,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","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":["arbor","arborchat","forest","go","library"],"created_at":"2026-01-17T02:21:53.916Z","updated_at":"2026-01-17T02:21:53.996Z","avatar_url":"https://github.com/arborchat.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# forest-go\n\n[![builds.sr.ht status](https://builds.sr.ht/~whereswaldon/forest-go.svg)](https://builds.sr.ht/~whereswaldon/forest-go?)\n[![GoDoc](https://godoc.org/git.sr.ht/~whereswaldon/forest-go?status.svg)](https://godoc.org/git.sr.ht/~whereswaldon/forest-go)\n\nThis repo contains:\n\n- A golang library for working with nodes in the Arbor Forest. This repo is based on the work-in-progress specification [available here](https://github.com/arborchat/protocol/blob/forest/spec/Forest.md).\n- A CLI for creating, manipulating, and viewing nodes in the Arbor Forest in `cmd/forest`\n\nFor information about each component of this repo, see later in this file.\n\n\u003e NOTE: this package requires using a fork of golang.org/x/crypto, and you must therefore include the following in your `go.mod`:\n\u003e ```\n\u003e     replace golang.org/x/crypto =\u003e github.com/ProtonMail/crypto \u003cversion-from-forest-go's-go.mod\u003e\n\u003e ```\n\n## About Arbor\n\n![arbor logo](https://git.sr.ht/~whereswaldon/forest-go/blob/master/img/arbor-logo.png)\n\nArbor is a chat system that makes communication clearer. It explicitly captures context that other platforms ignore, allowing you to understand the relationship between each message and every other message. It also respects its users and focuses on group collaboration.\n\nYou can get information about the Arbor project [here](https://man.sr.ht/~whereswaldon/arborchat/).\n\nFor news about the project, join our [mailing list](https://lists.sr.ht/~whereswaldon/arbor-dev)!\n\n### Using the CLI\n\nRight now, the CLI works with files in its current working directory, though this will change in the future.\nFor the meantime, create a directory to play around in:\n\n```sh\nmkdir arbor-forest\ncd arbor-forest\n```\n\n\u003e **Important: About OpenPGP Keys**\n\u003e \n\u003e Arbor Forest nodes are signed by OpenPGP private keys. This gives Arbor strong guarantees about the authenticity of messages. The below procedures assume that you have `gpg2` installed and have already [generated a private key](https://fedoraproject.org/wiki/Creating_GPG_Keys#Creating_GPG_Keys_Using_the_Command_Line). Wherever you see `--gpguser \u003cemail\u003e` below, substitute the email address associated with your GPG private key for `\u003cemail\u003e`.\n\u003e \n\u003e If you do not have `gpg2` or a key and you do not want to install them, you can omit the `--gpguser \u003cemail\u003e` flag in the commands below. If you do this, the CLI will create a new one for you and store it\n\u003e in `./arbor.privkey`. This private key is not encrypted (has no passphrase), and should not be used for anything of importance.\n\n#### Identities\n\nSince all nodes must be signed by an Identity node, you must create one of those before you can create any others.\n\n```sh\nforest create identity --name \u003cyour-name\u003e --gpguser \u003cemail\u003e\n```\n\nThis will print the base64url-encoded ID of your identity node, which will be stored in a file by that name in your\ncurrent working directory.\n\n\nTo view your identity in a human-readable format, try the following (install `jq` if you don't have it, it's really handy):\n\n```sh\nforest show \u003cid\u003e | jq .\n```\n\nSubstitute the base64url-encoded ID of your identity node for `\u003cid\u003e`. `jq` will pretty-print the JSON to make it easier to read.\n\n#### Communities\n\nTo create a community, use:\n\n```sh\nforest create community --as \u003cid\u003e --name \u003ccommunity-name\u003e --gpguser \u003cemail\u003e\n```\n\nSubstitute the base64url-encoded ID of your identity node for `\u003cid\u003e` and provide appropriate values for name and metadata.\n\nTo view your community in a human-readable format, try the following:\n\n```sh\nforest show \u003cid\u003e | jq .\n```\n\nSubstitute the base64url-encoded ID of your community node for `\u003cid\u003e`. `jq` will pretty-print the JSON to make it easier to read.\n\n#### Replies\n\nTo create a reply, use:\n\n```sh\nforest create reply --as \u003cid\u003e --to \u003cparent-id\u003e --content \u003cyour message\u003e --gpguser \u003cemail\u003e\n```\n\nSubstitute the base64url-encoded ID of your identity node for `\u003cid\u003e` and the base64url-encoded ID of another reply or conversation node for `\u003cparent-id\u003e`. Substitute `\u003cyour message\u003e`\nfor the content of your reply. Usually this will be a response to the content of the node referenced by `\u003cparent-id\u003e`.\n\nTo view your reply in a human-readable format, try the following:\n\n```sh\nforest show \u003cid\u003e | jq .\n```\n\nSubstitute the base64url-encoded ID of your reply node for `\u003cid\u003e`. `jq` will pretty-print the JSON to make it easier to read.\n\n\n## Build\n\nMust use Go 1.11+\n\n`go build`\n\n## Test\n\n`go test -v -cover`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farborchat%2Fforest-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farborchat%2Fforest-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farborchat%2Fforest-go/lists"}