Your sovereign, multilingual AI knowledge assistant for Obsidian
Project description
NANA - NAna Not AI
NANA is your assitant for writing better notes and managing your vault.
"I don't cook dinner yet, but I'll help you organize your mind so you have more time to enjoy yours." — Nana
What is Nana?
Nana is not just another AI wrapper. She is your digital Babcia (Grandma). While you do the hard work of reading and thinking, Nana handles the tedious bookkeeping of your personal knowledge base.
She works on top of your Obsidian vault — respecting your existing structure, never modifying source material, and always compounding your knowledge over time.
The Philosophy: LLM Wiki, Not RAG
Most AI tools treat your documents as a temporary search index. Nana treats your notes like a persistent, compounding codebase.
- Compounding — The more you add, the smarter the wiki becomes.
- Sovereign — Works locally or with any cloud provider via OpenRouter. Your data stays in your Markdown files.
- Human-Centric — Nana doesn't write your notes for you; she prepares the "ingredients" so you can cook the "meal."
Features
| Command | Description |
|---|---|
clean [path] |
🧹 Renames messy files (e.g. Untitled_123.md) intelligently based on their content |
extract |
📚 Converts raw web clips from /raw into structured, interlinked pages in /wiki |
finish [path] |
✍️ Finds notes tagged #incomplete and suggests conclusions or missing sections |
tag <path> <tag> |
🏷️ Adds a tag to all markdown files in a folder that don't already have it |
recipe |
🍲 Asks Nana for a secret recipe — she's been known to share pierogi |
Installation
Requirements: Python 3.12+, an Obsidian vault, an OpenRouter API key.
Recommended — pipx (no Python prefix ever needed)
pipx install nana-wiki
nana
One-line installer
curl -sSL https://raw.githubusercontent.com/mlemiec/nana/main/install.sh | bash
From source (dev)
git clone https://github.com/mlemiec/nana.git
cd nana
pip install -e .
nana
What is pipx? It installs Python CLI tools into isolated environments and exposes them globally — like
npm install -gbut for Python. Install it withbrew install pipxorpip install pipx.
Configuration
Create a .env file in the project root (or run python src/cli.py to be guided through setup):
NANA_VAULT_PATH=/path/to/your/obsidian/vault
NANA_API_KEY=sk-or-v1-your-openrouter-key
NANA_MODEL_NAME=google/gemma-3-27b-it:free
Nana uses OpenRouter by default, giving you access to hundreds of models — including free tiers.
Vault Structure
Nana expects two folders in your Obsidian vault:
YourVault/
├── raw/ ← Drop your web clips and PDFs here (Nana never modifies these)
└── wiki/ ← Nana builds your interlinked knowledge base here
├── index.md
└── log.md
Obsidian Web Clipper tip: Set the default save folder to raw/ in the clipper settings. Then run nana clean to rename and nana extract to process.
Usage
Interactive Shell
python src/cli.py
>> clean
>> extract
>> finish /path/to/specific/note.md
>> tag "/path/to/folder" #incomplete
>> recipe
>> exit
Direct Commands
python src/cli.py clean --path /path/to/folder
python src/cli.py extract
python src/cli.py finish --path /path/to/note.md
python src/cli.py tag /path/to/folder "#incomplete"
python src/cli.py recipe
Tip: Use ↑/↓ arrow keys in the interactive shell to cycle through command history.
AGENT.md / AGENTS.md — Behavior Instructions
Nana reads a AGENT.md file from the project root and injects it as a system prompt into every model request. This means you can control Nana's personality, formatting rules, and vault conventions without touching any code.
Edit AGENT.md to customise how she processes your notes, what format she uses for wiki pages, and how she handles Obsidian wiki-links vs. citations.
Multilingual
Nana speaks your language. Set the locale in src/cli.py:
lang = LocaleManager("pl") # or "en"
| Language | Code | Status |
|---|---|---|
| English | en |
✅ Complete |
| Polish | pl |
✅ Complete |
| Other | — | Contributions welcome! |
Testing
.venv/bin/python -m pytest tests/ -v
17 passed in 0.36s
All AI model calls are mocked — tests run instantly with no API calls.
Project Structure
nana/
├── src/
│ ├── actions/
│ │ ├── housekeeping.py # clean command
│ │ ├── extractor.py # extract command
│ │ ├── writer.py # finish command
│ │ ├── tagger.py # tag command
│ │ └── recipe.py # recipe command
│ ├── locales/
│ │ ├── en.yaml
│ │ └── pl.yaml
│ ├── cli.py # Entry point & interactive shell
│ ├── request_handler.py # OpenRouter API + AGENT.md injection
│ ├── locale_manager.py
│ ├── setup_wizard.py
│ └── utils.py
├── tests/
│ ├── test_housekeeping.py
│ ├── test_tagger.py
│ └── test_writer.py
├── AGENT.md # Nana's instruction manual
├── pyproject.toml
└── .env # Your secrets (gitignored)
Roadmap
-
nana index— auto-generate and updatewiki/index.md -
nana lint— audit the wiki for orphan pages and contradictions -
nana chat— multi-turn conversation grounded in your wiki - Local model support via Ollama (Bielik, Llama 3)
-
es,de,uklocale additions
Contributing
Want to teach Nana a new language or a new skill? PRs are welcome!
- Fork the repo
- Add your locale file to
src/locales/<code>.yaml - Run the test suite
- Open a pull request with a clear description
Made with 💜 and a lot of tea.
v0.0.7 — She's just getting started.
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 nana_wiki-0.0.7.tar.gz.
File metadata
- Download URL: nana_wiki-0.0.7.tar.gz
- Upload date:
- Size: 27.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd82866b449054f62a94e1ceb9ccc722ff6c7120adfbc2239bf488af6e503ef0
|
|
| MD5 |
a34e11e774d31af6debf37a63c7f485a
|
|
| BLAKE2b-256 |
c040d582867ff80501596142e515b537e12c31739ad9c95e1dae994d6d657667
|
Provenance
The following attestation bundles were made for nana_wiki-0.0.7.tar.gz:
Publisher:
publish.yml on mlemiec/nana
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nana_wiki-0.0.7.tar.gz -
Subject digest:
dd82866b449054f62a94e1ceb9ccc722ff6c7120adfbc2239bf488af6e503ef0 - Sigstore transparency entry: 1390607846
- Sigstore integration time:
-
Permalink:
mlemiec/nana@9797e0121047b4daaffcfdda92d7b89c33d0d8ab -
Branch / Tag:
refs/tags/v0.0.7 - Owner: https://github.com/mlemiec
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9797e0121047b4daaffcfdda92d7b89c33d0d8ab -
Trigger Event:
release
-
Statement type:
File details
Details for the file nana_wiki-0.0.7-py3-none-any.whl.
File metadata
- Download URL: nana_wiki-0.0.7-py3-none-any.whl
- Upload date:
- Size: 26.8 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 |
bdeb9fdecc1cada6165e24b46d28bd2289e69bbe5509bdb3e612430551205262
|
|
| MD5 |
4f6f7150a6940e0ceacc62e9cbf03b59
|
|
| BLAKE2b-256 |
d1194c7f746fe6b75a091e8c116fb67f284f7e85ee389118c3d69bd297cecac0
|
Provenance
The following attestation bundles were made for nana_wiki-0.0.7-py3-none-any.whl:
Publisher:
publish.yml on mlemiec/nana
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nana_wiki-0.0.7-py3-none-any.whl -
Subject digest:
bdeb9fdecc1cada6165e24b46d28bd2289e69bbe5509bdb3e612430551205262 - Sigstore transparency entry: 1390607853
- Sigstore integration time:
-
Permalink:
mlemiec/nana@9797e0121047b4daaffcfdda92d7b89c33d0d8ab -
Branch / Tag:
refs/tags/v0.0.7 - Owner: https://github.com/mlemiec
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9797e0121047b4daaffcfdda92d7b89c33d0d8ab -
Trigger Event:
release
-
Statement type: