Johannes Kaindl1k downloadsNeurodivergence-friendly gamification: XP, levels, streaks with freeze tokens, deterministic loot, and lore. Off-by-default for anything that could escalate.
🇬🇧 English · 🇩🇪 Deutsch
Neurodivergence-friendly gamification for Obsidian — XP, levels, streaks with freeze tokens, deterministic loot drops, and optional lore, with everything that could escalate off by default.
Your daily notes already record what you did — this plugin reads them and turns that into XP, levels and a streak that survives a missed day. It runs entirely inside your vault: no account, no server, no network access, and nothing that nags you unless you switch it on yourself.
qigong: true etc., XP per habit configurablereview_done / planning_done frontmatterSIGNAL LOST → K U R O, all titles + thresholds editable in Settingspacks/ folder, or import your own```kuro-status embed in any note)
The sidebar panel next to an ordinary note — level, total XP, progress, streak with freeze tokens, and today's score, all computed from your daily notes.
Redeeming a loot drop: three deterministic options, one pick.
Most gamification plugins for note apps are built for neurotypical brains: hard streaks that punish you for missing one day, exponential XP curves that reward consistency over actual life, push notifications that nag you. This one was built for ADHD and autism:
isDesktopOnly: false).Search for Kuro Gamification in Settings → Community plugins → Browse, then click Install and Enable.
main.js, manifest.json, styles.css from the latest release and copy them into <vault>/.obsidian/plugins/kuro-gamification/git clone https://git.jkaindl.de/jkaindl/kuro-gamification
cd kuro-gamification && npm install && npm run build
# main.js manifest.json styles.css → <vault>/.obsidian/plugins/kuro-gamification/
Optionally install the CRT/phosphor aesthetic CSS snippet afterwards — see Aesthetic CSS below.
qigong: true) in Settings → Habits, each with its own XP value.review_done: true / planning_done: true in a weekly note's frontmatter for the weekly review/planning bonus.kuro-status code block (see Status code block below) in any note for a live status view without opening the sidebar.Click the preview for the full settings tab (fourteen sections).
| Section | What it controls |
|---|---|
| 🎮 General | Language (DE/EN), reduce-animations, status-bar item, action notices, verbose breakdown, sidebar enable/disable |
| 📁 Paths | Daily/weekly folder paths + date formats |
| ⚡ XP sources | XP per checkbox, completion bonuses, pomodoro key/threshold/bonus |
| ✅ Tasks & pomodoro | XP for completed tasks, work sessions and breaks; how a task is recognised; source panel |
| 🎯 Habits | Add/edit/remove your own habit list (frontmatter key + label + XP) |
| 📅 Weekly | Review/planning frontmatter keys + XP |
| 🔥 Streaks | Day-qualification threshold, monthly freeze tokens, working weekdays, day-off property |
| 📊 Levels & loot | Loot enable/disable, options per drop |
| 📜 Lore | Lore reveal enable/disable |
| 📚 Packs | Install/switch/delete loot·lore packs; per-unit export/copy/reset to factory |
| 🛠 Advanced | Log level; whole-state data export/import/reset (incl. XP) |
| ℹ️ About | Version, link to in-vault docs |
Kuro can award XP for tasks you complete and for pomodoro sessions you finish — including breaks, which is deliberate: they are the counterweight to hyperfocus, so they are worth points too. All three rates start at 0, so nothing counts until you decide it should.
You tell Kuro what a task is. Four settings decide it: the frontmatter field that marks a
note as a task, the value it holds, the field carrying the status, and which status values mean
"done" (comma-separated, because "done" may have more than one value in your vault). The
defaults match TaskNotes' own defaults, but they are yours to change — if your vault uses
type: 💪 Task with status: 6_done_✅, put that in.
If TaskNotes is installed and configured differently, Kuro offers to adopt its configuration with one click. Pomodoro sessions are read from TaskNotes directly when it keeps its history in its own storage. If it writes them into the daily note instead, the daily-note pomodoro bonus counts them and the source panel says so.
The source panel tells you whether any of it works. It sits in the same section, always visible, and shows one line per source: counting (with the rate), readable but sitting at rate 0, nothing found yet, or unable to count at all — with the reason. It is there because a bonus that silently never fires is worse than one that is switched off.
Embed your status anywhere:
```kuro-status
mode: full # full | compact | minimal
loot: show # show | hide
lore: show # show | hide
breakdown: hide # show | hide
```
The kuro-status code block rendered inside a note.
In your daily note frontmatter:
qigong: true
peloton: false
draussen: true
haushalt: false
pomodoros: 4
Then in Settings → Habits, add e.g.:
qigong → 🧘 Qi Gong → 10 XPpeloton → 🚴 Peloton → 15 XPdraussen → 🌳 Draußen → 10 XPhaushalt → 🏠 Haushalt → 10 XPPomodoros bonus is automatic when pomodoros >= threshold (default ≥ 4 → +10 XP). The
pomodoros field also accepts the session array TaskNotes
writes when its pomodoroStorageLocation is set to "daily-notes" — Kuro counts only
completed work sessions from that array, ignoring breaks and interrupted sessions.
This plugin works without external styling — it ships with sane structural CSS. For the full gothic-cyberpunk CRT terminal aesthetic (phosphor green, scanlines, flicker), see Aesthetic CSS · (DE) for the CSS and install instructions (it's kept as a doc, not a tracked .css file, so it isn't bundled and never shows up in CSS linting of the plugin's own source).
The snippet styles pre.kuro-status, pre.kuro-loot, and the [!kuro], [!levelup], [!spoiler], [!streak] callouts. It has no hard dependency on the Kuro theme (works under any theme that respects CSS custom properties).
The companion chat in the sidebar, with the context disclosure showing exactly what gets sent.
Kuro can talk to you: ask what to start with, say you're stuck, or think out loud about the
day. It is off by default — while Enable chat is off, the plugin makes no network
connection at all and the sidebar looks exactly as before.
The chat talks to an OpenAI-compatible endpoint you configure yourself. There is no
preset provider and no cloud default; it is meant for a local server such as
LM Studio (http://localhost:1234) or
Ollama (http://localhost:11434).
If you have the LLM Endpoint Manager plugin installed, the chat takes its endpoints and model from there instead, and the settings show the manager's endpoint choice in place of the list.
An API key you enter for a local endpoint is stored in Obsidian's keychain, not in the plugin's data.json. Before a question is sent, keys, tokens, Bearer headers and private-key blocks in your text are replaced by placeholders; the answer shows your original again. The chat waits up to 10 minutes for the first data (a model that is still loading), then up to 2 minutes of silence. Pictures, executable code blocks and HTML in an answer are shown as plain text, not rendered.
What is sent, and when. Nothing is sent until you ask a question. With each question go:
| Always | Depending on From today's note |
|---|---|
| Level, XP, streak, freeze tokens, today's progress, open drops, last unlocked lore title | Nothing — no note content at all · Tasks and habits (default) — the checkbox lines and your configured habit fields · The whole note |
| Your notes list (see below) |
The default deliberately leaves journal prose out of it. Settings → 💬 Kuro chat shows a live preview of exactly what would be sent from today's note, and the chat tab has the same preview behind a disclosure triangle — both render through the same function that builds the prompt, so the preview cannot drift from reality.
Notes (📌). Kuro has no memory of past conversations by design — the history is not
saved and is gone when Obsidian closes. What does persist is a short list of sentences you
ask it to remember: "Don't remind me about streaks unprompted." Add them by writing
remember: … in the chat, or directly in Settings → 📌 Notes, where you can edit and delete
them at any time. The list holds 20 entries; when it's full the add button is disabled
rather than silently dropping the oldest one.
Voice. The tone comes from the active lore pack (persona field) — the Cozy pack speaks
warmly, the Gothic pack darkly — or from your own text in the settings, which overrides it.
Kuro is instructed not to comment on your numbers unless you ask, and not to act as a
therapist.
The plugin watches vault.modify events (800 ms debounced) on your daily/weekly notes. On each trigger it re-reads the relevant notes' checkboxes and frontmatter, and pure-function engines compute the result from scratch — XP totals, level, streak state, and (once a new level is reached) a deterministic loot drop:
XpEngine sums XP from ticked checkboxes, completion-percentage bonuses, configured habits, and the weekly review/planning bonus, then derives the level from the linear-quadratic curve.StreakEngine replays your daily notes forward from the first qualifying day: the running day is neutral, a freeze token bridges each gap once, days off are neutral, and streak-tier bonuses (3/7/14/30 days) are credited per day and kept when a streak ends.LootEngine picks a deterministic reward per level-up above 1 (seeded by level + save count, so a drop doesn't change on reload) from a 5-tier pool that's user-replaceable via packs.LoreEngine reveals the narrative fragment tied to the new level, from whichever lore pack is active.The engines carry no Obsidian imports, so they run in plain Node under jest — the UI layer (sidebar, status code-block, modals, settings tab) is a thin layer over these pure computations and the Obsidian API. Data is persisted to data.json via Obsidian's plugin data API; export/import/reset in Settings → Advanced operate on that same JSON. Module layout and the architectural rules behind it are documented in AGENTS.md.
Issues and pull requests are welcome on GitHub and on the canonical repository on Forgejo. Development is test-driven — npm test must stay green, and the engines are the place where new rules belong. See CONTRIBUTING.md and AGENTS.md; contributions are accepted under the CLA.
v6t2b9), 2026-03 to 2026-04Code: AGPL-3.0-or-later — see LICENSE.
Documentation: CC BY-SA 4.0 — see LICENSE-DOCS.
A commercial license is available for uses incompatible with the AGPL — see LICENSING.md.
Copyright © 2026 Johannes Kaindl.