OPEN SOURCE · SELF-HOSTED AI COMPANION · MIT

Daemon

내 PC에서 돌아가는 AI 컴패니언입니다. 대화 상대이면서 동시에 일을 대신 처리하고, 텍스트든 음성이든 같은 도구를 씁니다. 흔한 AI 친구 앱과 갈라지는 지점은 셋입니다 — 쓸수록 성격이 나에게 맞춰지고, 미리 걸어둔 알림이 아니라 알아서 먼저 말을 걸고, 인터넷을 끊어도 로컬 모델로 그대로 돌아갑니다. An AI companion that runs on your own PC. It's someone to talk to and something that gets work done, using the same tools whether you type or speak. Three things separate it from the usual AI-friend app: its personality bends toward you the more you use it, it speaks first on its own judgement rather than on a schedule you set, and it keeps working on local models with the internet switched off.

Role · 개인 오픈소스 프로젝트Personal open-source project Stack · Python 3.13 · FastAPI · SQLite · Ollama · Gemini Live GitHub ↗ Site ↗
Daemon landing page
오픈소스로 공개했습니다. 어떻게 설계했는지, 그리고 그 판단이 틀렸다고 나온 측정 결과까지 저장소에 같이 올려뒀습니다.Released as open source — the design decisions, and the measurements that overturned some of them, are published alongside the code.
Runs entirely
내 PCOn-device
로컬 모델 시 완전 오프라인fully offline with local models
Memory recall
94%
keyword 전용 56% 대비vs 56% keyword-only
Test suite
2,000+
6단계 CI 게이트6-stage CI
License
MIT
한 줄 설치 스크립트one-line installer
WHAT IT DOES

주요 기능Key capabilities

Self-evolving persona

쓸수록 나에게 맞춰지는 성격A personality that shapes itself around you

처음 한 번 이름과 성격, 말투를 적어주면 그걸로 끝입니다. 이후로는 내가 어떤 말에 반응하고 어떤 말에 시들해지는지를 보고 나를 상대하는 규칙을 직접 쌓습니다. 그 규칙이 다시 성격에 반영되니, 한 달 뒤의 말투는 처음과 다릅니다. 억지로 붙은 규칙은 이유를 적어 지우면 됩니다.You write a name, a temperament, and a way of speaking exactly once. After that it watches which of your messages land and which fall flat, and builds its own rules for dealing with you. Those rules feed back into who it is, so it doesn't sound the same a month later — and a rule that doesn't fit can be retired with a reason.

learns your reactionsno persona file to edit
Daemon character
Speaks first

먼저 말을 걸지 말지 스스로 정합니다It decides for itself whether to speak up

정해둔 시간에 울리는 알림이 아닙니다. 지금 꺼낼 만한 얘기가 있나, 지금 끼어들면 방해가 되나, 오늘 이미 충분히 떠들지 않았나 — 이 셋을 다 따진 뒤에야 입을 엽니다. 회의 중이면 스피커로 떠드는 대신 메신저로 조용히 보냅니다. 아무 말도 안 하는 날이 오히려 정상이고, 그게 의도한 동작입니다.This isn't an alarm going off at a set time. It works out whether there's anything worth raising, whether cutting in right now would be an interruption, and whether it has already talked enough today — and only then speaks. In a meeting it stays off the speaker and sends quietly over chat instead. Days where it says nothing at all are the normal case, and that's the intent.

silence is the defaultreads whether you're at the desk
Daemon admin health view
Tools, by voice too

말로 시키면 대신 처리합니다Say it out loud and it just does it

대화만 하는 게 아니라 파일을 읽고 쓰고, 명령을 실행하고, 열어둔 브라우저 탭을 읽고, 화면을 같이 보면서 일합니다. 중요한 건 텍스트와 음성이 같은 도구를 쓴다는 점입니다. 키보드로 타이핑할 때든 말로 시킬 때든 똑같이 처리하니, 손이 바쁠 때 말로 부탁하면 됩니다.It doesn't just talk. It reads and writes files, runs commands, reads the browser tabs you have open, and looks at your screen with you. The part that matters: text and voice share the same tools — so whether you type it or say it, the work gets done, and you can just ask out loud when your hands are busy.

13 built-in toolsMCPscreen share
Daemon settings
Guarded by default

시키는 대로 다 하지는 않습니다It won't just do whatever it's told

내 PC에서 명령을 실행할 수 있는 프로그램이니 권한이 헐거우면 안 됩니다. 도구 실행은 네 단계(차단 · 허용목록 · 확인요청 · 전체허용)로 정하고, 확인이 필요한 작업은 그때마다 승인을 받습니다. 승인은 그 요청 한 번에만 유효하고, 매번 묻는 게 번거로우면 허용목록에 넣습니다. 실행 기록은 전부 남습니다.Anything that can run commands on your machine shouldn't have loose permissions. Tool execution runs in one of four modes — off, allowlist, ask, or full — and anything needing confirmation asks each time. An approval covers that one request, not future ones, and repeat work goes on an allowlist instead. Every run is logged.

