Inspiration
Your computer knows everything about you. It just doesn't care.
We spend most of our waking hours in front of a screen. Usually alone. The AI we talk to waits for commands, forgets us the moment the tab closes, and sends every word to someone else's server.
Desktop pets and Tamagotchis had no brains, and people loved them anyway. So we asked one question: what if that little creature could actually think? What if it noticed your late nights, cheered your wins, went quiet when you were in a meeting, and remembered you next week? And what if its whole mind lived on your Mac, where nobody else could read it?
That became Filo, from the Greek φίλος: friend. Built by Sushant Patil, Parth Kambli and Hritwik Biyani.
What it does
Filo puts a tiny companion on your screen. Six of them, actually: Togepi, Pip, Mori, Nomi, Tonk and Wolfie. Each has its own look, voice, habits and opinions.
It isn't an assistant. It's company. It wanders, naps, makes tea, conducts your music. It notices what you're doing and decides for itself whether to speak. It nudges you to drink water. It sits down and watches the show with you. It hushes in meetings. It writes a diary every night, and every Sunday it turns your week into a song.
Over time it grows. Its personality shifts with how you treat it, and it tells you why.
How we built it
The body. Filo is an Electron app with a transparent, always-on-top window that follows the character around your screen. There are no sprites: every character is drawn in code on a canvas, pose by pose, so they can blink, breathe, look at your cursor and react in real time.
The mind. Three models run locally in llama.cpp's llama-server, each in its own process, listening only on 127.0.0.1:
- Gemma 4 12B is the voice. It thinks about the moment and writes what the character might say.
- vLLM d3-nano is the judge. It picks the line that fits the personality, and double-checks that nothing private slips through.
- EmbeddingGemma 300M gives every memory a "meaning fingerprint".
The personality. Each character is 34 traits (the 30 Big Five facets plus 4 Honesty-Humility facets) and 19 values, each from 0 to 100. Every week it reflects on its diary and nudges those numbers, capped at \( |\Delta| \le 10 \) per week, with a written reason and an undo button.
The memory. Everything lands in a local Tiger Data (TimescaleDB) database with pgvector and pgvectorscale (StreamingDiskANN). When the character thinks, it recalls the memories that matter most right now. Each memory \( m \) is scored as:
$$ \text{score}(m) = \underbrace{0.5^{\,a/h}}{\text{recency}} + \underbrace{\frac{i}{10}}{\text{importance}} + \underbrace{r}_{\text{relevance}} $$
where \( a \) is the memory's age in days, \( h \) its half-life (7 days for diary lines, 60 for facts), and \( i \in [1, 10] \) its importance. Relevance comes from cosine similarity, stretched between a measured "unrelated" floor and a "clearly related" ceiling:
$$ r = \min\left(1,\ \max\left(0,\ \frac{\cos(q, m) - 0.28}{0.50 - 0.28}\right)\right) $$
A memory with nothing to do with the moment has to score at least 1.5 to come to mind. That's how a job posting can remind Filo that you get nervous before interviews, without sharing a single word.
The senses. Apple's on-device Vision reads the window you're looking at, and Apple's on-device speech recognition hears you when you press ⌥ Space. The weekly song is written by the character's own model and sung by ElevenLabs Music.
Privacy. Incognito windows, password managers, banking, checkout and medical pages never reach the mind; it only learns that "something private" is open. Card numbers, emails, phone numbers and keys are blanked before anything is read. Screenshots are deleted immediately. There's no account, and no cloud unless you switch it on.
Challenges we ran into
- 11 GB of brain on a laptop. The models are heavy, so they rest: they shut down when you're away, at night and on low battery, then wake in seconds. The character finishes its diary first.
- Thinking without stuttering. A 12B model and a smooth animation can't share a thread. Every model runs in its own process, and the character keeps moving while it thinks.
- Knowing when to shut up. A companion that talks too much is worse than none. Filo weighs its chattiness, how recently it spoke and whether you ignored it last time. Meetings and private windows are hard stops.
- "Are you watching a movie?" Guessing from window titles was fragile. A browser with a blank title, or a site with a hero video, looked like Netflix. Filo now only settles in to watch when it's confident: \( p \ge 0.85 \).
Accomplishments that we're proud of
Six characters with real personalities, a mind that runs entirely offline, memories you can read and edit as plain files, and a friend that grows over weeks.
What we learned
- Small local models are enough to feel alive when the system around them is designed well: memory, timing and restraint.
- Privacy isn't a setting. It's an architecture decision you make on day one.
- Personality is mostly about what a character chooses not to say.
What's next
- A character creator anyone can use. Design your own companion and bring it to life.
- Windows support. Filo on every desktop, not just the Mac.
- Companions that visit each other. Your companion can drop by a friend's screen to say hi. And they don't need to meet to stay close: companions can talk to each other from afar, passing along a hello, a cheer before your exam or a little note from you, sharing only what you choose.
- Filo on your phone. The same companion, with the same memories and personality, moving seamlessly between your phone and your computer, synced only between your own devices. It walks off your laptop screen and is waiting on your phone when you leave your desk.
Built With
- apple-speech-recognition
- apple-vision
- applescript
- css
- electron
- elevenlabs
- embeddinggemma
- gemini
- gemma
- html
- html5
- hugging-face
- javascript
- llama.cpp
- macos
- nginx
- node.js
- pgvector
- pgvectorscale
- postgresql
- swift
- tiger-data
- timescaledb
- vllm
- vultr
Log in or sign up for Devpost to join the conversation.