# Talorys: 개인 AI 비서를 거의 공짜로 운영하기
# Talorys: a personal AI assistant, almost for free

- Site: https://select1.dev/2026-10-11 (English), https://select1.dev/ko/2026-10-11 (Korean)
- Entry: 001
- Published: 2026-10-11 (KST). Launch date: 2026-10-10
- Pick: Talorys <https://github.com/rociiu/talorys> (source: GitHub)
- Verified: ran
- What: Talorys 는 개인 AI 비서를 설치하는 오픈소스 프로덕트다. 명령 한 줄로 사용자의 Cloudflare 계정 안에 설치되고, 채팅, 기억, 할 일, 노트, 예약 알림이 들어 있다.
- What (en): Talorys is an open-source personal AI assistant product that installs in the user's own Cloudflare account with one command. It has chat, memory, tasks, notes and scheduled reminders.
- Why: 오늘의 픽으로 선정한 이유는 개인 AI 비서를 무료 플랜 안에서 운영하려고 무엇을 포기했는지가 코드에 그대로 남아 있어서다.
- Why (en): It is today's pick because the code shows exactly what was given up to run a personal AI assistant inside a free plan.
- Verdict: 작동한다. Cloudflare 계정 없이 로컬에서 비서 전체가 실행됐다.
- Verdict (en): It runs. The whole assistant started locally without a Cloudflare account.
- Tags: agent, cloudflare, durable-objects, self-hosted, ai-built

## Checked against the README

- [pass] 단순 알림과 다이제스트는 AI 를 사용하지 않는다 — executeAutomation 의 reminder 분기는 알림 레코드만 만든다. 1분 알림이 모의 모델 호출 없이 도착
- [pass] 텔레메트리가 없고 개발자에게 아무것도 보내지 않는다 — apps/ 와 packages/shared 의 외부 URL 검색. fetch 는 내부 서비스 바인딩 두 곳뿐
- [pass] KV, D1, R2, Vectorize 같은 유료 서비스를 만들지 않는다 — packages/create-talorys/src/config.ts 의 바인딩이 ai 와 durable_objects 두 개뿐

## Measured

- agent Worker 번들 (wrangler deploy --dry-run): 3190 KiB, gzip 602 KiB (npm run build -w @talorys/agent 출력의 Total Upload)

## Progress (days after launch; full history https://select1.dev/2026-10-11/progress)

- day 3 (due 2026-10-13) [missed] Progress checks started on 2026.10.16. This date had already passed.
- day 7 (checked 2026-10-17) [active] commits since launch 100, stars 1254, releases 0, contributors 10, last commit 2026-10-16
  - Search by meaning was added to memory. It is optional. When it is on, recall uses keyword search and search by meaning together. Chat also finds tasks, notes and automations by meaning.
  - Agent actions that cannot be undone need the owner's approval. An approval covers only what was shown. The agent can no longer erase notes or memories.
  - Notifications are delivered as Web Push.
  - Personal access tokens were added. External tools and other AI assistants connect with them.
  - The owner can still sign in during a distributed attack. Reading a request body stops as soon as it passes the size limit.
- day 15 (checked 2026-10-25) [active] commits since launch 128, stars 1383, releases 1, contributors 13, last commit 2026-10-24
  - Korean is now the web UI’s second language.
  - AI now proposes task plans. The owner must confirm each plan before it runs.
  - Personal access tokens let outside tools and other AI assistants use Talorys. Notifications arrive as Web Push (create-talorys@0.1.7).
  - The installer output now hides provider API keys and bearer tokens.
  - Automation runs no longer overlap or get stuck. A one-off automation is paused if its run time has passed after a time zone change.

## 한국어

## 무엇이 문제인가

개인 AI 비서를 가지려면 지금은 방법이 두 가지다.

- 월 구독료를 지불하고 상용 서비스를 사용한다.
- 오픈소스를 받아 자신의 서버에 올린다. 서버와 데이터베이스를 구매하고 모델 API 키를 넣어야 하며, 사용하지 않을 때도 요금이 부과된다.

