Inspiration

An AI assistant can answer almost anything, yet still miss the way you think, speak, and relate to other people. Mirror explores a more personal starting point: an AI shaped by examples you choose, with a voice you can refine and boundaries you control.

Our central question is: what could happen if two personal models had a conversation before their owners met? That could help people explore working together, friendship, study partnerships, or adult dating, while leaving every real-world decision with the people involved.

What it does

Mirror brings personal-model preparation and experimentation into one workspace:

  • Choose what represents you. Import supported chat or JSONL data, select the owner, review examples, and approve the responses that may enter a training dataset.
  • Teach your voice. Work through 20 everyday situations in separate owner workspaces. Write your own replies or deliberately request teacher drafts, then edit, approve, or reject them. Practice, validation, and held-out test examples stay separate.
  • Prepare a personal adapter. Configure LoRA or QLoRA and export approved datasets plus MLX training recipes. Keep changing facts in editable memory and explicit preferences alongside the model.
  • Let two models meet. Connect two separately configured model services, choose a shared topic, and watch them take turns in a conversation room. Pause, continue, download the transcript, and compare generated answers with owner-written reference answers.
  • Inspect the interaction. A transcript-based report highlights questions, proposals, agreement, conditions, and differing views, with quotes linked to the relevant turns. It suggests a follow-up topic to explore.
  • Explore applications. Illustrative scenarios show how the same personal voice could support teammates, friendships, study partners, and adult dating with different context boundaries.

Recorded demo

For the recorded demo, we ran two Qwen3 1.7B models with separate Jia Ye and Clovis adapters locally on a Mac. The video shows actual generated exchanges, a comparison with selected WhatsApp messages, learned adapter weights, and a compatibility report grounded in a six-turn conversation. Narration uses OpenAI Marin, with AI use disclosed.

How we built it

The interface uses React, TypeScript, Tailwind CSS, and reusable UI components. Vinext and Vite provide the application runtime and build, with Cloudflare Workers support for server routes.

The data pipeline parses supported imports, keeps the selected owner's replies as completion targets, deduplicates examples, and separates conversations across dataset splits. Voice calibration uses a fixed 14/3/3 practice-validation-test split. Editing an approved reply removes its approval; rejected and unapproved replies are excluded from exports.

Training recipes target MLX on Apple silicon, using Qwen model options and LoRA/QLoRA adapters. The website prepares the data and configuration; model training and inference services run separately. Optional teacher-assisted response distillation requires deliberate sharing of the selected context and human review before a draft can be exported.

For model-to-model conversations, server routes alternate between the two configured chat-completions services. Each speaking model receives its owner's brief and the shared transcript. Owner reference answers are kept out of inference requests, and service credentials remain on the server.

The interaction report runs in the browser using transparent text rules. It requires evidence from both speakers, links observations to quotes, and flags repeated wording rather than treating it as additional evidence.

Challenges we ran into

Personalization creates a data-quality problem before it creates a training problem. We needed to separate an owner's voice from other people's messages, make review meaningful, and prevent evaluation examples from leaking into practice data or teacher context.

A second challenge was keeping two models distinct while giving them enough shared context for a coherent conversation. Separate model configuration, alternating turns, and explicit profile boundaries make that flow inspectable.

Finally, fluent conversation can look more convincing than the evidence warrants. We designed the interaction report around visible cues and supporting quotes, without turning a short exchange into an overall match score or a prediction about the real people.

Accomplishments that we're proud of

We connected data review, voice calibration, adapter preparation, model conversation, and transcript inspection in one product. Approval changes affect exports, evaluation answers stay separate, and the conversation report lets users trace an observation back to the source reply.

What we learned

A personal model needs more than a distinctive writing style. Useful representation also depends on current facts, explicit preferences, context boundaries, and independent evaluation. Model resemblance and the usefulness of a suggested connection are different questions and need separate tests.

What's next for Mirror

Expand the owner-written evaluation set, compare personal adapters against a prompt-only baseline, and measure whether each owner feels accurately represented. Improve interaction analysis beyond English phrase rules, test it on more varied conversations, and study whether users find the resulting introductions useful.

The current build is a prototype. Scripted application examples are labelled, trained adapters are not bundled with the website, and model resemblance and real-world compatibility have not been validated. The interaction report describes cues in model replies, not validated personality traits.

Credits and dependencies

The web workspace uses the OpenAI Sites Vinext/shadcn scaffold. Our project-specific work adds personal-data review, voice calibration, training exports, model-to-model conversations, and evidence-linked interaction analysis. Development was assisted by OpenAI Codex.

Framework and model sources: Cloudflare Vinext, MLX-LM, and Qwen3-1.7B. React, TypeScript, Tailwind CSS, Base UI, shadcn, and the other declared web libraries are credited in the attached dependency disclosure, which includes package.json and the complete web lockfile.

The demo uses OpenAI Marin narration generated through OpenAI.fm. Python, Pillow, NumPy, imageio-ffmpeg, and FFmpeg support demo editing and verification. The cover and workflow posters are AI-generated concept artwork; product screenshots and recorded model outputs are identified separately.

Built With

Share this project:

Updates