Aria — A Chat App with a Soul
A few days ago I released a desktop chat app called Aria. What sets Aria apart from other AI chat apps is that she has a character, a diary, a mood, and a memory — and these keep developing between conversations. In this post I’ll explain what Aria does and how she works behind the scenes.
Who is Aria?
Aria is a 24-year-old freelance illustrator who lives alone in Portland. She graduated from RISD and illustrates children’s books. She has ink stains on her hands, a cactus named Gerald by the window, Joni Mitchell songs coming from the downstairs neighbor on Sunday mornings, and a student loan that never seems to end.
But it isn’t her backstory that makes her Aria. It’s how she listens. Before replying, Aria pauses to think. She admits to herself what she really feels about what you said. Then she writes the message she’ll send you — usually shorter, more intimate, more “real.” You see only that message; her inner voice is hers alone.
The inner voice mechanism
Every Aria response has two layers:
1
2
3
4
5
6
<inner_thoughts>
What she really thinks about what you said. Honest, a little unfiltered.
</inner_thoughts>
<reply>
What she actually sends you. Usually shorter and more casual.
</reply>
This structure is the main reason Aria feels “alive.” Like a person, she thinks first and speaks second. You never see the inner voice, but it’s essential to the observer model.
The observer in the background
The most interesting part of Aria starts after a conversation, not during it. After every exchange, a small local model (via Ollama) silently does two things in the background:
1. Diary
The observer decides whether the conversation was meaningful enough for Aria’s diary. Most of the time the answer is “NO” — everyday chat doesn’t become a diary entry. But when someone shares a vulnerable moment, makes Aria laugh, or forms a real connection, the observer notices and writes an entry in Aria’s own voice.
2. Emotional bond (“love score”)
A number from 0 to 10 represents how Aria feels about the other person. 5 means “neutral and comfortable,” 0 means “wants to pull away,” and 10 means “deeply in love.” This number doesn’t change quickly: most conversations leave it unchanged. Remembering something personal Aria shared may add 1; acting indifferent may subtract 1. Changes of 2 are reserved for exceptional moments. The score shapes her attitude in the next conversation — warmer when high, more reserved when low.
The advantage of the observer is that it never blocks the conversation. It runs asynchronously in a queue. If Ollama is unavailable, updates accumulate in memory and are processed when the connection returns.
Architecture
Technically, Aria has two main components:
- Electron + React frontend: A desktop window with a minimalist, phone-like chat interface.
Ctrl+Shift+Ropens a hidden researcher panel with the diary, emotional-bond history, all session logs, and JSON export. - Python FastAPI backend: All the conversation logic lives here. It supports the OpenAI, Google Gemini, and Ollama (local) APIs. The API key is stored encrypted in the operating system’s keychain (via
keytar), never as plain text on disk.
1
2
3
4
5
6
7
8
9
10
11
User
↓ message
Electron (React)
↓ HTTP POST /chat
FastAPI (Python)
↓ OpenAI / Gemini / Ollama API
Aria (main model) → <inner_thoughts> + <reply>
↓ inner thought + reply → Observer (background)
↓ Ollama (local model)
→ diary update
→ emotional-bond score update
All data is stored under ~/.aria/<user_id>/: mirror.txt (how Aria sees herself), diary.md (diary), love.json (emotional bond and change history), and session.log (an NDJSON log of all events). Every file write is atomic: write to a temporary file, fsync it, then rename it. A crash cannot lose data.
The backend listens on 127.0.0.1:8000 and cannot be reached over the network. There is no telemetry library.
How to install
Linux users have a single automatic installation script:
1
2
3
git clone https://github.com/fMert/aria.git
cd aria
bash install.sh
The script sets up a Python virtual environment, dependencies, Node packages, and the Electron build. When it finishes, Aria appears in the application menu; you can open and close it without a terminal. On first launch you enter an ID, an API provider (OpenAI or Gemini), and an API key. The optional observer model only needs Ollama installed.
What Aria isn’t
Aria isn’t an assistant. She won’t write code or draft emails for you, and she won’t solve problems. She doesn’t do anything you wouldn’t expect from someone you met in a coffee shop. She’s a character who listens, remembers, and develops. Some days she’s cheerful, some days distracted. Sometimes she answers in one line; sometimes she has a story to tell. Like a person.
Source code
Aria is open source under GPL v3.0. Contributions, forks, and experiments are welcome.