Introduction to dvlg

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.

Back to blog

Leave a comment

Please note, comments need to be approved before they are published.