Features intentionally not in scope for v1.0. Listed here so the omission is documented, not accidental.
Every deferred item that's a viable future feature links to a tracking GitHub issue. The workflow is:
- When you ship a deferred item, remove its entry from this file in the same PR that closes the issue. The spec file(s) for that feature become the source of truth —
deferred.mdonly lists what's currently deferred. - When you newly defer something during ongoing work, add an entry here AND file an issue, then link them both ways.
- Speculative items (no concrete consumer demand, no scheduled work) don't need an issue. The entry stays here until either a consumer surfaces a need (→ file an issue) or the feature is judged out-of-scope-forever (→ move to the "Dropped" section).
When in doubt about whether an entry belongs in deferred.md, the litmus test is: "if someone reads the spec for X and notices it's missing from the code, will this file explain why?"
Watch mode — #135
- What:
repo.watch(callback)API that emits events when the data tree changes externally (working-tree edits, ref updates from another process), letting consumers invalidate caches/indices live. - Why deferred: Gitsheets typically operates against refs, not the working tree. The use case is real for dev/seeding workflows but not load-bearing for production consumers.
YAML format support (input + output) — #61
- What: Accept and emit YAML in CLI ingest / export, alongside the existing JSON / TOML / CSV.
- Why deferred: Long-standing backlog request with no concrete current consumer.
- What: Richer
contracts adopt/syncsource forms beyond v1's local-path and HTTPS URL: git-native refs with a host-defaulted shorthand (owner/repo/path@ref, GitHub Actions-style), and vanity-name resolution (a name likegitsheets.io/meals/v1dereferencing to a backing source, Go-modules-style). Pure resolution sugar — identity, pinning, and enforcement are already location-free (behaviors/contracts.md). - Why deferred: The kernel works with vendored files and raw URLs alone; the shorthand grammar can arrive later without breaking anything since it desugars to the same (source, bytes) pair.
- What: A contract registry that is itself a gitsheets repo — contracts as records in a built-in contracts sheet (validated on write by a meta-contract:
$idpresent, self-contained, open), served read-only over git transport. Succession/deprecation signaling (supersededBy) lives here — it cannot live in contract documents, which are immutable (behaviors/contracts.md). - Why deferred: Speculative until multiple independent producers/consumers exist; the motivating consumer pair works with consumer-authored, repo-hosted contracts.
- What: Allow contract documents to
$refother contracts, with adoption vendoring the transitive closure and identity accounting for resolution. - Why deferred: v1 requires contracts to be self-contained — closure identity semantics are subtle, and no consumer needs composition-by-reference yet.
- What: Contracts asserting sheet-level semantics — path-template/key structure (a consumer doing keyed lookups depends on
${{ slug }}semantics), required indexes. - Why deferred: Record schema covers the motivating cases; key-semantics assertions are where scope creep would live. Needs concrete consumer demand first.
- What: Allow secondary indices (currently in-memory only) to materialize to disk under a
.gitsheets/.indexes/tree, so consumers don't pay rebuild cost across restarts. - Why deferred: At v1.0 corpus sizes, lazy rebuild is fast enough. If a consumer's corpus grows past the threshold where rebuild matters, this becomes a real concern.
- What:
$in,$or,$gt-style operators onSheet.query. - Why deferred: Consumers can iterate
queryAll(...)and.filter(...)in their own code. The whole-repo-fits-in-memory premise makes the operator richness less load-bearing.
- What: A library-managed cache around parsed records, surviving across requests in a long-running consumer.
- Why deferred: Once #138 (blob-hash record cache fix) lands, the existing per-sheet-instance cache covers most needs. A richer multi-instance cache can come if a consumer shows it's needed.
CLI --working global flag — #165
- What: Read/write the working tree's state rather than HEAD.
- Why deferred: Substantive library work —
Repositoryneeds a parallel read/write path against on-disk files (no commit). Split out of #148 during v1.1;--prefixshipped,--workingtracked separately.
- What: The pre-v1.0 Koa server that exposed gitsheets over HTTP.
- Why dropped: Consumers building HTTP APIs around gitsheets build their own HTTP layer. The library doesn't ship one.
- What: The pre-v1.0 single-page app at
src/that demonstrated upload/diff/commit workflows. - Why dropped: Demo-grade UI tied to the dropped HTTP server. If a UI is wanted, it's a separate project on top of the library.
- What:
backend/lib/GitSheets.js— the pre-v1.0 single-class API with ref-oriented mutation and stream-based CSV import/export. - Why dropped: Early-prototype API with no current users. The modern
Sheet/Repository/Transactionmodel supersedes it.
- What: A built-in JSON:API-compliant HTTP layer.
- Why dropped: JSON:API didn't take over, the library doesn't ship an HTTP layer anyway, and consumer-side framing is more flexible.
- What: Split the npm package into separately-versioned core + CLI packages.
- Why dropped: Single-package shipping is simpler. Splitting is reversible later if a consumer wants the core without the CLI dependency surface.
These belong to consumers, not to gitsheets:
- Authentication / authorization — handled in consumer code or upstream
- HTTP layer / request handling — Fastify, Koa, Express, Hono, etc. — consumer's choice
- Search index — SQLite FTS, Meilisearch, etc. built on top
- Migration framework — schema migrations are one-shot scripts that commit to the data repo
- Auth for the push daemon's git remote — handled by the environment (SSH config, credential helper, GitHub App)