Local-first AI conversation/persona portability tool with safety-first browser automation.
Project description
PersonaPort
PersonaPort is a local-first Python CLI for moving conversation context and persona data between AI platforms.
Warning
THIS TOOL USES BROWSER AUTOMATION WHICH MAY VIOLATE PLATFORM TOS. USE AT YOUR OWN RISK. RISK OF ACCOUNT BAN. WE STRONGLY RECOMMEND OFFICIAL MANUAL EXPORT WHEN POSSIBLE.
- No passwords are stored in code or logs.
- Sessions are saved as Playwright storage-state files after manual login.
- Data stays local (
~/.personaportby default). --safe-modeand--no-scrapekeep flows on official export paths.
Supported Platforms
- Source:
chatgpt,claude,gemini(experimental) - Target:
chatgpt,claude,gemini(experimental)
gemini is [Experimental] in v0.1 and may require manual steps.
Install
PyPI
python -m pip install --upgrade pip
python -m pip install personaport
personaport install-deps
Development
git clone https://github.com/0x-Professor/PersonaPort.git
cd PersonaPort
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .[dev]
personaport install-deps
First Run
personaport init
personaport login --platform chatgpt
personaport login --platform claude
personaport init creates local config and checks required browser dependencies.
Demo
Short terminal walkthrough:
personaport login --platform chatgptpersonaport export --from chatgpt --to claude --safe-mode --no-scrapepersonaport migrate --input session --target claude --no-auto-inject
Quick Start
# 1) login once per platform
personaport login --platform chatgpt
personaport login --platform claude
# 2) safe export + process + migrate package output
personaport export --from chatgpt --to claude --all --safe-mode --no-scrape
# 2a) configure provider key once (stored in OS keyring)
personaport provider set-key --provider groq
# 2b) process using a selected provider/model for persona + summarization
personaport process --file ~/Downloads/chatgpt_export.zip --from chatgpt \
--target claude --all --llm-provider groq --model groq/llama-3.1-8b-instant
# 2c) safe export and wait 10 minutes for manual ZIP download
personaport export --from chatgpt --to claude --all --safe-mode --no-scrape --wait-for-export 10
# 2d) provide the downloaded export directly (ChatGPT email ZIP)
personaport export --from chatgpt --to claude --all --safe-mode --no-scrape --export-file ~/Downloads/chatgpt_export.zip
# 2e) same flow for Claude export ZIP
personaport export --from claude --to chatgpt --all --safe-mode --no-scrape --export-file ~/Downloads/claude_export.zip
# 3) process manual export file directly
personaport process --file ~/Downloads/chatgpt_export.zip --from chatgpt
# 3b) process the whole export into one merged migration bundle
personaport process --file ~/Downloads/chatgpt_export.zip --from chatgpt --target claude --all
# 4) migrate a cached session or export file to target platform
personaport migrate --input session --target claude --no-auto-inject
# 4b) migrate whole cached history to target platform
personaport migrate --input session --source chatgpt --target claude --all --no-auto-inject
CLI Commands
personaport --versionpersonaport versionpersonaport initpersonaport install-depspersonaport login --platform <chatgpt|claude|gemini>personaport logout --platform <chatgpt|claude|gemini>personaport logout --allpersonaport export --from <platform> --to <platform> --all [--safe-mode] [--no-scrape] [--export-file path] [--wait-for-export N_minutes] [--no-remote-llm]personaport process --file <export.zip|json|html> [--from platform] [--all] [--persona "..."] [--llm-provider ...] [--model ...] [--no-remote-llm]personaport migrate --input <session|conversation_id|file> --target <platform> [--all] [--llm-provider ...] [--model ...] [--no-remote-llm]personaport provider listpersonaport provider set-key --provider <name>personaport provider delete-key --provider <name>
Run personaport --help for full options.
LLM Providers and Models
Supported providers:
ollama(local, no key)groqopenrouteropenaianthropicgeminitogether
Per-run key injection:
personaport process --file export.zip --llm-provider groq --api-key "<key>"
Provider + model example:
personaport process --file export.zip --from chatgpt --target claude \
--llm-provider groq --model groq/llama-3.1-8b-instant --api-key "<groq-key>"
Persist key in OS keyring:
personaport provider set-key --provider groq
personaport process --file export.zip --llm-provider groq --model groq/llama-3.1-8b-instant
Fallback order when model/provider fails:
- user-selected model
- provider default model
- configured default model (
config.yaml) - built-in chain (
ollama/llama3.1:8b,groq/llama-3.1-8b-instant,openrouter/...:free)
Remote Fallback Safety
- Default behavior prefers local (
ollama) first. - If local fails and remote fallback is possible, PersonaPort prompts before sending data to hosted providers.
--no-remote-llmhard-blocks remote fallback.
Persona Override (--persona)
--persona lets you manually set the system prompt used in output artifacts.
personaport process --file export.zip --from chatgpt \
--persona "Act as my long-term coding copilot. Be concise, practical, and task-focused."
Use a single natural-language instruction string. It is injected as the persona system prompt.
Safe Mode
--safe-mode: official export actions only.--no-scrape: disable scraping even in unsafe mode.--unsafe-mode: allows fallback scraping and risky automation (with confirmation).
Supported Export Shapes
- ChatGPT ZIP with sharded
conversations-000.json...conversations-XYZ.json(all shards aggregated). - ChatGPT
chat.htmlfallback export. - Claude ZIP with
conversations.json, including attachment-only messages (extracted_contentsupported).
ChatGPT chat.html Fallback Usage
personaport process --file ~/Downloads/chat.html --from chatgpt
chat.html can come from ChatGPT's export package; if ZIP parsing cannot recover JSON conversations, PersonaPort attempts the HTML fallback parser.
Local Data Layout
~/.personaport/
config.yaml
personaport.db
sessions/
chatgpt_state.json
claude_state.json
gemini_state.json
exports/
processed/
Session files contain auth tokens. PersonaPort attempts to set restrictive permissions on saved session files. Use personaport logout to remove them.
Migration Outputs
Each run writes:
<prefix>.mdprompt markdown for target platform<prefix>_knowledge.txtcompact context payload<prefix>_full_json.jsonnormalized full artifact
Example success output (CLI table):
Generated Output Files
- prompt_markdown: ~/.personaport/processed/migrate_to_claude.md
- knowledge_text: ~/.personaport/processed/migrate_to_claude_knowledge.txt
- full_json: ~/.personaport/processed/migrate_to_claude_full_json.json
Large Histories and Chunking
If knowledge text exceeds upload size thresholds, PersonaPort auto-splits into multiple files.
- Chunk limit:
4,000,000bytes per knowledge file. - Output names:
..._knowledge_part001.txt,..._knowledge_part002.txt, etc. - Auto-injection attempts upload of all generated chunk files.
Versioning and Changelog
- Run
personaport --versionto check installed version. - Release notes are tracked in CHANGELOG.md.
Tests and Local Checks
pytest
make check
make check runs:
ruff check .pytest
The current test suite is primarily unit-level (parsers, processor logic, DB/config helpers, transfer chunking).
Development Dependencies
pyproject.toml is the source of truth for dependencies.
requirements.txt is a compatibility snapshot for environments that prefer pip install -r; keep it aligned with pyproject.toml when updating deps.
Platform Support
- Linux: supported
- macOS: supported
- Windows: supported (PowerShell + visible Playwright sessions are tested paths)
Branching Model
master(ormain): stable production branch.develop: integration branch for ongoing development.- feature branches: branch from
develop, open PR intodevelop. - release PRs: merge
developintomasterafter validation. - version tags/releases are cut from
master.
Development Status
v0.1 focuses on safe-mode flows first, with risky automation behind explicit confirmation gates.
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 personaport-0.1.1.tar.gz.
File metadata
- Download URL: personaport-0.1.1.tar.gz
- Upload date:
- Size: 39.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f084f17ae568a9ffffb87408e85ae480202b813cb029cb9b013922a87af418ca
|
|
| MD5 |
bcef7e4ce95489a864ccfaddddd73fc8
|
|
| BLAKE2b-256 |
8416bd18234070816417a669a78ee2e91ff8d820a2142a65f995ee39d7149b1a
|
File details
Details for the file personaport-0.1.1-py3-none-any.whl.
File metadata
- Download URL: personaport-0.1.1-py3-none-any.whl
- Upload date:
- Size: 46.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0acdc0d677fcfde1e5f05bbe499d0812519ff9fce861074acce290c89275e42e
|
|
| MD5 |
5bf5fba78470f72655a0998e7e1fb97c
|
|
| BLAKE2b-256 |
ff307b0930bdab05a78d0ba0d67c7175a7b6cde8c0574cb1e1140bbdae5b6247
|