A fast TUI lens over work knowledge
Project description
lazylens
A fast terminal lens over work knowledge.
lazylens builds a local SQLite/FTS index over work knowledge, then gives you
a keyboard-first Textual TUI for search, source structure, previews, and
cross-linked document relationships.
The intended first use case is an Atlassian project: Confluence pages provide the design/document structure, Jira issues provide delivery detail, and relationships let you navigate between them without losing the source context. Local folders are also supported for notes, demos, and non-cloud documents. SharePoint is planned next.
Screenshot
Features
- Local SQLite index with FTS5 search.
- Confluence Cloud indexing with page hierarchy, folders, snippets, and links.
- Jira Cloud indexing with issues, hierarchy, snippets, and linked issues.
- Cross-source relationship navigation: Confluence pages can lead into Jira Epics/Stories/Bugs and Jira issues can lead back to Confluence LLDs/KDDs.
- Local folder indexing for Markdown, text, and other readable project files.
- TUI project/source navigation with scoped
Allviews, Confluence/page structure, Jira roots, Epics, and Unparented tickets. - Browser/file opening from the selected page.
- About popup with version, commit, credit, and tech stack.
- Optional Nerd Font icon mode for richer terminal presentation.
Install
From PyPI:
pipx install lazylens
lazylens --help
From a checkout:
git clone https://github.com/richlee/lazylens.git
cd lazylens
python3 -m venv .venv
.venv/bin/python -m pip install -e ".[dev]"
.venv/bin/lazylens --help
On Windows PowerShell:
git clone https://github.com/richlee/lazylens.git
cd lazylens
py -m venv .venv
.\.venv\Scripts\python -m pip install -e ".[dev]"
.\.venv\Scripts\lazylens --help
Quick Start
For a real Atlassian project, configure Confluence and Jira as separate sources that share the same Atlassian env file:
lazylens init confluence \
--base-url "https://example.atlassian.net" \
--email "you@example.com" \
--space-key ARCH
lazylens init jira \
--base-url "https://example.atlassian.net" \
--email "you@example.com" \
--project-key ARCH
Edit the generated env file and paste your Atlassian API token:
${EDITOR:-vi} ~/.config/lazylens/atlassian.env
source ~/.config/lazylens/atlassian.env
lazylens doctor
lazylens index
lazylens
Inside the TUI, projects and sources are selected separately. A project selection
shows the combined project structure: All, Confluence/local document
structure, Jira roots, Jira Epics, and Unparented Jira tickets. A source
selection scopes both Structure and Pages to that source. The outgoing/incoming
relationship panes can still cross between Confluence and Jira inside the
selected project.
For a no-credentials demo:
lazylens demo
lazylens
Useful commands:
lazylens doctor
lazylens index
lazylens search architecture
lazylens
Atlassian Setup
lazylens uses Atlassian API-token basic auth for Confluence Cloud and Jira
Cloud. Remote APIs are used only to refresh the local SQLite index; TUI search
and navigation read from local data.
Credentials belong in:
~/.config/lazylens/atlassian.env
Source scope belongs in:
~/.config/lazylens/config.toml
Token values should stay out of config.toml and out of source control.
For personal or non-client testing, create a small Atlassian Cloud site, add a
Confluence space and Jira project, create an API token from your Atlassian
account security settings, then run lazylens doctor before indexing.
Confluence Source
Generate or append a Confluence source:
lazylens init confluence \
--base-url "https://example.atlassian.net" \
--email "you@example.com" \
--space-key ARCH
Then:
source ~/.config/lazylens/atlassian.env
lazylens index personal-confluence
Jira Source
Generate or append a Jira source:
lazylens init jira \
--base-url "https://example.atlassian.net" \
--email "you@example.com" \
--project-key LAZY
Then:
source ~/.config/lazylens/atlassian.env
lazylens index personal-jira
By default, Jira config uses project_keys to build a JQL query. You can use a
custom jql value in config.toml when you need a narrower scope.
Jira snippets and embedded links come from the first configured description
field that contains content. This supports projects that use custom fields such
as Description (DSP) instead of the standard Jira description field.
Local Folder Source
Local folders are useful for notes, exported documents, or demos:
lazylens init --root ~/Documents/notes --name Notes --key notes
lazylens index notes
Configuration
Default config path:
- macOS/Linux:
~/.config/lazylens/config.toml - Windows:
%APPDATA%\lazylens\config.toml
Default database path:
- macOS/Linux:
~/.local/share/lazylens/index.sqlite3 - Windows:
%LOCALAPPDATA%\lazylens\index.sqlite3
Example:
database = "~/.local/share/lazylens/index.sqlite3"
[ui]
icon_style = "ascii" # ascii, unicode, or nerd
[sources."notes"]
name = "Notes"
type = "local"
root = "~/Documents/notes"
[sources."personal-confluence"]
name = "Personal Confluence"
type = "confluence"
space_keys = ["ARCH"]
page_limit = 100
max_pages = 5
[sources."personal-jira"]
name = "Personal Jira"
type = "jira"
project_keys = ["LAZY"]
description_fields = ["description"]
issue_limit = 100
max_pages = 5
[projects.arch]
name = "Architecture"
sources = ["personal-confluence", "personal-jira"]
Projects group separately named sources into one working context. Selecting a
project with 1-9 shows the whole project: All means all project sources,
Structure includes Confluence/local document categories plus Jira roots, Epics,
and Unparented entries, and relationship navigation can cross source boundaries.
Selecting a source with a, b, d, etc. switches to source mode: All means
that source only, Structure is limited to that source, and Pages resets to that
source's overview. Selecting the project again returns to the full project view.
For Confluence, space_keys is usually the friendliest scope to configure. You
can also configure space_ids if you already know them. page_limit controls
API page size, and max_pages limits how many API result pages are fetched per
space.
For Jira, project_keys is the simplest scope. You can set jql instead when
you want to index a board, issue type, component, label, or other controlled
slice. description_fields is an ordered list of Jira field IDs or names to
use for snippets and embedded links. The first field with content wins, so a
project using a custom field can use:
description_fields = ["description", "Description (DSP)"]
If needed, base_url, email, or api_token_env can be set on Atlassian
sources. Token values should stay out of TOML. CONFLUENCE_BASE_URL may be
either the Atlassian site root or the /wiki URL; JIRA_BASE_URL should be the
Atlassian site root.
TUI Keys
1-9: select projecta,b,d...: select source within the current project/: focus searchc: clear searchr: refresh configured sourcesEnter: select structure, open pages, or drill into foldersRight/Space: drill into page/folder children or follow selected linksLeft/Backspace: go back from a drilled view?: Aboutq: quit
Icons
The TUI defaults to portable ASCII labels. For richer icons:
[ui]
icon_style = "nerd" # ascii, unicode, or nerd
nerd mode expects a Nerd Font in your terminal, for example FiraCode Nerd Font.
On macOS with Homebrew:
brew install --cask font-fira-code-nerd-font
Development
python3 -m venv .venv
.venv/bin/python -m pip install -e ".[dev]"
.venv/bin/python -m pytest
The project is intentionally local-first: remote APIs refresh the index, while interactive search/navigation reads from SQLite.
See docs/plan.md for the broader direction.
References
Project details
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 lazylens-0.4.0.tar.gz.
File metadata
- Download URL: lazylens-0.4.0.tar.gz
- Upload date:
- Size: 51.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
129566f6ad9fcbdab70c18d6d61d31b346b5fa74c00d05932918641a13c9e1bd
|
|
| MD5 |
913058fe6d7a07629c0f10ed0c427d1f
|
|
| BLAKE2b-256 |
aea867386a6996d52f11c0dc7a0c8f2f46ec1ff1f4b5dd21efef75366256a1b3
|
Provenance
The following attestation bundles were made for lazylens-0.4.0.tar.gz:
Publisher:
publish.yml on richlee/lazylens
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lazylens-0.4.0.tar.gz -
Subject digest:
129566f6ad9fcbdab70c18d6d61d31b346b5fa74c00d05932918641a13c9e1bd - Sigstore transparency entry: 2192046444
- Sigstore integration time:
-
Permalink:
richlee/lazylens@f0aaf77a008d37e051970a7d31a1fec3b3767413 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/richlee
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f0aaf77a008d37e051970a7d31a1fec3b3767413 -
Trigger Event:
release
-
Statement type:
File details
Details for the file lazylens-0.4.0-py3-none-any.whl.
File metadata
- Download URL: lazylens-0.4.0-py3-none-any.whl
- Upload date:
- Size: 39.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7e99dd604e6d20316c3e71245733e170317215a48147b0b82e1fab3216d6d910
|
|
| MD5 |
fc792da513dd417ae36aba6d091706ce
|
|
| BLAKE2b-256 |
c07d0abc274f50bc77c96be07d2d65e066fc2803afbdec6e047cb242d83b6575
|
Provenance
The following attestation bundles were made for lazylens-0.4.0-py3-none-any.whl:
Publisher:
publish.yml on richlee/lazylens
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lazylens-0.4.0-py3-none-any.whl -
Subject digest:
7e99dd604e6d20316c3e71245733e170317215a48147b0b82e1fab3216d6d910 - Sigstore transparency entry: 2192046451
- Sigstore integration time:
-
Permalink:
richlee/lazylens@f0aaf77a008d37e051970a7d31a1fec3b3767413 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/richlee
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f0aaf77a008d37e051970a7d31a1fec3b3767413 -
Trigger Event:
release
-
Statement type: