Unofficial Notes and Resources on Neorg

While diving into the Neorg project, I have accumulated a number of notes and links. As with any large project, it takes a while to get oriented, and sometimes it is beneficial to see someone else's notes. Due to the open-source nature of the project, it is especially useful to keep a collection of all relevant links in one place.

Disclaimer

This site does not constitute official documentation, nor are these notes endorsed by any person or organization. These are my personal notes that I wrote while getting oriented with Neorg, and I have chosen to make them public in the hope that someone else may find them useful.

Project Description

From the official README:

Neorg (Neo - new, org - organization) is a Neovim plugin designed to reimagine organization as you know it. Grab some coffee, start writing some notes, let your editor handle the rest.

What is Neorg?

Neorg is an all-encompassing tool based around structured note taking, project and task management, time tracking, slideshows, writing typeset documents and much more. The premise is that all of these features are built on top of a single base file format (.norg), which the user only has to learn once to gain access to all of Neorg's functionality.

Not only does this yield a low barrier for entry for new users it also ensures that all features are integrated with each other and speak the same underlying language. The file format is built to be expressive and easy to parse, which also makes .norg files easily usable anywhere outside of Neorg itself.

Neorg is a plugin to extend the functionality of the Neovim editor, but the scope of the project is considerably wider. It defines a new file format, .norg and extensions are currently in the works to support databases, syncing, mobile, and more.

In the words on mrossinek:

Neorg is a life organization tool for Neovim. It implements its own plain-text format improving upon others such as markdown and org-mode by leveraging the full power of Treesitter and combined with Lua revolutionizes note taking in Neovim.

Installation

Basic installation

Installation with Docker

Installation with Nix (best option)

Basic

See the official README.

Installation with Docker

docker pull yelircaasi/neorg-basic:latest

WIP: need to push image and dockerfile, also pin commits to make everything even more solid

Installation with Nix (best option)

# TODO

Norg Files

Cheatsheet

1.0 Specification

1.0 Semantics

Standard Library (.norg)

Standard Library (Janet)

Usage

Config Examples

WIP

Config Examples

Doom Neovim

asn/dotfiles

katawful/dotfiles-nvim

max397574/omega-nvim

Jxstxs/nvimconf

Porting neovim config to lua (blog post with example)

janlaff/linux-dotfiles

Modules

The wiki already has good documentation of the built-in modules. This page will be mostly for my own notes on the modules - insights, questions answered, thoughts, and so on.

Tutorial on making modules

Tutorial on making modules, with accompanying videos:

  • Extending Neorg - Your first module
  • Extending Neorg - Module configuration and overview
  • Extending Neorg - A treesitter-powered module

Example of a 3rd-party module

neorg-telescope

WIP: find examples on configs using this

Ecosystem Overview

Neorg Core

WIP

Neorg Extensions

WIP

How the Neorg API works

WIP

Roadmaps

Neorg Roadmap

GTD Module Roadmap

Norgberg Roadmap

Zettelkasten Tracking Issue

Active Projects

Foundational

  • Official Wiki - official documentation of Neorg

  • Main Github Repo - the mother ship

  • norg-specs - the official specification of Norg file syntax and semantics: the One Source of Truth

  • neorg-dirman - a directory manager for Neorg, a core module which provides a basic interface for workspaces

Parsers, Treesitter

  • zig-norg - Norg parser written in zig; an API to interface with the .norg file format

  • rust-norg - rust version of zig-norg

  • neorg-breeze - rust library for parsing entire directories of Norg files in a multithreaded fashion

  • neorg-haskell-parser - reimplementation of the parser with the Neorg markup specification. It will be able to transform .norg files to the pandoc AST and subsequently to the plethora of formats that pandoc supports

  • Norg.jl - a Julia parser for .norg files, currently targeting HTML

  • norg.py - Python Norg parser, still immature

  • tree-sitter-norg-meta -

  • tree-sitter-norg2 -

  • tree-sitter-norg -

Tools and Extensions

  • norg-fmt - a formatter for Neorg, written in Zig and currently dormant but not dead; to be rewritten in Python

  • neorg-templates -

  • neorg-exec -

  • GTD module - see roadmaps

  • Taskwarrior integration - apparently dormant project here;

Neorg Beyond Neovim

  • Norgberg - database services module

  • norgopolis - a lightweight communication, launcher and utility services client for the Neorg rust-native modules ecosystem on desktop

  • Groen - "neorg mobile app inspired by Obsidian" - developed with Flutter (still in embryo)

Other

Project Ideas

parser in {{language}}

The more the merrier. As noted here, "many parsers can be created for it without forming annoying "'dialects'".

Graph Visualization

→ something like the graph visualization feature of Obsidian

Improve Internationalization (i18n)

Almost goes without saying in an open-source project, but it bears saying anyway.

*TeX Support

Orgmode can do this, why can't we?

Advanced date and time support

Likely best implemented as a core module?

neorg-planager (my personal obsession at the moment)

A module for as-declaratively-as-possible creating Gantt timelines and schedules from roadmaps, projects, and tasks. Designed to take care of most of the "what" and "when" and "how" up front so as to reduce cognitive load. Ideally, this will take care of ensuring that day-to-day time usage aligns with long-term priorities. Generally in line with the GTD methodology, but tailored to my needs. Robustness to unforeseen circumstances and ability to track completion and view statistics (a bit like Anki, perhaps) are essential.

One of the biggest features is the ability to use custom priority-respecting scheduling algorithms to go from roadmaps, Gantts, projects, etc. to fine-grained schedules, and also to have this accessible through my phone (for now via Telegram API, later via Signal API or even a custom App).

Contributing

Contributing to these notes

If you find something is missing or incomplete, fork the repo and open a pull request, or open an issue.

Contributing to Neorg

See this official document.

Get in touch with the author. As always, the Discord server is a good place to discuss ideas (or anything, really).

Helpful Resources

Discord Server (very lively and welcoming)

Tutorials

Notable people

Note: this is not a comprehensive list by any means, and I do not wish to offend anyone who is a key contributor to the project whose name I missed. Just make a pull request or open an issue, and I'll make sure you get included.

  • Vhyrro - creator of Neorg
  • mrossinek
  • NTBBloodbath
  • Sevoris
  • danymat
  • max397574
  • champignoom
  • JoeyGrajciar
  • danilshvalov
  • andreadev-it
  • laher
  • pysan3
  • Gilfoyle
  • Marmalade
  • Bryant
  • Sir Polo Modulus III

Neorg on social media (focus on interesting discussions)

Background Knowledge

This covers some of what I would consider useful to know when working with Neorg & co. Most of the sections are in the form of 'learning roadmaps' - some key readings to get up to speed, sometimes also activities or questions to guide one's acquisition of the material.

Markdown

  1. Markdown Guide
  2. Markdown Tutorial
  3. Learn Markdown in Y Minutes - available in many different languages here
  4. the official documentation, as needed
    1. Basics
    2. Syntax
    3. Online Markdown-to-HTML Converter, Cheatsheet

emacs orgmode

  1. Org mode beginning at the basics
  2. Org Mode Compact Guide - reading Emacs Lisp isn't too bad if you have had any exposure to a lisp-family language before, and if not, this will will help you make sense of it
  3. .org File Syntax Specification

Neovim

General

WIP

Plugins

WIP

Treesitter

nvim-treesitter

WIP

Programming Languages

Multilinugual

Good selection of problems from Rosetta Code

Lua

  1. Why Lua?
  2. A Look at the Design of Lua
  3. Hyperpolyglot - comparison with other scripting languages, see here for the same examples in 4 more languages
  4. Learn Lua in Y Minutes
  5. nvim Lua guide - excellent tutorial

Janet

  1. Learn Janet in Y Minutes
  2. Official Site - read the main page and skim the documentation
  3. Community Docs - browse and search examples

Scheme

  1. Scheme is Fun - quick video on Scheme syntax
  2. decent short intro
  3. longer intro
  4. Learn Racket in Y Minutes - Racket is closely related to Scheme, so this is a good way to get a feel for the language - just don't memorize all the the details here; focus on generalities
  5. nice little video course
  6. Official Guide - very well-written and worth reading - not too long
  7. Cookbook - one of the better ways to get a feel for the language
  8. Teach Yourself Scheme in Fixnum Days - probably more than is needed for the small amount of Scheme used in Neorg, but well-written and worth leafing through

Zig

  1. Why Zig When There is Already C++, D, and Rust? - to get motivated
  2. ziglearn.org
  3. Learn Zig in Y Minutes
  4. In-depth Overview - really nice read
  5. Zig Docs - worth skimming
  6. Examples - to get a practical feel for the language

Rust

  1. Learn Rust in Y Minutes
  2. Hyperpolyglot
  3. The Rust Programming Language - the Bible of Rust, worth at least skimming
  4. Rust by Example - my preferred way to learn, especially when a language is new to me
  5. The Rust Cookbook - another nice format, and the third member of the Holy Trinity of Rust books

