lestash
Core CLI and plugin system for Le Stash - a personal knowledge base that aggregates content from multiple sources into a unified, searchable database.
Note: For project overview, features, and quick start guide, see the GitHub repository.
Installation
uv add lestash
Or install the full workspace from the repository root:
uv sync --all-packages
CLI Commands
Items
# List all items (with date/time and resolved author names)
lestash items list
# Filter by source
lestash items list --source linkedin
# Search items
lestash items search "query"
# Show item details (includes reaction/comment target URLs)
lestash items show <id>
# Export items to JSON
lestash items export --output backup.json
# Create a Micro.blog draft from an item
lestash items draft <id> --output ~/blog/content/drafts/
Profiles
Map person URNs (e.g., LinkedIn) to human-readable names and profile URLs:
# Add a profile mapping
lestash profiles add "urn:li:person:abc123" --name "John Doe" --url "https://linkedin.com/in/johndoe"
# List all profiles
lestash profiles list
# Show a specific profile
lestash profiles show "urn:li:person:abc123"
# Remove a profile
lestash profiles remove "urn:li:person:abc123"
When profiles are configured, items list and items search display names instead of URNs, and items show includes the profile URL.
Sources
# List configured sources
lestash sources list
# Sync all sources
lestash sources sync
# View sync history
lestash sources history
Configuration
# Show current config
lestash config show
# Initialize config file
lestash config init
# Set a config value
lestash config set logging.level DEBUG
Plugin Architecture
Le Stash uses entry points for plugin discovery. Plugins implement the SourcePlugin base class:
from lestash.plugins.base import SourcePlugin
from lestash.models.item import ItemCreate
class MySource(SourcePlugin):
name = "my-source"
description = "My custom data source"
def get_commands(self) -> typer.Typer:
"""Return Typer app with source-specific commands."""
app = typer.Typer()
# Add commands...
return app
def sync(self, config: dict) -> Iterator[ItemCreate]:
"""Fetch items from the source."""
yield ItemCreate(
source_type="my-source",
source_id="unique-id",
content="Item content",
)
Register the plugin in pyproject.toml:
[project.entry-points."lestash.sources"]
my-source = "my_package:MySource"
Data Model
Item
The core unit of content:
| Field | Type | Description |
|---|---|---|
id |
int | Auto-generated primary key |
source_type |
str | Plugin identifier (e.g., "arxiv", "linkedin") |
source_id |
str | Unique ID within the source |
url |
str | Optional URL to original content |
title |
str | Optional title |
content |
str | Main text content |
author |
str | Optional author |
created_at |
datetime | When the content was created |
is_own_content |
bool | Whether user authored this |
metadata |
dict | Source-specific data (JSON) |
parent_id |
int | Optional FK to parent item (for grouping children) |
Database
SQLite database with:
- items - Main content table with unique constraint on (source_type, source_id) and optional
parent_idfor hierarchical grouping - items_fts - Full-text search virtual table (FTS5)
- vec_items - Vector embeddings for semantic search (sqlite-vec)
- item_history - Audit trail of content changes
- person_profiles - URN to name/URL mapping for display
- post_cache - Cached metadata for posts referenced by reactions/comments
- tags / item_tags - Tagging system
- collections / collection_items - Cross-source item grouping
- sources - Plugin configuration storage
- sync_log - Sync operation history
Configuration
Default location: ~/.config/lestash/config.toml
[general]
database_path = "~/.config/lestash/lestash.db"
[logging]
level = "INFO"
file_path = "~/.config/lestash/logs/lestash.log"
License
Metadata
Release files for lestash 1.64.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| lestash-1.64.4.tar.gz | 86.3 kB | With provenance | Details for lestash-1.64.4.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| lestash-1.64.4-py3-none-any.whl | Python 3 | none | any | Details for lestash-1.64.4-py3-none-any.whl |
Total release size: 169.7 kB
Release files / lestash-1.64.4.tar.gz
| Download URL | lestash-1.64.4.tar.gz |
|---|---|
| Size | 86.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
98102dc4391c0e719a1e88a2e358e9e97417c3b04b5fd95db2bc894f552644ef
|
|
BLAKE2b-256 checksum How to use checksums |
ed4575b5c5c1827ccb006cbbb499bf8c2802724b62554df4716a8c9084e25195
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 15, 2026.
Transparency logRelease files / lestash-1.64.4-py3-none-any.whl
| Download URL | lestash-1.64.4-py3-none-any.whl |
|---|---|
| Size | 83.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f88d7d734280a556bdcdd15175711aea215f71cb98a0e613634ce202f361954f
|
|
BLAKE2b-256 checksum How to use checksums |
0106349da43ff2f31d183dcdd35007d3d0bd92427381a3772f72888103ac6b0d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 15, 2026.
Transparency logSecurity for lestash 1.64.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for lestash-1.64.4.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 15, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.