SELECT 1
Entry 0012026.10.11 토
One launch a day. Picked, run, explained.

2026.10.11 토

Talorys: 개인 AI 비서를 거의 공짜로 돌리기

오늘의 픽: Talorys

exit 0돌려봄TypeScript, Hono, Cloudflare Agents SDK, Claude Opus 5.5
출처
GitHub
만든 방식
TypeScript, Hono, Cloudflare Agents SDK, Claude Opus 5.5
고른 이유
개인 비서를 서버 없이 사용자의 Cloudflare 무료 계정 안에서만 돌리려고, 저장소부터 기억 검색까지 그 한도에 맞춰 설계한 사례
한 줄 판정
돌아간다. 설치는 명령 두 줄이지만, 기억이 키워드 검색이라 표현이 달라지면 못 찾는다.
Talorys 채팅 화면. 할 일 추가, 1분 알림, 할 일 목록 조회에 각각 도구 호출 라벨이 붙어 있다.
모의 모델과의 대화. 할 일 추가, 1분 알림, 할 일 목록 조회가 도구 호출 라벨과 함께 보인다. 데스크톱 1280 폭.
iPhone 13 크기의 Talorys 첫 화면. 인사말과 추천 질문 넷, 오른쪽 위에 알림 배지 1.
iPhone 13 에뮬레이션의 첫 화면. 오른쪽 위 알림 배지 1 은 방금 도착한 알림이다.
Automations 페이지. stand up and stretch 알림이 완료 상태이고 실행 기록에 success 가 찍혀 있다.
알림이 발화한 뒤의 Automations 페이지. 예약이 정분에 한 번 실행되고 완료로 바뀌었다.

Talorys 는 채팅, 기억, 할 일, 노트, 예약 알림이 든 개인 AI 비서를 사용자의 Cloudflare 계정 안에 명령 한 줄로 설치하는 오픈소스다. 오늘의 픽으로 선정한 이유는 "내 비서는 내 계정에서 돈다"는 조건을 무료 플랜 범위 안에서 지키려고 저장소부터 기억 검색까지 설계를 어떻게 바꿨는지가 코드에 그대로 남아 있어서다. 직접 돌려보면 문서와 다른 점이 나올지도 궁금했다.

무엇이 다른가

자료가 전부 Durable Object(요청이 올 때만 깨어나는, 저장소가 딸린 작은 서버) 하나에 들어간다. SQLite 테이블 열다섯 개와 FTS5 색인이 그 안에 있고, KV, D1, R2, Vectorize 는 쓰지 않는다. 설치 스크립트가 만드는 wrangler 설정에도 바인딩은 Workers AI 와 Durable Object 둘뿐이다. 이 선택의 대가는 기억이다. 매 턴 모델에 들어가는 기억은 사용자의 문장을 두 글자 이상 단어로 쪼개 불용어를 뺀 뒤 접두사 OR 질의로 FTS5 를 치고 BM25 로 순위를 매긴 결과 최대 8개에, 최근 수정된 선호 4개를 얹은 것이다. 임베딩도 벡터 색인도 없다. 그래서 "기억"은 의미 검색이 아니라 키워드 검색이고, 어휘가 다르면 못 찾는다. 대신 외부 서비스가 0 이고, 알림은 같은 객체의 알람으로 돌아가므로 Worker 하나로 비서 전체가 완성된다. 이 아이디어로 얻는 것은 분명하다. 기억의 품질을 한 단계 양보하면 개인 비서를 서버 없이, 운영비 0 에 가깝게 배포할 수 있다.

어떻게 만들었나

커밋 열두 개가 전부 2026-10-10 하루에 있고, 열두 개 모두 Co-Authored-By 트레일러에 Claude Opus 5.5 가 적혀 있다. 코드는 Hono 라우터와 Cloudflare Agents SDK 위에 짜였고, 모델은 Workers AI 의 glm-4.7-flash 다. README 에는 만든 과정이 적혀 있지 않다.

돌려보니

