Artifact 9c7ecbc124f317d05346aac004eca7e1e0883b9da7011bee92af66d6940ad9f6:
- File
docs/site/static/llms.txt
— part of check-in
[a87790f468]
at
2026-10-26 12:45:46
on branch main
— feat(sshverify): make in-process SSH signature verification opt-in
internal/clearsign keeps the SSH envelope, SSHSIG parsing, namespace, hash and SHA-1 checks, none of which need cryptography, and hands the key parse and signature check to an SSHVerifier that the new public package sshverify registers from init. The library therefore no longer links golang.org/x/crypto/ssh and the ECDSA, P-256, Ed25519 and RSA code it pulls in; html-artifact-publisher's TinyGo engine drops from 1,347,569 to 1,093,647 bytes gzipped (3,777,936 to 3,208,411 raw).
Without the verifier nothing is accepted unchecked: a well-formed SSH signature is ErrSSHVerifierUnavailable, which wraps ErrCannotVerify, so a seed under an SSH horizon-seed-key is refused, the held one is kept, and the sync or rebuild fails naming the package to import. Malformed signatures are still bad. The cli package (and so cmd/libfossil) and examples/tinygo import sshverify; a go list guard keeps x/crypto/ssh out of the root and db closures. (user: [email protected], size: 14484) [annotate] [blame] [check-ins using] [more...]
# go-libfossil > A Fossil repository engine in Go without cgo: it reads, writes and syncs Fossil repositories (the artifact format, the derived tables and the sync protocol). Go module `github.com/danmestas/go-libfossil` (package `libfossil`), command `libfossil`. A repository is an ordinary `.fossil` SQLite file that stock fossil reads. This file is generated from `docs/site/llms-header.md` plus the docs site. Every link below is a page on the docs site; [llms-full.txt](https://libfossil-docs.daniel-mestas.workers.dev/llms-full.txt) holds all pages in one file. ## Key concepts - **Artifact**: a text manifest made of cards (check-in, tag, wiki, cluster, ...). Its name is the SHA1 or SHA3-256 hash of its bytes. - **Repository state**: the tables (`event`, `plink`, `mlink`, `tagxref`, `leaf`, ...) derived from the artifacts by crosslinking, matching what `fossil rebuild` writes. - **Sync**: Fossil's card protocol over HTTP (`igot`, `gimme`, `file`, ...), as a client (`Clone`, `Repo.Sync`, `Repo.Pull`) and a stateless server (`libfossil repo serve`). - **Sparse cone**: a set of paths a checkout or a store holds; content outside it is elided, not lost. - **Horizon**: a check-in below which a store leaves history on the origin; at the structural depth the clone verifies a seed the origin can sign. - **Sub-manifests**: an extension that writes a check-in as a tree of manifests instead of one flat file list, shared with zit. - **Driver**: the `database/sql` SQLite driver, chosen by blank import: `db/driver/modernc` (pure Go) or `db/driver/ncruces` (SQLite as WebAssembly, for js/wasm and wasip1). ## Quick start 1. `go install github.com/danmestas/go-libfossil/cmd/libfossil@latest` 2. `libfossil repo new notes.fossil`, then `libfossil -R notes.fossil repo open .`, `libfossil repo add README.md`, `libfossil repo ci -m "first notes"`. 3. From Go: blank-import a driver, then `libfossil.Create(path, libfossil.CreateOpts{User: "ana"})` or `libfossil.Open(path)`, and `r.Commit(libfossil.CommitOpts{...})`, `r.Timeline(libfossil.TimelineOpts{...})`. 4. Sync: `libfossil.Clone(ctx, path, libfossil.NewHTTPTransport(url), libfossil.CloneOpts{})`, then `r.Sync(ctx, t, libfossil.SyncOpts{Pull: true})`. ## Go packages - `.` (package `libfossil`): `Repo`, `Create`, `Open`, `Clone`, check-ins, checkouts, history, merge, sync. - `cli`: the Kong command structs behind `libfossil`, embeddable in another binary. - `db`: the SQLite abstraction and driver registration. - `db/driver/modernc`: pure-Go SQLite driver (separate module). - `db/driver/ncruces`: SQLite-as-WebAssembly driver (separate module). - `observer/otel`: OpenTelemetry observer (separate module). - `dst`: deterministic simulation of sync between nodes. - `simio`: clock, randomness and storage seams for deterministic tests. ## Overview - [Documentation](https://libfossil-docs.daniel-mestas.workers.dev/docs/): go-libfossil reads, writes and syncs Fossil repositories in Go, without cgo. - [Examples](https://libfossil-docs.daniel-mestas.workers.dev/docs/examples/): Runnable examples live in the repo. ## Get started - [Install](https://libfossil-docs.daniel-mestas.workers.dev/docs/get-started/install/): go-libfossil is a Go module and a command. - [Quickstart: the CLI](https://libfossil-docs.daniel-mestas.workers.dev/docs/get-started/quickstart/): Create a repository, commit a file, and read the result with stock fossil. - [Embed in Go](https://libfossil-docs.daniel-mestas.workers.dev/docs/get-started/embed-in-go/): The libfossil package does what the command does, as typed Go values instead of command output. - [First sync](https://libfossil-docs.daniel-mestas.workers.dev/docs/get-started/first-sync/): Two repositories exchange check-ins with Fossil's sync protocol over HTTP. ## Concepts - [Architecture](https://libfossil-docs.daniel-mestas.workers.dev/docs/concepts/architecture/): The packages of go-libfossil, the SQLite driver layer, the observer interfaces and the deterministic simulator. - [Artifacts](https://libfossil-docs.daniel-mestas.workers.dev/docs/concepts/artifacts/): Everything a Fossil repository records is an artifact: a run of bytes, named by its own hash, that is never changed once written. - [Repository state](https://libfossil-docs.daniel-mestas.workers.dev/docs/concepts/repository-state/): Artifacts are the only facts a repository records. - [Sync](https://libfossil-docs.daniel-mestas.workers.dev/docs/concepts/sync/): Two repositories exchange artifacts with Fossil's sync protocol: text cards carried in HTTP POST bodies, one request and one reply per round. - [Sub-manifests](https://libfossil-docs.daniel-mestas.workers.dev/docs/concepts/sub-manifests/): A check-in manifest has one F card per file in the tree, not per changed file. - [Sparse cones](https://libfossil-docs.daniel-mestas.workers.dev/docs/concepts/sparse-cones/): A repository does not have to hold everything. - [Horizons](https://libfossil-docs.daniel-mestas.workers.dev/docs/concepts/horizons/): A horizon cuts a store by time. - [Signing](https://libfossil-docs.daniel-mestas.workers.dev/docs/concepts/signing/): go-libfossil signs two kinds of artifact: check-ins, as fossil and zit sign them, and the seeds an origin mints for structural horizons. ## Guides - [Production patterns](https://libfossil-docs.daniel-mestas.workers.dev/docs/guides/production/): The Quickstart uses log.Fatal to keep the snippets short. - [Migrating from fossil](https://libfossil-docs.daniel-mestas.workers.dev/docs/guides/migrating-from-fossil/): This guide is for users of upstream Fossil SCM (the C binary distributed by fossil-scm.org) who are evaluating libfossil — a pure-Go implementation of the Fossil repository format and sync protocol. - [Embedding the CLI](https://libfossil-docs.daniel-mestas.workers.dev/docs/guides/cli-embedding/): An application that keeps version history in a Fossil repository can run the libfossil binary as a child process: no checkout, no shadow working tree. - [Extension points](https://libfossil-docs.daniel-mestas.workers.dev/docs/guides/extension-points/): libfossil exposes four surfaces for consumers that want to instrument, extend, or replace pieces of the stack: - [Testing](https://libfossil-docs.daniel-mestas.workers.dev/docs/guides/testing/): This guide describes libfossil's test strategy for contributors adding tests or investigating failures. ## Reference - [SDK](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/sdk/): Auto-generated Go API reference. - [cli](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/sdk/cli/api/): - func \(e \*ExitError\) Error\(\) string - func \(e \*ExitError\) Unwrap\(\) error - type Globals - func \(g \*Globals\) OpenRepo\(\) \(\*libfossil.Repo, error\) - type RecoveryFlags - type RepoAddCmd - func ... - [db/driver/modernc](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/sdk/db/driver/modernc/): Pure-Go SQLite driver, the libfossil default. - [db/driver/ncruces](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/sdk/db/driver/ncruces/): Wasm-friendly SQLite driver based on ncruces/go-sqlite3. - [db](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/sdk/db/api/): Package db provides a SQLite database layer with pluggable drivers. - [dst](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/sdk/dst/api/): - func NewDefaultNode\(r \*repo.Repo, t sync.Transport, projectCode, serverCode string, opts DefaultNodeOpts\) \*DefaultNode - func \(n \*DefaultNode\) Repo\(\) \*repo.Repo - func \(n \*DefaultNode\) Tick\(ctx c... - [libfossil](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/sdk/libfossil/api/): - [func \(c \*Checkout\) Add\(patterns \[\]string\) \(int, error\)](<#Checkout.Add>) - func \(c \*Checkout\) Checkin\(opts CheckoutCommitOpts\) \(rid int64, uuid string, err error\) - func \(c \*Checkout\) Check... - [observer/otel](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/sdk/observer/otel/api/): Package otel provides OpenTelemetry implementations of the libfossil SyncObserver and CheckoutObserver interfaces. - [sshverify](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/sdk/sshverify/api/): Package sshverify links in\-process verification of SSH signatures into a program that uses go\-libfossil. - [CLI](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/): The libfossil command, one page per command group. - [repo new](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-new/): Create a new repository - [repo clone](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-clone/): Clone a remote repository - [repo ci](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-ci/): Checkin file changes - [repo co](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-co/): Checkout a version - [repo ls](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-ls/): List files in a version - [repo timeline](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-timeline/): Show repository history - [repo snapshot](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-snapshot/): Commit a file's bytes onto trunk, no checkout needed - [repo log](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-log/): Show the check-ins that changed a path - [repo cat](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-cat/): Output artifact content - [repo info](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-info/): Repository statistics - [repo hash](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-hash/): Hash files (SHA1 or SHA3) - [repo delta](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-delta/): Delta create/apply operations - [repo config](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-config/): Repository configuration - [repo query](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-query/): Execute SQL against repository - [repo verify](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-verify/): Verify repository integrity - [repo resolve](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-resolve/): Resolve symbolic name to UUID - [repo extract](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-extract/): Extract files from a version - [repo wiki](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-wiki/): Wiki page operations - [repo tag](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-tag/): Tag operations - [repo open](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-open/): Open a checkout in a directory - [repo status](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-status/): Show working directory changes - [repo add](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-add/): Stage files for addition - [repo rm](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-rm/): Stage files for removal - [repo rename](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-rename/): Rename a tracked file - [repo revert](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-revert/): Undo staging changes - [repo diff](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-diff/): Show changes vs a version - [repo merge](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-merge/): Merge a divergent version - [repo conflicts](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-conflicts/): List/manage unresolved conflicts - [repo mark-resolved](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-mark-resolved/): Mark a conflict as resolved - [repo undo](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-undo/): Undo last operation - [repo redo](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-redo/): Redo undone operation - [repo stash](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-stash/): Stash working changes - [repo bisect](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-bisect/): Binary search for bugs - [repo annotate](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-annotate/): Annotate file lines with version history - [repo blame](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-blame/): Alias for annotate - [repo branch](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-branch/): Branch operations - [repo uv](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-uv/): Unversioned file operations - [repo schema](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-schema/): Synced table schema operations - [repo user](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-user/): User management - [repo invite](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-invite/): Generate invite token for a user - [repo serve](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-serve/): Serve repository over HTTP for sync/clone - [repo submanifests](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-submanifests/): Sub-manifest tree settings - [repo cone](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/repo-cone/): Show or edit a checkout's sparse cone - [version](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/cli/version/): Print version information - [Settings](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/settings/): A repository setting is one row of the config table in the repository file. - [Conformance](https://libfossil-docs.daniel-mestas.workers.dev/docs/reference/conformance/): Every requirement of every draft go-libfossil implements, with its status, from the conformance test suite. ## Optional - [Full documentation in one file](https://libfossil-docs.daniel-mestas.workers.dev/llms-full.txt): every page above, concatenated in order