Gnosis User Manual

Table of Contents


1 Introduction

Gnosis is a personal knowledge management and spaced repetition system for Emacs. It integrates two complementary subsystems in a single package: a Zettelkasten-style note system called nodes, and a flashcard-based self-testing system built around themata. Both subsystems share a single SQLite database, and their contents are designed to be linked together so that flashcard questions can refer directly to the notes they are drawn from.

The name gnosis (Greek: γνῶσις, knowledge) reflects the package’s philosophical orientation: the goal is not mere memorization but the deliberate construction of knowledge over time.


1.1 Why Gnosis

Most spaced repetition tools treat flashcards as isolated units. You create a card, review it, and the system schedules the next review. The cards have no relationship to each other or to anything outside the review loop.

Most note-taking tools do the opposite: they help you build a web of interconnected ideas, but they offer no mechanism for systematically testing and reinforcing what you have written.

Gnosis bridges these two approaches. Your notes and your review material live in the same system, linked together. When you write a node about a topic, you can create themata whose questions reference that node. When you review, you can review all the questions linked to a given note, or follow the link graph to review related topics. The goal is a single system where understanding and recall reinforce each other.


1.2 The Two Subsystems


1.2.1 Nodes

Nodes are Zettelkasten-style notes stored as plain org-mode files. Each node is a file, or a heading within a file, identified by a unique UUID stored as an ‘#+id:’ org property. Nodes are indexed in the database so that they can be searched, browsed by tag, and linked together. Links between nodes use standard org-mode ‘[[id:UUID]]’ syntax, which means they remain compatible with any tool that understands org-id links.


1.2.2 Themata

A thema (Greek: θέμα, a subject set before one; plural themata) is a review card. Each thema consists of a keimenon (Greek: κείμενον, the text that underlies something; the question or prompt), an answer (the expected response), and an optional parathema (Greek: παράθεμα, a side-text; supplementary context shown after the answer). Themata are reviewed using a spaced repetition algorithm that adapts the interval between reviews based on performance.

Themata support five question types:

  • Basic: A direct question with a typed answer.
  • Double: Two prompts, each with its own answer, presented in sequence.
  • MCQ (Multiple Choice Question): The user selects one correct option from a list.
  • Cloze: A sentence with one or more words obscured; the user types the missing text.
  • MC-Cloze (Multiple Choice Cloze): A cloze question where the missing text is chosen from a list of options.

1.3 Greek Terminology Reference

The following terms appear throughout this manual and in user-facing prompts:

  • Gnosis (γνῶσις, knowledge): the name of the package, and also the name of the internal score used by the spaced repetition algorithm to track performance per thema.
  • Thema (θέμα, topic or subject; plural themata): a single review card.
  • Keimenon (κείμενον, underlying text): the question or prompt shown during review.
  • Parathema (παράθεμα, side-text): supplementary text shown after answering, used to add context or a longer explanation.
  • Anagnosis (ἀνάγνωσις, recognition): an event in the algorithm that fires after a streak of consecutive successes or failures, adjusting the gnosis score.
  • Epignosis (ἐπίγνωσις, full knowledge): the increment applied to the gnosis score on a correct answer during an anagnosis event.
  • Agnoia (ἄγνοια, ignorance): the decrement applied on an incorrect answer during an anagnosis event.
  • Amnesia (ἀμνησία, forgetting): the multiplier applied to the interval on failure.
  • Lethe (λήθη, forgetting; the river of oblivion): the threshold of consecutive failures that triggers an interval reset.
  • Proto (πρῶτο, first): the sequence of fixed intervals used during the initial learning phase before the adaptive algorithm takes over.

1.4 Data Storage

All data lives in a single SQLite database at ‘GNOSIS-DIR/gnosis.db’. The database is created and migrated automatically; no manual setup or maintenance is required. Gnosis requires Emacs 29.1 or later (for built-in SQLite support) and the ‘compat’ library. There are no other external dependencies.


2 Installation and Setup


2.1 Requirements

