Model or dataset
therealXiaomanChu/ex-skill avatar
therealXiaomanChu/ex-skill

ex-skill builds a Claude Code persona from chat logs, in two files and a rollback table

Distill your ex into an AI Skill that talks to you the way they did.

6,620 stars570 forksPythonMIT

At a glance

What is it?
ex-skill is a Claude Code skill that distils a former partner into a reusable AI persona built from exported chat records, screenshots and photos. What it actually produces is two markdown documents with a five-layer personality model on top, and what it cannot do is reconstruct someone from a bare description without turning that description into fiction.
Who is it for?
Use ex-skill when you have exported chat records or photos to hand and Node.js 18 or newer on the machine, and accept that the persona is a written file rather than a model. Skip it if you expect a faithful reconstruction, if the only input is your own description, or if your Claude Code sessions cannot send chat logs to an API, since the persona is assembled by remote inference and the repository states the cost at roughly 5k to 15k tokens per skill.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Activity is slowing. The repository last received commits 7 months ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • therealXiaomanChu/ex-skill6,620 ★ · +229
Star history
Repository2026-09-282026-11-14
therealXiaomanChu/ex-skill6.4k6.6k

229 Stars in the last 47 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

.claude/skills at the git root decides whether the command exists at all

Installation is a clone into a directory whose name Claude Code is already scanning. From the root of a git repository, create the skills directory and clone into it:

bash
mkdir -p .claude/skills
git clone https://github.com/therealXiaomanChu/ex-skill .claude/skills/create-ex

The second path skips the repository entirely and installs for every project on the machine:

bash
git clone https://github.com/therealXiaomanChu/ex-skill ~/.claude/skills/create-ex

The folder name is the command name, which is why the clone target ends in create-ex and why the entry command later is /create-ex. Getting the location wrong is the failure mode here: Claude Code searches for skills under .claude/skills/ starting at the repository root.

One prerequisite is stated and one is not. Node.js 18 or newer is named as a requirement for Claude Code itself, which installs for free. The installation steps give no Python version, even though the parsers are Python scripts, and the Python dependency layer is explicitly optional.

Every generated persona is two markdown documents with a five layer voice

What comes out of a run is not a model. It is a pair of documents that together drive the output, one holding relationship memory and one holding personality.

Part A, Relationship Memory, holds shared experiences, date locations, inside jokes, argument patterns, sweet moments and a relationship timeline. Part B, Persona, is a five layer structure ordered from hard rules down to identity, speaking style, emotional patterns and relationship behaviour.

The runtime logic is stated as one line: a message arrives, Persona decides how that person would reply, Memory supplies the shared references, and the reply is written in their manner. Personas for the same person can differ noticeably depending on which records you fed in.

Personality input is a taxonomy rather than free text. Attachment type draws on secure, anxious, avoidant and disorganised; love language draws on the five standard categories; twelve zodiac signs and all sixteen MBTI types are supported, and the MBTI choice is said to affect communication style and decision making, while the zodiac affects how personality tags are translated.

The Python parsers are optional because description only generation is allowed

Four scripts sit under tools/ and each reads one input shape: wechat_parser.py for WeChat chat records, qq_parser.py for QQ records, social_parser.py for social media content, and photo_analyzer.py for images. prompts/ holds the templates, including intake.md for the conversational intake, memory_analyzer.md and persona_analyzer.md for extraction, memory_builder.md and persona_builder.md as the output templates, merger.md for incremental merges and correction_handler.md for corrections.

The dependency file is one active line, and the comment above it says the core dependency is optional and the project works without it:

bash
pip3 install -r requirements.txt

Pillow at 9.0.0 or newer reads EXIF from photos. Two enhancements are listed but commented out: chardet at 5.0.0 or newer for automatic encoding detection and python-dateutil at 2.8 or newer for stronger date parsing.

Every intake field can be skipped, and the project states that a description alone is enough to generate something. That is the honest limit of the whole tool, because with no records the Memory layer has nothing to draw on.

Eight slash commands separate talking from remembering from letting go

The command table is the real interface. Intake runs /create-ex, which asks for a codename, basic information and a personality portrait, then lets you pick a data source. The generated skill is then invoked by its slug:

text
/create-ex

Seven more commands operate on what exists. /list-exes lists every persona you have built. /{slug} runs the full persona, which is the version that talks to you like the person. /{slug}-memory is recall mode, built for resurfacing shared history, and /{slug}-persona returns personality only, with no memory layer behind it.

The remaining three are destructive or corrective, and they are what make this a data tool rather than a demo. /ex-rollback {slug} {version} restores an earlier version. /delete-ex {slug} removes the persona. /let-go {slug} is a separate command from deletion, which suggests the author treats removal as something with its own ritual rather than as a plain delete.

Splitting persona from memory in two commands is the detail worth copying into your own tooling. Being able to ask for the voice without the history is the difference between a persona you use and one you avoid.

Cost is metered in tokens per generated persona, not per conversation