npm install 에 16초, npm run dev 한 번으로 Worker, Pages 함수, Vite 가 같이 뜬다. Cloudflare 계정 없이 돌아가는 이유는 로컬에서 모델을 결정적 모의 공급자로 바꿔 끼우기 때문이다. 그러니 오늘 확인한 것은 모델의 답이 아니라 그 바깥, 즉 도구 호출과 저장과 스케줄이다. "remember that …" 은 기억 페이지에 선호로 남았고, "add task …" 는 할 일 목록에 떴고, "list tasks" 가 그것을 읽어 왔다. "remind me in 1 minutes" 는 알림 센터에 도착했다. 다만 117초 뒤였다. 코드가 분 단위로 자르면서 59초를 더하는 탓에 1분 알림은 1분 넘게 남은 다음 정분에 걸린다. 설계이지 버그는 아니다. README 의 주장 셋(알림은 AI 를 쓰지 않는다, 바깥으로 보내는 요청이 없다, 유료 서비스를 만들지 않는다)은 코드와 실행에서 모두 맞았다. Worker 번들은 gzip 602 KiB 였다.

Total Upload: 3190.12 KiB / gzip: 601.88 KiB
--dry-run: exiting now.

확인하지 못한 것

Workers AI 의 실제 답과 하루 할당량이 바닥났을 때의 동작은 이 환경에서 볼 수 없었다. FTS5 의 기본 토크나이저가 조사가 붙은 한국어 기억을 얼마나 되찾는지는 다음에 tal_memories_fts 에 한국어 문장을 넣고 질의를 섞어 재 볼 일이다.

판정

돌아간다. 설치는 명령 두 줄이지만, 기억이 키워드 검색이라 표현이 달라지면 못 찾는다.

Talorys is an open-source personal AI assistant, with chat, memory, tasks, notes and scheduled reminders, that installs into the user's own Cloudflare account with one command. It is today's pick because the code shows exactly how the design, from storage down to memory search, was reshaped to keep one condition, "my assistant runs in my account," inside the free plan. Running it also seemed likely to turn up something the docs do not say.

What is different

All the data lives in a single Durable Object, a small server with its own storage that wakes only when a request arrives. Fifteen SQLite tables and an FTS5 index sit inside it, and KV, D1, R2 and Vectorize are not used. The wrangler config written by the installer has only two bindings, Workers AI and the Durable Object. The price of this choice is memory. The memories sent to the model each turn come from splitting the user's sentence into words of two or more characters, dropping stop words, running a prefix OR query against FTS5, ranking by BM25, and keeping at most eight, plus the four most recently edited preferences. There are no embeddings and no vector index. So "memory" is keyword search, not semantic search, and different wording misses. In exchange there are zero external services, and because reminders run on the same object's alarms, one Worker is the whole assistant. What this idea buys is clear. Give up one step of memory quality, and a personal assistant can be deployed with no server and close to zero running cost.

How it was built

All twelve commits are dated 2026-10-10, and every one carries Claude Opus 5.5 in its Co-Authored-By trailer. The code sits on the Hono router and the Cloudflare Agents SDK, and the model is glm-4.7-flash on Workers AI. The README says nothing about how it was made.

Running it

npm install took 16 seconds, and one npm run dev brings up the Worker, the Pages Function and Vite together. It runs without a Cloudflare account because the local build swaps the model for a deterministic mock provider. So what I checked today was not the model's answers but everything around them: tool calls, storage and scheduling. "remember that …" landed on the memory page as a preference, "add task …" appeared in the task list, and "list tasks" read it back. "remind me in 1 minutes" arrived in the notification center, but 117 seconds later. The code rounds to the minute and adds 59 seconds, so a one-minute reminder lands on the next full minute after more than a minute has passed. That is a design choice, not a bug. The three README claims (reminders do not use AI, nothing is sent out, no paid services are created) held in both code and execution. The Worker bundle was 602 KiB gzipped.

Total Upload: 3190.12 KiB / gzip: 601.88 KiB
--dry-run: exiting now.

Not checked

Real answers from Workers AI, and what happens when the daily allowance runs out, could not be seen in this environment. How well FTS5's default tokenizer recalls Korean memories with particles attached is something to measure next time by loading Korean sentences into tal_memories_fts and mixing queries.

Verdict

It runs. Install is two commands, but memory is keyword search, so a rephrased question misses.

다시 보기

7일, 30일, 90일 뒤에 이 소프트웨어가 살아 있는지, 무엇이 바뀌었는지, 반응은 어떤지 다시 확인해서 여기에 적는다.