제작자는 HN 글에서 이유를 이렇게 밝혔다. 월 구독 없이, 상용 서비스에 의존하지 않고, 비서를 자기가 소유하고 통제하고 싶어서 만들었다.

## 어떻게 해결했나

Talorys 는 그 사이에 세 번째 선택지를 만든다. 명령 하나로 자신의 Cloudflare 계정 안에 비서 전체를 설치하고, 무료 플랜 안에서만 작동하도록 설계했다. 서버를 구매하지 않고, 모델도 Workers AI 의 하루 무료 할당으로 사용하며, 채팅·기억·할 일·노트·알림이 한 번에 생긴다. HN 에는 반론도 있다. 상용 서비스에 의존하지 않는다는 말은 과장이며, 실제로는 Cloudflare 의 서비스 네 개에 의존하고 무료 범위도 Cloudflare 가 언제든 바꿀 수 있다고 적혀 있다. 타당한 말이다. 이 프로덕트는 의존을 없애지 않았다. 월 요금과 서버 운영을 없앴다.

## 무엇이 다른가

그게 가능한 이유는 구조에 있다. 자료가 전부 Durable Object 하나에 들어간다. SQLite 테이블 15개와 FTS5 색인이 그 안에 있고, KV, D1, R2, Vectorize 는 사용하지 않는다. 설치 스크립트는 wrangler 설정을 만드는데, 여기에도 바인딩은 Workers AI 와 Durable Object 두 개뿐이다. 알림은 같은 객체의 알람으로 작동하므로 Worker 하나로 비서 전체가 완성된다. 이 선택의 트레이드오프는 기억이다. 기억은 매 턴 이렇게 골라 모델에 넣는다. 사용자의 문장을 두 글자 이상의 단어로 나누어 불용어를 빼고, FTS5 에 질의해 BM25 로 순위를 계산한 뒤 최대 8개를 가져온다. 여기에 최근 수정된 선호 4개를 더한다. 임베딩도 벡터 색인도 없다. 그래서 기억은 의미 검색이 아니라 키워드 검색이고, 어휘가 다르면 못 찾는다.

## 어떻게 만들었나

- 커밋 12개가 전부 2026-10-10 하루에 있다.
- 12개 모두 Co-Authored-By 트레일러에 Claude Opus 5.5 가 적혀 있다.
- 코드는 Hono 라우터와 Cloudflare Agents SDK 위에 작성됐고, 모델은 Workers AI 의 glm-4.7-flash 다.
- README 에는 어떻게 만들었는지 적혀 있지 않다.

## 실행해 보니

로컬에서는 모델을 결정적 모의 공급자로 교체하므로 Cloudflare 계정 없이도 작동한다. 그래서 오늘은 모델의 답이 아니라 도구 호출과 저장과 스케줄을 아래 순서로 확인했다.

1. 설치와 실행. `npm install` 에 16초가 걸렸고, `npm run dev` 한 번으로 Worker, Pages 함수, Vite 가 함께 실행됐다.
2. 기억과 할 일. "remember that …" 은 기억 페이지에 선호로 저장됐고, "add task …" 는 할 일 목록에 추가됐다. "list tasks" 로 그 할 일을 조회했다.
3. 알림. "remind me in 1 minutes" 는 알림 센터에 도착했지만 117초 뒤였다. 코드가 지금 시각에 요청한 분과 59초를 더한 뒤 분 단위로 자른다. 그래서 1분 알림은 1분이 넘게 지나고 다음 정분에 실행된다. 설계이지 버그는 아니다.
4. README 대조. README 에 적힌 세 가지(알림은 AI 를 사용하지 않는다, 외부로 요청을 보내지 않는다, 유료 서비스를 만들지 않는다)는 코드에서 모두 확인됐다. 실행에서도 1분 알림이 모델 호출 없이 도착했다.
5. 번들 크기. Worker 번들은 gzip 602 KiB 였다.

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

## 확인하지 못한 것

- Workers AI 의 실제 답과 하루 할당량이 바닥났을 때의 동작. 확인하려면 Cloudflare 계정에 배포해야 한다.
- 한국어 기억에 조사가 붙어 있을 때 FTS5 의 기본 토크나이저가 얼마나 되찾는지. 다음에 `tal_memories_fts` 에 한국어 문장을 넣고 질의를 섞어 측정하자.

## 판정

작동한다. Cloudflare 계정 없이 로컬에서 비서 전체가 실행됐다. 다만 기억이 키워드 검색이라 단어가 다르면 못 찾는다. 자신의 Cloudflare 계정에서 비서를 운영하고 싶고 기억은 메모 수준이면 충분한 경우에 써 볼 만하다. 기억이 핵심이라면 벡터 검색이 붙기 전까지는 이 프로덕트는 적합하지 않다.

## 얻어갈 것

- 기능마다 사용자 기억을 벡터 검색 없이 키워드 검색으로 시작해도 되는지 적어 보자. Talorys 는 벡터 검색을 포기하고 서버와 운영비를 없앴다.
- 외부 서비스를 하나도 사용하지 않으면 무엇을 못 하게 되는지부터 명시해 두자. 여기서는 의미 검색과 Workers AI 밖의 모델이 빠졌다.
- 코드가 예약 시각을 분 단위로 자르면, 1분 알림이 실제로 몇 초 뒤에 오는지 측정해 보자. Talorys 는 117초였다.

### 용어

- Durable Object: Cloudflare 의 작은 서버 단위. 저장소가 딸려 있고 요청이나 알람이 올 때만 깨어난다.

## English

## The problem

There are two ways to have a personal AI assistant today.

- Pay a monthly subscription for a commercial service.
- Take an open-source one and put it on your own server. You buy a server and a database and add a model API key. You also pay for the hours you are not using it.

The author wrote on HN that they wanted an assistant they could own and control, without a monthly subscription and without relying on someone else's hosted service.

## How it solves it

Talorys offers a third option. One command installs the whole assistant inside your own Cloudflare account, and it is designed to stay within the free plan. It needs no rented server and uses Workers AI's daily free allocation for the model. It includes chat, memory, tasks, notes and reminders. HN commenters said the claim of not relying on someone else's service goes too far. Talorys relies on four Cloudflare services, and Cloudflare can change the free limits at any time. Talorys does not remove this dependence. It removes the monthly bill and the need to run a server.

## What is different

All the data lives in a single Durable Object. It contains fifteen SQLite tables and an FTS5 index. Talorys does not use KV, D1, R2 or Vectorize. The installer writes a wrangler config with only two bindings, Workers AI and the Durable Object. Reminders use the same object's alarms, so one Worker runs the whole assistant. Each turn, Talorys splits the user's sentence into words of two or more characters and drops stop words. It queries FTS5 and ranks the results by BM25. It sends at most eight memories and the four most recently edited preferences to the model. There are no embeddings and no vector index. So memory is keyword search. A question that uses different words from a stored memory does not find it.

## How it was built

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

## Running it

Talorys uses a deterministic mock provider locally, so it runs without a Cloudflare account. Today I did not check the model's answers. I checked tool calls, storage and scheduling.

1. Install and run. `npm install` took 16 seconds. A single `npm run dev` started the Worker, the Pages Function and Vite together.
2. Memory and tasks. "remember that …" showed up on the memory page as a preference, and "add task …" appeared in the task list. "list tasks" read it back.
3. Reminders. The reminder from "remind me in 1 minutes" arrived in the notification center after 117 seconds. The code adds the requested minutes and 59 seconds to the current time, then truncates the result to the minute. So a one-minute reminder fires at the next full minute after more than a minute has passed. That is a design choice, not a bug.
4. Against the README. The README makes three claims: reminders do not use AI, nothing is sent out, and no paid services are created. The code confirmed all of them. In the run, the one-minute reminder also arrived without a model call.
5. Bundle size. 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 allocation runs out. Checking them requires deploying to a Cloudflare account.
- How well FTS5's default tokenizer recalls Korean memories with particles attached. Next time, load Korean sentences into `tal_memories_fts` and measure recall with a mix of queries.

## Verdict

It runs. The whole assistant started locally without a Cloudflare account. But memory is keyword search, so a question with different words misses. It suits users who want an assistant in their own Cloudflare account and only need keyword-based memory. If memory is the priority, this product is not the right choice until it supports vector search.

## What to take away

- First, list the features that could use keyword search instead of vector search. Talorys gave up vector search and removed the server and the running cost.
- Then write down what you lose when you use no external service at all. For Talorys, the losses were semantic search and models outside Workers AI.
- If your code truncates scheduled times to the minute, measure how many seconds a "1 minute" reminder takes. For Talorys it was 117.

### Terms

- Durable Object: A small Cloudflare server unit with its own storage. It wakes only when a request or an alarm arrives.

## Launches the same day

- Nagare <https://ilia.page/writing/introducing-nagare> (Show HN, 16): 할 일 앱. 아이폰과 맥과 에이전트가 같은 목록을 사용한다. 에이전트는 원격 MCP 로 연결한다.
- Babytalk <https://github.com/tlack/babytalk> (Show HN, 13): 음성 인식과 음성 합성. ESP32 보드에서 오프라인으로 작동한다.
- Open Components <https://opencomponents.dev/> (Show HN, 7): UI 컴포넌트 표준 제안. 사용자와 개발자와 에이전트가 같이 읽는다.
- Chrome Relay <https://github.com/aindeev/agent-chrome-relay> (Show HN, 7): 릴레이. 로그인된 내 크롬의 백그라운드 탭을 코딩 에이전트에게 빌려준다.
- OpenWants <https://maplehill.openwants.com/> (Show HN, 6): 가상 도시 시뮬레이션. 주민의 요구를 AI 에이전트들이 처리한다.
- Talorys <https://github.com/rociiu/talorys> (GitHub, 365): 개인 AI 비서. 내 Cloudflare 계정에 명령 한 줄로 배포한다.
- robot-heads <https://github.com/fayazara/robot-heads> (GitHub, 182): React 용 로봇 머리 컴포넌트. 에이전트 상태를 얼굴로 보여 준다.
- vegaml <https://github.com/NandhaKishorM/vegaml> (GitHub, 107): 결정 라이브러리. 고정된 언어 모델과 작은 물리 엔진으로 확률을 보정한다.
- ReSO AI <https://www.producthunt.com/products/reso> (Product Hunt, 353): 서비스. 고객이 AI 에게 물을 때 내 프로덕트가 추천되게 만든다.
- Onepin <https://www.producthunt.com/products/onepin> (Product Hunt, 327): AI 보이스오버. 이름과 가격과 날짜를 틀리지 않고 읽는다.
- BCD <https://disquiet.io/products/bcd> (Disquiet): 원격 MCP. ChatGPT 나 Claude 에게 말하면 내 맥에서 바로 일한다.
- Plopino <https://disquiet.io/products/plopino> (Disquiet): HTML 공유 도구. AI 가 HTML 을 만들어 주면 올려서 공유 링크를 받는다.

## Getting started

- Steps: npx create-talorys@latest
- Needs: Cloudflare 계정 (설치 중 브라우저 로그인), Node.js 22 이상
- Cost: Cloudflare 무료 플랜 안에서 운영된다. Workers AI 는 하루 할당량이 있고, 할당량이 바닥나면 채팅만 멈추고 할 일·노트·알림은 유지된다.
- Note: 설치 프로그램이 Worker 와 Pages 를 배포하고 주소를 출력한다. 로컬에서만 보려면 저장소를 클론해 npm install 뒤 npm run dev 를 실행한다.
