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, andauto_vacuum = INCREMENTALenablement
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:
- fuser check — refuse if OpenCode still has the DB open (unless
--skip-fuser) - WAL checkpoint — flush write-ahead log into the main DB
- Integrity check — abort if database is corrupt
- Backup — timestamped copy, then verify backup integrity
- Enable
auto_vacuum = INCREMENTAL— prevent future freelist bloat - VACUUM — rebuild the database with progress indication
- Re-enable WAL —
VACUUMresets journal mode; restore it - 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-fuserto 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
- OpenCode issue #16777 — database bloat bug report
- OpenCode PR #16730 — upstream fix (auto-vacuum, WAL checkpoint)
- ocgc — alternative garbage collector with session purging
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c211573587ca14a552e7451650b0cb94d17da59ff20ddd340d8f7e0e4919b174
|
|
| MD5 |
bb72ca1aa93c2ce38abb30c7824a24d5
|
|
| BLAKE2b-256 |
977bc78cd7a7978ef6c313cdd4da532edeacce46a73387109f6343e487ad0e93
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd5c75f12cc0aef515c979392242ad08295f0bd0821268ee7ec2db7b2abc89b0
|
|
| MD5 |
9de4d6db145c90c813363e762a8dcba1
|
|
| BLAKE2b-256 |
62616dfd04220cf720f48fe7f9d8bf97ea22183c56a17311b5907725d58b0a7d
|