Gnosis requires:

  • GNU Emacs 29.1 or later, compiled with SQLite support. Verify this with (fboundp 'sqlite-open); it should return ‘t’.
  • The ‘compat’ library, available from GNU ELPA.

No external programs are required. Git is optionally used by the version control integration (gnosis-vc-auto-push), but is not a hard dependency.


2.2 Installing from GNU ELPA

Gnosis is available from GNU ELPA. To install it:

M-x package-install RET gnosis RET

Or with use-package:

(use-package gnosis
  :ensure t)

2.3 Basic Configuration

The minimal configuration requires only specifying where gnosis should store its files. All directories are created automatically on first use.

(use-package gnosis
  :ensure t
  :custom
  ;; Directory for the gnosis database and related files.
  ;; Defaults to ~/.emacs.d/gnosis/
  (gnosis-dir "~/gnosis/")

  ;; Directory where node (note) files are stored.
  ;; Defaults to ~/Notes/
  (gnosis-nodes-dir "~/Notes/")

  ;; Directory for journal files. Defaults to GNOSIS-NODES-DIR/journal/
  (gnosis-journal-dir "~/Notes/journal/"))

2.4 Key Directories


2.4.1 gnosis-dir

The gnosis data directory. This is where ‘gnosis.db’ is stored. It is also the root used for version control when gnosis-vc-auto-push is enabled. Defaults to ‘{user-emacs-directory}/gnosis/’.

(setopt gnosis-dir (expand-file-name "gnosis/" user-emacs-directory))

2.4.2 gnosis-nodes-dir

The directory containing your note files. All ‘.org’ and ‘.org.gpg’ files in this directory are indexed by gnosis. Defaults to ‘~/Notes/’.

(setopt gnosis-nodes-dir "~/Notes/")

2.4.3 gnosis-journal-dir

The directory for journal entry files. Defaults to a ‘journal/’ subdirectory inside gnosis-nodes-dir. Journal files are indexed separately from regular nodes but use the same underlying mechanism.

(setopt gnosis-journal-dir (expand-file-name "journal/" gnosis-nodes-dir))

2.5 Upgrading from org-gnosis

If you previously used org-gnosis as a separate package, gnosis automatically imports your org-gnosis database when it first detects the old data. No manual action is required beyond installing the new version.


2.6 Version Control

Gnosis can automatically push your database to a remote Git repository after each review session. This is controlled by gnosis-vc-auto-push.

(setopt gnosis-vc-auto-push t)

When this is ‘t’, gnosis pushes gnosis-dir at the end of every review session. To use this, initialize ‘gnosis-dir’ as a Git repository and configure a remote before enabling this option.


2.7 Completing Read Integration

Gnosis respects your preferred completion framework. The gnosis-completing-read-function variable defaults to completing-read when Vertico, Ivy, Helm, or fido-mode is detected, and to ido-completing-read otherwise.

;; Explicitly set if auto-detection does not work for your setup:
(setopt gnosis-completing-read-function #'completing-read)

2.8 Full Example Configuration

(use-package gnosis
  :ensure t
  :custom
  (gnosis-dir "~/gnosis/")
  (gnosis-nodes-dir "~/Notes/")
  (gnosis-journal-dir "~/Notes/journal/")
  (gnosis-vc-auto-push nil)
  (gnosis-center-content-during-review t)
  (gnosis-review-new-first t)
  (gnosis-new-themata-limit nil))

3 Nodes

Nodes are gnosis’s note-taking system. A node is an org-mode heading (or an entire org file) that has been assigned an org ID. Gnosis indexes all nodes in its database, enabling fast search, tag-based browsing, backlink navigation, and linking from themata.

The node system is deliberately minimal. Files live on disk as plain org-mode files, readable and editable without gnosis. The database is a derived index that can be rebuilt at any time from the files themselves.


3.1 What Makes an Org Heading a Node

Any org-mode heading that has an ‘:ID:’ property becomes a node. The file-level title (expressed with ‘#+title:’) paired with a file-level ID also constitutes a node. Gnosis assigns UUIDs using org-id-get-create when it creates a new file.

A file may contain multiple nodes if multiple headings carry IDs. In that case, gnosis tracks the hierarchy: a heading’s title is stored as ‘ParentTitle:ChildTitle’ to reflect its position in the outline.


3.2 Creating and Finding Nodes


3.2.1 gnosis-nodes-find

The primary command for opening a node is gnosis-nodes-find. It presents a completing-read prompt listing all known node titles. Select an existing title to open that node’s file, positioned at the correct heading.

If you type a title that does not match any existing node, gnosis creates a new file for it in gnosis-nodes-dir, prompts you to choose a template, and opens the file in a new buffer.


3.2.2 gnosis-nodes-find-by-tag

To browse nodes by tag, use gnosis-nodes-find-by-tag. It prompts for a tag name drawn from existing tags, then presents all nodes carrying that tag for selection.


3.3 File Naming

When gnosis creates a new node file, the filename is derived from the node title. By default, filenames are prefixed with a timestamp to ensure uniqueness and to prevent collisions when two nodes share similar titles.


3.3.1 gnosis-nodes-timestring

This variable controls the timestamp prefix format. It is a format-time-string format string. The default is "%Y%m%d%H%M%S", producing filenames like ‘20240315143022--My_Topic.org’.

Set it to ‘nil’ to use the title alone as the filename, with no timestamp prefix:

;; Use timestamp prefix (default):
(setopt gnosis-nodes-timestring "%Y%m%d%H%M%S")

;; Use title only, no timestamp:
(setopt gnosis-nodes-timestring nil)

When gnosis-nodes-timestring is ‘nil’ and a file with the same title already exists, gnosis will ask whether you want to visit the existing file or abort.


3.3.2 GPG Encryption

Setting gnosis-nodes-create-as-gpg to ‘t’ causes all new node files to be created with a ‘.gpg’ suffix, triggering Emacs’s built-in EasyPG encryption on save.

(setopt gnosis-nodes-create-as-gpg nil)  ; default

This setting affects only newly created files; existing ‘.org’ files are not retroactively encrypted.


3.4 Displaying Tags in Completion

By default, the completing-read prompt for nodes displays only titles. Set gnosis-nodes-show-tags to ‘t’ to display each node’s tags alongside its title, rendered with the gnosis-nodes-face-tags face.

(setopt gnosis-nodes-show-tags t)

Tags are displayed in the format ‘Title #tag1#tag2’ and are stripped from the string before the title is used for lookup.


3.5 Templates

When gnosis creates a new node, it optionally inserts template content into the file. Templates are configured via gnosis-nodes-templates.


3.5.1 gnosis-nodes-templates

This variable is a list of ‘(NAME FUNCTION)’ pairs. Each function takes no arguments and returns a string that is inserted into the new file after the initial ‘#+title:’ and ‘#+filetags:’ lines.

The default templates are:

  • Empty: no content.
  • Annotated: sections for Summary, Notes, and References.
  • Reading: sections for Key Ideas, Quotes, and Notes, with an optional Author field.
(setopt gnosis-nodes-templates
        '(("Empty" (lambda () ""))
          ("Annotated" (lambda ()
                         (concat "{*} Summary\n\n"
                                 "{*} Notes\n\n"
                                 "{*} References\n")))
          ("Reading" (lambda ()
                       (let ((author (read-string "Author: ")))
                         (concat "{*} Key Ideas\n\n"
                                 "{*} Quotes\n\n"
                                 "{*} Notes\n"
                                 (unless (string-empty-p author)
                                   (format "\nAuthor: %s\n" author))))))))

3.5.2 The ‘{*}’ Heading Marker

Template strings use ‘{*}’ as a placeholder for an org heading. When gnosis inserts a template, it expands each ‘{*}’ to the appropriate number of asterisks for the context in which the template is being inserted. If you are inserting into a new top-level file, ‘{*}’ becomes ‘*’. If you are inserting under an existing level-2 heading, ‘{*}’ becomes ‘***’.

Use ‘{**}’ for a heading one level deeper than the base, ‘{***}’ for two levels deeper, and so on.

For example, the template string:

{*} Key Ideas

{**} Subpoint

Inserted at the top level of a new file produces:

* Key Ideas

** Subpoint

Inserted under an existing ‘**’ heading produces:

*** Key Ideas

**** Subpoint

3.5.3 Inserting a Template Manually

Use gnosis-nodes-insert-template to insert a template at point in an existing buffer. It detects whether the buffer is a journal file and selects the appropriate template list automatically.


3.6 Automatic Sync

gnosis-nodes-mode is a minor mode that is automatically activated for any org file located in gnosis-nodes-dir or gnosis-journal-dir. When this mode is active, saving the buffer updates that file’s entries in the database.


3.6.1 Manual Sync

To sync all files without waiting for saves, use gnosis-nodes-db-sync. Called interactively without a prefix argument, it updates only files that have changed since the last sync. Called with a prefix argument (C-u M-x gnosis-nodes-db-sync), it purges all node entries and rebuilds the database from scratch.

;; Sync only changed files:
M-x gnosis-nodes-db-sync

;; Force full rebuild:
C-u M-x gnosis-nodes-db-sync

3.6.2 Force Rebuild

gnosis-nodes-db-force-sync provides a dedicated command for the full rebuild case, with a confirmation prompt before proceeding.


3.9 Tags

Tags in gnosis nodes come from two sources:

  1. File-level tags: The ‘#+filetags:’ keyword at the top of the org file. These apply to the file-level node.
  2. Heading-level tags: Tags applied to individual org headings using standard org syntax (‘:tag:’ at the end of the heading line). These are inherited downward through the outline.

3.9.1 Adding Tags

Use gnosis-nodes-insert-tags to add tags to the current node interactively. It presents a completing-read prompt supporting multiple selections (separated by commas). If the cursor is on a heading, the tags are added to that heading; otherwise they are inserted as filetags.

To add a single existing tag to the ‘#+filetags:’ line, use gnosis-nodes-insert-filetag. The command completes against tags that already exist in the database, which helps maintain consistent tag names across notes.


4 Journal

The journal module provides date-based entry creation with optional TODO carry-forward and checkbox-to-done tracking. Journal entries are org-mode files (or headings within a single file) stored in gnosis-journal-dir. They are indexed alongside nodes but in a separate table.


4.1 Creating Entries


4.1.1 gnosis-journal

The quickest way to open today’s journal entry is gnosis-journal.


4.1.2 gnosis-journal-find

gnosis-journal-find accepts an optional title argument. Called interactively without arguments, it prompts for an existing or new journal entry title via completing-read. If the entry already exists, gnosis opens it; if it does not, gnosis creates a new file (or heading, in single-file mode) for it.


4.2 File vs Single-File Mode

Gnosis supports two modes for journal storage:


4.2.1 Separate Files (Default)

By default, each journal entry is its own file in gnosis-journal-dir. File naming follows the same rules as nodes (timestamp prefix by default, configurable via gnosis-nodes-timestring).

;; Default: separate files per entry
(setopt gnosis-journal-file nil)

4.2.2 Single Journal File

Setting gnosis-journal-file to a file path causes all journal entries to be added as top-level headings in that file. Each entry is a ‘* YYYY-MM-DD’ heading with an org ID.

(setopt gnosis-journal-file "~/Notes/journal/journal.org")

When this is set, gnosis creates the file if it does not exist, adding an appropriate ‘#+title:’ and ‘#+filetags:’ header. New entries are appended at the end of the file.


4.3 GPG Encryption

Like nodes, journal files can be created with a ‘.gpg’ suffix. The option gnosis-journal-as-gpg controls this independently from gnosis-nodes-create-as-gpg.

(setopt gnosis-journal-as-gpg nil)  ; default

4.4 Templates

Journal templates follow the same mechanism as node templates. They are configured via gnosis-journal-templates.


4.4.1 gnosis-journal-templates

(setopt gnosis-journal-templates
        '(("Default" (lambda ()
                       (concat "{*} Daily Notes\n\n"
                               "{*} Goals\n"
                               (gnosis-journal-todos))))
          ("Empty" (lambda () ""))))

