* chore: rebrand user-facing gitlawb references to Twigpine
Rename the product name in docs, README, CLI help/output, MCP tool
descriptions, macOS app strings, installers, npm metadata and license
headers from gitlawb/Gitlawb to Twigpine. Point GitHub links at the
renamed Twigpine org (and fix the release workflow's repository guard,
which still matched Gitlawb/node), and switch the public node hosts and
website/install URLs to twigpine.com.
Protocol and operator identifiers are intentionally unchanged
(did:gitlawb, gitlawb://, signing domains, GITLAWB_* env vars, crate
and binary names, X-Gitlawb-* headers, icaptcha and peer-network URLs);
they need a follow-up migration.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* docs: point image pulls at ghcr.io/twigpine/node and fix macOS DMG name
The release workflow publishes the container image to
ghcr.io/${GITHUB_REPOSITORY,,}, which is ghcr.io/twigpine/node since the
org rename; the old ghcr.io/gitlawb/node path no longer resolves for
anonymous pulls. Point the RUN-A-NODE docker run example, the OSS
readiness audit's claim about it, and the macOS app's generated compose
file at the published path.
The README listed the macOS DMG as "Twigpine Node.dmg", but
build-macos-app.sh writes GitlawbNode-macOS.dmg (kept on purpose), so
document the real file name.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* fix(infra): keep the AWS security group description to avoid replacement
`description` on aws_security_group is ForceNew, so renaming it forced a
replace of the in-use group on the next apply of an existing deployment.
Restore the original text and note why it must stay until a separate
infra migration.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* fix(macos): regenerate the app's compose file instead of treating it as a repo's
Config.repoPath fell back to the data directory when no repo clone was
found, and DockerCompose then picked up the compose file it had generated
there as if it belonged to a repo. The generator therefore only ran on
first launch, so upgraded installs kept their original compose, including
the old ghcr.io/gitlawb/node image, which no longer serves anonymous pulls.
repoPath now returns nil when there is no clone, and the app regenerates
its compose file whenever no repo compose is in use. Project directory and
named volumes are unchanged.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* fix(infra): default the AWS node image to ghcr.io/twigpine/node
release.yml publishes to ghcr.io/${GITHUB_REPOSITORY,,}, which is now
ghcr.io/twigpine/node; ghcr.io/gitlawb/node denies anonymous pulls, so the
default made new deployments fail to start and the upgrade command fail
on existing ones. On an existing deployment `terraform apply` only updates
the upgrade SSM document in place (user_data drift is ignored); the new
image is pulled on the next upgrade_command.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* fix(macos): keep operator edits to the generated compose, migrate only the image
e04efe4 regenerated the app's compose file on every access, overwriting
edits operators make to pass settings the generated environment block
omits (e.g. GITLAWB_OPERATOR_STRICT_MODE). Generate the file only when it
is missing; when it exists, keep it and rewrite only references to the
retired ghcr.io/gitlawb/node image, keeping tags and digests.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* fix(macos): only migrate complete ghcr.io/gitlawb/node references
Without a left boundary the migration also rewrote the retired path when
it appeared inside a longer reference, such as a registry mirror
(registry.example.com/ghcr.io/gitlawb/node), pointing it at a path the
mirror may not have.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: Claude Opus 5.5 <[email protected]>
4.9 KiB
Contributing to Twigpine
Thanks for your interest in contributing. Twigpine is an open protocol — agents and humans welcome.
Quick start for contributors
# Clone and build
git clone https://github.com/Twigpine/node
cd node
# Build everything
cargo build
# Run the workspace test suite
cargo test --workspace
# Run a local node (requires a Postgres instance — see docker-compose.yml)
cargo run -p gitlawb-node
# Build the CLI
cargo run -p gl -- --help
The fastest dev loop is docker compose up postgres -d for the database, then cargo run -p gitlawb-node for the node.
Repository layout
crates/
├── gitlawb-core/ crypto primitives (DID, CID, HTTP sigs, UCAN, ref certs)
├── gitlawb-node/ axum HTTP server, git smart HTTP, P2P, GraphQL
├── gl/ CLI — identity, repos, MCP server, Base L2 names
├── git-remote-gitlawb/ git remote helper for gitlawb:// URLs
├── gitlawb-attest/ provenance attestations for ref-update certificates
└── icaptcha-client/ client for the iCaptcha proof-of-intelligence service
docs/ Operator guides
scripts/ Build helpers
Smart contracts live in a separate repo: github.com/Twigpine/contracts.
Ways to contribute
- Bug reports — open an issue with steps to reproduce
- Feature requests — open an issue describing the use case
- Code — open a PR (see guidelines below)
- Documentation — fixes and improvements always welcome
- Node operators — run a node and join the network
- Agent integrations — build tools using
gl mcp serve
PR guidelines
- One thing per PR. Small, focused PRs get reviewed faster.
- Tests. New functionality should have tests. Run
cargo test --workspacebefore opening a PR. - No breaking changes without discussion. Open an issue first for protocol-level changes.
- Conventional commits. Use
feat:,fix:,docs:,refactor:,test:,chore:. Releases are automated by release-please — your commit prefixes drive the next version bump. - Format and lint. Run
cargo fmt --allandcargo clippy --workspace --all-targets -- -D warningsbefore submitting. CI will reject anything that fails these. - Security-surface rules.
AGENTS.mdcarries the authorization invariants PRs most often break; it is written for coding agents and humans alike, so read it before touching endpoints, visibility, or migrations.
What gets merged, what gets closed
We welcome contributions from humans and agents alike. To keep review sustainable, PRs are expected to clear a basic quality bar:
- Link an issue. Bug fixes and features should reference an issue (
Closes #123). For protocol-level changes (identity, signatures, UCAN, ref certs, wire formats), open the issue before writing code. - One change per PR. Unrelated churn slows review and gets sent back.
- Tests and a green pipeline. New behavior needs tests;
cargo fmt,cargo clippy, and the full CI suite must pass. - A real description. Say what changes and why. "Update code" is not a description.
A triage bot labels PRs that are missing these and leaves a short note. Nothing is closed automatically while you're engaging. A flagged PR still missing a description after 14 days of inactivity gets a stale warning, and is closed 7 days later if still untouched. A missing issue link alone never triggers closure; that label stays advisory. Closed PRs can be reopened at any time once updated.
Development environment
Requirements:
- Rust stable (≥ 1.91) — install via rustup
- PostgreSQL — required for the node. Use the bundled
docker-compose.ymlfor local dev. - Docker (optional, for full-stack local testing)
Environment variables:
cp .env.example .env
# edit .env
The minimum required variable is DATABASE_URL. Everything else has sensible defaults — see .env.example.
Running tests
# All workspace tests
cargo test --workspace
# Specific crate
cargo test -p gitlawb-core
cargo test -p gitlawb-node
Areas actively looking for help
- TypeScript SDK (
@gitlawb/sdk) — client library for the HTTP API - Python SDK (
gitlawb) — for ML/agent pipeline integration - UCAN authorization — add trusted issuer anchoring, capability checks, and authorization-aware revocation
- Filecoin storage tier — wire up cold storage deals
- Documentation — guides, tutorials, API examples
- Node operators — run a public node and report issues
Code of conduct
Be constructive and respectful. This is a technical project — focus on ideas and code, not people.
License
By contributing, you agree that your contributions will be dual licensed under MIT and Apache-2.0, at the user's option.