Introduction to dvlg
Share
Underthreaded is a plaintext company, we try our best to do everything we can in plaintext. We have a strong belief that this allows us to focus on content over anything else. However, using only plaintext comes with its own unique challenges. One of the most prevalent at our current stage is note taking.
The Problem
As we built our company, we quickly realized the importance of efficient note taking – whether it’s for learning, meeting notes, TODO lists, or reminders. We found it surprisingly difficult and time-consuming to maintain clean notes using standard plaintext formats. You often have to create your own custom rules and conventions, which can be hard to consistently apply. There are so many tools and editors for taking notes out there, but most are non-starters tying you into their services, or don’t support plaintext. We wanted something that can live easily in our company monorepo in git.
The Solution
To address this, we created dvlg – a plaintext markup language designed to encode a base level of semantic meaning, forming the foundation for future tooling to solve broader problems. The most important principle behind dvlg is append-dominant writing. We believe that the most efficient way to capture thoughts is to avoid editing or backspacing, which disrupts the creative flow. Instead, you simply append new thoughts as they come, and let the tooling handle the “uninteresting” work of organizing and facilitating retrieval.
dvlg is simple to use, and with the help of a basic VSCode extension, it’s easy to get started. You can find the extension here. Let’s see what the language looks like right now.
The language
The main constructs of the language include:
- Date headers, for segmenting notes by date
- TODO’s
- TIL (Today I learned)
- QTS (Question to self)
- Calendar Entries, for tracking upcoming events
- General Notes
Date Headers
@YYYY-MM-DD
TODO’s
Everyone knows what todo’s are.
- [ ] An uncompleted TODO
- [/] An in progress TODO
- [x] A completed TODO
- [-] A dropped TODO
TIL’s
Short for Today I Learned. Keeping a log of these is great for tracking your progress or just interesting facts.
! Today I learned about dvlg
QTS’s
Sometimes a question occurs to you, and you don’t have time to address it right now. Note it down, come back to it later and turn it into a TIL.
This is pretty much a special case of a todo, except you don’t need to add extra fluff in your description of the todo
? Is this language useful at all
The TODO version of this would be
- [ ] learn if this language is useful at all?
Which is, of course, too much typing.
Calendar Entries
[YYYY-MM-DD] Ship big feature
or with a time
[YYYY-MM-DD HH:MM] Check on intern
or with a time and duration
[YYYY-MM-DD HH:MM-HH:MM] Big important meeting
Note that there must be a space after the square brackets.
General Notes
For when you want to make a note for a project you’re working on, thinking via typing etc…
/ This is a plain untagged note
/tag/ this is a tagged note
/tag1/tag2/ tags can have a path to allow you to categorise notes in a hierarchy
EDIT: This has been changed since the initial release of this blog post, we moved to /
from >
to allow better compatibility with markdown thanks to the commenters on this reddit conversation
Multiline notes
When you want to take longer form notes, just keep writing on newlines. As long as you don’t use the above syntax your notes should apply to the preceding constructs (todo/til/qts/note/calendar/etc…)
- [ ] create video for showing off dvlg
The video should be short with no fluff.
Probably keep short and emphasise how we want to keep users typing words and focusing on the content not the process.
- [ ] Do this other thing
In Practice
So what does this look like when used normally? Of course, that’s up to you, but here is an example:
@2024-08-10
- [-] Actually learn rust
! Rust doesn't allow pattern matching string prefixes
@2024-08-11
- [ ] Check database index types
Performance is good enough so low priority
? syntax highlighting in vscode package
- [/] Fix null errors bug
[2024-09-10] Lunch with coworkers
> It's nice when you can watch an expert doing what you're trying to do
rust> Using collect midway through iterator pipelines, the Rust compiler ensures that there’s no significant difference in the optimized code generated compared to an explicit loop implementation. (https://blog.jetbrains.com/rust/2024/03/12/rust-iterators-beyond-the-basics-part-ii-key-aspects/#down-to-bare-metal)
[2024-09-03] Super important meeting
We believe this is an exciting new way to take your notes and hope some people will find this useful. Note that this is still in alpha and is open to suggestions and queries, please send them to us on our project and find us on X or Instagram.