בלוג

12 באוגוסט 2026

איך Routines שומרת זיכרון AI: markdown, SQLite ו-FTS5

Routines כותבת כל הערה כ-markdown רגיל בתיקייה שאתם בוחרים. SQLite FTS5 מאנדקסת אותה על הדיסק. בטלו ועדיין תוכלו לפתוח את ה-vault ב-Obsidian.

רוב עוזרי ה-AI כותבים את ההקשר שלכם למסד נתונים שהספק שולט בו. מבטלים את המנוי וההקשר נעלם איתו. Routines שומרת זיכרון אחרת: כל הערה שהאפליקציה יוצרת היא קובץ markdown פשוט בתיקייה שאתם בוחרים, עם אינדקס SQLite + FTS5 שנמצא על הדיסק שלכם לצד הקבצים. האפליקציה היא שכבה מעל הקבצים. הקבצים הם הדבר עצמו.

זוהי ה-write-up ההנדסי שאנחנו מפרסמים ב-Show HN. הוא מכסה את ארכיטקטורת האחסון, מסלול השאילתה, והפשרות שעשינו, כפי שהן נשלחות בגרסה החתומה והמאושרת הנוכחית.

שלוש השכבות

מחסנית הזיכרון בנויה משלוש שכבות:

  • קובצי markdown: שכבת הארטיפקט. כל הערה היא קובץ .md. קובץ אחד לכל הערה, בספריה שבחר המשתמש.
  • SQLite + FTS5: שכבת האינדקס. מסד נתונים SQLite עם טבלה וירטואלית FTS5 שמשקפת את תוכן ה-vault ותומכת בחיפוש טקסט מלא.
  • שקלול רלוונטיות: שכבת הדירוג. תוצאות FTS5 ממוינות מחדש לפני שמגיעות לחלון ההקשר של ה-AI.

כל שכבה קריאה עם כלי תקן. פתחו את ספריית ה-vault ב-Finder והקבצים שם. פתחו את מסד הנתונים SQLite בכל לקוח SQLite והאינדקס שם. שום דבר לא דורש שהאפליקציה תרוץ.

שכבה 1: קובצי markdown

ה-vault הוא ספריה שהמשתמש בוחר בזמן ההגדרה. Routines יוצרת את הספריה אם היא לא קיימת, או שהמשתמש יכול להפנות אותה לתיקייה קיימת של הערות, ל-vault של Obsidian, או לספריה של קבצים מיוצאים. כל מה שנמצא שם נקרא.

כל הערה ש-Routines כותבת היא קובץ .md עם YAML frontmatter. ה-frontmatter מכיל כותרת, תאריך, כל תגיות שהמודל הקצה בזמן הייבוא או היצירה, ושדה מקור להערות שהגיעו מפגישה או מקובץ מיובא. הגוף הוא תוכן ההערה.

הקובץ הוא הארטיפקט הקנוני. Routines קוראת וכותבת לאותם קבצים שגם Obsidian, grep, git, וכל עורך טקסט אחר מפעיל. אין שלב המרה. אין פורמט קנייני.

ההערות שלכם הן markdown פשוט בתיקייה שאתם בוחרים, קריאות ב-Obsidian.

כש-Routines כותבת הערת פגישה, היא יוצרת קובץ .md ב-vault. כשאתם כותבים הערה בעורך של האפליקציה, היא כותבת קובץ .md. כשאתם מייבאים PDF, Routines קוראת אותו, מסכמת אותו עם מודל ה-AI המחובר, וכותבת את התוצאה כקובץ .md. המנגנון זהה בכל שלושת המקרים.

סביבת העבודה של Routines מציגה vault של קובצי markdown פשוטים בסרגל הצד השמאלי עם תיקיות ממוספרות והערות, עם קובץ פתוח בעורך ועץ הספריות גלוי

ה-vault הוא ספריה של קובצי markdown. סרגל הצד הוא עץ קבצים, לא רשימה קניינית.

שכבה 2: SQLite + FTS5

FTS5 הוא תוסף חיפוש הטקסט המלא המובנה של SQLite. הוא נשלח בהפצה הרגילה של SQLite וזמין מאז SQLite 3.9.0, שיצא באוקטובר 2015. לא הוספנו ספריית חיפוש. השתמשנו במה שכבר היה ב-macOS.

ההגדרה היא הצהרת CREATE VIRTUAL TABLE אחת וסט טריגרים ששומרים על האינדקס מסונכרן עם הוספות, עדכונים ומחיקות. FTS5 מבצע טוקנייזציה לטקסט המסמך, בונה אינדקס הפוך, ותומך בדירוג BM25. BM25 שוקל תדירות מונחים מול תדירות מסמכים בכל הקורפוס: מונחים שמופיעים בהרבה מסמכים תורמים פחות להתאמה ממונחים ספציפיים לקבוצה קטנה של הערות.

מסד הנתונים SQLite נמצא בספריית ה-vault לצד ההערות. הוא קובץ על הדיסק. כל לקוח SQLite יכול לפתוח אותו ולהריץ שאילתות ישירות.

יש תהליך רקע שאנחנו קוראים לו "dreaming". הוא רץ מדי פעם, סורק את ספריית ה-vault, מגלה אילו קבצים השתנו מאז המחזור האחרון, ומעדכן את אינדקס ה-FTS5 עבור אותם קבצים. הערה שהמשתמש זה עתה כתב או קובץ שהאפליקציה זה עתה ייבאה ניתן לחיפוש תוך שניות מרגע שהמחזור הסתיים. קובץ שנמחק עוזב את האינדקס במחזור הבא.

פאנל הזיכרון של Routines מציג את תהליך שחזור האינדקס FTS5 ברקע, עם מחוון התקדמות והערות שמעובדות במחזור ה-dreaming

מחזור ה-dreaming בונה מחדש את אינדקס FTS5 ברקע. פאנל הזיכרון מציג מתי מחזור רץ.

עיצוב ה-dreaming אומר שהאפליקציה לא חוסמת על עדכוני אינדקס. כתיבת הערת פגישה לא מחייבת המתנה לסיום האינדקסציה. ההערה קיימת כקובץ מיד, והאינדקס מדביק ב מחזור הבא.

שכבה 3: שקלול רלוונטיות

FTS5 מחזיר רשימה מדורגת BM25 של הערות תואמות. BM25 מצוין במציאת טקסט רלוונטי מבחינה נושאית אך אינו יודע דבר על הקשר: הערה מלפני שלוש שנים שמכילה בדיוק את ביטוי השאילתה תדורג מעל הערה מהבוקר שמתאימה פחות במדויק.

אנחנו ממיינים מחדש את תוצאות FTS5 לפני שמכניסים אותן לחלון ההקשר של ה-AI. הדירוג מחדש מביא בחשבון עדכניות, תדירות גישה, ואותות חשיבות מפורשים. הזיכרון שקול-רלוונטיות, וזה פיצ'ר ששוחרר. אנחנו עדיין מכוונים את המשקולות ולא מפרסמים את הנוסחה המדויקת, אבל הכיוון יציב: הערות שנוצרו לאחרונה ואליהן ניגשו לאחרונה עולות, הערות ישנות שאיש לא נגע בהן יורדות.

התוצאה היא רשימת הערות שגם רלוונטית מבחינה נושאית וגם מתאימה הקשרית. אותן הערות מוזנות לפרומפט המערכת כהקשר לפני קריאת ה-LLM.

איך שאילתה מגיעה להערות שלכם

כשהמשתמש שואל את עוזר ה-AI שאלה, או כשרוטינה מתוזמנת מופעלת, המסלול נראה כך:

  1. טקסט השאלה או המשימה הופך למחרוזת השאילתה של FTS5.
  2. Routines מריצה את שאילתת ה-FTS5 מול אינדקס SQLite המקומי.
  3. התוצאות המובילות חוזרות, ממוינות לפי ציון BM25.
  4. מדרג הרלוונטיות ממיין מחדש את הרשימה.
  5. ה-N הערות המובילות מעוצבות ומוזנות לפרומפט המערכת כהקשר.
  6. קריאת ה-LLM עוברת מה-Mac של המשתמש לספק המודל המחובר שלו.

Routines היא אגנוסטית למודל. המשתמש מביא מפתח API עבור Anthropic, OpenAI, או OpenRouter. המפתח מאוחסן ב-macOS Keychain. הבקשה עוברת מה-Mac של המשתמש לספק, עם Routines כממסר מקומי.

