- Plugin features now use type_ prefix (meta_magic, filter_grep, etc.) - Added meta_all_musl and filter_all_musl for MUSL-compatible builds - grep filter plugin made optional via filter_grep feature flag - Removed regex crate from grep-related code, uses strip_prefix instead - Updated CHANGELOG.md with breaking change documentation
5.2 KiB
5.2 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Added
- New
filter_grepfeature to optionally include the grep filter plugin (regex-based line filtering). Disabling this feature removes theregexcrate and its ~800 KiB dependency stack from the binary. - New
meta_all_muslfeature for all MUSL-compatible meta plugins (excludesmeta_magicwhich requires libmagic) - New
filter_all_muslfeature for all MUSL-compatible filter plugins - Database index on
items(ts)column for faster ORDER BY sorting - Server API
ItemInfonow includesfile_size— actual filesystem-reported size of the item data file
Changed
- CLI args now feature-gated:
--serverand related options hidden when built withoutserverfeature;--client-*options hidden when built withoutclientfeature. Run--helponly shows relevant options. serverCargo feature now includes TLS support by default (axum-server);tlsfeature removed- Clap
conflicts_with_allremoved from all mode args — exclusivity now handled by implicitgroup("mode") - Filter plugins check size before loading content into memory (prevents OOM on large inputs)
- Status page pre-allocates collections with known capacities (meta plugins, compression info)
#[inline]on HTML escape helper functions (esc,esc_attr) for hot path performance- Removed
once_cellcrate (replaced withstd::sync::LazyLockfrom Rust 1.80) - Removed
lazy_staticcrate (replaced withstd::sync::LazyLock)
Breaking
- Plugin feature flags renamed with type prefix for consistency:
magic→meta_magicinfer→meta_infertree_magic_mini→meta_tree_magic_minitokens→meta_tokensgrep→filter_grepall-meta-plugins→meta_allall-filter-plugins→filter_all
Fixed
- CLI help text typo: "metatdata" → "metadata" in
--getand--infodescriptions
Refactored
- Added module-level documentation to
services/module
Documentation
- README.md: Fixed compression table — zstd is native (not external), "none" renamed to "raw"
- DESIGN.md: Updated schema to reflect current
itemstable columns and meta plugin inventory
[0.1.0] - 2026-03-21
Added
- Streaming tar-based export (
--export) producing.keep.tararchives without loading entire files into memory - Streaming tar-based import (
--import) extracting.keep.tararchives with new IDs - Server endpoints
GET /api/exportandPOST /api/import - ID-based filtering for
--list(keep -l 1 2 3lists specific items by ID) - Server API accepts optional
idsquery parameter onGET /api/item/ --ids-onlyflag for--listmode for scriptinginferandtree_magic_minimeta plugins for MIME type detection- Native
zstdcompression plugin as default - Configurable compression via
--compressionflag - Export/import modes with format detection (JSON, YAML, binary)
XDG_CONFIG_HOMEsupport for default config file locationXDG_DATA_HOMEsupport for default storage location- Tilde (
~) expansion in config file paths
Changed
CompressionType::Nonerenamed toCompressionType::Raw(with"none"as alias for backward compatibility)items.sizecolumn renamed toitems.uncompressed_size- Added
items.compressed_sizecolumn tracking compressed file size on disk - Added
items.closedcolumn tracking whether an item is fully written - Default
list_formatin config now matches CLI default (7 vs 5 columns) - All filter plugins share deduplicated option implementations
Refactored
- Extracted
spawn_body_reader()andcheck_binary_content()helpers for streaming uploads - Extracted
yaml_value_to_string()helper for meta plugins - Extracted
item_path()helper inItemServiceto reduce path duplication - Unified
get_item_meta_name/valueto take&strinstead ofString - Shared
ItemInfostruct between client and server - Compression service now returns
Resulttypes instead of panicking via.expect() ApiResponse::ok()andApiResponse::empty()constructorsmeta_filter()helper onSettingsfor consistent filtering- Added
tag_names()method onItemWithMeta filter_clone_box!macro for filter plugin cloning
Fixed
- Panic guards in diff, compression engine, and spawned threads
- Pre-existing borrow errors in export handler and
TryFromimplementation - TOCTOU race in
stream_raw_content_response - Swallowed write errors in meta plugins (digest, magic_file, exec)
- Truncated uploads (413) now properly store compressed data
term::stderr().unwrap()panic initem_service.unwrap()panics in compression engineRead/Writeimpls- Client API errors now propagate to user instead of being swallowed
- Import endpoint returns 413 on
max_body_sizeinstead of truncating keep --listuseslist_formatfrom config in all modes- All tables respect
table_configfrom settings DisplayListItemstruct removed (was unused)#[serde(alias = "size")]onImportMetafor backward compatibility