Metadata-Version: 2.5
Name: browsr
Version: 1.26.0
Summary: TUI File Browser App
Project-URL: Documentation, https://github.com/juftin/browsr#readme
Project-URL: Issues, https://github.com/juftin/browsr/issues
Project-URL: Source, https://github.com/juftin/browsr
Author-email: Justin Flannery <juftin@juftin.com>
License-Expression: MIT
License-File: LICENSE
Classifier: Development Status :: 4 - Beta
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: 3.15
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Requires-Python: >=3.11
Requires-Dist: art~=6.5
Requires-Dist: click~=8.3.1
Requires-Dist: orjson<4,>=3.11.5
Requires-Dist: pandas<4,>=3.1
Requires-Dist: pillow>=12.1.1
Requires-Dist: pypdfium2>=5.6.0
Requires-Dist: pyperclip~=1.11.0
Requires-Dist: rich-click~=1.9.7
Requires-Dist: rich-pixels~=3.0.1
Requires-Dist: rich<15,>=14
Requires-Dist: textual-universal-directorytree~=1.6.0
Requires-Dist: textual[syntax]<9,>=8
Requires-Dist: universal-pathlib~=0.2.6
Provides-Extra: all
Requires-Dist: pyarrow<27,>=26; extra == 'all'
Requires-Dist: s3fs>=2024.5.0; extra == 'all'
Requires-Dist: textual-universal-directorytree[remote]~=1.6.0; extra == 'all'
Provides-Extra: data
Requires-Dist: pyarrow<27,>=26; extra == 'data'
Provides-Extra: parquet
Requires-Dist: pyarrow<27,>=26; extra == 'parquet'
Provides-Extra: remote
Requires-Dist: s3fs>=2024.5.0; extra == 'remote'
Requires-Dist: textual-universal-directorytree[remote]~=1.6.0; extra == 'remote'
Description-Content-Type: text/markdown

<div align="center">
  <a href="https://github.com/juftin/browsr">
    <img src="https://raw.githubusercontent.com/juftin/browsr/main/docs/_static/browsr.png" width=400 alt="browsr" />
  </a>
</div>

<p align="center">
a pleasant <strong>file explorer</strong> in your terminal supporting <strong>all filesystems</strong>
</p>

<p align="center">
  <a href="https://github.com/juftin/browsr"><img src="https://img.shields.io/pypi/v/browsr?color=blue&label=%F0%9F%97%82%EF%B8%8F%20browsr" alt="PyPI"></a>
  <a href="https://pypi.python.org/pypi/browsr/"><img src="https://img.shields.io/pypi/pyversions/browsr" alt="PyPI - Python Version"></a>
  <a href="https://github.com/juftin/browsr/blob/main/LICENSE"><img src="https://img.shields.io/github/license/juftin/browsr?color=blue&label=License" alt="GitHub License"></a>
  <a href="https://github.com/juftin/browsr/actions/workflows/test.yaml?query=branch%3Amain"><img src="https://github.com/juftin/browsr/actions/workflows/test.yaml/badge.svg?branch=main" alt="Testing Status"></a>
  <a href="https://github.com/go-task/task"><img src="https://img.shields.io/badge/task---?message=task&logo=task&color=teal&labelColor=grey" alt="task"></a>
  <a href="https://github.com/astral-sh/uv"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json" alt="uv"></a>
  <a href="https://github.com/pre-commit/pre-commit"><img src="https://img.shields.io/badge/pre--commit-enabled-lightgreen?logo=pre-commit" alt="pre-commit"></a>
  <a href="https://juftin.github.io/browsr/"><img src="https://img.shields.io/static/v1?message=docs&color=526CFE&logo=Material+for+MkDocs&logoColor=FFFFFF&label=" alt="docs"></a>
  <a href="https://github.com/semantic-release/semantic-release"><img src="https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg" alt="semantic-release"></a>
  <a href="https://gitmoji.dev"><img src="https://img.shields.io/badge/gitmoji-%20😜%20😍-FFDD67.svg" alt="Gitmoji"></a>
</p>

