ADR-04: The bucket modelΒΆ

ContextΒΆ

TINO needed a way to organise documents. The options ranged from a flat file system shared across all users, to a fully hierarchical folder tree, to isolated per-project repositories.

DecisionΒΆ

Documents are organised into buckets β€” named, isolated workspaces. Each bucket is an independent git repository with its own file tree, commit history, and access control list. Users switch between buckets explicitly; there is no global file tree spanning multiple buckets.

ConsequencesΒΆ

PositiveΒΆ

  • Isolation
    Each bucket is self-contained β€” its history, access rules, and files are independent of every other bucket.
  • Per-bucket access control
    Viewer, editor, and committer roles are assigned at the bucket level, making fine-grained access policy straightforward.
  • Clear ownership
    Buckets map naturally to projects, teams, or customers β€” easy to reason about who owns what.
  • Independent history
    Commits, diffs, and restores are scoped to a single bucket, keeping history clean and relevant.

NegativeΒΆ

  • No cross-bucket operations
    Files cannot be shared or referenced across buckets.
    Shared assets (e.g. a corporate logo) must be duplicated or managed via a Typst package.
  • No hierarchy
    There is no concept of nested buckets or folders of buckets β€” a flat list of named workspaces is all that exists at the top level.