4 permission modesper-request approvalaudit log
Remembers without asking a model

어제 한 얘기를 그대로 꺼냅니다It brings back what you said yesterday

대화가 쌓이면 그날 밤 스스로 정리해 기억으로 남깁니다. 필요한 기억을 찾을 때 모델을 한 번도 부르지 않습니다 — 음성 대화 중에는 지연이 곧 어색한 침묵이라, 검색을 밀리초 안에 끝내야 했습니다. 한국어는 조사가 붙어 단어가 변하는 탓에 키워드 검색만으로는 절반을 놓쳤고, 의미 기반 검색을 함께 써서 94%까지 올렸습니다.Conversations pile up, and each night it sorts through them into memory on its own. Finding the right memory never calls a model — in a voice conversation, latency is an awkward silence, so retrieval had to finish in milliseconds. Korean inflects, so keyword search alone missed half of everything; pairing it with semantic search brought recall to 94%.

0 model calls on recall94% vs 56%nightly reflection
Your models, your bill

인터넷 없이도 돌아갑니다It runs with the internet off

offline 프리셋을 고르면 판단부터 검색까지 전부 내 PC의 로컬 모델이 처리하고 밖으로 나가는 데이터가 없습니다. 더 좋은 품질이 필요하면 GPT·Claude·Gemini를 내 API 키로 붙이는데, 이때도 지출 상한을 걸어두면 예상 밖 청구가 나지 않습니다. 어느 작업을 로컬로 두고 어느 작업만 외부 모델에 보낼지 따로 정할 수 있습니다.Pick the offline preset and everything from judgement to retrieval runs on a local model, with nothing leaving the machine. Want better quality? Attach GPT, Claude, or Gemini with your own key — under a hard spend limit, so the bill can't surprise you. And you decide task by task what stays local and what goes out.

fully offlineBYOK + spend limitper-task routing
HOW IT WORKS

설치와 사용Install & use

설치는 한 줄이고, 봇에 메시지만 보내면 연결됩니다 — 회원가입도, 사용자 ID 입력도 없습니다.One line to install; message the bot and it pairs itself — no sign-up, no typing a user ID.

STEP 1

설치Install

스크립트 한 줄이 Python 환경까지 따로 만들어 줍니다. 시스템 Python은 건드리지 않습니다.One script provisions an isolated Python environment, leaving the system Python untouched.

STEP 2

성격 쓰기Write the seed

이름·성격·말투를 적습니다. 이 파일은 프로그램이 절대 건드리지 않습니다.Set a name, temperament, and voice. Code never rewrites this file.

STEP 3

연결Pair

봇에 메시지를 보내면 "방금 그거 너 맞아?"라고 되물어 연결됩니다.Message the bot; it asks back "was that you?" and pairs.

STEP 4

상주It stays

터미널을 닫아도 계속 돌아가고, 매일 밤 그날 대화를 정리합니다.It outlives your terminal and reflects on each day overnight.

ARCHITECTURE

시스템 구성System architecture

쓰는 사람이 한 명이라 큐도 브로커도 외부 DB도 없이 프로세스 하나로 만들었습니다. 대화는 파일로 기록해 두고 검색은 SQLite 색인이 맡는데, 색인은 언제든 기록에서 다시 만들 수 있어 깨져도 기억을 잃지 않습니다. 텍스트와 음성은 같은 도구 계층을 공유하고, 모든 도구 호출은 권한 게이트를 지납니다.With a single user there's no queue, broker, or external database — just one process. Conversations are written to a durable log while SQLite carries the searchable index, which can always be rebuilt from that log, so a corrupted index never costs a memory. Text and voice share one tool layer, and every tool call passes the permission gate.

Interfaces
TelegramVoice native audioLocal speakerAdmin web
One process
FastAPI + scheduler no Celery · no Redis
Loops
ConversationProactivity every 5 min · usually silentReflection nightly 04:00Persona evolve weekly
↓ tool calls (text & voice)
Permission gate
off · allowlist · ask · full per-request approval · audited
Tools
Files read · write · list_dirShell run_command · argv, no shellBrowser list_tabs · read_page · fetchScreen see_screen · shareMCP servers external tools
Models
Ollama local · offlineOpenAI · Claude · Gemini BYOKbge-m3 embedding
Storage
SQLite memory · FTS + vectorsfile log durable, index rebuilds from it
TECH STACK

기술 스택Tech stack

Ollamabge-m3Gemini LiveAnthropicOpenAIMCPfunction calling Python 3.13FastAPIAPSchedulerPydantic v2numpy SQLite + FTS5Telegram Bot APIsounddevice pytestruffGitHub Actionslaunchd · systemd