**`browsr`** 🗂️ is a pleasant **file explorer** in your terminal. It's a command line **TUI**
(text-based user interface) application that empowers you to browse the contents of local
and remote filesystems with your keyboard or mouse.

You can quickly navigate through directories and peek at files whether they're hosted **locally**,
in **GitHub**, over **SSH**, in **AWS S3**, **Google Cloud Storage**, or **Azure Blob Storage**. View code files
with syntax highlighting, format JSON files, render images, convert data files to navigable
datatables, and more.

![](https://raw.githubusercontent.com/juftin/browsr/main/docs/_static/screenshot_utils.png)

<details>
<summary>Screenshots</summary>

<body>
<div>
    <img src="https://raw.githubusercontent.com/juftin/browsr/main/docs/_static/screenshot_datatable.png" alt="Image 2">
    <img src="https://raw.githubusercontent.com/juftin/browsr/main/docs/_static/screenshot_mona_lisa.png" alt="Image 3">
    <img src="https://raw.githubusercontent.com/juftin/browsr/main/docs/_static/screenshot_markdown.png" alt="Image 4">
</div>
</body>

</details>

<details>
<summary>Screen Recording</summary>

https://user-images.githubusercontent.com/49741340/238535232-459847af-a15c-4d9b-91ac-fab9958bc74f.mp4

</details>

## Installation

Install **`browsr`** in an isolated environment with [uv](https://docs.astral.sh/uv/guides/tools/):

```shell
uv tool install browsr
```

You can also use [pipx](https://pypa.github.io/pipx/) (`pipx install browsr`) or `pip install browsr`.

### Extra Installation

If you're looking to use **`browsr`** on remote file systems, like GitHub or AWS S3, you'll need to install the `remote` extra.
If you'd like to browse parquet / feather files, you'll need to install the `data` extra. Or, even simpler,
you can install the `all` extra to get all the extras.

```shell
uv tool install "browsr[all]"
```

### Upgrading

```shell
uv tool upgrade browsr
```

To upgrade all tools installed with uv, use `uv tool upgrade --all`.

## Usage

Simply give **`browsr`** a path to a local or remote file / directory.
[Check out the Documentation](https://juftin.com/browsr/) for more information
about the file systems supported.

### Local

```shell
browsr ~/Downloads/
```

### SQLite

Open a `.db`, `.db3`, `.sqlite`, or `.sqlite3` file to browse its tables and views
without modifying the database. Select an object from the dropdown to browse its
rows. Use **Previous** and **Next** (or `{` and `}`) to page through rows. The
`--max-lines` option controls the number of rows per page (default: 1000).

Use `[` and `]` to switch to the previous or next table or view.
Navigation wraps at either end of the dropdown and starts each selected object
at its first page. These shortcuts are also listed under **?**.

Columns are limited to 40 terminal cells, with long values shortened using an
ellipsis. Press **c** to copy the selected cell's full value as plain text,
preserving line breaks. NULL copies as `NULL`, and BLOBs copy as full hexadecimal
contents. Press **Shift+C** to copy the selected row's full contents as JSON,
including original column names and unshortened values. In copied rows, NULL
becomes JSON `null`, and BLOBs become `{"type": "blob", "hex": "..."}`.
All SQLite navigation and copy shortcuts appear in **?** while viewing a SQLite
file, including when the file tree has focus.

```shell
browsr ~/data/example.sqlite
```

Remote databases are downloaded to a temporary file that is removed when you
switch files or exit. The usual `--max-file-size` limit applies. Remote previews
read the database file alone; checkpoint any WAL changes before uploading it.

### GitHub

```
browsr github://juftin:browsr
```

```
export GITHUB_TOKEN="ghp_1234567890"
browsr github://juftin:browsr-private@main
```

### Cloud

```shell
browsr s3://my-bucket
```

\*\* _Currently AWS S3, Google Cloud Storage, and Azure Blob Storage / Data Lake are supported._

### SSH / SFTP

```shell
browsr ssh://username@example.com:22
```

## License

**`browsr`** is distributed under the terms of the [MIT license](LICENSE).