The default template calls gnosis-journal-todos, which produces a checkbox list of any TODO items from gnosis-journal-todo-files that are due today (or have no scheduled date). The ‘{*}’ heading marker works exactly as in node templates.


4.5 “TODO” Integration

The journal module can pull TODO items from your org agenda files into each journal entry as checkboxes. This provides a daily task list drawn automatically from your existing TODO state.


4.5.1 gnosis-journal-todo-files

The list of org files from which TODOs are pulled. Defaults to org-agenda-files.

(setopt gnosis-journal-todo-files org-agenda-files)

4.5.2 gnosis-journal-todo-keywords

The TODO keywords recognized when scanning files. Defaults to org-todo-keywords. Keywords that appear after the vertical bar ‘|’ (which in standard org convention separates active from done states) are ignored.

(setopt gnosis-journal-todo-keywords org-todo-keywords)

4.5.3 Bullet Point Character

The character used to introduce each TODO checkbox in the journal template output is configured via gnosis-journal-bullet-point-char. It defaults to ‘+’, which org-mode renders as a plain-list item.

(setopt gnosis-journal-bullet-point-char "+")

4.5.4 How TODO Carry-Forward Works

When a journal entry’s template is applied, gnosis-journal-todos scans gnosis-journal-todo-files for headings whose TODO keyword matches an active keyword from gnosis-journal-todo-keywords. It includes items that either have no scheduled date or are scheduled for today. Each included item is rendered as a checkbox line:

