Skip to content

Latest commit

 

History

History
233 lines (175 loc) · 10.8 KB

File metadata and controls

233 lines (175 loc) · 10.8 KB

Licensing in practice

Gable is licensed per component. There is no single license that covers the repository; the directory a file lives in determines which OpenLBM Profile governs it. This page is the working guide: how to tell which license applies to a file in front of you, how the machinery enforces it, and what to do when you add a file.

The canonical Standard is not here. License texts, the normative Definitions & Eligibility core, the Gable Charter, and the design rationale live in https://github.com/FutureBuildAIinc/openlbm. That repository is authoritative; this page explains how it is applied in gable. Where the two disagree, the published Standard governs.

Verified against openlbm and gable main on 2026-08-07.


The Profiles, in one table

Six named Profiles compose over a shared Definitions Core. Full texts: openlbm/LICENSES/.

Profile SPDX identifier Covers Distinctive term
Commons 1.0 LicenseRef-OpenLBM-Commons-1.0 Core suite, add-ons, open interfaces Size-conditioned reciprocity — a Large Operator owes Corresponding Source even for purely internal production use
Surface 1.0 LicenseRef-OpenLBM-Surface-1.0 Surfaces and native client apps Reciprocity on distribution only — customize your own UI privately
Connector 1.0 LicenseRef-OpenLBM-Connector-1.0 Module SDK, generated API clients — the plug-in seam Maximally permissive, no copyleft
Community-Source 1.0 LicenseRef-OpenLBM-Community-Source-1.0 Community satellites Free for Community Members; fee for Large Operators; converts to AGPL-3.0-only after 5 years
Docs 1.0 LicenseRef-OpenLBM-Docs-1.0 Documentation, specs, guides — including this repository Attribution + share-alike
Trademark 1.0 LicenseRef-OpenLBM-Trademark The Gable / GableLBM / AI_LM / OpenLBM marks Not a code license — a brand-use policy

This is fair source, not open source. The Commons Profile conditions an obligation on organization size and excludes one field of use, which puts the Standard outside the OSI Open Source Definition. The license text says so itself (Commons §9, "NO OSI CLAIM"). If you need an OSI-approved license, OpenLBM is not it. The reasoning is in the OpenLBM README.


How to tell which license governs a file

Three artifacts encode the same mapping. Check them in this order.

1. The SPDX header on the file itself

Every source file in gable carries two lines at the top:

// SPDX-License-Identifier: LicenseRef-OpenLBM-Commons-1.0
// SPDX-FileCopyrightText: 2026 FutureBuild, Inc. and OpenLBM contributors

Comment syntax varies — // for Go and TypeScript, # for YAML, Makefiles and inside YAML frontmatter, an HTML comment for Markdown:

<!--
SPDX-License-Identifier: LicenseRef-OpenLBM-Docs-1.0
SPDX-FileCopyrightText: 2026 FutureBuild, Inc. and OpenLBM contributors
-->

Binary files (images, fonts) cannot carry a header, so they get a <filename>.license sidecar containing the same two lines — gable uses this for .claude/settings.json, which is JSON and has no comment syntax.

This is the fastest answer and it is right in the overwhelming majority of cases. Where the header and the map disagree, that is a bug: file it.

2. LICENSE-MAP.md — the human-readable directory map

At the root of gable. The authoritative directory → license mapping:

Path prefix SPDX license identifier
backend/internal/ LicenseRef-OpenLBM-Commons-1.0
backend/pkg/ (except backend/pkg/apps/) LicenseRef-OpenLBM-Commons-1.0
backend/cmd/ LicenseRef-OpenLBM-Commons-1.0
backend/migrations/ LicenseRef-OpenLBM-Commons-1.0
backend/pkg/apps/ LicenseRef-OpenLBM-Connector-1.0
app/ LicenseRef-OpenLBM-Surface-1.0
docs/ LicenseRef-OpenLBM-Docs-1.0

The most specific path wins. A file under backend/pkg/apps/ is Connector-licensed; anything else under backend/pkg/ is Commons-licensed.

LICENSE-MAP.md also records two Profiles that are not directory-scoped and therefore do not appear in the table: Community-Source (applied per-work, by version notice) and Trademark (a brand policy, not a code license).

3. REUSE.toml — the machine-readable form

Same mapping, in REUSE 3.x format, at the root of gable. It is what tooling reads and what CI enforces.

