Funny you mention spaced repetition, because I was thinking about it yesterday. Wondering if it can be implemented as some sort of 'plugin' mechanism in neuron.
At minimum, I want to review N number of notes every day, each note having a 'next_review_date' YAML field that gets updated based on the spaced repetition algorithm.
At minimum, I want to review N number of notes every day, each note having a 'next_review_date' YAML field that gets updated based on the spaced repetition algorithm.
I think the best approach in this case would just be adding minimal syntax on top (maybe even how remnote.io does it) so that it can be easily decomposable.
I proposed that we implement this as a plugin, and have the plugin inject the 'next_review' value into the YAML metadata, with perhaps some structure expectation for hidden text (like a heading with {.flashcard-hidden} commonmark attribute)
So when you show text::hidden-text as a demonstration of the minimal syntax you were referring to above, I have no idea how that translates to the neuron model.
Explain how to add custom HTML attributes to the various elements, including images. For example, ![](https://srid.keybase.pub/me.jpeg){#avatar .ui .left .floated .small .image} Also reference Sema...
Piggybacking on existing commonmark extensions like this is really nice, because you get to use just text and HTML without introducing any custom syntax.
That sounds like a good idea. I would highly encourage you to try both Obsidian and Remnote for inspiration, they are both excellent, just with a different structure software wise.
I feel there's two different things: a zettel and a flashcard. I expect that a single zettel might contain many flashcards, or none. Not least because of close deletion. I like the syntax that Andy has for it: https://notes.andymatuschak.org/z5ARNXtS5VxteskEW91S1yYTgAcLABNXsZuJE
The way he does it is that each Q/A block and cloze deletion block gets hashed to get a unique id and the next review date is stored in a separate database. I don't feel like storing that in the YAML is very clean
I'm taking Cerveau into consideration as well, which could as well support the plugin mechanism, but with web app functionality on top. And since it uses Git as storage, it would make sense to store the 'plugin data' in Git as well.
The idea is to make it possible to create "mini apps" of some sort that piggyback on neuron's "future-proof" philosophy. And allow you to do things using just plain-text and local storage (or git).
There's a clear separation of concerns here: one the one hand extracting flashcards from whatever (here neuron zettels) and on the other a spaced repetition system with per-user state
Having something like <zettel id>/<0-based index in the zettel> might be good enough for many usecases, as long as the user can override ids when they add/remove flashcards or clozes
Vaguely related: it'd be nice in the cerveau interface/LSP plugin to have a shortcut to create an empty note with the current selection as title. To quote this, "Adding a empty “[to complete] note” is better than simply not adding a note in a couple of ways.". Then spaced repetition would remind you to add content to that empty note
I think this is where a plugin system like obsidian's would shine. Perhaps making the project into an organization where everything is separate (plugins, cerveau, neuron, LSP, editor plugins) would be a good idea?
contd from here
Funny you mention spaced repetition, because I was thinking about it yesterday. Wondering if it can be implemented as some sort of 'plugin' mechanism in neuron.
At minimum, I want to review N number of notes every day, each note having a 'next_review_date' YAML field that gets updated based on the spaced repetition algorithm.
Sridhar Ratnakumar said:
I think the best approach in this case would just be adding minimal syntax on top (maybe even how remnote.io does it) so that it can be easily decomposable.
What sort of minimal syntax? Do you have a specific proposal?
so how remnote does it is just
text::hidden-text
I'm not at all familiar with Remnote.
In neuron, all notes are in Markdown with a YAML block.
I proposed that we implement this as a plugin, and have the plugin inject the 'next_review' value into the YAML metadata, with perhaps some structure expectation for hidden text (like a heading with
{.flashcard-hidden}
commonmark attribute)So when you show
text::hidden-text
as a demonstration of the minimal syntax you were referring to above, I have no idea how that translates to the neuron model.It would be nice to have a detailed proposal written up on GitHub.
See https://github.com/srid/neuron/issues/176
So we could create a flash card like this:
This syntax is already supported by neuron, btw. See https://github.com/jgm/commonmark-hs/blob/master/commonmark-extensions/test/fenced_divs.md
That syntax creates a
div
with class=flashcard-hidden. But the plugin can use that and 'hide' it when showing the card during review stage.Piggybacking on existing commonmark extensions like this is really nice, because you get to use just text and HTML without introducing any custom syntax.
That sounds like a good idea. I would highly encourage you to try both Obsidian and Remnote for inspiration, they are both excellent, just with a different structure software wise.
Yup, several tools to get inspired from. Lots of idea space to explore in regards to representing structured content in plain-text ...
(Plain-text stored locally or in Git repo, that is).
Oh yaaaay I've been wanting that too
I feel there's two different things: a zettel and a flashcard. I expect that a single zettel might contain many flashcards, or none. Not least because of close deletion. I like the syntax that Andy has for it: https://notes.andymatuschak.org/z5ARNXtS5VxteskEW91S1yYTgAcLABNXsZuJE
The way he does it is that each Q/A block and cloze deletion block gets hashed to get a unique id and the next review date is stored in a separate database. I don't feel like storing that in the YAML is very clean
One other reason to store review dates separately: in a community zettelkasten, people will want to each have their review state
So a separate file (per-user) in the git repo?
I'm taking Cerveau into consideration as well, which could as well support the plugin mechanism, but with web app functionality on top. And since it uses Git as storage, it would make sense to store the 'plugin data' in Git as well.
(On the CLI side, it would be the same local file that gets updated)
Hmm, I was thinking that learning from a zettelkasten shouldn't require write access to it
Right, that makes sense
Community flashcards. That's one rad idea.
The idea I see is something like https://quantum.country : an online flashcard-aided learning resource
A group of people curates a set of flashcards and anyone can use them to learn
It's getting a bit out of scope for neuron though ^^
Not out of scope as a decoupled plugin though.
True
The idea is to make it possible to create "mini apps" of some sort that piggyback on neuron's "future-proof" philosophy. And allow you to do things using just plain-text and local storage (or git).
There's a clear separation of concerns here: one the one hand extracting flashcards from whatever (here neuron zettels) and on the other a spaced repetition system with per-user state
Right, as long as IDs stay consistent between the two places.
The ideal would be a federated protocol for spaced repetition where you can add cards from many websites into your hub :3
For zettel IDs this is straightforward. Not so much for individual sections in a zettel.
Yeah indeed... But just cloze deletion already makes it difficult to limit to one flashcard per zettel :/
Having something like <zettel id>/<0-based index in the zettel> might be good enough for many usecases, as long as the user can override ids when they add/remove flashcards or clozes
A related but rather different use of spaced repetition would be to regularly prompt you with incomplete notes so that you can add to them. Andy describes this here: https://notes.andymatuschak.org/z7iCjRziX6V6unNWL81yc2dJicpRw2Cpp9MfQ
Vaguely related: it'd be nice in the cerveau interface/LSP plugin to have a shortcut to create an empty note with the current selection as title. To quote this, "Adding a empty “[to complete] note” is better than simply not adding a note in a couple of ways.". Then spaced repetition would remind you to add content to that empty note
That would be a more important use case for a spaced repetition neuron plugin. I myself need it.
I think this is where a plugin system like obsidian's would shine. Perhaps making the project into an organization where everything is separate (plugins, cerveau, neuron, LSP, editor plugins) would be a good idea?