+ [ ] Write documentation
+ [ ] Review pull requests

4.6 Checked Item Tracking

When you mark a checkbox in a journal entry as done (‘[x]’) and save the buffer, gnosis identifies all checked items, finds the corresponding TODO headings in gnosis-journal-todo-files by title, and marks them as ‘DONE’. It also records a ‘LAST_DONE_DATE’ property on the heading so that the same item is not marked done twice in one day.

In single-file mode (gnosis-journal-file non-nil), gnosis restricts checked-item lookup to the section of the file corresponding to today’s date heading.


4.8 Full Journal Configuration Example

(use-package gnosis
  :ensure t
  :custom
  ;; Journal in separate files (default):
  (gnosis-journal-file nil)
  (gnosis-journal-dir "~/Notes/journal/")
  (gnosis-journal-as-gpg nil)
  (gnosis-journal-bullet-point-char "+")
  (gnosis-journal-todo-files org-agenda-files)
  (gnosis-journal-todo-keywords org-todo-keywords)
  (gnosis-journal-templates
   '(("Default" (lambda ()
                  (concat "{*} Daily Notes\n\n"
                          "{*} Goals\n"
                          (gnosis-journal-todos))))
     ("Empty" (lambda () "")))))

5 Themata (Spaced Repetition Cards)