Haskell

  1. Learn Haskell in Y Minutes - worth going through for exposure to Haskell syntax
  2. Hyperpolyglot - good examples of basic tasks, even if the other 3 languages are unfamiliar
  3. Learn You a Haskell for Great Good - a classic
  4. Happy Learn Haskell Tutorial - another highly recommended resource
  5. Real-World Haskell - worth going through to solidify what has already been learned and to go from theory to practice

Dart (→ Flutter)

  1. FreeCodeCamp - very basic
  2. Another quick 1-page intro

GTD Framework

  1. Wikipedia - good concise overview
  2. Official site - 5 Steps
  3. a GTD implementation in Orgmode
  4. GTD in Taskwarrior - interesting tutorial series

Zettelkasten System

  1. Wikipedia - as always, Wikipedia has an excellent introduction
  2. Zettelkasten 101 (good blog post)

Parsing and Formal Language Theory

  1. James Power Notes - impressively concise and readable

WIP: Read through and sort

Selected Rosetta Code Problems

A+B

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Arithmetic/Integer

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Arrayconcatenation

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Array length

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Arrays

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Boolean values

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Call a function

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Character codes

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Check that file exists

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Code Golf: Code Golf

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Compare length of two strings

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Conditional structures

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Conjugate a Latin verb

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Copy a string

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Create a file

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Detect division by zero

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Determine if a string is numeric

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Draw a pixel

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Empty program

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Empty string

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Environment variables

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Even or odd

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Factorial

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

File input/output

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Find limit of recursion

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Find square difference

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

FizzBuzz

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Formatted numeric output

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Function definition

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Greatest element of a list

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Halt and catch fire

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Hello world/Graphical

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Hello world/Text

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Increment a numerical string

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Input loop

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Integer comparison

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Iterators

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Jump anywhere

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Keyboard input/Flush the keyboard buffer

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Keyboard input/Keypress check

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Keyboard input/Obtain a Y or N response

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Literals/Integer

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Logical operations

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Loops/Break

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Loops/Do-while

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Loops/Downward for

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Loops/For

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Loops/For with a specified step

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Loops/Increment loop index within loop body

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Loops/Infinite

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Loops/N plus one half

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Loops/While

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Loops/With multiple ranges

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Multiplication tables

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Naming conventions

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Nth root

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Null object

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Operator precedence

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Program termination

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Read a file line by line

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Real constants and functions

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

RPG attributes generator

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Selectively replace multiple instances of a character within a string

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Sieve of Pritchard

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Simple windowed application

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Split a character string based on change of character

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

String append

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

String comparison

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

String concatenation

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

String interpolation_(included)

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

String matching

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

String prepend

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Substring

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

System time

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Tokenize a string

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Transliterate English text using the Greek alphabet

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Two's complement

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

User input/Text

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Variables

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Zero to the zero power

   lua | zig | rust | c | janet | scheme | haskell | python | julia | dart

Comparison with Similar Projects

Markdown

WIP

emacs orgmode

The OG superuser everything-in-one plugin for the OG superuser everything-in-one editor (i.e. operating system).

Mature Ecosystem, most notably:

WIP

Obsidian

Verdict: A beautiful and very useful product whose main flaw is not being open-source. Has a powerful ecosystem and good design, and is built around markdown.

Joplin

WIP

mind.nvim

Notable features

  • tree-based
  • pure lua (nvim plugin)
  • designed to support a variety of workflows, such as journaling, note-taking, personal wiki, task management

... an organizer tool for Neovim. It can be used to accomplish and implement a wide variety of workflows. It is designed to quickly add items in trees. Why a tree? Well, list of things like WIP lists are great but they lack the organization part. Most of them can be gathered in “lists of lists” — you probably have that on your phone. A list of list is basically a tree. But editing and operating a list of list is annoying, so it’s better to have a tool that has the concept of a node and a tree as a primitive.

Status: Archived by the owner in favor of work on a more cross-application tool: "I decided that having so many great features in a single editor is not the right way to write software, and I wanted to do something different outside of Neovim."

Verdict: Well-designed and impressive tool whose only major flaw is having been abandoned. Neorg should be able to do everything that

quarto-nvim

Quarto

Quarto Neovim Docs

WIP

Taskwarrior

WIP

vim-orgmode

WIP

orgmode.nvim

WIP

zk-nvim

WIP

telekasten.nvim

WIP

taskwiki

WIP

vimwiki

WIP

mkdnflw.nvim

WIP