Self-hosted personal knowledge base: bring in what you read, collect and write — papers, manuals, web pages, chats — then search it, ask it, see how it connects, and let your tools and agents work from it. Web UI, browser extension, CLI, MCP
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http counts 16 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
append_page
-
ask
-
capture_url
-
context
-
documents
-
get
-
get_chunk
-
get_page
-
ingest
-
ingest_file
-
link
-
promote
-
search
-
set_domains
-
traverse
-
write_page
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit d7908e6 · analyzer v33 · 3h ago
skills & prompt files 2
danger signals3
- dynamic code execution __import__() lodsb-prax-d7908e6/clients/cli/prax_cli/running.py :678
__import__(name) - dynamic code execution __import__ sink lodsb-prax-d7908e6/tests/test_cli.py :198
**__import__("os").environ, - dynamic code execution __import__ sink lodsb-prax-d7908e6/tests/test_mcp.py :83
env={**__import__("os").environ, "PYTHONPATH": "src"},
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 145
filesystem 76
- fs (weak) lodsb-prax-d7908e6/clients/claude-plugin/scripts/sync.py :20
from pathlib import Path - fs lodsb-prax-d7908e6/clients/cli/prax_cli/importing.py :10
from pathlib import Path - fs lodsb-prax-d7908e6/clients/cli/prax_cli/library.py :11
from pathlib import Path - fs lodsb-prax-d7908e6/clients/cli/prax_cli/out.py :8
import shutil - fs lodsb-prax-d7908e6/clients/cli/prax_cli/running.py :11
from pathlib import Path - fs lodsb-prax-d7908e6/clients/cli/prax_cli/up.py :7
from pathlib import Path - fs (weak) lodsb-prax-d7908e6/scripts/backfill.py :12
from pathlib import Path - fs (weak) lodsb-prax-d7908e6/scripts/bench_extractor.py :22
from pathlib import Path - fs (weak) lodsb-prax-d7908e6/scripts/build_extension.py :20
from pathlib import Path - fs (weak) lodsb-prax-d7908e6/scripts/compare_extractors.py :24
from pathlib import Path - fs (weak) lodsb-prax-d7908e6/scripts/eval_ask.py :41
from pathlib import Path - fs (weak) lodsb-prax-d7908e6/scripts/eval_retrieval.py :19
from pathlib import Path
show 28 more
- fs (weak) lodsb-prax-d7908e6/scripts/fetch_model.py :18
from pathlib import Path - fs (weak) lodsb-prax-d7908e6/scripts/make_zotero_fixture.py :20
import shutil - fs (weak) lodsb-prax-d7908e6/scripts/resolve_entities.py :19
from pathlib import Path - fs (weak) lodsb-prax-d7908e6/scripts/work.py :25
from pathlib import Path - fs lodsb-prax-d7908e6/src/prax/api.py :16
from pathlib import Path - fs lodsb-prax-d7908e6/src/prax/autostart.py :19
from pathlib import Path - fs lodsb-prax-d7908e6/src/prax/client.py :12
from pathlib import Path - fs lodsb-prax-d7908e6/src/prax/config.py :23
from pathlib import Path - fs lodsb-prax-d7908e6/src/prax/evaluation.py :25
from pathlib import Path - fs lodsb-prax-d7908e6/src/prax/fetch.py :16
import shutil - fs lodsb-prax-d7908e6/src/prax/hostinfo.py :13
from pathlib import Path - fs lodsb-prax-d7908e6/src/prax/importers/chats.py :34
from pathlib import Path - fs lodsb-prax-d7908e6/src/prax/importers/claude.py :28
from pathlib import Path, PurePosixPath, PureWindowsPath - fs lodsb-prax-d7908e6/src/prax/importers/links.py :36
from pathlib import Path - fs lodsb-prax-d7908e6/src/prax/importers/project.py :32
from pathlib import Path - fs lodsb-prax-d7908e6/src/prax/importers/zotero.py :29
import shutil - fs lodsb-prax-d7908e6/src/prax/inbox.py :31
import shutil - fs lodsb-prax-d7908e6/src/prax/mcp_server.py :16
from pathlib import Path - fs lodsb-prax-d7908e6/src/prax/models.py :46
from pathlib import Path - fs lodsb-prax-d7908e6/src/prax/ontology.py :40
from pathlib import Path - fs lodsb-prax-d7908e6/src/prax/parsers/__init__.py :59
import shutil - fs lodsb-prax-d7908e6/src/prax/parsers/figures.py :334
with pymupdf.open(stream=data, filetype="pdf") as doc: - fs lodsb-prax-d7908e6/src/prax/pipeline.py :172
with pymupdf.open(str(path)) as pdf: - fs lodsb-prax-d7908e6/src/prax/store/backup.py :29
import shutil - fs lodsb-prax-d7908e6/src/prax/store/base.py :20
from pathlib import Path - fs lodsb-prax-d7908e6/src/prax/store/retrieval.py :14
from pathlib import Path - fs lodsb-prax-d7908e6/src/prax/up.py :37
import shutil - fs lodsb-prax-d7908e6/src/prax/vectors.py :25
from pathlib import Path
36 more not shown — this panel samples each group; the count above is the real total.
shell / exec 8
- shell (weak) lodsb-prax-d7908e6/clients/claude-plugin/scripts/sync.py :18
import subprocess - shell lodsb-prax-d7908e6/src/prax/autostart.py :17
import subprocess - shell lodsb-prax-d7908e6/src/prax/parsers/__init__.py :1147
import subprocess - shell lodsb-prax-d7908e6/src/prax/up.py :39
import subprocess - shell (weak) lodsb-prax-d7908e6/tests/test_cli.py :8
import subprocess - shell (weak) lodsb-prax-d7908e6/tests/test_mcp.py :8
import subprocess - shell (weak) lodsb-prax-d7908e6/tests/test_ui_js.py :9
import subprocess - shell (weak) lodsb-prax-d7908e6/tests/test_up_failures.py :9
import subprocess
network 16
- net lodsb-prax-d7908e6/clients/cli/prax_cli/main.py :17
import httpx - net lodsb-prax-d7908e6/src/prax/api.py :12
import socket - net lodsb-prax-d7908e6/src/prax/client.py :11
import socket - net lodsb-prax-d7908e6/src/prax/fetch.py :17
import urllib.error - net lodsb-prax-d7908e6/src/prax/importers/citations.py :33
import urllib.error - net lodsb-prax-d7908e6/src/prax/importers/github.py :23
import urllib.error - net lodsb-prax-d7908e6/src/prax/inbox.py :34
import urllib.error - net lodsb-prax-d7908e6/src/prax/mcp_server.py :19
import httpx - net lodsb-prax-d7908e6/src/prax/models.py :42
import urllib.error - net lodsb-prax-d7908e6/src/prax/parsers/__init__.py :494
import httpx - net lodsb-prax-d7908e6/src/prax/pipeline.py :24
import socket - net lodsb-prax-d7908e6/src/prax/rerank.py :29
import urllib.request
show 4 more
- net lodsb-prax-d7908e6/src/prax/store/jobs.py :44
import socket - net lodsb-prax-d7908e6/src/prax/up.py :43
import urllib.error - net (weak) lodsb-prax-d7908e6/tests/test_citations.py :9
from urllib.parse import unquote - net (weak) lodsb-prax-d7908e6/tests/test_models.py :253
import urllib.error
secrets 7
- secrets lodsb-prax-d7908e6/clients/cli/prax_cli/main.py :68
default=os.environ.get("PRAX_TOKEN") or None, - secrets lodsb-prax-d7908e6/clients/cli/prax_cli/running.py :687
bool(os.environ.get("ANTHROPIC_API_KEY")), - secrets (weak) lodsb-prax-d7908e6/scripts/eval_ask.py :360
door = Door(a.door, token=os.environ.get("PRAX_TOKEN") or None, name="eval-ask") - secrets (weak) lodsb-prax-d7908e6/scripts/work.py :37
ap.add_argument("--token", default=os.environ.get("PRAX_TOKEN") or None) - secrets lodsb-prax-d7908e6/src/prax/auth.py :36
value = os.environ.get("PRAX_TOKEN", "").strip() - secrets lodsb-prax-d7908e6/src/prax/fetch.py :86
token = os.environ.get("HF_TOKEN") - secrets lodsb-prax-d7908e6/src/prax/mcp_server.py :42
token=token if token is not None else os.environ.get("PRAX_TOKEN"),
database 57
- db (weak) lodsb-prax-d7908e6/scripts/make_zotero_fixture.py :21
import sqlite3 - db lodsb-prax-d7908e6/src/prax/ask.py :32
import sqlite3 - db lodsb-prax-d7908e6/src/prax/evaluation.py :22
import sqlite3 - db lodsb-prax-d7908e6/src/prax/extraction.py :25
import sqlite3 - db lodsb-prax-d7908e6/src/prax/importers/citations.py :30
import sqlite3 - db lodsb-prax-d7908e6/src/prax/importers/zotero.py :30
import sqlite3 - db lodsb-prax-d7908e6/src/prax/inbox.py :32
import sqlite3 - db lodsb-prax-d7908e6/src/prax/parsers/queue.py :23
import sqlite3 - db lodsb-prax-d7908e6/src/prax/pipeline.py :25
import sqlite3 - db lodsb-prax-d7908e6/src/prax/resolution.py :25
import sqlite3 - db lodsb-prax-d7908e6/src/prax/review.py :21
import sqlite3 - db lodsb-prax-d7908e6/src/prax/store/__init__.py :31
import sqlite3 # noqa: F401 - callers type against store.sqlite3
show 28 more
- db lodsb-prax-d7908e6/src/prax/store/backup.py :30
import sqlite3 - db lodsb-prax-d7908e6/src/prax/store/base.py :16
import sqlite3 - db lodsb-prax-d7908e6/src/prax/store/documents.py :15
import sqlite3 - db lodsb-prax-d7908e6/src/prax/store/graph.py :12
import sqlite3 - db lodsb-prax-d7908e6/src/prax/store/jobs.py :10
import sqlite3 - db lodsb-prax-d7908e6/src/prax/store/maintain.py :28
import sqlite3 - db lodsb-prax-d7908e6/src/prax/store/pages.py :13
import sqlite3 - db lodsb-prax-d7908e6/src/prax/store/repair.py :30
import sqlite3 - db lodsb-prax-d7908e6/src/prax/store/retrieval.py :13
import sqlite3 - db lodsb-prax-d7908e6/src/prax/store/summary.py :10
import sqlite3 - db lodsb-prax-d7908e6/src/prax/surf.py :37
import sqlite3 - db lodsb-prax-d7908e6/src/prax/work.py :39
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_acronyms.py :5
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_ask.py :6
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_chunking.py :5
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_citations.py :7
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_delta_index.py :6
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_domains.py :7
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_door_jobs.py :7
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_embeddings.py :10
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_eval.py :8
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_extraction.py :7
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_figures.py :8
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_formulas.py :7
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_glyphs.py :6
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_heal.py :6
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_inbox.py :9
import sqlite3 - db (weak) lodsb-prax-d7908e6/tests/test_indexes.py :5
import sqlite3
17 more not shown — this panel samples each group; the count above is the real total.
tool registrations 16
- search lodsb-prax-d7908e6/src/prax/mcp_server.py :69
- get_chunk lodsb-prax-d7908e6/src/prax/mcp_server.py :106
- get lodsb-prax-d7908e6/src/prax/mcp_server.py :116
- traverse lodsb-prax-d7908e6/src/prax/mcp_server.py :130
- link lodsb-prax-d7908e6/src/prax/mcp_server.py :138
- ask lodsb-prax-d7908e6/src/prax/mcp_server.py :169
- set_domains lodsb-prax-d7908e6/src/prax/mcp_server.py :203
- promote lodsb-prax-d7908e6/src/prax/mcp_server.py :216
- context lodsb-prax-d7908e6/src/prax/mcp_server.py :237
- documents lodsb-prax-d7908e6/src/prax/mcp_server.py :276
- get_page lodsb-prax-d7908e6/src/prax/mcp_server.py :321
- write_page lodsb-prax-d7908e6/src/prax/mcp_server.py :328
show 4 more
- append_page lodsb-prax-d7908e6/src/prax/mcp_server.py :359
- ingest lodsb-prax-d7908e6/src/prax/mcp_server.py :373
- capture_url lodsb-prax-d7908e6/src/prax/mcp_server.py :385
- ingest_file lodsb-prax-d7908e6/src/prax/mcp_server.py :400
declared dependencies 23
- mcp@>=2,<3
- fastapi@>=0.115
- uvicorn@>=0.30
- pydantic@>=2.7
- python-multipart@>=0.0.9
- pyyaml@>=6
- anthropic@>=1
- httpx@>=0.27
- pymupdf4llm@*
- rapidocr@*
- python-bidi@>=0.6
- trafilatura@*
show 11 more
- magika@*
- striprtf@*
- pillow@*
- docling@*
- usearch@>=2.12
- onnxruntime@*
- tokenizers@*
- numpy@*
- prax@*
- pytest@>=8
- ruff@*
clipboard 1
- clipboard shell call lodsb-prax-d7908e6/clients/cli/prax_cli/main.py :171
" pbpaste | prax add - --title 'a thought'"