Gnosis organises all review material into units called themata (singular: thema). The word is Greek for “that which is placed” or “a topic set before you,” and a thema in gnosis is precisely that: a question or prompt placed before you for recall. Each thema carries its own review history, scheduling state, and algorithm parameters.


5.1 Fields of a Thema

Every thema shares a common set of fields:

  • keimenon (κείμενον, “underlying text”): The question, prompt, or sentence context. This is what the user sees first during review.
  • hypothesis (ὑπόθεσης, “assumption”): Supporting material. Its role differs by type: for MCQ it holds the list of answer choices, for basic it holds an optional hint, and for cloze and mc-cloze it holds hints corresponding to each gap.
  • answer: The correct answer or list of cloze gaps.
  • parathema (παράθεμα, side-text): supplementary text shown after answering, used to add context or a longer explanation.
  • tags: A list of strings for organising themata and applying per-tag algorithm customisation.
  • links: Node IDs extracted from ‘[[id:...]]’ org-links present in the keimenon or parathema. Used for topic-based review.

5.2 Thema Types

Gnosis provides five thema types:


5.2.1 Basic

A straightforward question and answer. The keimenon is the question; the answer is a single string. An optional hypothesis serves as a hint displayed before the user types their response. The comparison is case-insensitive and allows for a small Levenshtein distance, controlled by ‘gnosis-string-difference’.


5.2.2 Double

A convenience type that creates two basic themata from a single definition: one in the forward direction (keimenon -> answer) and one in reverse (answer -> keimenon). Both cards are stored independently and scheduled separately.


5.2.3 MCQ (Multiple Choice Question)

The keimenon is the question. The hypothesis holds a list of answer options (at least two) shuffled on each review. The answer is a single string that must be one of the hypothesis options. The user selects from the completion interface rather than typing freely.


5.2.4 Cloze

A fill-in-the-blank type. The keimenon is a sentence with one or more gaps to fill. Gnosis supports standard Anki-style cloze notation:

The capital of {{c1::Greece}} is one of the oldest cities in the world.
{{c1::Athens}} was named after {{c2::Athena}}.

Each ‘c1’, ‘c2’, etc. group is extracted into a separate thema. The user must supply each gap in turn; a wrong answer on any gap fails the whole thema. Hints can be embedded after a double colon: ‘{{c1::Athens::city}}’.


5.2.5 MC-cloze (Multiple Choice Cloze)

Like cloze, but the user selects the correct word from a list of candidates (the hypothesis) rather than typing it. Only a single gap is supported per thema. The answer must appear verbatim in the sentence.


5.3 Creating Themata

Use ‘M-x gnosis-add-thema’ to create a new thema interactively. The command first prompts for the type, then opens a dedicated edit buffer (‘*Gnosis NEW*’) pre-populated with a template for the selected type.

Inside the edit buffer, use ‘C-c C-c’ to save, ‘C-c C-q’ to add tags, ‘C-c C-o’ to follow an org-id link, or ‘C-c C-k’ to quit without saving.


5.4 Editing Themata

To edit an existing thema, use ‘M-x gnosis-edit-thema’ or press ‘e’ during a review session. The same edit buffer is used, this time populated with the existing values. Saving updates the record in place, re-synchronising both tags and node links.


5.5 Tags on Themata

Tags are free-form strings that serve two purposes:

  1. Organisation: Filter themata during review by including or excluding tags (see Review System).
  2. Algorithm customisation: Override the default spaced repetition parameters for all themata carrying a given tag (see The Algorithm).

During thema creation or editing, press ‘C-c C-q’ in the edit buffer to add tags interactively using completion against existing tags.


5.7 Suspending Themata

A suspended thema is excluded from all regular review sessions. Suspended themata remain in the database and can be unsuspended at any time, either through the review interface or the dashboard.


6 Review System

The review system is the mechanism through which themata are presented to the user, evaluated, and then fed back into the spaced repetition algorithm. All review activity is recorded and optionally committed to a Git repository for version control.


6.1 Starting a Review Session

