llm-wiki-installer
llm-wiki-installer generates a Git-auditable, agent-friendly Obsidian
Markdown knowledge vault from one command.
It turns an empty folder into a durable Markdown knowledge system with clear
evidence boundaries, agent policy, helper scripts, and selected upstream
Skills. The generated vault is designed for a simple loop: collect
approved sources, compile them into wiki/, retrieve from the wiki first, and
review every change through Git.
It is not itself an initialized vault. This repository builds the generator; the generated vault lives in a separate target repository.
Quick Start
From the empty directory you want to turn into an llm-wiki vault, run:
curl -fsSL https://raw.githubusercontent.com/exhank/llm-wiki-installer/main/install.sh | /bin/bash
The default flow is interactive. It shows selectors for dependency tools and upstream Skills, with all options selected by default. When no target path is provided, the installer writes the vault into the current directory.
If you use uv, the package is also published on PyPI as
llm-wiki-installer:
uvx llm-wiki-installer
For pinned automation, include the package version you want to reproduce:
uvx llm-wiki-installer==<version> --no-interactive /path/to/knowledge-vault
Why This Exists
Most AI note workflows stop at chat answers or ad hoc generated notes. This project sets up a stricter vault contract:
raw/keeps user-approved source evidence.wiki/keeps compiled long-term Markdown knowledge.wiki/index.mdandwiki/maps/provide stable retrieval entry points.wiki/tags.mdkeeps the flat kebab-case tag registry.wiki/log.jsonl, Git diff, and generated scripts make changes auditable.- Upstream Skills are copied as third-party artifacts from pinned sources.
Features
- One-command local or streamed installer.
- Python installer package with no runtime third-party dependencies.
- Interactive default-all selectors for dependency tools and upstream Skill sources.
- Generated AGENTS policy, README, scripts, Codex config, index, log, and stable Obsidian settings.
- Generated stable Obsidian settings with bundled Things theme and obsidian-git plugin assets.
- Pinned upstream Skill commits for reproducible generated vaults.
- Safety checks that refuse to generate into this generator repository.
- Unit, shell integration, type, lint, coverage, and package checks.
What It Generates
llm-wiki-installer turns an empty target repository into a working vault
contract:
knowledge-vault/
+-- raw/ # user-approved source evidence
+-- attachments/ # Obsidian default attachment folder
+-- wiki/ # durable compiled knowledge
| +-- index.md # retrieval entry point
| +-- tags.md # flat kebab-case tag registry
| +-- log.jsonl # JSONL change log
| +-- maps/ # topic maps for navigation
+-- outputs/ # generated reports and exports
+-- inbox/ # incoming material awaiting review
+-- archives/ # retired material
+-- schema/ # schema and policy documents
+-- AGENTS.md # runtime policy for agents
+-- .agents/
| +-- skills/ # flattened pinned third-party Skill artifacts
+-- .codex/
| +-- config.toml # Codex project config
| +-- hooks.json # Codex project hook config
+-- .scripts/ # verification helpers
+-- .obsidian/ # stable Obsidian settings, theme, and pinned plugin assets
The operating model is intentionally file-first:
approved sources -> raw/ -> wiki pages -> wiki/index.md + wiki/maps/
\-> wiki/log.jsonl -> Git diff review
agents read AGENTS.md -> retrieve with rg/fzf -> verify against raw/
Generate A Vault
Install with the published PyPI package:
uvx llm-wiki-installer /path/to/knowledge-vault
Pin the package version for repeatable automation:
uvx llm-wiki-installer==<version> /path/to/knowledge-vault
Install into the current directory with the streamed shell bootstrap:
curl -fsSL https://raw.githubusercontent.com/exhank/llm-wiki-installer/main/install.sh | /bin/bash
Pass installer options through the same pattern:
curl -fsSL https://raw.githubusercontent.com/exhank/llm-wiki-installer/main/install.sh | /bin/bash -s -- --force
The streamed launcher resolves
GitHub Releases latest
internally when LLM_WIKI_INSTALLER_REF is not set. Set
LLM_WIKI_INSTALLER_REF only when intentionally testing or pinning another ref:
curl -fsSL https://raw.githubusercontent.com/exhank/llm-wiki-installer/main/install.sh | LLM_WIKI_INSTALLER_REF=<tag-or-commit> /bin/bash
The uvx entry point uses the PyPI package and runs the same installer CLI as
llm-wiki-install. It is the preferred path for automation because JSON output
comes directly from the Python CLI. The streamed one-line command remains useful
on machines that do not already use uv.
Install from a local checkout into the current directory:
bash /path/to/llm-wiki-installer/install.sh
Install into a specific directory:
bash install.sh /path/to/knowledge-vault
Use --force with a specific directory only when you intentionally want to
overwrite generated files in the target vault:
bash install.sh --force /path/to/knowledge-vault
Preview an install plan:
bash install.sh --dry-run /path/to/knowledge-vault
bash install.sh --dry-run --json /path/to/knowledge-vault
Select tools and upstream Skills explicitly:
bash install.sh --tools rg --skills kepano /path/to/knowledge-vault
bash install.sh --tools none --skills none /path/to/knowledge-vault
Run without network bootstrap operations:
bash install.sh --offline --tools rg --skills none /path/to/knowledge-vault
Run without automatically installing missing selectable tools:
bash install.sh --no-install-tools --tools rg /path/to/knowledge-vault
When run from an interactive terminal, the installer shows two onboarding selectors before generating files:
- dependency tools:
rgandfzf - upstream Skill sources:
Ar9av/obsidian-wikiandkepano/obsidian-skills
Both selectors default to all options selected. Use Up/Down to move, Space to toggle an option, and Enter to continue. Non-interactive runs, including scripted installs with redirected output, use the all-selected default. To force that behavior from a terminal, pass:
bash install.sh --no-interactive /path/to/knowledge-vault
The installer refuses to use a checked-out generator repository, or any path
inside one, as the target. If you run bash install.sh from this repository, it
exits instead of writing vault files here.
Generated Target Layout
The target vault receives:
inbox/
raw/
attachments/
wiki/
outputs/
archives/
AGENTS.md
README.md
.agents/skills/
.codex/config.toml
.codex/hooks.json
.scripts/postrun.sh
.scripts/check-index-log.sh
.obsidian/
.gitignore
Selected upstream Skills are installed into .agents/skills/, flattened by
skill directory name. Stable Obsidian settings, the Things theme, and pinned
obsidian-git plugin assets are generated under .obsidian/; volatile workspace
state is not generated.
Requirements
- Python 3.13+
- Git
rgwhen selectedfzfwhen selected- Network access to PyPI for
uvx, GitHub for streamed installs and upstream Skills
Pass --no-install-tools to require preinstalled tools instead. Pass
--offline to disable upstream Skill cloning; when --offline is used without
--skills, upstream Skills default to none.
CLI Options
--force overwrite generated files in the target vault
--no-interactive use default all-selected prompts without asking
--yes alias for --no-interactive
--tools LIST rg,fzf, all, or none
--skills LIST Ar9av,kepano, all, or none
--no-install-tools fail if a selected missing tool would need installation
--offline do not run network bootstrap operations
--dry-run print the install plan without writing files
--json print dry-run or final install summaries as JSON
Failure Handling
Installer failures are intended to be actionable. Common fixes:
- Missing Python: install Python 3.13+ or use
uvx --python 3.13. - Missing Git: install Git and rerun the same command.
- Missing
rgorfzf: install the selected tool or rerun with--toolsexcluding it. - Network unavailable: use
--offline --skills none; selected upstream Skills require GitHub access.
Privacy And Network Boundaries
The installer does not include telemetry. It writes only under the target vault
root after rejecting the generator repository itself and child paths. Network
access is limited to documented bootstrap operations: fetching the published
package from PyPI when using uvx, cloning this installer for streamed
installs, and cloning selected pinned upstream Skill sources. Use --dry-run
to inspect the plan first, and --offline to disable installer-managed network
bootstrap operations after the package or launcher has already started.
Develop
python3 -m venv .venv
.venv/bin/python -m pip install --upgrade pip
.venv/bin/python -m pip install -r requirements-dev.txt
.venv/bin/python -m pip install --no-build-isolation --no-deps -e .
Useful development checks:
make format # apply isort and Black to src/ and tests/
make format-check # verify isort and Black without changing files
make lint # run format checks and Pylint
make typecheck # run mypy
make test # run pytest
make coverage # run pytest with coverage
make shell-test # run the stubbed shell integration harness
make package-check # build sdist/wheel and run twine check
make verify # run the full local verification stack
Optional local Git hook setup:
.venv/bin/pre-commit install
Project Map
install.shis the small compatibility launcher.src/llm_wiki_installer/contains the Python installer package.src/llm_wiki_installer/templates/contains generated vault file bodies.docs/technical-design.mdis the architecture source of truth.docs/llm-wiki-generation-guide.mdis the generation contract.docs/security-model.mddescribes trust boundaries, network access, command execution, and supply-chain controls.tests/test_installer.pycovers installer behavior and generated contracts.tests/install_test.shis the shell integration harness with stubbed tools.
Contributing And Security
Contributions should keep the generator and generated vault contracts aligned:
when generated behavior changes, update the relevant template, docs, and tests
in the same patch. See CONTRIBUTING.md for the local workflow,
docs/security-model.md for the security model, and SECURITY.md for
vulnerability reporting.
Credits
This project is inspired by Andrej Karpathy's LLM Wiki methodology: compile approved source material into a long-lived Markdown wiki, retrieve from the wiki first, and keep changes reviewable through files and Git.
The installer can copy upstream Skills from these projects as third-party artifacts:
Ar9av/obsidian-wikikepano/obsidian-skills
Thanks to the authors and maintainers of the tools and ecosystems this project builds on:
- Obsidian for the local-first Markdown knowledge base model this installer targets.
- ripgrep and fzf for fast local search and selection.
- Git, Python, and related tooling for the portable installer and verification toolchain.
These acknowledgements do not imply endorsement by those projects. They are
included to make the dependencies and inspiration behind llm-wiki-installer
clear.
License
MIT. See LICENSE.
Metadata
Release files for llm-wiki-installer 0.1.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| llm_wiki_installer-0.1.7.tar.gz | 309.4 kB | With provenance | Details for llm_wiki_installer-0.1.7.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| llm_wiki_installer-0.1.7-py3-none-any.whl | Python 3 | none | any | Details for llm_wiki_installer-0.1.7-py3-none-any.whl |
Total release size: 587.0 kB
Release files / llm_wiki_installer-0.1.7.tar.gz
| Download URL | llm_wiki_installer-0.1.7.tar.gz |
|---|---|
| Size | 309.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
000b1a2ae785f24a53800a352de49db908fbcbf7955693c1373afb7ed7950c7b
|
|
BLAKE2b-256 checksum How to use checksums |
36b19e6fa1d0c3e5d9082fe909472041652df4211795a14b9a5c8ff64e8951af
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 29, 2026.
Transparency logRelease files / llm_wiki_installer-0.1.7-py3-none-any.whl
| Download URL | llm_wiki_installer-0.1.7-py3-none-any.whl |
|---|---|
| Size | 277.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
851bbcfa7c9af60dbae6635d171c488bd993702533262d59d1244f3d3b528781
|
|
BLAKE2b-256 checksum How to use checksums |
9aa7f2daf044fb05f67bca6b302276218a884f83aa57064acad488aa77ecfb88
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 29, 2026.
Transparency logSecurity for llm-wiki-installer 0.1.7
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for llm_wiki_installer-0.1.7.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 29, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.