Local markdown/HTML browser with split-pane preview, full-text search, and a task board — stdlib-only.
Project description
Hub scans a directory tree, indexes every document into SQLite with full-text search and task lineage, and serves a fast local browser at http://localhost:8787. No npm. No framework. No runtime dependencies — pure stdlib Python (3.11+).
Install
pipx install hubspaces # isolated, recommended
# or
pip install hubspaces
From a clone (no publish needed):
git clone https://github.com/auth-02/hub && cd hub
pipx install .
This puts two commands on your PATH: hub (build the index) and hub-server (serve it + watch for changes).
Run
cd ~/my-project # any folder you want to browse
hub-server # serves http://localhost:8787 and rebuilds on change
Then open http://localhost:8787. That's it — Hub indexes the current directory by default.
Want to see it before pointing it at your own files? hub --demo builds the index from a bundled example repo, then hub-server --demo serves it.
hub-server --demo
Index — grouped by repo, filtered by kind, sorted by recency
Status badges on every task manifest. Click to cycle ongoing → completed → paused, saved instantly.
Split-pane preview with task trace
Click any row to open a live preview. The // trace panel links to related runs, artifacts, and the parent task.
Hub Feed — floating activity drawer
Press Ctrl+F or click the // feed tab on the right edge. Shows the last 50 file events across the scan root — what changed, which task, when.
Hub Timeline — daily work summary
Press Ctrl+T or click the // timeline tab. Answers What have I been working on? / yesterday? / this week? — grouped by task, with git commits, runs logged, artifacts generated, and task status inline.
Markdown & HTML document pages
Every file opened in its own tab gets a clean reading view with a // trace bar below the heading. HTML artifacts are served with the hub's own CSS injected.
Features
- Full-text search — filter by repo, path, title, and body simultaneously. Implicit AND,
repo:nameprefix supported. - Kind chips — one-click filters for TASK, RUN, ARTIFACT, CLAUDE, README, DOC, PROMPT. Stack with repo chips and search.
- Task status badges — every task manifest shows a clickable status pill. Cycles
ongoing → completed → paused. Persisted — survives DB resets, scan-root changes, and git branch switches. - Split-pane preview — click any row for a live rendered preview with lineage trace. No page navigation needed.
- Hub Feed — floating drawer (
Ctrl+F) showing recent file activity: what changed, which task, how long ago. - Hub Timeline — drawer (
Ctrl+T) with a synthesised daily summary grouped by today / yesterday / this week, pulling from the activity log +git logacross all repos. - Auto-rebuild — file watcher triggers a rebuild within ~3 s of any change in the scan root.
- Keyboard-first — navigate the full list without a mouse.
Configuration
Everything is optional. Drop a hub.toml in the folder you run Hub from (or run hub init to scaffold one):
[hub]
scan_root = "." # directory to index (default: CWD)
port = 8787 # local server port
exclude_dirs = ["vendor", "fixtures"] # extra dirs to skip (added to built-ins)
default_view = "board" # work | list | board | calendar | activity
Environment variables override the file:
| Var | Default | Purpose |
|---|---|---|
HUB_SCAN_ROOT |
(current directory) | Directory to scan |
HUB_SERVER_PORT |
8787 |
Server port |
HUB_OUTPUT |
~/.local/state/hub/build/docs-index.html |
Generated HTML path |
HUB_DB |
~/.local/state/hub/hub.db |
SQLite database |
HUB_DEBUG |
off | 1 enables logging to ~/.local/state/hub/hub.log |
Scan-root priority: --root flag → HUB_SCAN_ROOT → hub.toml → .scan_root sidecar → current directory.
You can also change it live: click the scan-root path in the header → edit → Save & Rebuild.
Task structure
Hub understands this layout and builds a lineage graph automatically:
{repo}/tasks/{slug}/
├── manifest.md ← TASK (links to all below)
├── runs/YYYY-MM-DD/ ← RUN (↑ back-link to manifest)
├── artifacts/ ← ARTIFACT
└── prompts/ ← PROMPT
hub new task <slug> scaffolds a valid task for you.
Agent plugin (optional)
Hub is the viewer. If you drive work with Claude Code, the companion
hub-agent plugin is the producer — it bundles the manifest skill, which
creates and maintains the tasks/<slug>/manifest.md structure above as you
work, so the board, trace, and timeline fill themselves in.
/plugin marketplace add auth-02/hub
/plugin install hub-agent@hub
Fully opt-in — Hub needs no plugin and no agent to deliver the full index/search/preview/trace experience.
Search
| Query | Finds |
|---|---|
session tokens |
files whose title or body contains both words |
repo:tasks manifest |
manifests in the tasks repo |
repo:docs architecture |
docs matching "architecture" |
Keyboard shortcuts
| Key | Action | Key | Action | |
|---|---|---|---|---|
/ |
Focus search | Enter |
Open in new tab | |
Ctrl+F |
Toggle feed drawer | j / ↓ |
Next file | |
Ctrl+T |
Toggle timeline drawer | k / ↑ |
Previous file | |
Esc |
Close preview / drawer |
Keep it running (macOS)
Two launchd agents start Hub at login — the server (+ watcher) and a periodic rebuild:
bash scripts/setup-launchd.sh
# custom scan root:
HUB_SCAN_ROOT=~/work bash scripts/setup-launchd.sh
Reload after upgrading:
launchctl kickstart -k gui/$(id -u)/com.user.hub-server
launchctl kickstart -k gui/$(id -u)/com.user.hub
Development
git clone https://github.com/auth-02/hub && cd hub
python3 -m hubspace.server # run from source, no install
python3 tests/run_tests.py # 246 tests, stdlib unittest
Layout: code is the hubspace/ package; all generated/writable state (index, DB, log)
lives under ~/.local/state/hub/, never the package directory.
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 hubspaces-0.1.0.tar.gz.
File metadata
- Download URL: hubspaces-0.1.0.tar.gz
- Upload date:
- Size: 53.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
579d23e94ec0958ae6e79923f363f0601e85b1e328813a70754f78cb7aecbe06
|
|
| MD5 |
de08ae8ac90b0eeaa61d34e788243737
|
|
| BLAKE2b-256 |
2178bd6bb81e0726051af3ce85c2a8826dee8e5bac01f4ae7d5495803be0ddda
|
Provenance
The following attestation bundles were made for hubspaces-0.1.0.tar.gz:
Publisher:
publish.yml on auth-02/hub
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hubspaces-0.1.0.tar.gz -
Subject digest:
579d23e94ec0958ae6e79923f363f0601e85b1e328813a70754f78cb7aecbe06 - Sigstore transparency entry: 1991679028
- Sigstore integration time:
-
Permalink:
auth-02/hub@ba43508f91e6fa6cff7e3be05aec36178dafa975 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/auth-02
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ba43508f91e6fa6cff7e3be05aec36178dafa975 -
Trigger Event:
release
-
Statement type:
File details
Details for the file hubspaces-0.1.0-py3-none-any.whl.
File metadata
- Download URL: hubspaces-0.1.0-py3-none-any.whl
- Upload date:
- Size: 61.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 |
02a2c76ffa8ebec09e0130fb169301beea928a6931797f32adb1e8d0db12bf61
|
|
| MD5 |
53194b141bfb000fd2b8069e238dd44d
|
|
| BLAKE2b-256 |
5f87ffcffdde81bb6e56c4f2673725e38279aac80ecbfe156f461b15368eb5b3
|
Provenance
The following attestation bundles were made for hubspaces-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on auth-02/hub
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hubspaces-0.1.0-py3-none-any.whl -
Subject digest:
02a2c76ffa8ebec09e0130fb169301beea928a6931797f32adb1e8d0db12bf61 - Sigstore transparency entry: 1991679154
- Sigstore integration time:
-
Permalink:
auth-02/hub@ba43508f91e6fa6cff7e3be05aec36178dafa975 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/auth-02
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ba43508f91e6fa6cff7e3be05aec36178dafa975 -
Trigger Event:
release
-
Statement type: