Fixed: - CLI help typo: "metatdata" -> "metadata" - Filter buffer OOM: check size before loading into memory Changed: - #[inline] on HTML escape helpers for hot path performance - Replaced once_cell and lazy_static with std::sync::LazyLock - Removed unused once_cell and lazy_static crate dependencies Refactored: - Added module-level doc to services/ module Documentation: - README.md: zstd is native not external, "none" -> "raw" - DESIGN.md: current schema and meta plugins section - CHANGELOG.md: Unreleased section populated
3.9 KiB
3.9 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
- Database index on
items(ts)column for faster ORDER BY sorting
Changed
- Filter plugins check size before loading content into memory (prevents OOM on large inputs)
#[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)
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