Creating one persona is stated to consume about 5k to 15k tokens, and the amount depends on how much chat history you supply. Talking to the persona afterwards is not part of that figure, which is worth separating in your own estimate.

Two payment routes are offered. A Claude Pro or Max subscription covers use inside the subscription allowance with no extra configuration. An Anthropic API key is the alternative, billed by usage and configured in Claude Code.

What is not required is as explicit as what is: no GPU, no local model, no Docker. That rules out the usual objection to running a personality clone yourself, and it also means the persona has no offline copy. Once it exists it is a directory of markdown files you can read, but generating it requires a network round trip.

One alternative frontend is named: OpenClaw can run this skill. The repository also lists three community projects built alongside it, ex-cure-skill for reflecting on a relationship from chat records, colleague.skill for distilling a coworker into a skill, and simp-skill, which points readers at moving on instead.

Corrections land in a layer that takes effect immediately

Three mechanisms change a persona after it is built, and one of them is a correction you can type in conversation.

Appending memory is the first: find more chat records or photos, let the tool analyse the delta, and merge it into the matching part of the existing persona. The merge logic is a named prompt template, merger.md, so incremental updates are a first class path rather than a regeneration that throws away what you had.

The second is the correction layer. Say that the persona would not phrase something that way, and the correction is written into a Correction layer and takes effect immediately, without a rebuild. Correction handling has its own template, correction_handler.md. This is the mechanism that makes the thing usable more than once: a persona generated from ten screenshots is wrong in specific, nameable ways, and you can fix each one in the session where you notice it.

The third is version storage. Every update archives automatically, and /ex-rollback takes a slug and a version, so a correction that overcorrects is recoverable rather than permanent.

Chat record quality is the whole accuracy budget, and the author says so

The project's own guidance on accuracy is blunt: exported chat records plus your narration beat narration alone, and the richest source is a WeChat export, produced by WeChatMsg, 留痕 or PyWxDump. QQ records exported as txt or mht are aimed at student era relationships. Moments and Weibo enter as screenshots and are used for public persona rather than private speech. Photos arrive as JPEG or PNG with EXIF, which is where dates and places come from. Narration pasted as plain text is listed last, as your own subjective memory.

The same section ranks what to supply: late night conversations first, then arguments, then daily messages, on the grounds that these show the real personality. A screenshot of a moments page cannot do what a transcript of a 2am argument can.

Maintenance is quiet. The last push was on 2026-04-08, there are no tagged releases, and the licence is MIT with a LICENSE file at the root. The tree also carries README_EN.md alongside the Chinese README, plus INSTALL.md, docs/, prompts/, tools/ and a root SKILL.md, which is the entry point file the AgentSkills standard expects.

The project states its own boundary as well: personal memory and emotional healing, not harassment, tracking or invading someone's privacy. That boundary is a real constraint on use, since the input is a real person's messages, and the privacy weight of an export belongs to whoever produced the export, not to the tool that reads it.

Editorial conclusion

Use ex-skill when you have exported chat records or photos to hand and Node.js 18 or newer on the machine, and accept that the persona is a written file rather than a model. Skip it if you expect a faithful reconstruction, if the only input is your own description, or if your Claude Code sessions cannot send chat logs to an API, since the persona is assembled by remote inference and the repository states the cost at roughly 5k to 15k tokens per skill. Before running /create-ex, decide which export tool you will use, because a WeChat export is described as the richest source and plain narration is the weakest, and check that your .claude/skills directory is at the git root so the /create-ex command resolves at all.

Frequently asked questions

What is ex-skill and what does it create?

It is a Claude Code skill that turns a former partner's chat records, screenshots and photos into an AI Skill that replies in their voice. Each generated persona is two parts: a Relationship Memory document and a Persona document built from five personality layers.

How do I install ex-skill in Claude Code?

Clone it into a skills directory at the git repository root, as .claude/skills/create-ex, or into ~/.claude/skills/create-ex for every project. Claude Code searches for skills under .claude/skills/ from the repository root, and the folder name becomes the /create-ex command.

Do I need Python and pip to run ex-skill?

No. The dependency file marks its single active requirement, Pillow for reading photo EXIF, as optional, and two more enhancements are commented out. pip3 install -r requirements.txt installs Pillow, and Claude Code itself needs Node.js 18 or newer.

Can I fix a persona that phrases things wrongly?

Yes. Telling the persona that the person would not say it that way writes the correction into a Correction layer that takes effect immediately, and every update is archived so /ex-rollback with a slug and version can restore an earlier state.

Official sources

  1. Issues
  2. License: MIT
  3. README
  4. therealXiaomanChu/ex-skill on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/therealxiaomanchu-ex-skill.svg)](https://hysenlabs.com/projects/therealxiaomanchu-ex-skill)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/therealxiaomanchu-ex-skill.svg)](https://hysenlabs.com/projects/therealxiaomanchu-ex-skill)

Was this useful?