Perenna 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,221 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py.cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ # Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # uv.lock
102
+
103
+ # poetry
104
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
105
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
106
+ # commonly ignored for libraries.
107
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
108
+ # poetry.lock
109
+ # poetry.toml
110
+
111
+ # pdm
112
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
113
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
114
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
115
+ # pdm.lock
116
+ # pdm.toml
117
+ .pdm-python
118
+ .pdm-build/
119
+
120
+ # pixi
121
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
122
+ # pixi.lock
123
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
124
+ # in the .venv directory. It is recommended not to include this directory in version control.
125
+ .pixi
126
+
127
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
128
+ __pypackages__/
129
+
130
+ # Celery stuff
131
+ celerybeat-schedule
132
+ celerybeat.pid
133
+
134
+ # Redis
135
+ *.rdb
136
+ *.aof
137
+ *.pid
138
+
139
+ # RabbitMQ
140
+ mnesia/
141
+ rabbitmq/
142
+ rabbitmq-data/
143
+
144
+ # ActiveMQ
145
+ activemq-data/
146
+
147
+ # SageMath parsed files
148
+ *.sage.py
149
+
150
+ # Environments
151
+ .env
152
+ .envrc
153
+ .venv
154
+ env/
155
+ venv/
156
+ ENV/
157
+ env.bak/
158
+ venv.bak/
159
+
160
+ # Spyder project settings
161
+ .spyderproject
162
+ .spyproject
163
+
164
+ # Rope project settings
165
+ .ropeproject
166
+
167
+ # mkdocs documentation
168
+ /site
169
+
170
+ # mypy
171
+ .mypy_cache/
172
+ .dmypy.json
173
+ dmypy.json
174
+
175
+ # Pyre type checker
176
+ .pyre/
177
+
178
+ # pytype static type analyzer
179
+ .pytype/
180
+
181
+ # Cython debug symbols
182
+ cython_debug/
183
+
184
+ # PyCharm
185
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
186
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
187
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
188
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
189
+ # .idea/
190
+
191
+ # Abstra
192
+ # Abstra is an AI-powered process automation framework.
193
+ # Ignore directories containing user credentials, local state, and settings.
194
+ # Learn more at https://abstra.io/docs
195
+ .abstra/
196
+
197
+ # Visual Studio Code
198
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
199
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
200
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
201
+ # you could uncomment the following to ignore the entire vscode folder
202
+ # .vscode/
203
+ # Temporary file for partial code execution
204
+ tempCodeRunnerFile.py
205
+
206
+ # Ruff stuff:
207
+ .ruff_cache/
208
+
209
+ # PyPI configuration file
210
+ .pypirc
211
+
212
+ # Marimo
213
+ marimo/_static/
214
+ marimo/_lsp/
215
+ __marimo__/
216
+
217
+ # Streamlit
218
+ .streamlit/secrets.toml
219
+
220
+ # agent
221
+ .zcode/
perenna-0.1.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 scarletkc
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
perenna-0.1.1/PKG-INFO ADDED
@@ -0,0 +1,247 @@
1
+ Metadata-Version: 2.5
2
+ Name: Perenna
3
+ Version: 0.1.1
4
+ Summary: A lightweight, Git-backed permanent memory for AI agents.
5
+ Project-URL: Homepage, https://github.com/scarletkc/Perenna
6
+ Project-URL: Repository, https://github.com/scarletkc/Perenna
7
+ Project-URL: Issues, https://github.com/scarletkc/Perenna/issues
8
+ Author: scarletkc
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: agents,ai,git,llm,local-first,mcp,memory,semantic-search
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Intended Audience :: End Users/Desktop
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Topic :: Database
23
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
24
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
25
+ Classifier: Topic :: Software Development :: Version Control :: Git
26
+ Classifier: Topic :: Text Processing :: Indexing
27
+ Classifier: Topic :: Utilities
28
+ Requires-Python: >=3.12
29
+ Requires-Dist: anyio<5.0,>=4.9
30
+ Requires-Dist: mcp<3.0,>=2.0
31
+ Requires-Dist: portalocker[win32]<5.0,>=4.2
32
+ Requires-Dist: pydantic<3.0,>=2.12
33
+ Requires-Dist: pyjwt[crypto]<3.0,>=2.10
34
+ Requires-Dist: pyyaml<7.0,>=6.0
35
+ Requires-Dist: starlette<2.0,>=0.48
36
+ Requires-Dist: uvicorn<1.0,>=0.31
37
+ Requires-Dist: vexor<0.29,>=0.28
38
+ Provides-Extra: dev
39
+ Requires-Dist: build>=1.2; extra == 'dev'
40
+ Requires-Dist: coverage[toml]>=7.6; extra == 'dev'
41
+ Requires-Dist: pytest-asyncio>=0.25; extra == 'dev'
42
+ Requires-Dist: pytest-xdist>=3.6; extra == 'dev'
43
+ Requires-Dist: pytest>=8.3; extra == 'dev'
44
+ Requires-Dist: ruff>=0.12; extra == 'dev'
45
+ Requires-Dist: twine>=6.1; extra == 'dev'
46
+ Provides-Extra: local
47
+ Requires-Dist: vexor[local]<0.29,>=0.28; extra == 'local'
48
+ Description-Content-Type: text/markdown
49
+
50
+ <div align="center">
51
+
52
+ # Perenna
53
+
54
+ [![Python](https://img.shields.io/badge/python-3.12%2B-blue)](https://www.python.org/downloads/)
55
+ [![PyPI](https://img.shields.io/pypi/v/perenna.svg)](https://pypi.org/project/perenna/)
56
+ [![CI](https://img.shields.io/github/actions/workflow/status/scarletkc/Perenna/validate.yml?branch=main)](https://github.com/scarletkc/Perenna/actions/workflows/validate.yml)
57
+ [![Codecov](https://img.shields.io/codecov/c/github/scarletkc/Perenna/main)](https://codecov.io/github/scarletkc/Perenna)
58
+ [![CodeRabbit Pull Request Reviews](https://img.shields.io/coderabbit/prs/github/scarletkc/Perenna?utm_source=oss&utm_medium=github&utm_campaign=scarletkc%2FPerenna&labelColor=171717&color=FF570A&link=https%3A%2F%2Fcoderabbit.ai&label=CodeRabbit+Reviews)](https://coderabbit.ai)
59
+ [![License](https://img.shields.io/github/license/scarletkc/Perenna.svg)](https://github.com/scarletkc/Perenna/blob/main/LICENSE)
60
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/scarletkc/Perenna)
61
+ [![perenna MCP server](https://glama.ai/mcp/servers/scarletkc/perenna/badges/score.svg)](https://glama.ai/mcp/servers/scarletkc/perenna)
62
+
63
+ </div>
64
+
65
+ <!-- mcp-name: io.github.scarletkc/perenna -->
66
+
67
+ ---
68
+
69
+ A lightweight, Git-backed permanent memory for AI agents. Claude Code, Codex,
70
+ ChatGPT, Cursor, and other MCP clients can share durable memories without
71
+ sharing a vendor account or conversation history.
72
+
73
+ - Separate MCP tools for reading, writing, and deleting memories
74
+ - Local stdio and single-user OAuth-protected Streamable HTTP transports
75
+ - Human-readable Markdown stored in an independent Git repository
76
+ - Local Vexor retrieval index that can always be rebuilt from Git
77
+ - Cross-process locking for multiple local agent processes
78
+
79
+ ## Why Perenna?
80
+
81
+ Your memory should follow **you**, not the agent you happen to be using.
82
+
83
+ Claude Code, Codex, Cursor, and ChatGPT keep memory in separate silos. Switch
84
+ agents and your memory disappears. Switch machines and local memory stays
85
+ behind.
86
+
87
+ Perenna gives them one **shared, Git-backed memory**. Local agents and ChatGPT
88
+ can connect to the same self-hosted Perenna service, while every durable memory
89
+ stays ordinary Markdown you can inspect, edit, version, and back up yourself.
90
+
91
+ [Mem0's self-hosted stack](https://docs.mem0.ai/open-source/setup) is much
92
+ heavier, while its hosted [Free Plan](https://mem0.ai/terms) currently allows
93
+ customer content to be used for model training and product improvement.
94
+
95
+ Perenna is different by design: **no account, no proprietary memory cloud, no
96
+ lock-in.** Just your memories, in your Git repository, on infrastructure you
97
+ control.
98
+
99
+ ## Quickstart
100
+
101
+ ### Install with your AI agent
102
+
103
+ Paste this into Claude Code, Codex, ChatGPT Desktop, Cursor, or another coding
104
+ agent with terminal and local MCP configuration access:
105
+
106
+ ```text
107
+ Install Perenna and connect it to this AI agent as a local stdio MCP server.
108
+ Work through the complete setup autonomously.
109
+
110
+ Use these as the source of truth:
111
+ - https://github.com/scarletkc/Perenna/blob/main/docs/getting-started.md
112
+ - https://github.com/scarletkc/Perenna/blob/main/docs/guides/client-setup.md
113
+
114
+ 1. Detect the operating system, shell, and current MCP client.
115
+ 2. Check for Python 3.12 or newer, Git, and uv. Install uv in user scope if it
116
+ is missing. If Python or Git needs administrator approval, give me the exact
117
+ command and stop there.
118
+ 3. Install Perenna with `uv tool install perenna`. If Perenna is already
119
+ installed, upgrade it with `uv tool upgrade perenna`.
120
+ For Codex, also run `perenna skill install --agent codex`. For Claude Code,
121
+ run `perenna skill install --agent claude-code`. Do not replace an existing
122
+ modified copy or remove unrelated installed skills.
123
+ 4. Check the effective Vexor embedding provider configuration. Reuse a working
124
+ `~/.vexor/config.json` or inherited environment configuration. If none is
125
+ available, ask me to choose between a remote provider and local embeddings.
126
+ Explain that a remote provider receives memory text and search queries. For
127
+ a remote provider, keep the provider and model in Vexor configuration and
128
+ supply its secret through `VEXOR_API_KEY` or the provider-specific environment
129
+ variable. For local embeddings, install `perenna[local]` and configure the
130
+ local model according to the Perenna configuration reference. Verify the
131
+ selected provider with `uvx vexor doctor` using the same environment that
132
+ the Perenna process will inherit.
133
+ 5. Ask whether I want to synchronize Perenna with a private Git repository. If
134
+ I do, ask me to provide or approve its URL, run
135
+ `perenna sync setup <repository-url>`, and verify it with
136
+ `perenna sync status`. Treat repository creation, remote replacement, and
137
+ reconciling diverged history as separate choices that require my explicit
138
+ approval.
139
+ 6. Register `perenna mcp --source <stable-client-name>` using the client-specific
140
+ method in the setup guide. Preserve unrelated MCP servers and settings. Use
141
+ a stable source such as `claude-code`, `codex`, or `cursor` for this client.
142
+ For another client, use its official instructions for adding a local stdio
143
+ MCP server. Make sure the Perenna process inherits `VEXOR_CONFIG_JSON`,
144
+ `VEXOR_API_KEY`, or any provider-specific key used in step 4. Report only
145
+ whether a secret is present.
146
+ 7. Verify `perenna --help` and the saved MCP configuration. Reload MCP servers
147
+ and call `memory_read` with `action: "list"` when the client supports it. If
148
+ a restart is required, tell me the single restart step.
149
+ 8. Report the commands run, files changed, and verification results. Keep API
150
+ keys out of tracked configuration files.
151
+ ```
152
+
153
+ ### Install a published release
154
+
155
+ Perenna requires Python 3.12+, Git, and
156
+ [uv](https://docs.astral.sh/uv/).
157
+
158
+ ```bash
159
+ uv tool install perenna
160
+ ```
161
+
162
+ Install the optional memory behavior skill for the local client:
163
+
164
+ ```bash
165
+ perenna skill install --agent codex
166
+ # or
167
+ perenna skill install --agent claude-code
168
+ ```
169
+
170
+ Repeat `--agent` in one command when both clients should receive the skill.
171
+ The [configuration reference](https://github.com/scarletkc/Perenna/blob/main/docs/reference/configuration.md#bundled-agent-skill)
172
+ documents user and project scope, destinations, and replacement safeguards.
173
+
174
+ Codex and Claude Code can instead install the combined Skill and MCP connection
175
+ from Perenna's repository Marketplace. Follow the
176
+ [Plugin setup guide](https://github.com/scarletkc/Perenna/blob/main/docs/guides/plugin-setup.md)
177
+ and choose one setup path per client.
178
+
179
+ Perenna needs a working Vexor embedding provider. For interactive provider
180
+ selection and configuration, run:
181
+
182
+ ```bash
183
+ uvx vexor init
184
+ ```
185
+
186
+ Perenna automatically reuses `~/.vexor/config.json`. When using process-level
187
+ configuration, make sure the MCP server receives `VEXOR_CONFIG_JSON` plus
188
+ `VEXOR_API_KEY` or the selected provider's key from its host environment.
189
+ Remote providers receive memory text and search queries.
190
+
191
+ If you choose local embeddings, also install Perenna's local extra:
192
+
193
+ ```bash
194
+ uv tool install "perenna[local]"
195
+ ```
196
+
197
+ [Vexor provider configuration](https://github.com/scarletkc/Perenna/blob/main/docs/reference/configuration.md#vexor-provider-configuration)
198
+ covers remote and local setup. From the environment that starts the MCP client,
199
+ verify the selected provider with:
200
+
201
+ ```bash
202
+ uvx vexor doctor
203
+ ```
204
+
205
+ Configure an MCP client to start:
206
+
207
+ ```text
208
+ perenna mcp --source <client-name>
209
+ ```
210
+
211
+ Perenna creates its local data under `~/.perenna/` unless another home is
212
+ configured.
213
+
214
+ To import, publish, or fast-forward compatible history through a private Git
215
+ repository, run:
216
+
217
+ ```bash
218
+ perenna sync setup <repository-url>
219
+ ```
220
+
221
+ ### Install from source for development
222
+
223
+ ```bash
224
+ git clone https://github.com/scarletkc/Perenna.git
225
+ cd Perenna
226
+ uv tool install .
227
+ ```
228
+
229
+ ## Documentation
230
+
231
+ Start with the
232
+ [documentation index](https://github.com/scarletkc/Perenna/blob/main/docs/index.md),
233
+ then follow the path for your task:
234
+
235
+ - [Getting started](https://github.com/scarletkc/Perenna/blob/main/docs/getting-started.md)
236
+ - [Client setup](https://github.com/scarletkc/Perenna/blob/main/docs/guides/client-setup.md)
237
+ - [Plugin setup](https://github.com/scarletkc/Perenna/blob/main/docs/guides/plugin-setup.md)
238
+ - [Self-hosting for ChatGPT](https://github.com/scarletkc/Perenna/blob/main/docs/guides/self-hosting.md)
239
+ - [Using permanent memory](https://github.com/scarletkc/Perenna/blob/main/docs/guides/using-memory.md)
240
+ - [`perenna-memory` Agent Skill](https://github.com/scarletkc/Perenna/blob/main/skills/perenna-memory)
241
+ - [Configuration reference](https://github.com/scarletkc/Perenna/blob/main/docs/reference/configuration.md)
242
+ - [Architecture](https://github.com/scarletkc/Perenna/blob/main/docs/concepts/architecture.md)
243
+ - [Development guide](https://github.com/scarletkc/Perenna/blob/main/docs/development/contributing.md)
244
+
245
+ ## License
246
+
247
+ [MIT](https://github.com/scarletkc/Perenna/blob/main/LICENSE)
@@ -0,0 +1,198 @@
1
+ <div align="center">
2
+
3
+ # Perenna
4
+
5
+ [![Python](https://img.shields.io/badge/python-3.12%2B-blue)](https://www.python.org/downloads/)
6
+ [![PyPI](https://img.shields.io/pypi/v/perenna.svg)](https://pypi.org/project/perenna/)
7
+ [![CI](https://img.shields.io/github/actions/workflow/status/scarletkc/Perenna/validate.yml?branch=main)](https://github.com/scarletkc/Perenna/actions/workflows/validate.yml)
8
+ [![Codecov](https://img.shields.io/codecov/c/github/scarletkc/Perenna/main)](https://codecov.io/github/scarletkc/Perenna)
9
+ [![CodeRabbit Pull Request Reviews](https://img.shields.io/coderabbit/prs/github/scarletkc/Perenna?utm_source=oss&utm_medium=github&utm_campaign=scarletkc%2FPerenna&labelColor=171717&color=FF570A&link=https%3A%2F%2Fcoderabbit.ai&label=CodeRabbit+Reviews)](https://coderabbit.ai)
10
+ [![License](https://img.shields.io/github/license/scarletkc/Perenna.svg)](https://github.com/scarletkc/Perenna/blob/main/LICENSE)
11
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/scarletkc/Perenna)
12
+ [![perenna MCP server](https://glama.ai/mcp/servers/scarletkc/perenna/badges/score.svg)](https://glama.ai/mcp/servers/scarletkc/perenna)
13
+
14
+ </div>
15
+
16
+ <!-- mcp-name: io.github.scarletkc/perenna -->
17
+
18
+ ---
19
+
20
+ A lightweight, Git-backed permanent memory for AI agents. Claude Code, Codex,
21
+ ChatGPT, Cursor, and other MCP clients can share durable memories without
22
+ sharing a vendor account or conversation history.
23
+
24
+ - Separate MCP tools for reading, writing, and deleting memories
25
+ - Local stdio and single-user OAuth-protected Streamable HTTP transports
26
+ - Human-readable Markdown stored in an independent Git repository
27
+ - Local Vexor retrieval index that can always be rebuilt from Git
28
+ - Cross-process locking for multiple local agent processes
29
+
30
+ ## Why Perenna?
31
+
32
+ Your memory should follow **you**, not the agent you happen to be using.
33
+
34
+ Claude Code, Codex, Cursor, and ChatGPT keep memory in separate silos. Switch
35
+ agents and your memory disappears. Switch machines and local memory stays
36
+ behind.
37
+
38
+ Perenna gives them one **shared, Git-backed memory**. Local agents and ChatGPT
39
+ can connect to the same self-hosted Perenna service, while every durable memory
40
+ stays ordinary Markdown you can inspect, edit, version, and back up yourself.
41
+
42
+ [Mem0's self-hosted stack](https://docs.mem0.ai/open-source/setup) is much
43
+ heavier, while its hosted [Free Plan](https://mem0.ai/terms) currently allows
44
+ customer content to be used for model training and product improvement.
45
+
46
+ Perenna is different by design: **no account, no proprietary memory cloud, no
47
+ lock-in.** Just your memories, in your Git repository, on infrastructure you
48
+ control.
49
+
50
+ ## Quickstart
51
+
52
+ ### Install with your AI agent
53
+
54
+ Paste this into Claude Code, Codex, ChatGPT Desktop, Cursor, or another coding
55
+ agent with terminal and local MCP configuration access:
56
+
57
+ ```text
58
+ Install Perenna and connect it to this AI agent as a local stdio MCP server.
59
+ Work through the complete setup autonomously.
60
+
61
+ Use these as the source of truth:
62
+ - https://github.com/scarletkc/Perenna/blob/main/docs/getting-started.md
63
+ - https://github.com/scarletkc/Perenna/blob/main/docs/guides/client-setup.md
64
+
65
+ 1. Detect the operating system, shell, and current MCP client.
66
+ 2. Check for Python 3.12 or newer, Git, and uv. Install uv in user scope if it
67
+ is missing. If Python or Git needs administrator approval, give me the exact
68
+ command and stop there.
69
+ 3. Install Perenna with `uv tool install perenna`. If Perenna is already
70
+ installed, upgrade it with `uv tool upgrade perenna`.
71
+ For Codex, also run `perenna skill install --agent codex`. For Claude Code,
72
+ run `perenna skill install --agent claude-code`. Do not replace an existing
73
+ modified copy or remove unrelated installed skills.
74
+ 4. Check the effective Vexor embedding provider configuration. Reuse a working
75
+ `~/.vexor/config.json` or inherited environment configuration. If none is
76
+ available, ask me to choose between a remote provider and local embeddings.
77
+ Explain that a remote provider receives memory text and search queries. For
78
+ a remote provider, keep the provider and model in Vexor configuration and
79
+ supply its secret through `VEXOR_API_KEY` or the provider-specific environment
80
+ variable. For local embeddings, install `perenna[local]` and configure the
81
+ local model according to the Perenna configuration reference. Verify the
82
+ selected provider with `uvx vexor doctor` using the same environment that
83
+ the Perenna process will inherit.
84
+ 5. Ask whether I want to synchronize Perenna with a private Git repository. If
85
+ I do, ask me to provide or approve its URL, run
86
+ `perenna sync setup <repository-url>`, and verify it with
87
+ `perenna sync status`. Treat repository creation, remote replacement, and
88
+ reconciling diverged history as separate choices that require my explicit
89
+ approval.
90
+ 6. Register `perenna mcp --source <stable-client-name>` using the client-specific
91
+ method in the setup guide. Preserve unrelated MCP servers and settings. Use
92
+ a stable source such as `claude-code`, `codex`, or `cursor` for this client.
93
+ For another client, use its official instructions for adding a local stdio
94
+ MCP server. Make sure the Perenna process inherits `VEXOR_CONFIG_JSON`,
95
+ `VEXOR_API_KEY`, or any provider-specific key used in step 4. Report only
96
+ whether a secret is present.
97
+ 7. Verify `perenna --help` and the saved MCP configuration. Reload MCP servers
98
+ and call `memory_read` with `action: "list"` when the client supports it. If
99
+ a restart is required, tell me the single restart step.
100
+ 8. Report the commands run, files changed, and verification results. Keep API
101
+ keys out of tracked configuration files.
102
+ ```
103
+
104
+ ### Install a published release
105
+
106
+ Perenna requires Python 3.12+, Git, and
107
+ [uv](https://docs.astral.sh/uv/).
108
+
109
+ ```bash
110
+ uv tool install perenna
111
+ ```
112
+
113
+ Install the optional memory behavior skill for the local client:
114
+
115
+ ```bash
116
+ perenna skill install --agent codex
117
+ # or
118
+ perenna skill install --agent claude-code
119
+ ```
120
+
121
+ Repeat `--agent` in one command when both clients should receive the skill.
122
+ The [configuration reference](https://github.com/scarletkc/Perenna/blob/main/docs/reference/configuration.md#bundled-agent-skill)
123
+ documents user and project scope, destinations, and replacement safeguards.
124
+
125
+ Codex and Claude Code can instead install the combined Skill and MCP connection
126
+ from Perenna's repository Marketplace. Follow the
127
+ [Plugin setup guide](https://github.com/scarletkc/Perenna/blob/main/docs/guides/plugin-setup.md)
128
+ and choose one setup path per client.
129
+
130
+ Perenna needs a working Vexor embedding provider. For interactive provider
131
+ selection and configuration, run:
132
+
133
+ ```bash
134
+ uvx vexor init
135
+ ```
136
+
137
+ Perenna automatically reuses `~/.vexor/config.json`. When using process-level
138
+ configuration, make sure the MCP server receives `VEXOR_CONFIG_JSON` plus
139
+ `VEXOR_API_KEY` or the selected provider's key from its host environment.
140
+ Remote providers receive memory text and search queries.
141
+
142
+ If you choose local embeddings, also install Perenna's local extra:
143
+
144
+ ```bash
145
+ uv tool install "perenna[local]"
146
+ ```
147
+
148
+ [Vexor provider configuration](https://github.com/scarletkc/Perenna/blob/main/docs/reference/configuration.md#vexor-provider-configuration)
149
+ covers remote and local setup. From the environment that starts the MCP client,
150
+ verify the selected provider with:
151
+
152
+ ```bash
153
+ uvx vexor doctor
154
+ ```
155
+
156
+ Configure an MCP client to start:
157
+
158
+ ```text
159
+ perenna mcp --source <client-name>
160
+ ```
161
+
162
+ Perenna creates its local data under `~/.perenna/` unless another home is
163
+ configured.
164
+
165
+ To import, publish, or fast-forward compatible history through a private Git
166
+ repository, run:
167
+
168
+ ```bash
169
+ perenna sync setup <repository-url>
170
+ ```
171
+
172
+ ### Install from source for development
173
+
174
+ ```bash
175
+ git clone https://github.com/scarletkc/Perenna.git
176
+ cd Perenna
177
+ uv tool install .
178
+ ```
179
+
180
+ ## Documentation
181
+
182
+ Start with the
183
+ [documentation index](https://github.com/scarletkc/Perenna/blob/main/docs/index.md),
184
+ then follow the path for your task:
185
+
186
+ - [Getting started](https://github.com/scarletkc/Perenna/blob/main/docs/getting-started.md)
187
+ - [Client setup](https://github.com/scarletkc/Perenna/blob/main/docs/guides/client-setup.md)
188
+ - [Plugin setup](https://github.com/scarletkc/Perenna/blob/main/docs/guides/plugin-setup.md)
189
+ - [Self-hosting for ChatGPT](https://github.com/scarletkc/Perenna/blob/main/docs/guides/self-hosting.md)
190
+ - [Using permanent memory](https://github.com/scarletkc/Perenna/blob/main/docs/guides/using-memory.md)
191
+ - [`perenna-memory` Agent Skill](https://github.com/scarletkc/Perenna/blob/main/skills/perenna-memory)
192
+ - [Configuration reference](https://github.com/scarletkc/Perenna/blob/main/docs/reference/configuration.md)
193
+ - [Architecture](https://github.com/scarletkc/Perenna/blob/main/docs/concepts/architecture.md)
194
+ - [Development guide](https://github.com/scarletkc/Perenna/blob/main/docs/development/contributing.md)
195
+
196
+ ## License
197
+
198
+ [MIT](https://github.com/scarletkc/Perenna/blob/main/LICENSE)