Order matters. When a path matches more than one [[annotations]] block, the last matching block wins. The backend/pkg/apps/** carve-out therefore must appear after the broader backend/pkg/** entry. If you reorder that file, you silently relicense the connector seam.

REUSE.toml also covers everything LICENSE-MAP.md does not — build manifests, CI config, repo plumbing, brand assets — because reuse lint requires that every file in the tree carries licensing information. The choices there follow the map's spirit: build config next to Commons code is Commons; prose and repo plumbing are Docs; brand assets are Trademark.


The Connector seam — why backend/pkg/apps/ is carved out

backend/pkg/apps/ is the installable-apps connector seam: the Manifest and App types, the Router interface that gates routes on enablement, and the registry that syncs manifests to the apps table. It is the surface a third-party module plugs into.

It is deliberately carved out of the backend/pkg/ Commons default and licensed under the more permissive Connector Profile, which has no copyleft. That is the point:

Because the SDK seam is permissive, a proprietary product, a community-source satellite, and the copyleft commons can all interoperate across it without any license crossing the boundary.

If you are integrating with a Gable instance, you integrate over the Connector, and your own licensing is your own business. If you contribute to the commons itself, you are contributing under Commons or Surface.

Practical consequences when working in that directory:

  • A file you add under backend/pkg/apps/ gets the Connector SPDX identifier, not Commons. Copy the header from a neighbouring file — don't copy one from backend/pkg/database/.
  • Moving code into backend/pkg/apps/ relicenses it more permissively. That is a licensing decision, not a refactor. Flag it in the PR.
  • Moving code out of backend/pkg/apps/ into backend/internal/ makes it copyleft. Also a decision.

Status: the seam exists and works, but it is not yet a separately versioned, independently consumable SDK. pkg/apps still couples to pkg/audit, pkg/database and pkg/httputil, there is one go.mod for the whole backend, and only a couple of modules are converted to manifests — the rest are declared centrally in backend/cmd/server/catalog.go. Extraction into a semver-tagged module is planned work — the seam is Connector-licensed but not yet independently consumable, which is what would make it usable by a third party. Phases 1–2 of the modularization blueprint describe the shape of that work.


Contributing: inbound = the license of what you touch

Your contribution is licensed under the same OpenLBM Profile that governs the file(s) you change. A change under backend/internal/ is contributed under Commons; under app/, Surface; under backend/pkg/apps/, Connector; under docs/ or in this repository, Docs.

Because these are custom licenses rather than an off-the-shelf inbound=outbound OSS license, contribution goes through a Contributor License Agreement. You will be asked to agree to it before your first contribution is merged. The CLA lives with the Standard in the openlbm repository.

By opening a pull request you confirm the contribution is your original work (or you have the right to submit it), that you agree to license it under the component license(s) it touches, and that you are not knowingly including third-party code under incompatible terms.


Adding a file: the checklist

  1. Work out the identifier — cheapest is head -3 on a neighbouring file in the same directory; confirm against LICENSE-MAP.md if the directory sits near a boundary.
  2. Add the two SPDX lines in the comment syntax of the file's language. A file that opens with --- frontmatter puts them as # comments inside the frontmatter block so it still parses.
  3. Binary or comment-less? Add a <filename>.license sidecar instead.
  4. New top-level directory, or a file REUSE.toml doesn't match? Add an [[annotations]] block — and mind the ordering rule.
  5. Run the gate: make license-check in gable, reuse lint here. It is a merge gate; a missing header fails the build.

This repository

Everything in gable-docs is LicenseRef-OpenLBM-Docs-1.0 — attribution and share-alike. Reuse it, adapt it, even commercially: credit "the OpenLBM/Gable project", link the source, indicate your changes, and distribute your adaptations under the same terms. The root LICENSE is the verbatim Docs Profile text; REUSE.toml covers the tree.

The Gable and OpenLBM marks are not covered by the Docs license. Trademark use is governed separately by LicenseRef-OpenLBM-Trademark — the Docs Profile grants you no right to use the names or logos to brand your fork.


Status

The OpenLBM Standard is at version 1.0, effective, in the openlbm repository. The OpenLBM Standard is published and effective at version 1.0. The texts vendored under LICENSES/ in the gable repository are copies, shipped so the repository is self-contained and REUSE-compliant offline. Where a vendored copy and the published Standard ever disagree, the published Standard governs.

Nothing on this page is legal advice. If your organization needs to know whether it qualifies as a Community Member or a Large Operator, read definitions.md in the Standard — it is normative — and then talk to your counsel.


See also