This changelog tracks user-visible changes and recorded release validation
status for published versions. Entries for v0.1.0, v0.1.1, and v0.2.0
were backfilled from git tags and WORKLOG.md.
The format is loosely based on Keep a Changelog.
0.2.5 - 2026-07-21
- Raised the minimum LanceDB version to 0.34.0, which embeds Lance 8.0.0 and
includes the upstream full-text-index maintenance fixes required by
tweetxvault optimizeafter archive updates and deletions. - Migrated full-text index creation to LanceDB's unified
create_index(..., config=FTS())API. - Added README upgrade and recovery guidance for archives that encountered the affected Lance 7 full-text-index panic.
- Prevented
tweetxvault optimizefrom resolving to affected LanceDB releases whose stale persisted FTS token bookkeeping could panic while merging index segments. Existing archives can be repaired in place after upgrading; no archive reimport is required.
UV_CACHE_DIR=/tmp/uv-cache uv run ruff format --checkuv run ruff checkUV_CACHE_DIR=/tmp/uv-cache uv run pytest -qUV_CACHE_DIR=/tmp/uv-cache uv builduvx --from twine twine check dist/tweetxvault-0.2.5*uv run --isolated --with dist/tweetxvault-0.2.5-py3-none-any.whl tweetxvault --help
0.2.4 - 2026-04-23
tweetxvault --versionprints the installed package version and, when run from a git checkout, includes the short commit hash plus adirtymarker.tweetxvault syncnow runs archive enrich, thread expansion, article refresh, media download, and URL unfurl by default after the sync pass, with--skip-enrich,--skip-threads,--skip-articles,--skip-media, and--skip-unfurlescape hatches for users who want the older sync-only behavior.- Follow-up jobs (
articles refresh,media download,unfurl,threads expand) now emit TTY progress bars and status lines during interactive runs instead of staying mostly silent until the final summary.
- CLI help text and
README.mdwere expanded to document sync flags, backfill markers, and representative nested command options sotweetxvault <cmd> --helpis self-explanatory. - Archive enrich now batches TweetDetail success/failure writes into chunked
Lance
merge_insertcalls to drastically reduce LanceDB version churn on long-running or interrupted enrich jobs. - Interrupted archive imports now run
ArchiveStore.optimize()on the way out so the stored archive stays compact even when a run is aborted. - The sampled archive-import debug flag was renamed for clarity (old help text and README copy updated to match).
- Security: refreshed the lock to pull in
pygments2.20.0 (CVE-2026-4539, a ReDoS in an unused lexer reached via transitive deps) and bumped thepytestdev pin to 9.0.3 (CVE-2025-71176, predictable/tmp/pytest-of-*directory);pip-auditnow reports no known vulnerabilities against the locked runtime- dev graph.
- Cleaned up the dev-dependency configuration: moved dev deps to a PEP 735
[dependency-groups].devand removed the deprecated[tool.uv].dev-dependenciesblock, souv syncno longer warns.
UV_CACHE_DIR=/tmp/uv-cache uv run ruff format --checkuv run ruff checkUV_CACHE_DIR=/tmp/uv-cache uv run pytest -qUV_CACHE_DIR=/tmp/uv-cache uv builduvx --from twine twine check dist/tweetxvault-0.2.4*uv run --isolated --with dist/tweetxvault-0.2.4-py3-none-any.whl tweetxvault --help
0.2.3 - 2026-03-23
- Shipped Grailbird archive conversion via
tweetxvault import grailbird, so pre-2018 CSV-based Twitter exports can be converted from an installed package instead of requiring a repo checkout.
- Release artifacts now include the packaged Grailbird converter module plus the Grailbird conversion guide in the source distribution.
- Grailbird validation now runs through the normal
pytestsuite instead of a standalone repo-root unittest.
- Grailbird archives without
data/js/user_details.jsno longer persist a fake archive owner id of"unknown", so later authenticated sync/import follow-up can still establish the real archive owner metadata.
UV_CACHE_DIR=/tmp/uv-cache uv run ruff format --checkuv run ruff checkUV_CACHE_DIR=/tmp/uv-cache uv run pytest -qUV_CACHE_DIR=/tmp/uv-cache uv builduvx --from twine twine check dist/tweetxvault-0.2.3*uv run --isolated --with dist/tweetxvault-0.2.3-py3-none-any.whl tweetxvault --help
0.2.2 - 2026-03-21
- TweetDetail-heavy follow-up jobs now pace themselves from X's live
x-rate-limit-*headers when available instead of relying on a fixed per-request delay. - The shared GraphQL client now honors
Retry-Afterandx-rate-limit-reseton429responses before falling back to the existing retry/cooldown path. - Removed the manual
--sleepoverrides for archive enrich/import follow-up, thread expansion, and article refresh; the default TweetDetail delay floor is now0s.
- Archive enrich no longer burns through the TweetDetail bucket at a fixed
1s/requestpace before failing after a guessed cooldown on accounts where X exposes the actual rate-limit window.
UV_CACHE_DIR=/tmp/uv-cache uv run ruff format --checkuv run ruff checkUV_CACHE_DIR=/tmp/uv-cache uv run pytest -qUV_CACHE_DIR=/tmp/uv-cache uv builduvx --from twine twine check dist/tweetxvault-0.2.2*uv run --isolated --with dist/tweetxvault-0.2.2-py3-none-any.whl tweetxvault --help
0.2.1 - 2026-03-21
- Search filters for surfaced result types and collections via
tweetxvault search --type ... --collection .... - Search result sorting via
tweetxvault search --sort relevance|newest|oldest. tweetxvault statsfor archive totals, collection coverage, storage health, and follow-up queues.
tweetxvault statsnow explains backfill/follow-up labels inline and reports optimize state asokorrun optimize.- Archive stats and related preload helpers are much faster on large archives.
- Installation docs now cover global
uv tool/pipxusage and editableuv tool install -e .development installs from a local checkout. - TweetDetail-heavy jobs now wait
1sbetween requests by default, with a--sleep 0escape hatch for one-off runs. - TweetDetail-heavy jobs now retry 429s more conservatively by default before entering the shared cooldown window.
- Empty resumed backfill pages now clear stale saved cursors instead of leaving
resume olderstuck on the collection.
UV_CACHE_DIR=/tmp/uv-cache uv run ruff format --checkuv run ruff checkUV_CACHE_DIR=/tmp/uv-cache uv run pytest -qUV_CACHE_DIR=/tmp/uv-cache uv builduvx --from twine twine check dist/tweetxvault-0.2.1*uv run --isolated --with dist/tweetxvault-0.2.1-py3-none-any.whl tweetxvault --help
0.2.0 - 2026-03-18
- Official X archive import from ZIP files or extracted directories.
- Archive follow-up commands via
tweetxvault import x-archive --enrichandtweetxvault import enrich. tweetxvault sync ... --head-onlyto clear stale saved backfill state without deleting archived data.
tweetxvault view ... --limit Nnow avoids full-export work before slicing, which makes large archives much faster to inspect interactively.- Archive/tweet list rendering is shared across
viewandsearch, with corrected chronology forview --sort oldest|newest. - Project docs and PyPI metadata now present X archive import as a first-class feature.
- Archive import rerun, progress, and follow-up edge cases across
--regen,--enrich, and standalone enrich flows. - Archive reconciliation now stays head-only instead of unexpectedly resuming an unrelated saved sync backfill.
uv builduvx --from twine twine check dist/*uv run pytest -q
0.1.1 - 2026-03-16
- Semantic-search embeddings are now L2-normalized and LanceDB vector/hybrid search explicitly uses cosine distance.
- Existing archives can be upgraded to the new embedding scale with
tweetxvault embed --regen. - Shared query-id resolution moved into
tweetxvault.utils, with stale sync helper parameters removed during the same cleanup pass.
uv run pytest tests/test_sync.py tests/test_articles.py tests/test_threads.py tests/test_cli.py -quv run ruff check tweetxvault/utils.py tweetxvault/sync.py tweetxvault/articles.py tweetxvault/threads.pyuv run ruff format --check tweetxvault/utils.py tweetxvault/sync.py tweetxvault/articles.py tweetxvault/threads.pyuv run pytest -quv builduv run --with twine twine check dist/tweetxvault-0.1.1*uv run --isolated --with dist/tweetxvault-0.1.1-py3-none-any.whl tweetxvault --help
0.1.0 - 2026-03-16
- Initial PyPI release with incremental sync for bookmarks, likes, and authored tweets.
- Raw API capture storage plus normalized secondary extraction for tweet objects, relations, media, URLs, and articles.
- Full-text and optional semantic search, plus terminal view and JSON/HTML export commands.
- Browser cookie extraction across Firefox and Chromium-family browsers.
- PyPI metadata and artifact contents were tightened so release builds better reflect shipped capabilities and stop bundling repo-internal files.
uv builduv run --with twine twine check dist/*- Wheel and sdist contents inspected to confirm repo-internal files no longer ship in release artifacts.