Local-first persona and context portability for cross-LLM collaboration
Project description
Sayane (紗綾音)
日本語版 README · Documentation · Roadmap
Sayane is a local-first toolkit for carrying persona, context, prompts, and audit trails across LLM workflows.
It keeps your canonical context on your own machine, compiles it for different LLM runtimes such as ChatGPT and Claude, and prevents captured changes from being merged blindly.
Your context should not disappear when you change models.
Why Sayane exists
AI work is increasingly spread across multiple tools: ChatGPT, Claude, Gemini, Cursor, local models, browser extensions, and knowledge bases. Each runtime has its own memory, prompt format, and assumptions. As a result, serious users often lose:
- the context behind an answer,
- the persona or working stance used to produce it,
- the history of what changed,
- the ability to review whether a captured insight should become part of the canonical profile.
Sayane separates your context from any single vendor memory or chat service. It treats persona and context as local, reviewable project assets.
What Sayane does
| Need | Sayane mechanism |
|---|---|
| Keep a canonical user profile locally | Sayane Profile in ~/.sayane/ |
| Generate prompts for different LLMs | Profile → Prompt IR → target adapter |
| Avoid blind context merges | capture → candidate → evaluate → approve/reject |
| Track accepted and rejected changes | lineage records |
| Use local Markdown context | context/, storage index, optional Obsidian/Git workflows |
| Connect tools and editors | CLI, Local Bridge, MCP server, Chrome Extension |
Current status
Community Edition in this repository is now v1.0.13 and supports the core local-first workflow.
Community Edition v1.0.13 is now published on PyPI.
| Interface | Status | Primary use |
|---|---|---|
| CLI | Available | init / compile / candidate / storage |
| Local Bridge | Available | sayane serve + local HTTP API |
| MCP Server | Available | Cursor / Claude Desktop integration |
| Chrome Extension | Frozen / deprecated | legacy capture / context insert / candidate actions during migration |
| RDE/Candidate evaluation | Available | evaluate / approve / reject / lineage |
| Storage | Available | local Markdown / filesystem-first workflows, with Obsidian/Git kept as legacy compatibility paths |
Try it in 5 minutes
Install the CLI first. See docs/install.md for detailed installation notes.
# PyPI (macOS / Linux / Windows with Python 3.11+)
pip install "sayane==1.0.13"
# macOS / Linux install script
curl -fsSL https://raw.githubusercontent.com/zyx-corporation/sayane/main/scripts/install.sh | bash
# Windows PowerShell install script
irm https://raw.githubusercontent.com/zyx-corporation/sayane/main/scripts/install.ps1 | iex
Verify the core flow:
sayane --version
sayane init
sayane compile --target chatgpt --profile examples/profiles/minimal.yaml
This verifies:
- local profile store initialization,
- target-specific prompt compilation from one profile,
- the basic flow: Profile → Prompt IR → Adapter output.
Notes:
- The Chrome Extension remains available for existing users, but it is frozen / deprecated and no longer the primary entry point.
- The recommended stable integration surfaces are the CLI, Local Bridge, and MCP Server.
Core workflow
Sayane Profile (local canonical context)
↓
Prompt IR (runtime-independent intermediate representation)
↓
Adapter (ChatGPT / Claude / Gemini / local targets)
↓
Target-specific prompt output
captured context → Candidate → evaluation → approve/reject → lineage
The LLM is not the owner of your persona. It is a runtime that receives a compiled prompt from your local profile.
Core principles
1. Separate persona from runtime
Your canonical persona and context belong to the local Sayane Profile, not to vendor memory.
2. Compile through Prompt IR
Do not copy one giant prompt string across runtimes. Compile one canonical profile into target-specific outputs.
3. Review meaning changes before merge
Captured context should become a candidate first. It should be evaluated, accepted, rejected, and recorded.
capture → candidate → evaluate (RDE/UIB-inspired review) → approve/reject → lineage
4. Prefer local-first portability
Sayane is designed so that serious AI work can remain inspectable, portable, and independent from any single hosted LLM memory.
Documentation
Start here:
- Installation
- Getting started (Japanese)
- CLI manual
- Local Bridge
- MCP Server
- Chrome Extension
- RDE / Candidate evaluation
- Storage / Obsidian / Git
- Docs index
Development
git clone https://github.com/zyx-corporation/sayane.git
cd sayane
uv run --extra dev pytest -q
# or keep a local venv explicitly:
# python -m venv .venv
# source .venv/bin/activate
# pip install -e ".[dev]"
# pytest -q
Development references:
Positioning
Sayane is not a prompt snippet manager.
It is a small infrastructure layer for people who want AI collaboration to be:
- portable across models,
- local-first by default,
- reviewable before merge,
- inspectable after change,
- grounded in explicit persona, context, and lineage.
License
Apache License 2.0
SPDX-License-Identifier: Apache-2.0
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 sayane-1.0.14.post1.tar.gz.
File metadata
- Download URL: sayane-1.0.14.post1.tar.gz
- Upload date:
- Size: 2.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ff903e1218c77ea599bdb934b2ecd2420f7248f67d5b49b5889c589ed774f1b1
|
|
| MD5 |
2f0868cad55e4dc6970bbfd578339042
|
|
| BLAKE2b-256 |
2a5397d1219f446d9bde69859993a44c86404a782d9dcd549a7b5e1e6648a30d
|
Provenance
The following attestation bundles were made for sayane-1.0.14.post1.tar.gz:
Publisher:
publish-pypi.yml on zyx-corporation/sayane
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sayane-1.0.14.post1.tar.gz -
Subject digest:
ff903e1218c77ea599bdb934b2ecd2420f7248f67d5b49b5889c589ed774f1b1 - Sigstore transparency entry: 1947564281
- Sigstore integration time:
-
Permalink:
zyx-corporation/sayane@5e453ba087d8d2adf209438fc93e95689ca2678f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/zyx-corporation
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@5e453ba087d8d2adf209438fc93e95689ca2678f -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file sayane-1.0.14.post1-py3-none-any.whl.
File metadata
- Download URL: sayane-1.0.14.post1-py3-none-any.whl
- Upload date:
- Size: 359.3 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 |
eb20a74543e0c452f7a86ecc756be5950feacb15f5e3569680e797ee063e4aa4
|
|
| MD5 |
c8922d38f016c6571141887492ed4c3e
|
|
| BLAKE2b-256 |
846e3f7e78fce9da2b0caf94f0845f183c73362e026072121db65f0dca7b4152
|
Provenance
The following attestation bundles were made for sayane-1.0.14.post1-py3-none-any.whl:
Publisher:
publish-pypi.yml on zyx-corporation/sayane
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sayane-1.0.14.post1-py3-none-any.whl -
Subject digest:
eb20a74543e0c452f7a86ecc756be5950feacb15f5e3569680e797ee063e4aa4 - Sigstore transparency entry: 1947564388
- Sigstore integration time:
-
Permalink:
zyx-corporation/sayane@5e453ba087d8d2adf209438fc93e95689ca2678f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/zyx-corporation
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@5e453ba087d8d2adf209438fc93e95689ca2678f -
Trigger Event:
workflow_dispatch
-
Statement type: