A Bub distribution centered on Kimi as the default model and local screen-visual capture.
Project description
visual-base
Your brain is what you see.
Most "second brain" tools assume you will do the work of remembering — write the note, hit the highlight key, tag the page, file it under the right section. Whatever you didn't capture in the moment is gone. Whatever you did capture is a sample of what you chose to notice: a biased slice of a day you'll never get back.
visual-base starts from the opposite premise. It runs quietly in the
background and records what your eyes actually land on — your screen,
continuously, as compressed video. The browsing you forgot you did, the
terminal error that flashed and closed, the Slack thread you scrolled
past on the way to somewhere else, the Figma panel you stared at for
thirty seconds. The raw stream is the archive. Structure comes
out of it, not into it.
On top of the stream, visual-base ships:
bub_eye— a background screen recorder. Intel Mac, hardware HEVC viaavfoundation, ~135 MB per 15-min 720p segment, self-restarts across sleep / wake / permission changes, near-zero CPU.bub_kimi— Kimi as the default chat model, via thekimiCLI.video-activity-log— a skill that turns any recorded segment into an Obsidian-linkable daily log. One bullet per coherent activity;[[wikilinks]]on every site, app, person, and project it can identify; an ffmpeg-based idle preflight short-circuits locked-screen segments before the model ever sees them.
Nothing here asks you to be disciplined. If it was on your screen, it's in the tape.
Status
v0.1 — Intel Mac only, recording-first. bub_eye captures to
~/.bub/eye/segments/. The video-activity-log skill reads individual
segments on demand. Model-side ingestion of the full stream — searching
across days, a @tool over the tape, prompt injection of recent context
— is on the roadmap but not in this release. So are Apple Silicon and
Linux capture backends.
Install
One command, any platform:
uv tool install visual-base
This puts the visual-base / bub CLIs on your PATH inside an isolated
tool venv. On Intel Mac, the first time bub_eye actually starts
recording, it auto-installs imageio-ffmpeg into that venv. On all
platforms, the first Kimi call auto-installs kimi-cli as a separate uv
tool. You never need to touch pip, manage extras, or resolve
dependency conflicts by hand.
Set up Kimi credentials once:
cp .env.example .env # then fill in BUB_KIMI_*
On Intel Mac, macOS will prompt for Screen Recording permission the
first time bub_eye spawns ffmpeg. The grant is path-specific — re-grant
if you switch to a system ffmpeg via BUB_EYE_FFMPEG.
For local development
Clone the repo and let uv sync the workspace:
uv sync
cp .env.example .env
uv run visual-base --help
just setup bundles uv sync with a pre-warmed uv tool install kimi-cli for Dockerfile layers or CI caches.
Why auto-install instead of bundling as a dependency?
kimi-cli is an application, not a library, and imageio-ffmpeg ships
a 70 MB ffmpeg binary that only Intel Mac actually uses. Bundling either
into the wheel would either pin pydantic/typer to specific versions
that constrain future bub upgrades, or force every Linux / Apple
Silicon user to download the Mac-only binary for nothing. Auto-installing
via uv at first use keeps the base wheel small and each heavy dep
gated to the machine that needs it.
Run
uv tool run visual-base --help
uv tool run bub --help # same CLI, alternate name
Inside a cloned repo:
uv run visual-base --help
Layout
pyproject.toml # hatchling build, publishes visual-base to PyPI
LICENSE # MIT
src/visual_base/ # distribution-level defaults and version
src/bub_kimi/ # Kimi CLI plugin (entry-point: bub.kimi)
src/bub_eye/ # Screen-capture plugin (entry-point: bub.eye)
src/skills/ # Builtin skills shipped with the wheel
tests/ # ruff + pytest run against the flat layout
Releasing
Tag-driven. Edit version in pyproject.toml, commit, then:
git tag v0.1.0
git push --tags
.github/workflows/release.yml runs ruff + pytest, checks the tag
matches the project version, builds sdist + wheel with uv build, and
publishes via PyPI trusted publisher (OIDC). A Pending publisher for
oilbeater/visual-base → release.yml → environment pypi must be
configured on PyPI first.
Project details
Release history Release notifications | RSS feed
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 visual_base-0.1.1.tar.gz.
File metadata
- Download URL: visual_base-0.1.1.tar.gz
- Upload date:
- Size: 25.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f97989cf181505c09d720eaf4dd9f476301ace961420b05547356ba1daf88856
|
|
| MD5 |
1bcc9195473f3d6bfb05bf94f5cde1d7
|
|
| BLAKE2b-256 |
618477d0e3a33d5d14b693794f9b639546616d614ee8ed52883d45782922e40b
|
Provenance
The following attestation bundles were made for visual_base-0.1.1.tar.gz:
Publisher:
release.yml on oilbeater/visual-base
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
visual_base-0.1.1.tar.gz -
Subject digest:
f97989cf181505c09d720eaf4dd9f476301ace961420b05547356ba1daf88856 - Sigstore transparency entry: 1346818925
- Sigstore integration time:
-
Permalink:
oilbeater/visual-base@42b58138f8bd6938d29213da8d9fd2cfdcf92cad -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/oilbeater
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@42b58138f8bd6938d29213da8d9fd2cfdcf92cad -
Trigger Event:
push
-
Statement type:
File details
Details for the file visual_base-0.1.1-py3-none-any.whl.
File metadata
- Download URL: visual_base-0.1.1-py3-none-any.whl
- Upload date:
- Size: 28.1 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 |
029b481eab1716af35ff4892bb30c08b2b60cb28a12b82c931f192f042f2694a
|
|
| MD5 |
8f3a394e591fa33e1b3cd63e513ffcc3
|
|
| BLAKE2b-256 |
6927310fe4de03d2cf7bfc250b1de0b85e9fc06419b9057426fb81002a86ce93
|
Provenance
The following attestation bundles were made for visual_base-0.1.1-py3-none-any.whl:
Publisher:
release.yml on oilbeater/visual-base
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
visual_base-0.1.1-py3-none-any.whl -
Subject digest:
029b481eab1716af35ff4892bb30c08b2b60cb28a12b82c931f192f042f2694a - Sigstore transparency entry: 1346819014
- Sigstore integration time:
-
Permalink:
oilbeater/visual-base@42b58138f8bd6938d29213da8d9fd2cfdcf92cad -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/oilbeater
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@42b58138f8bd6938d29213da8d9fd2cfdcf92cad -
Trigger Event:
push
-
Statement type: