Skip to content

Posts & Markdown

Posts and replies in Nexus are written in Markdown with GitHub Flavored Markdown (GFM) extensions enabled. The composer provides a toolbar, slash commands, live preview, @mention autocomplete, and image upload.


Every post has a type, selected when composing:

TypeBehaviour
DiscussionStandard post.
AnnouncementIdentical to discussion — visually distinguished as an announcement.
QuestionMarks the post as a question. The author or a moderator can mark a reply as the accepted answer, which pins it below the question body. Requires the Question posts setting to be enabled in Admin → Permissions.

FieldLimit
Post title3–255 characters
Post body1–100,000 characters
Reply body1–50,000 characters

Nexus uses marked with breaks: true and gfm: true. Single newlines produce line breaks. All output is sanitized with DOMPurify before rendering.

**bold**
*italic*
~~strikethrough~~
`inline code`
# Heading 1
## Heading 2
- Unordered item
- Another item
1. Ordered item
2. Another item
[link text](https://example.com)
![alt text](https://example.com/image.jpg)

Fenced code blocks with optional language for syntax highlighting:

```elixir
def hello, do: "world"
```
> This is a blockquote.
| Column 1 | Column 2 |
|---|---|
| Cell | Cell |
---

Wrap text in || to create a spoiler that must be clicked to reveal:

||hidden text||

Wrap image markdown lines in [grid]...[/grid] tags to display them as a responsive mosaic gallery rather than stacked individually:

[grid]
![Sunset](https://example.com/sunset.jpg)
![Mountains](https://example.com/mountains.jpg)
![Lake](https://example.com/lake.jpg)
[/grid]

Images inside a grid are rendered at their natural aspect ratio with no cropping. Clicking any image opens it in the lightbox, scoped only to the images in that grid. The Image grid button in the composer toolbar inserts an empty [grid]...[/grid] block with the cursor positioned inside it.


Bare URLs on their own line are automatically detected and embedded:

URL typeEmbed
YouTube (youtube.com/watch, youtu.be, youtube.com/shorts)Lazy-loaded video player
Vimeo (vimeo.com/…)Iframe player
X / Twitter (twitter.com/…/status/…, x.com/…/status/…)Tweet embed
Spotify (open.spotify.com/track/…, /album/…, /playlist/…, /episode/…)Spotify player
Direct video file (.mp4, .webm, .ogg, .mov)<video> player
Direct audio file (.mp3, .ogg, .wav, .flac, .m4a)<audio> player
Other URLsLink preview card (title, description, image)

Type @ followed by a username to trigger an autocomplete dropdown. Select a user with the arrow keys and press Enter or Tab to insert the mention. Mentions render as links to the user’s profile.


The toolbar wraps the text area and provides one-click formatting:

ButtonAction
BBold (**text**)
IItalic (*text*)
SStrikethrough (~~text~~)
H1Heading 1 (# )
H2Heading 2 (## )
</>Inline code (`text`)
Code block (```)
🔗Link ([text](url))
Blockquote (> )
Horizontal divider (---)
👁Spoiler (||text||)
😊Emoji picker
🖼Image upload
👁 (eye icon)Live preview

Toolbar buttons can be reordered and hidden per context (posts vs. replies) from Admin → Layout.


Images can be inserted three ways:

  • Toolbar button — click the image icon to open a file picker
  • Paste — paste an image directly from the clipboard
  • Drag and drop — drag an image file into the composer

Accepted formats: JPEG, PNG, GIF, WebP, SVG. The image is uploaded immediately and inserted as a Markdown image link pointing to the WebP-converted version, with the original as the lightbox target.


Type / at the start of a new line to open the slash command menu:

CommandInserts
ImageOpens the image file picker
Code blockA fenced code block template
BlockquoteA blockquote prefix (> )
DividerA horizontal rule (---)

Navigate with arrow keys, select with Enter, dismiss with Escape.


Click the eye icon at the far right of the toolbar to open a preview modal showing the rendered output of the current Markdown.


Admins and moderators can pin or lock posts. Pinned posts float to the top of the feed. A post can be pinned globally (visible at the top of all feeds) or pinned to its space only.

Locked posts cannot receive new replies. The post body remains readable.


When New users can post immediately is disabled in Admin → Permissions, posts and replies from new users are placed in a pending approval queue. They are not visible to other members until a moderator approves them from Admin → Moderation.