Call ‘M-x gnosis-review’ to open the review transient menu. The menu presents several review modes:

  • Due themata: All due and new themata, looping until none remain.
  • Due themata of tag(s): Due themata filtered by +include/-exclude tags.
  • Overdue themata: Only themata whose scheduled date has passed.
  • Due without overdue: Today’s due themata, excluding overdue ones.
  • All themata of tag(s): All themata for selected tags, ignoring due status.
  • Review node: All themata linked to a specific node topic.

New themata (never reviewed) are interleaved with due ones. By default they are shown first; set ‘gnosis-review-new-first’ to ‘nil’ to review them last. The number of new themata presented per session can be capped with ‘gnosis-new-themata-limit’.


6.2 Tag Filtering

When reviewing by tag, gnosis prompts for tags using ‘completing-read-multiple’. Each entry is prefixed with ‘+’ to include or ‘-’ to exclude:

Filter tags (+include -exclude): +biology -advanced

This selects all themata tagged ‘biology’ that are not also tagged ‘advanced’.


6.3 The Review Flow

For each thema in the session, gnosis proceeds through the following stages:

  1. Display: The keimenon is rendered in the ‘*gnosis*’ buffer. If the keimenon contains a ‘[[file:...]]’ image link, the image is opened in a secondary window. Content is centred by default (controlled by ‘gnosis-center-content-during-review’).
  2. Input: The user provides an answer. The exact mechanism depends on the thema type.
  3. Feedback: The answer is evaluated and the result is displayed alongside the correct answer, the user’s input (when wrong), and the parathema if one is present.
  4. Next review date: The algorithm computes and displays the next scheduled review date.
  5. Action prompt: The user chooses what to do next via a one-character prompt. Available actions include advancing to the next thema, overriding the result (useful when the user typed a valid alternative answer), suspending or deleting the thema, editing the thema, viewing linked nodes, or quitting the session.
  6. Algorithm update: After the user confirms the result, the review log and gnosis score are updated.

6.4 Type-Specific Review Behaviour


6.4.1 Basic

The keimenon and optional hint are displayed. The user types a free-form answer into the minibuffer. The comparison is case-insensitive and accounts for a small edit distance (‘gnosis-string-difference’). If the answer uses a non-Latin script, gnosis activates the appropriate input method from ‘gnosis-script-input-method-alist’.


6.4.2 MCQ

The keimenon is displayed. The user selects one of the shuffled hypothesis options via completion. Both the correct answer and the user’s choice are shown side by side.


6.4.3 Cloze

The keimenon is displayed with each gap replaced by the placeholder ‘(...)’. The user types each answer in turn. On a correct guess, that gap is revealed and the next is presented. On a wrong answer, all remaining gaps are highlighted and the card is marked as failed.


6.4.4 MC-cloze

The keimenon is displayed with the single gap replaced. The user selects the correct word from a shuffled list via completion.


6.5 Node-Based Review

gnosis-review-topic reviews all themata linked to a chosen node. With a prefix argument, gnosis additionally prompts for forward and backward link depths, allowing review of nodes reachable through the link graph:

C-u M-x gnosis-review-topic RET
Forward link depth: 1 RET
Backlink depth: 0 RET

This lets you review not just the selected node’s themata, but also those of related nodes at the specified distance in the knowledge graph.


6.6 Activity Logging

Every reviewed thema increments a daily activity counter, recording total and new themata reviewed per day. This data drives the dashboard’s streak display. To clear the log, call ‘M-x gnosis-history-clear’.


6.7 Monkeytype

After a failed review, gnosis can present the correct answer as a typing exercise. The user types character by character; correct characters are highlighted in green, and backspace is disabled. Upon completion, the words-per-minute figure is displayed.

Controlled by ‘gnosis-monkeytype-enable’ (default: ‘t’). Restrict to specific types via ‘gnosis-monkeytype-themata’:

(use-package gnosis
  :config
  ;; Disable monkeytype entirely.
  (setq gnosis-monkeytype-enable nil)

  ;; Or restrict to cloze cards only.
  (setq gnosis-monkeytype-themata '("cloze")))

6.8 Sample Configuration

(use-package gnosis
  :config
  (setq gnosis-review-new-first nil)
  (setq gnosis-new-themata-limit 20)
  (setq gnosis-center-content-during-review nil)
  (setq gnosis-vc-auto-push t))

7 The Algorithm

Gnosis uses a modified spaced repetition algorithm inspired by SM-2 but with distinct vocabulary and several extensions for fine-grained control.


7.1 Overview

The core idea is that every successful recall increases the interval before the next review, while every failure decreases it. The rate of growth and decay is governed by a per-thema gnosis score, which itself adapts over time based on review history.

Gnosis uses actual elapsed time (days since the last review) rather than the scheduled interval when computing the next interval. This rewards successful recall after longer delays.


7.2 The Gnosis Score Triplet

Each thema carries a gnosis score stored as a list of three values:

(gnosis-plus  gnosis-minus  gnosis-synolon)
  • gnosis-plus: How much ‘gnosis-synolon’ grows on success. Itself grows via anagnosis events. Default: ‘0.35’.
  • gnosis-minus: How much ‘gnosis-synolon’ shrinks on failure. Grows via anagnosis events on failures. Default: ‘0.30’.
  • gnosis-synolon (synolon, “total”): The interval multiplier. On success, next interval = ‘synolon * elapsed-time’. Capped at ‘gnosis-algorithm-synolon-max’ (default 3.0), floored at 1.3.
;; Default: plus=0.35, minus=0.30, synolon=1.3
(setq gnosis-algorithm-gnosis-value '(0.35 0.30 1.3))

7.3 Proto Phase

New themata go through a proto phase with fixed intervals before the standard algorithm applies:

;; Default: 0, 1, 2 days for the first 3 successes.
(setq gnosis-algorithm-proto '(0 1 2))

After exhausting the proto list, the algorithm switches to the standard ‘synolon * elapsed-time’ calculation.


7.4 Interval Calculation

On a successful review:

next-interval = round(fuzz(gnosis-synolon * elapsed-time))

The computed date is compared to the previously scheduled date, and the later of the two is kept, preventing early reviews from deflating intervals.

On a failed review:

failure-factor = 1 - gnosis-algorithm-amnesia-value
next-interval  = round(fuzz(failure-factor * elapsed-time))
;; Default: 0.5 -- interval halved on failure.
(setq gnosis-algorithm-amnesia-value 0.5)

7.5 Anagnosis Events

Anagnosis (ἀνάγνωσις, “recognition”) events fire when consecutive successes or failures reach a threshold, permanently adjusting the gnosis-plus or gnosis-minus values.

;; Fire every 3 consecutive successes or failures.
(setq gnosis-algorithm-anagnosis-value 3)

;; Increase gnosis-plus by 0.1 on success anagnosis.
(setq gnosis-algorithm-epignosis-value 0.1)

;; Increase gnosis-minus by 0.2 on failure anagnosis.
(setq gnosis-algorithm-agnoia-value 0.2)

A thema you keep getting right will grow its intervals faster over time; one you keep failing will be penalised more harshly.


7.6 Lethe

Lethe (the river of forgetfulness) resets the interval to zero when consecutive failures reach or exceed the threshold, and reduces gnosis-plus to slow future growth:

;; Default: reset on 2 consecutive failures.
(setq gnosis-algorithm-lethe-value 2)

7.7 Fuzz

Random variation applied to intervals to prevent review clustering:

;; Default: +/-10%. Set to 0 to disable.
(setq gnosis-algorithm-interval-fuzz 0.1)

Fuzz is not applied to intervals of 2 days or fewer.


7.8 Day Boundary

By default, a new review day begins at midnight. ‘gnosis-algorithm-day-start-hour’ shifts that boundary so that reviews done in the small hours count as part of the previous calendar day:

;; Default: 0 (midnight).  Set to e.g. 6 to treat 00:00--05:59 as the
;; previous day.
(setq gnosis-algorithm-day-start-hour 6)

The variable accepts any integer from 0 to 23. When set to 0 the behaviour is identical to the default. A non-zero value is useful for reviewers who work late at night and want reviews completed after midnight to be counted against the same day as the rest of their evening session.

The setting affects all date-dependent logic


7.9 Per-Tag Algorithm Customisation

gnosis-custom-values’ lets you override algorithm parameters for all themata carrying a given tag:

(use-package gnosis
  :config
  (setq gnosis-custom-values
        '(;; Strict scheduling for Greek vocabulary.
          (:tag "greek"
                (:proto     (0 1 3 7)
                 :amnesia   0.6
                 :lethe     2
                 :anagnosis 4
                 :epignosis 0.15
                 :agnoia    0.25))

          ;; Lenient scheduling for programming concepts.
          (:tag "programming"
                (:proto     (0 1)
                 :amnesia   0.4
                 :lethe     3
                 :anagnosis 2
                 :epignosis 0.2
                 :agnoia    0.15)))))

When a thema carries multiple tags with overlapping parameters, gnosis aggregates: for ‘:amnesia’, ‘:epignosis’, ‘:agnoia’ the maximum is used; for ‘:anagnosis’, ‘:lethe’ the minimum is used; for ‘:proto’ the element-wise maximum.


7.10 All Algorithm Variables

VariableDefaultDescription
gnosis-algorithm-proto(0 1 2)Fixed intervals for the first N successes
gnosis-algorithm-gnosis-value(0.35 0.30 1.3)Starting (plus minus synolon) score
gnosis-algorithm-amnesia-value0.5Memory loss factor on failure (0 < x < 1)
gnosis-algorithm-epignosis-value0.1gnosis-plus increment per success anagnosis
gnosis-algorithm-agnoia-value0.2gnosis-minus increment per failure anagnosis
gnosis-algorithm-anagnosis-value3Consecutive review threshold for anagnosis
gnosis-algorithm-lethe-value2Consecutive failures before lethe reset
gnosis-algorithm-synolon-max3.0Maximum value for the interval multiplier
gnosis-algorithm-interval-fuzz0.1Fuzz fraction applied to intervals (0 = off)
gnosis-algorithm-day-start-hour3Hour (0-23) at which a new review day begins

8 Dashboard

The dashboard is the central interface for browsing and managing everything stored in gnosis. It presents themata, nodes, and tags in tabulated views with contextual transient menus.


8.1 Opening the Dashboard

M-x gnosis-dashboard

This opens the ‘*Gnosis Dashboard*’ buffer with a header showing your review streak and today’s statistics. A transient menu opens automatically, providing access to nodes, themata, review sessions, export/import, and database synchronisation.


8.2 The Themata View

Lists all review items in a tabulated format, with columns for the keimenon, hypothesis, answer, tags, type, and suspension status.

From this view you can edit or delete individual themata, suspend them, search or filter the list by content, filter by review count, and use bulk operations on marked entries (bulk link replacement, suspend, delete). All actions are available through a transient menu.


8.3 The Nodes View

Lists org-mode knowledge nodes with connectivity metrics: forward link count, backlink count, and the number of themata that reference each node.

From this view you can navigate the knowledge graph by following forward links or backlinks from any node, see which themata reference a node, find isolated nodes with no connections, open a node’s org file, or start a review of all themata linked to a node (optionally specifying link depth to include related nodes).

Each navigation action pushes the current view onto a history stack, so you can step back through your browsing path.

(use-package gnosis
  :config
  (setopt gnosis-dashboard-nodes-default-sort-column "Backlinks")
  (setopt gnosis-dashboard-nodes-default-sort-ascending nil))

8.4 The Tags View

Lists every tag with a count of associated themata. From this view you can open the themata view filtered to a specific tag, rename tags, suspend all themata carrying a tag, or delete a tag from all themata.


9 Export and Import

Gnosis provides two export commands and two import commands. Exports produce standard org-mode files that can be edited freely and re-imported.


9.1 Exporting to a Directory

gnosis-export-themata is the primary export command. It writes a filtered subset of your themata to a directory, creating a ‘themata.org’ file and copying linked node files into a ‘nodes/’ subdirectory.

M-x gnosis-export-themata

When called interactively, you are asked for:

  1. Tag filters using +/- notation.
  2. Which directory to export to.
  3. Whether to replace IDs with ‘NEW’ (for sharing).
  4. Whether to include suspended themata.

The resulting directory structure:

export-directory/
  themata.org
  nodes/
    note1.org
    note2.org

9.1.1 Tag Filter Notation

Each candidate is prefixed with ‘+’ (include) or ‘-’ (exclude):

Filter tags (+include -exclude): +greek -draft

When no ‘+’ entries are chosen, the export starts from all themata and applies only exclusions.


9.1.2 Programmatic Use

Pass tag lists directly:

(gnosis-export-themata "/path/to/backup/"
                       nil nil
                       '("greek")
                       '("draft"))

9.2 Exporting to a Single File

gnosis-export-themata-to-file exports all non-suspended themata to a single org file without copying linked nodes.


9.3 The Export Format

Each thema is a top-level org heading:

* Thema :greek:vocabulary:
:PROPERTIES:
:GNOSIS_ID: 12345678
:GNOSIS_TYPE: Basic
:END:
** Keimenon
What is the Greek word for knowledge?

** Answer
- gnosis

** Parathema
Additional context.

The separator between multiple items in Hypothesis and Answer is the value of ‘gnosis-export-separator’ (default: ‘"\n- "’).


9.4 Importing a File

M-x gnosis-import-file

Reads an exported org file and inserts or updates themata within a single transaction. Themata with ‘:GNOSIS_ID: NEW’ receive fresh IDs.


9.5 Asynchronous Import

For large files, use ‘M-x gnosis-import-file-async’. This splits the file into chunks and processes them with timers between batches, keeping Emacs responsive.