Skip to content

LFS blob kind hits GitHub free-tier budget limit, no clean downgrade path #32

Description

@oc-bot-1

Problem

When argit backs up skills/ and workspace/ as kind: blob (the default for Hermes agents), they are LFS-tracked. On GitHub free-tier repos (1 GB storage / 1 GB bandwidth per month), this quickly exhausts the LFS budget — especially when combined with kind: sqlite snapshots of state.db (ours grew to 803 MB due to FTS indexes on 82k messages).

Once the LFS budget is exceeded, all pushes fail — even pushes that remove LFS objects or reduce repo size — because GitHub's pre-receive hook rejects any push that references LFS objects the budget can't serve.

What we tried

  1. Local manifest overlay to change workspace/ from blob to data and exclude state.db → overlay exclude does not suppress items defined in the bundled manifest, so both blob and data copies were produced.

  2. Removing LFS tracking (.gitattributes, git lfs uninstall --local, git rm --cached) → old commits in history still reference LFS objects, GitHub rejects the entire push with GH008: Your push referenced at least 170 unknown Git LFS objects.

  3. Fresh orphan branch + force push → this worked, but required nuking all 337 commits of backup history.

Requested improvements

1. Overlay should be able to override bundled item kinds

Currently, if the bundled manifest says {"kind": "blob", "source": "skills/"}, a local overlay cannot change it to kind: data or exclude it. The overlay can only add items and exclude uncovered paths.

Ask: Allow the local overlay to override kind for a source already defined in the bundled manifest, or allow exclude to suppress bundled items. This would let operators downgrade from blob to data without editing the hash-protected bundled manifest.

2. Provide an LFS-free backup mode

For repos on GitHub free tier, LFS is impractical for anything that changes frequently. Skills and workspace are almost entirely text files (markdown, Python, JS) that git handles natively.

Ask: Either:

  • Add a config flag like lfs: false that treats all blob items as data (regular git)
  • Or change the default for text-heavy directories to data instead of blob

3. state.db size warning / management

state.db grew to 803 MB (88% FTS indexes, 12% actual data). At 3x/day backups, this is ~2.4 GB/day of LFS bandwidth for a single file.

Ask: Consider:

  • Documenting expected state.db growth so operators can plan
  • Offering a VACUUM or index-rebuild maintenance command
  • Making state.db backup opt-in rather than default, since it's reconstructable (conversation history, not config)

Environment

  • argit manifest: hermes-2026.5.4-1
  • GitHub repo: free-tier org account
  • state.db: 803 MB (82k messages, 1412 sessions, dual FTS indexes)
  • skills/: 55 MB (text files)
  • workspace/: 1.4 MB (text files)

Workaround applied

Fresh orphan branch with:

  • LFS removed entirely (.gitattributes cleared)
  • hermes/sqlite/ in .gitignore (too large for GitHub without LFS)
  • Skills excluded from backup (reinstallable from Hermes)
  • Workspace backed up as regular data
  • Backup frequency reduced from hourly to 3x/day

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions