Skip to content

Usage analytics

Eklavya sends anonymous usage counts to Google Analytics, linked to a random install ID rather than to you. It never sends your code, file paths, project names, concept names, questions, answers or memory. The counts tell us whether people install Eklavya, keep using it, and which parts help, so we know what to improve.

It is on by default. To turn it off, run:

Terminal window
eklavya telemetry off

Or ask Claude: “Use the Eklavya skill to turn off analytics.”

What is sent, and when

The first session start after installing or updating shows one line saying these counts are sent and how to turn them off; nothing is sent before that line has been shown. After that, at most once a day, a session start launches a background process that reads totals from your local database and sends them. The session never waits for it, and a send that fails is tried again at a session start an hour or more later. Counts named _new cover the time since the last accepted ping, so they add up across days without being counted twice.

To print the exact next ping, run:

Terminal window
eklavya telemetry show

The only identity is client_id: a random UUID created on first use and stored in ~/.eklavya/telemetry.json. It identifies this install, not you, and is not in config.json, so copying your settings to another machine does not copy it.

daily_active

FieldMeaning
version, os, node_majorEklavya version, darwin/linux/win32, Node.js major version
install_age_daysdays since this install’s ID was created
active_days_7ddays in the last week on which a session started
sessions_newyour sessions that captured memory or opened a quiz gate
helper_sessions_newsessions run by Eklavya’s own memory observer that were recorded anyway; should be 0, and counts from them are left out of every other field
update_errornone, or the class of the last automatic-update failure (network, npm, install, other)

settings

Your global setting values: quiz_enabled, quiz_enforced, focus, cadence, difficulty, explain_on_wrong, delegate_work, quiet, auto_update, memory_enabled, memory_capture, retention_set, retrieval_mode, cross_project, observer and embeddings (the provider kind, or none), notifications, sync. privacy_rules is how many exclusion and redaction rules you have, not what they say.

Per project: project_configs (projects with their own settings file), projects_quiz_off, projects_memory_off, projects_with_settings and projects_known (projects Eklavya has seen). All counts; no project is named.

learning

FieldMeaning
questions_new, questions_totalquestions graded
answered_new, passed_newanswered, and answered with a passing grade
dont_know_new, declined_new“teach me” and “not now” answers
mcq_newmultiple-choice questions
concepts_logged_newconcepts logged during work
concepts_mastered, concepts_learningconcepts at mastery, and concepts practised but not there yet
reviews_duepractised concepts whose spaced review is due
level_easy, level_medium, level_hard, promotions_newprojects at each difficulty level, and level-ups
gates_enforced_new, gates_passed_newenforced sessions, and how many passed their commit gate

The question and answer counts (questions_new, questions_total, answered_new, passed_new, dont_know_new, declined_new and mcq_new) leave out a correction made from an explainer page.

memory

FieldMeaning
events_newwork observations captured
entries_new, entries_totalmemory entries written, and entries kept
corrected_new, deleted_newentries replaced by a correction, and deleted
recalls_new, recalls_session_start_new, recalls_search_newtimes a hook wrote recalled memory to Claude Code, in total (session start, prompt and file recall) and at session start alone; recalls_search_new counts receipts with the search scope, which no current recall writes. A recall that was prepared but never written is not counted
recall_items_new, recall_tokens_new, recall_tokens_saved_newentries handed over, their size in tokens, and tokens saved against the full text
jobs_pending, jobs_failedmemory processing jobs waiting and failed
collections, db_mbsaved collections, database size in megabytes

artifacts

artifacts_total, artifacts_new, explainers_total and explainers_new: pages under ~/.eklavya/artifacts/, counted by kind. Titles and contents are not read.

feature_use

One event per feature used on a finished day, with kind, feature and count. Features are Eklavya’s own names only:

kindfeature
clithe eklavya command run, such as doctor or dashboard, never its arguments
toolthe MCP tool Claude called, such as record_attempt or memory_search; the quiz panel’s present_question, panel_sync and panel_answer count the same way (panel_sync also while quiz.panel is off, since the panel checks in at each session start)
slashthe Eklavya slash command typed, such as quiz, never the rest of the prompt
quizcheckpoint (a question during work) or stop (a question at the end of a turn)
gateblocked, a commit held by the gate
hook_errorthe hook that failed and let the session continue, such as capture-tool

An uninstall event, with version, os and purge, is sent when you run eklavya uninstall.

What is never sent

Nothing Eklavya sends is text you wrote or a name you chose. A check in the code rejects any event whose values are not numbers, true/false or Eklavya’s own short identifiers, so a mistake fails instead of sending. Specifically, never: code, file paths, project or repository names, concept names, questions, answers, memory entries, prompts, your focus topic, git details, hostname, username or email.

Google receives the request, so it sees your IP address. Google Analytics 4 does not log or store IP addresses, and these events carry no location.

Turn it off

Any one of these stops every ping and count:

HowScope
eklavya telemetry offthis machine; sets telemetry: false in ~/.eklavya/config.json
Ask Claude to turn off Eklavya analyticsthe same setting, through the Eklavya skill
EKLAVYA_TELEMETRY=0any shell or process with that variable
DO_NOT_TRACK=1any shell or process; the convention many developer tools honour

telemetry is a global setting: a project’s settings cannot turn it back on. eklavya telemetry shows whether it is on and why, and eklavya doctor reports it on its usage ping row. Eklavya also sends nothing in CI, from a source checkout, or when its runtime is not installed.

This website

The website asks before it counts anything. Until you choose Allow analytics in the banner, no Google script loads, no cookie is set and no analytics request is made. Choosing Decline keeps it that way. With your permission, the landing page and this manual send:

EventSent whenFields
page_viewa page loadspage address, title, referrer
section_viewa landing-page section scrolls into view, once per visitsection name, such as dials or commands
copy_commandyou press Copy on a shell commandlanding or docs
scroll_depthyou scroll past 25, 50, 75 or 100% of a manual page, once eachthe percentage
searchyou pause while typing in the manual’s search boxthe search text, at most 100 characters
outbound clickyou follow a link to another sitethe link address

Google Analytics also records what every GA4 site records: an anonymous visitor ID in a first-party cookie (_ga), approximate location, browser, device type and screen size. The site has no sign-in and records no form input apart from the search box.

The same control is at the foot of the landing page. Declining after you allowed analytics deletes the _ga cookies and reloads the page without the Google script. The choice is stored in your browser as eklavya-analytics, so clearing site data brings the banner back. The website choice and the tool’s telemetry setting are separate.