# Hashcards: 일반 텍스트 기반의 간격 반복 시스템

> Clean Markdown view of GeekNews topic #25075. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=25075](https://news.hada.io/topic?id=25075)
- GeekNews Markdown: [https://news.hada.io/topic/25075.md](https://news.hada.io/topic/25075.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-12-15T09:36:45+09:00
- Updated: 2025-12-15T09:36:45+09:00
- Original source: [borretti.me](https://borretti.me/article/hashcards-plain-text-spaced-repetition)
- Points: 6
- Comments: 1

## Summary

**Hashcards**는 **Markdown 파일**을 직접 카드 데이터로 사용하는 **로컬 우선 간격 반복 시스템**입니다. 복습 일정은 **FSRS 알고리듬**이 관리하며, 각 카드는 텍스트 해시로 식별되어 **Git 저장소**를 통해 버전 관리와 협업이 가능합니다. 복잡한 UI 대신 텍스트 편집기 중심의 워크플로우를 채택해 **입력 마찰을 최소화**하고, 학습 데이터의 완전한 소유권을 유지할 수 있도록 설계되었습니다.

## Topic Body

- **Hashcards**는 **로컬 우선(local-first)** 방식의 **간격 반복 학습(spaced repetition)** 앱으로, **Anki**나 **Mochi**와 유사하지만 **데이터베이스 대신 Markdown 파일**을 사용함  
- 각 플래시카드는 일반 텍스트로 작성되며, **질문(Q)** , **답변(A)** , **클로즈 삭제(C)** 형식을 지원하고, **FSRS 알고리듬**으로 복습 일정을 관리함  
- 카드 데이터는 **텍스트 해시값으로 식별**되며, **SQLite**에 복습 기록이 저장되고, **Git 저장소**를 통해 버전 관리 및 공유 가능  
- 기존 Anki의 **복잡한 인터페이스**와 Mochi의 **비효율적 알고리듬** 문제를 해결하기 위해, **입력 마찰 최소화와 완전한 소유권**을 목표로 설계됨  
- **Markdown 기반, Git 통합, FSRS 스케줄러**의 결합으로, 개발자와 학습자가 **투명하고 자동화된 학습 관리**를 수행할 수 있는 새로운 접근 제공  

---

### Hashcards 개요
- Hashcards는 **로컬에서 실행되는 오픈소스 간격 반복 시스템**으로, Anki나 Mochi와 유사한 학습 경험을 제공  
  - 복습 일정은 **FSRS(Free Spaced Repetition Scheduler)** 알고리듬으로 관리  
  - 웹 인터페이스는 `localhost:8000`에서 실행되며, 복습 기록은 **SQLite 데이터베이스**에 저장  
- 핵심 차별점은 **데이터베이스를 사용하지 않고**, 각 플래시카드를 **Markdown 파일**로 관리하는 구조  
  - 예: `Cards/Math.md`, `Cards/Chemistry.md` 등으로 구성  
  - 각 파일은 여러 개의 Q/A 또는 클로즈 삭제(C) 카드 포함  

### 텍스트 기반 카드 구조
- 플래시카드는 간단한 텍스트 형식으로 작성  
  - `Q:` 질문, `A:` 답변, `C:` 클로즈 삭제 형태  
  - 예시:  
    ```
    Q: What is the role of synaptic vesicles?
    A: They store neurotransmitters for release at the synaptic terminal.
    C: Speech is [produced] in [Broca's] area.
    ```
- **Markdown 문법**을 그대로 활용할 수 있어, 일반 노트 작성과 유사한 경험 제공  
- 복습 실행 명령은 `$ hashcards drill &lt;path&gt;` 형태로 수행  

### 설계 철학과 이점
- Hashcards의 설계는 **“마찰 없는 카드 작성”** 을 최우선 목표로 함  
  - 카드 입력과 편집이 빠르고 직관적이어야 학습량이 증가함  
  - **대괄호([])** 사용으로 클로즈 삭제 입력을 단축 (Shift 키 불필요)  
- **Git 저장소와의 통합**을 통해 다음과 같은 이점 제공  
  - 버전 관리, 변경 추적, 협업 및 공개 공유 가능  
  - **표준 Unix 도구**나 스크립트를 이용한 카드 검색·수정 가능  
  - **CSV 등 구조화된 데이터**로부터 자동 카드 생성 가능  
- 카드가 **텍스트 해시값으로 식별**되어, 내용 기반의 안정적 참조 가능  

### 기존 시스템(Anki, Mochi)에 대한 평가
- **Anki**
  - 장점: 오픈소스, FSRS 지원, 풍부한 통계, 자동 카드 생성(note types) 기능  
  - 단점: **복잡하고 비직관적인 인터페이스**, **WYSIWYG 입력의 비효율성**, **플러그인 의존성**  
- **Mochi**
  - 장점: **깔끔한 UI**, **Markdown 기반 입력**, **단축키 중심 조작**  
  - 단점: **클로즈 삭제 문법이 장황**, **note types 부재**, **단순한 알고리듬**  
  - 기존 알고리듬은 **간단한 배수 기반(multiplier)** 방식으로, 장기 기억 유지에 비효율적  
  - 최근 FSRS 베타 지원을 추가했으나, 기존 카드 스케줄링 문제는 여전함  

### Hashcards의 구현 및 워크플로우
- 사용자는 **텍스트 편집기**로 직접 카드 작성 및 수정 가능  
  - 예: `Q: What is the atomic number of carbon? / A: 6`  
  - 여러 줄 카드나 복잡한 형식도 Markdown 내에서 자연스럽게 표현 가능  
- **지식의 변화에 따른 카드 수정**이 용이  
  - 챕터별 Markdown 파일로 구성해, 교재 구조와 일치시킬 수 있음  
  - 관련 개념을 인접 카드로 배치해, 수정 시 탐색 효율 향상  
- **Git 기반 관리**로 다음 기능 활용 가능  
  - 커밋, 브랜치, 병합, PR 등 완전한 버전 관리  
  - 공개 저장소를 통한 학습 공유 및 협업 가능  

### 텍스트 기반 접근의 시너지
- **편집기 매크로**를 통한 카드 자동 생성 및 탐색 가능  
- **Unix 명령어(wc, awk 등)** 로 카드 통계 및 일괄 수정 가능  
- **스크립트와 Makefile**을 이용해 CSV 등 외부 데이터로부터 자동 카드 생성 가능  
- **GitHub 공개**를 통해 개인의 학습 과정을 공유할 수 있으며, 이는 학습 문화 확산에 기여  

### 결론
- Hashcards는 **간단한 텍스트 포맷**, **고급 스케줄링 알고리듬(FSRS)** , **Git 통합**을 결합한 새로운 형태의 간격 반복 시스템  
- **카드 작성의 마찰을 최소화**하고, **데이터의 완전한 소유권**을 보장하며, **자동화와 확장성**을 동시에 제공  
- 개발자와 학습자 모두에게 **투명하고 제어 가능한 학습 환경**을 제공하는 도구로 제시됨

## Comments



### Comment 47732

- Author: neo
- Created: 2025-12-15T09:36:45+09:00
- Points: 1

###### [Hacker News 의견들](https://news.ycombinator.com/item?id=46264492) 
- 나는 **spaced repetition**의 진짜 힘이 플래시카드 앱이 아니라 **행동 수정**에 있다고 생각함  
  예를 들어, 아내가 치과 문제로 화가 났던 일을 계기로 ‘감정적으로 공감하고 충분히 듣기’를 습관화하기 위해 이 상황을 내 SRS에 넣었음  
  30초 정도 걸리는 이 복습을 평생 반복해도 15분도 안 걸릴 것임  
  그 후로 같은 실수를 한 번도 하지 않았고, 아내는 내가 완전히 달라졌다고 함  
  핵심은 spaced repetition을 ‘학습 도구’가 아니라 **구조화된 강화 시스템**으로 보는 것임
  - 이 예시가 정말 흥미로움. 나는 직업상 문제 해결을 바로 시도하는 타입이라, 누군가가 단지 불만을 이야기하고 싶어할 때 어떻게 반응해야 할지 모르겠음  
    문제를 해결하지 말고 그냥 공감만 해야 한다니, 내 사고방식과는 완전히 다름
  - 나도 이 예시가 마음에 듦. 나는 **Kindle 하이라이트**를 SRS에 그대로 넣어두는데, 주기적인 복습 덕분에 인용문이 자연스럽게 머릿속에 각인됨
  - 정말 멋진 접근임. 어떤 앱을 쓰는지, 얼마나 자주 **inbox를 비우는지**, 그리고 그 과정이 얼마나 걸리는지 궁금함
  - “아내가 화를 냈다”는 부분을 보면, 너만 잘못한 건 아닌 것 같음  
    만약 아내가 먼저 공감 없이 제안했다면, 너도 화가 났을까? 그리고 그때도 이미 늦었을까?
  - 정말 **영감을 주는 사례**임. 사랑하는 사람을 더 잘 이해하기 위해 이런 노력을 한다는 게 대단함  
    SRS에 기록할 때는 구체적인 일화를 넣는지, 아니면 일반화된 패턴을 넣는지 궁금함. 카드의 앞뒤 구조나 cloze 형식이 있는지도 알고 싶음

- 사람들은 이런 프로젝트를 Anki와 비교하는 게 자연스럽지만, Anki에 대한 비판 중 상당수는 **주관적이거나 과장된** 부분이 많다고 느낌  
  Anki의 **계층형 덱 구조**는 오히려 강점이고, WYSIWYG 편집도 대상 사용자에게는 당연한 선택임  
  LaTeX 수식도 간단히 쓸 수 있고, 플러그인은 ‘해킹스럽지만 유용한’ 생태계임  
  여러 대안을 써봤지만 결국 다시 Anki로 돌아오게 됨. 터미널 기반 도구를 좋아하는 나조차도 그만큼 기능적임
  - 그의 리스트는 단순히 **동기 부여의 이유**일 뿐, 다른 사람을 설득하려는 목적이 아님  
    공감이 된다면 프로젝트를 살펴보면 되고, 아니라면 그냥 무시하면 됨
  - 나는 매일 30분 정도 Anki를 씀. 솔직히 완벽하진 않지만, 다른 앱을 찾을 이유가 없을 만큼 충분히 쓸 만함

- 카드가 **텍스트의 해시값**으로 식별된다면, 오타를 수정할 때마다 카드의 복습 이력이 사라지는 것 아닌지 궁금함

- **spaced repetition 기반 소셜 네트워크**가 가능할지 궁금함  
  피드에서 마음에 드는 글을 ‘복습 예약’처럼 표시하면, 그게 일종의 리트윗이 되면서 **지속적으로 가치 있는 콘텐츠**가 확산될 수 있을 것 같음

- 나는 **knowledge base + spaced repetition** 프로젝트를 진행 중임  
  Markdown 파일이 정말 편리함 — 어디서나 볼 수 있고, Git으로 버전 관리가 가능하며, **cross-linking**이 자유로움  
  프로젝트 링크: [https://github.com/odosui/mt](https://github.com/odosui/mt)
  - 이거 정말 흥미로움. 나는 **지식 중심 과목**을 공부 중인데, 노트 안에서 바로 플래시카드를 만들고 복습할 수 있는 도구를 찾고 있었음  
    로컬 노트를 유지하고 싶어서 클라우드 기반 솔루션은 피했는데, Markdown을 Anki로 파싱하는 도구들이 있다는 걸 알게 됨

- **Emacs 사용자**라면 plain text 기반의 spaced repetition 도구인 [org-drill](https://orgmode.org/worg/org-contrib/org-drill.html)을 추천함

- 나는 **Ankivalenz**라는 라이브러리를 만들었음. 구조화된 Markdown을 Anki 덱으로 변환해줌  
  예를 들어, `Path: Solar System > Planets > Color`처럼 계층 구조가 카드에 포함되어 **맥락 있는 복습**이 가능함  
  일반 노트와 카드가 같은 Markdown 파일 안에서 공존할 수 있음  
  [https://github.com/vangberg/ankivalenz/](https://github.com/vangberg/ankivalenz/)

- 다른 SRS 프로젝트들이 Anki에서 **데이터 가져오기(import)** 기능을 제대로 구현하지 않아 아쉬움  
  대부분의 사용자는 이미 수천 장의 카드를 Anki에 가지고 있어서 쉽게 옮기기 어려움  
  Anki의 데이터 포맷은 복잡하지만 SQLite 기반이라 공유는 가능함
  - 나도 직접 플래시카드 앱을 만들며 Anki import 기능을 구현해봤는데, 처음엔 단순히 front/back만 가져와서 **데이터 손실**이 컸음  
    Anki의 **노트–모델–템플릿 구조**를 이해하고 나서야 그 정교함을 깨달음  
    텍스트 기반의 **공유 가능한 덱 포맷**이 있다면 GitHub에서 협업하기 훨씬 쉬울 것 같음  
    각 노트를 개별 파일로 두고 고유 ID를 부여하면 업데이트 관리도 용이할 것임
  - 많은 개발자들이 Anki가 최근 **Rust 기반으로 리팩터링**된 걸 모르는 듯함  
    이제 핵심 로직이 Rust crate로 분리되어 있어서, 같은 DB를 그대로 사용해 **대체 프론트엔드**를 쉽게 만들 수 있음
  - SQL dump도 결국 텍스트 파일이니, GitHub에서 공유하기 어렵지 않을 것 같음

- 나는 데이터 입력을 위해 **Google 스프레드시트**를 쓴 적이 있음  
  UUID로 각 행을 고유하게 관리하면 수정 시에도 추적이 쉬움  
  같은 데이터를 기반으로 여러 덱(예: 중국어 병음→한자, 한자→영어)을 만들 수 있음  
  이런 시트를 텍스트 포맷으로 백엔드화한 인터페이스가 있다면 정말 좋을 것 같음
  - 하지만 **content-addressing** 방식이라면 카드 수정이 어렵다는 점이 단점으로 보임

- 오랫동안 spaced repetition을 써온 입장에서 몇 가지 팁을 공유함  
  1️⃣ **무엇이 중요한지 결정**해야 함. 사소한 정보까지 카드로 만들면 매일 수백 장을 복습하게 됨  
  2️⃣ 중요한 개념은 여러 각도에서 이해를 테스트하는 **다양한 카드**로 구성해야 함  
  3️⃣ 일정 기간 후에는 **2차 카드**나 실제 적용으로 전환해야 함. 1년 동안 한 번도 쓰지 않은 개념이라면 중요하지 않은 것일 수 있음  
  결론적으로 spaced repetition은 매우 효율적인 학습 도구이지만, **우선순위 설정 실패**가 가장 큰 함정임