גרף הידע

סביבת העבודה מציגה גם תצוגת גרף של ה-vault. הגרף בנוי מקישורים מבניים: wikilinks בגוף ה-markdown וב-frontmatter, בנוסף לאחורי-הפניות ש-Routines זיהתה בזמן הייבוא. הוא לא מיוצר על ידי AI ולא סמנטי. צומת הוא הערה, קשת היא קישור שקיים בטקסט.

הגרף נמצא באותו מסד נתונים SQLite כמו אינדקס FTS5, בטבלה נפרדת, ומתעדכן באותו מחזור dreaming.

גרף הידע של Routines מציג קשרים בין קובצי markdown כצמתים וקשתות, כשכל צומת מייצג הערה אחת ב-vault

תצוגת הגרף. כל צומת הוא קובץ markdown, כל קשת היא קישור בטקסט. ללא AI, ללא הסקה, ללא embeddings.

מה קורה כשמבטלים

ספריית ה-vault נשארת במקום שבחרתם. קובצי ה-markdown עדיין שם. מסד הנתונים SQLite עדיין שם. אף אחד מהם לא דורש שהאפליקציה תרוץ.

בטלו אותנו והמוח השני עדיין נפתח.

פתחו את ה-vault ב-Obsidian, חפשו בו עם grep, נהלו אותו ב-git, או העבירו אותו לכל עורך markdown אחר. אין שלב ייצוא, כי אין פורמט קנייני לייצא ממנו. הקבצים היו שלכם תמיד.

הערות פגישה ומסלול התמלול

כשפגישה מסתיימת, Routines כותבת את התמליל וסיכום ה-AI כקובץ .md ב-vault. הקובץ עוקב אחרי אותה קונבנציית שמות ו-frontmatter כמו כל הערה אחרת.

מסלול השמע: שמע פגישות ודיקטציה עובר ל-Deepgram, שירות speech-to-text מתארח, עם מודל Whisper מקומי כגיבוי. בתוכנית Pro, Routines מנהלת את הקשר עם Deepgram ומחייבת לפי שימוש: 50 שעות בחודש כלולות, ושעות נוספות מחויבות בנפרד. בתוכנית Free, המשתמש מגדיר מפתח Deepgram משלו. הפרומפטים שמייצרים את סיכום הפגישה עוברים לספק המודל המחובר של המשתמש דרך מפתח ה-API שלו.

הפשרות שעשינו

FTS5 מבוסס מילות מפתח, לא סמנטיקה. אין embeddings בארכיטקטורה הזו. לבסיס ידע אישי של משתמש יחיד עם כמה אלפי הערות, BM25 עם שקלול רלוונטיות מניב תוצאות שימושיות. הפער אמיתי: FTS5 לא ימצא "לקוח תסכל מהלו"ז" מול הערה שאומרת "לקוח כועס על עיכובים" אלא אם אחד הביטויים מופיע בשני. אנחנו יודעים זאת ומקבלים זאת לעת עתה. העלות התפעולית של תחזוקת אינדקס וקטורי לצד קובצי ה-markdown לא הצדיקה את שיפור ה-recall בסקאלה זו.

ה-vault נמצא על Mac אחד. אם ה-Mac כשל ללא גיבוי, ה-vault יכול להיכשל איתו. אנחנו שולחים סנכרון ענן למשתמשים שרוצים יתירות, וה-vault הוא ספריה רגילה, כך ש-Time Machine, git, rsync, וכל כלי גיבוי עובדים בלי מעורבות האפליקציה. לא מאלצים סנכרון כברירת מחדל.

האינדקס הוא תמונת מצב. מחזור ה-dreaming הוא מחזורי, לא רציף. עוזר ה-AI קורא מה ש-FTS5 מציג בזמן השאילתה. למקרה שימוש של רישום הערות וזיכרון, זה בסדר. זה לא יעבוד לכלי שיתוף פעולה בזמן אמת.

הפשרות האלה משקפות את מה שלדעתנו חשוב בעוזר AI אישי על Mac: בעלות על הארטיפקט ראשית, פשטות תפעולית שנייה, איכות חיפוש שלישית. הקבצים הם הדבר. האינדקס קיים כדי לשרת את הקבצים, לא להיפך.


