Skip to main content

Safely analyze and vacuum OpenCode's SQLite database

Project description

ocdbc — OpenCode Database Cleaner

Safely analyze and shrink OpenCode's SQLite database.

OpenCode stores all session history in a single SQLite database (~/.local/share/opencode/opencode.db). Over time, compaction and session archival leave behind freelist pages — free space inside the file that is never returned to the filesystem unless auto_vacuum is enabled and VACUUM is run. Databases routinely bloat to 1–2 GB, with >50% being dead air.

ocdbc provides two commands:

  • analyze — read-only health report (no risk)
  • vacuum — safe VACUUM sequence with backup, integrity checks, and auto_vacuum = INCREMENTAL enablement

Installation

# from PyPI (recommended)
pip install ocdbc

# from GitHub
pip install git+https://github.com/chncaesar/opencode-db-clean.git

# from source
git clone https://github.com/chncaesar/opencode-db-clean.git
cd opencode-db-clean
pip install .

Requires Python 3.8+ (stdlib only, zero pip dependencies).

Usage

Analyze (always safe, read-only)

ocdbc analyze

Shows: DB size, live data vs freelist, table sizes, session age distribution, and the 5 largest messages.

Vacuum (safe sequence)

ocdbc vacuum

The vacuum command performs these steps in order:

  1. fuser check — refuse if OpenCode still has the DB open (unless --skip-fuser)
  2. WAL checkpoint — flush write-ahead log into the main DB
  3. Integrity check — abort if database is corrupt
  4. Backup — timestamped copy, then verify backup integrity
  5. Enable auto_vacuum = INCREMENTAL — prevent future freelist bloat
  6. VACUUM — rebuild the database with progress indication
  7. Re-enable WALVACUUM resets journal mode; restore it
  8. Final integrity check — verify the result
# Skip the confirmation prompt
ocdbc vacuum --force

# Skip backup (dangerous — backup is recommended)
ocdbc vacuum --no-backup --force

# Proceed without fuser installed (use with caution)
ocdbc vacuum --skip-fuser --force

# Custom database path
ocdbc vacuum --path /custom/path/opencode.db

Safety

  • Refuses to run if OpenCode has the database open (detected via fuser)
  • Refuses to run if fuser is not installed — pass --skip-fuser to override
  • Checks integrity before and after — abort if anything looks wrong
  • Creates a verified timestamped backup before VACUUM (unless --no-backup)
  • VACUUM uses atomic rename — original DB untouched if the operation fails

Example

$ ocdbc analyze

OpenCode Database Health Report
──────────────────────────────────────────────────────────
  Path:          /home/zjc/.local/share/opencode/opencode.db
  File size:     1.3 GB
  Page size:     4.0 KB
  Journal mode:  wal
  Auto-vacuum:   OFF (NONE)

Storage
──────────────────────────────────────────────────────────
  Live data:     525 MB
  Freelist:      766 MB  (56% of file)
   VACUUM would reclaim ~766 MB
   Estimated result:  ~525 MB
$ ocdbc vacuum

   No process has the database open

  Current size:   1.3 GB
  Live data:      525 MB
  Freelist:       766 MB (56%)

  Proceed with VACUUM? [y/N] y

   WAL checkpointed
   Integrity check passed
   Backup created (1.3 GB)
   Backup integrity verified
   auto_vacuum set to INCREMENTAL
   VACUUM complete
   journal_mode = wal
   Integrity check passed

Results
──────────────────────────────────────────────────────────
  Before:   1.3 GB
  After:    578 MB
  Reclaimed: 731 MB

  Backup:   /home/zjc/.local/share/opencode/opencode.db.backup.2026-07-22T...
  (Keep it until you verify OpenCode works correctly)

Related

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ocdbc-0.1.1.tar.gz (9.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ocdbc-0.1.1-py3-none-any.whl (10.1 kB view details)

Uploaded Python 3

File details

Details for the file ocdbc-0.1.1.tar.gz.

File metadata

  • Download URL: ocdbc-0.1.1.tar.gz
  • Upload date:
  • Size: 9.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for ocdbc-0.1.1.tar.gz
Algorithm Hash digest
SHA256 c211573587ca14a552e7451650b0cb94d17da59ff20ddd340d8f7e0e4919b174
MD5 bb72ca1aa93c2ce38abb30c7824a24d5
BLAKE2b-256 977bc78cd7a7978ef6c313cdd4da532edeacce46a73387109f6343e487ad0e93

See more details on using hashes here.

File details

Details for the file ocdbc-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: ocdbc-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 10.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for ocdbc-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 fd5c75f12cc0aef515c979392242ad08295f0bd0821268ee7ec2db7b2abc89b0
MD5 9de4d6db145c90c813363e762a8dcba1
BLAKE2b-256 62616dfd04220cf720f48fe7f9d8bf97ea22183c56a17311b5907725d58b0a7d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page