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 two feature sets. You start with 8 basic symbols that cover everyday note-taking. When you’re comfortable, long-press the padlock icon in the editor (or toggle in Settings) to unlock 9 more advanced symbols plus multi-line blocks and named blocks.

Prefix reference

PrefixTypeSetDescriptionExample
#HeadingbasicCreates a section heading. Everything below it gets grouped under this heading.# Project Notes
+TaskbasicAdds a task to your todo list. Tasks show up at the top of their section.+ Buy groceries
-DonebasicChecks off a task by name. You only need to type enough to identify it.- buy gr
!HighlightbasicMarks something important you want to stand out.! Ship by Friday
?QuestionbasicAn open question you haven’t answered yet.? Should we change the deadline?
"QuotebasicA quotation or something someone said." The only way to do great work...
*BulletbasicA bullet point. Put several in a row to make a list.* First point
@ImagebasicShows an image from a file path or web address.@ /path/to/image.png
-RemoveadvancedRemoves any item or section by name with a type prefix, e.g. - ?query, - !name, or - #section.- !ship
%NumberedadvancedA numbered list item. Numbers are assigned automatically.% Step one
`CodeadvancedA line of code. You can add a language name for syntax coloring.` const x = 42
&TableadvancedCreates a table row. Use pipes to separate columns. The first row becomes the header.& Name | Age | City
=MathadvancedCalculates a math expression or converts between units. Supports variable assignment.= 100 km to mi
:TimeradvancedStarts a countdown timer. Supports named timer blocks.: 25m
;Looping TimeradvancedLike a timer, but restarts automatically when it reaches zero.; 25m
>MoveadvancedMoves content into the current section by name.> +fix | Home
/CommentadvancedA private note that only shows in the editor, not the right side./ reminder to self
~Clean SlateadvancedEverything above this line disappears. A fresh start without deleting anything.~
^FindadvancedHighlights 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

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 is part of the basic set. Removing other items and sections is an advanced feature.

Checking off tasks

On its own, - looks for a matching task and marks it done. This is available in the basic set.

+ Buy groceries

- buy gr ← checks off “Buy groceries”

Removing other items advanced

With the advanced set unlocked, 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 advanced

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 persist within the note. Define them anywhere above and reference them in later expressions.

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
~Clean slate — everything above is hidden
\Escape — treats the next character as regular text
> +queryMoves a matching task into the current section