הורידו את Routines ונסו את הזיכרון חינם 7 ימים

אפשר לפתוח את ספריית ה-vault ולבדוק את מסד הנתונים SQLite בכל עת. הם על הדיסק שלכם.

ראו איך פיצ'ר הזיכרון עובד באפליקציה, קראו על בניית מוח שני מקבצים שכבר יש לכם, או ראו את מתכון תקציר הבוקר כדי לראות את אחזור הזיכרון בפעולה.


שאלות נפוצות

מה פורמט הקובץ שבו Routines משתמשת להערות?

markdown פשוט. כל הערה היא קובץ .md עם YAML frontmatter שמכיל כותרת, תאריך, תגיות ושדה מקור. הגוף הוא תוכן ב-CommonMark רגיל. אין פורמט קנייני ואין blobs בינאריים.

אפשר להשתמש ב-vault קיים של Obsidian עם Routines?

כן. הפנו את נתיב ה-vault אל ספריית ה-Obsidian בזמן ההגדרה. Routines קוראת וכותבת את אותם קובצי .md. אינדקס ה-FTS5 הוא קובץ .db נוסף בספריית ה-vault. שום דבר לא מומר ושום דבר לא ננעל.

מה זה FTS5 ולמה בחרתם בו?

FTS5 הוא תוסף חיפוש הטקסט המלא המובנה של SQLite. הוא כבר מותקן על כל Mac, תומך בדירוג BM25, ושמר על ארכיטקטורת ה-vault פשוטה: ספריה אחת, קובץ .db אחד לצד ההערות, מחזור ברקע אחד לסנכרון.

כמה פעמים האינדקס מתרענן?

מחזור ה-dreaming רץ מדי פעם ברקע. הערה חדשה או קובץ מיובא ניתנים לחיפוש תוך שניות מרגע שהמחזור מסתיים. לא מפעילים אותו ידנית. פאנל הזיכרון מציג מתי מחזור רץ.

האם Routines שולחת את ההערות שלי לשרת?

ההערות נשארות בתיקייה שבחרתם. הן לא עוזבות את ה-Mac שלכם כחלק מהאינדקסציה. כשעוזר ה-AI אוחר הקשר לשאלה, תוכן ההערות הרלוונטיות עובר לספק המודל המחובר שלכם כחלק מהפרומפט. Routines לא שומרת את ההערות שלכם בשרת.

שמע פגישות ודיקטציה עובר ל-Deepgram לתמלול, עם Whisper מקומי כגיבוי. בתוכנית Pro Routines מנהלת את הקשר, בתוכנית Free אתם מגדירים מפתח Deepgram משלכם.

מה קורה להערות אם מבטלים?

שום דבר לא משתנה בספריית ה-vault. קובצי ה-markdown נשארים על ה-Mac שלכם, קריאים בכל עורך טקסט, ב-Obsidian, או בסייר הקבצים. מסד הנתונים SQLite נשאר קריא בכל לקוח SQLite. בטלו אותנו והמוח השני עדיין נפתח.

אפשר לחפש ב-vault בלי לפתוח את האפליקציה?

כן. grep -r "מונח החיפוש" ~/ה-vault-שלכם עובד. גם חיפוש ב-Obsidian, Alfred, Raycast, וספוטלייט של macOS אם ספריית ה-vault מאונדקסת. אינדקס ה-FTS5 של Routines הוא שכבה נוספת, לא תחליף למערכת הקבצים.

למה לא embeddings וקטוריים?

לבסיס ידע אישי עם כמה אלפי הערות, BM25 עם שקלול רלוונטיות עובד מספיק טוב. הפער לאחזור מבוסס embeddings אמיתי אבל מקובל בסקאלה זו. ל-FTS5 יש יתרון נוסף: האינדקס ניתן לבדיקה. אפשר לפתוח את ה-.db ולראות בדיוק מה הוא מכיל. אינדקס וקטורי לא מציע זאת.

פוסטים קשורים

נסו את זה על ה-Mac שלכם.

Routines שומרת את ההערות, התמלולים והפלטים של השגרות שלכם כקבצי markdown וב-SQLite על המחשב שלכם, והם נשארים שם אלא אם תפעילו את Cloud Sync.

הורדה