Markup Language

Mudlark uses a simple system: start any line with a special character to tell it what that line is. The right side uses these to organize your notes. You can change which characters do what in Settings.

Mudlark has 20 prefix characters covering everyday note-taking and advanced features like math, timers, tables, and stock tickers. Toggle individual types on or off in Settings.

Prefix reference

PrefixTypeDescriptionExample
#HeadingCreates a section heading. Everything below it gets grouped under this heading.# Project Notes
+TaskAdds a task to your todo list. Tasks show up at the top of their section.+ Buy groceries
-DoneChecks off a task by name. You only need to type enough to identify it.- buy gr
!HighlightMarks something important you want to stand out.! Ship by Friday
?QuestionAn open question you haven’t answered yet.? Should we change the deadline?
"QuoteA quotation or something someone said." The only way to do great work...
*BulletA bullet point. Put several in a row to make a list.* First point
@MediaShows an image or video from a file path or web address.@ /path/to/image.png
-RemoveRemoves any item or section by name with a type prefix, e.g. - ?query, - !name, or - #section.- !ship
%NumberedA numbered list item. Numbers are assigned automatically.% Step one
`CodeA line of code. Add a language hint for coloring (e.g. `swift or `c# Title `).` const x = 42
&TableCreates a table row. Use pipes to separate columns. The first row becomes the header.& Name | Age | City
=MathCalculates a math expression or converts between units. Supports variable assignment and built-in constants (pi, e).= 100 km to mi
:TimerStarts a countdown timer. Notifies when done. Supports multi-phase timers (e.g. 5m work, 5m rest).: 25m
;Looping TimerLike a timer, but restarts automatically when it reaches zero.; 25m
$StockTracks a live stock price. Use $TICKER in math lines to calculate with market values.$ AAPL
>MoveMoves content into the current section by name.> +fix | Home
/CommentA private note that only shows in the editor, not the right side./ reminder to self
~DividerDraws a horizontal rule. Completions and moves cannot cross it. Add text to center a label on the rule.~ Chapter 2
^FindHighlights matching text. Add a pipe to replace it. Add a type prefix to search within a specific type. Use @ heading to scope to a section.^ search | replace
\EscapeMakes the rest of the line plain text, bypassing all prefix parsing.\ + Not a task

Inline formatting

Within any line, you can add bold and italic formatting using asterisks. This works inside any prefix type.

*italic text*

**bold text**

***bold and italic***

Formatting markers are stripped in the rendered view and in fuzzy matching, so **bold** matches bold when checking off tasks or searching.

Smart matching

When you check off a task with - or move something with >, you don’t need to type the full name. Each word you type just needs to match the beginning of a word in the original, in order.

+ go get groceries

- go g ← matches (“go” → “go”, “g” → “get”)

+ go get groceries

- go gr ← matches (“go” → “go”, “gr” → “groceries”, skips “get”)

This also works with filenames and paths. A file like images/daisy-pants-stereo.jpg is broken up at slashes, dots, and dashes, so - @pants is enough to match it.

If nothing matches, or if multiple items match, nothing happens. The editor turns the line green when it finds a match, or red when it can’t.

Removing things

The - character does different things depending on what it matches.

Checking off tasks

On its own, - looks for a matching task and marks it done.

+ Buy groceries

- buy gr ← checks off “Buy groceries”

Removing other items

Add a type prefix after the dash to remove a specific kind of item. This works with any type that produces visible content on the right side.

? Should we change the deadline?

- ?deadline ← removes the question

! Ship by Friday

- !ship ← removes the highlight

@ images/photo.jpg

- @photo ← removes the image

Removing sections

Use - #name to remove an entire section and everything in it.

# Old Ideas

+ some task

! some highlight

- #old ← removes the section and all its contents

Multi-line blocks

Wrap several lines between two matching characters to group them. Each line inside becomes its own item of that type.

!

Ship the feature

Update the docs

Tell the team

!

Block-capable types: + ! ? " * % ` @ : ; & $ = /

Named blocks

Give a block a title by writing the character followed by a name. Named blocks show up as groups on the right side, and you can check off, remove, or move the whole group at once.

+ Shopping List

milk

eggs

bread

+

- Shopping marks all items done. > +Shopping moves the entire block.

Tables

Start a line with & and use pipes to separate columns. The first row becomes the header; additional & rows form the body.

& Name | Age | City

& Alice | 30 | London

& Bob | 25 | Paris

Consecutive & rows are grouped into a single table on the right side. A heading above the table gives it a title.

Finding and replacing

The ^ character searches everything above it. Add a pipe to replace matches, a type prefix to target a specific type, or @ heading to scope the search to a specific section.

^ search ← highlights all matches

^ search | replace ← replaces all matches

^ +task | replacement ← only searches tasks

^ search | replace @ Notes ← scoped to the “Notes” section

Math

The = character evaluates math expressions, converts units, and supports variable assignment.

= 42 * 1.21 ← 50.82

= 100 km to mi ← 62.14

= x = 5 ← assigns 5 to x

= x * 2 ← 10

Variables are scoped to the current math block. Built-in constants like pi and e are always available.

Moving things around

The > character moves content between sections. You can move a single item, everything under a heading, or send things to a specific section.

> +fix ← moves a task matching “fix” here

> Work ← moves everything from the “Work” section here

> +fix | Home ← moves a task to the “Home” section

Special characters

InputBehavior
~Divider. Horizontal rule that blocks completions and moves from crossing
\Escape. Treats the next character as regular text
> +queryMoves a matching task into the current section