Developer blogs have specific needs that most blogging platforms ignore. You need code blocks that actually look good. You need math rendering for algorithms and proofs. You need Markdown because that's how you think. And you need to own your data so you can move it wherever you want.
Pluma was built with these needs in mind. Not as afterthoughts bolted onto a general-purpose CMS, but as core features of the writing experience.
Pluma uses Prism.js for syntax highlighting, supporting over 190 programming languages out of the box. Python, JavaScript, TypeScript, Rust, Go, C, C++, Java, SQL, Ruby, PHP, Swift, Kotlin, Haskell, Bash, YAML, TOML, Dockerfile, GraphQL -- whatever you write about, the highlighting is there.
Prism's autoloader plugin handles grammar loading automatically. When a reader opens your article, only the language grammars actually used on that page are fetched. If you write a post with Python and SQL code blocks, only those two grammars load. No bloated bundles, no manual configuration.
When you add a code block in the editor, you select a language and the highlighting applies immediately -- both in the editor and on the published page.
This isn't the basic monospace-font-on-gray-background approach you get on Medium or Substack. Pluma renders proper syntax highlighting with language-specific tokenization: keywords, strings, comments, functions, and operators each get distinct colors that make code genuinely readable.
Code blocks preserve whitespace exactly as you type it. Indentation, blank lines, and spacing are faithfully reproduced. There's no auto-formatting that mangles your carefully structured code. Each published code block also gets a language label in the corner so readers know what they're looking at.
If you write about mathematics, computer science, physics, or any field that uses equations, Pluma has built-in MathJax support. Write inline math within your paragraphs or add dedicated math blocks for display equations.
This works in the editor with live preview -- you type LaTeX, and the rendered equation appears as you write. On the published page, MathJax renders your equations as crisp, scalable SVG that looks sharp on every screen size.
Most blogging platforms either don't support math at all or require you to generate equation images and upload them manually. Pluma treats math as a first-class content type. Math blocks use $$ delimiters on their own lines for display equations, while inline math sits naturally within paragraph text. Both render identically in the editor preview and on the published page.
Pluma's editor is built for keyboard-driven workflows. Every common action has a shortcut, and you can remap all of them from the settings page.
Global actions:
Text formatting (select text first):
Add blocks:
Block management:
On macOS, Ctrl is replaced by Cmd throughout. You can also type / inside any empty block to open the slash command menu, which lets you search and insert any block type without leaving the keyboard.
Every shortcut is customizable -- open the settings page, click the shortcut field you want to change, press your new key combination, and save. Conflict detection prevents you from assigning the same binding to two actions. Your custom bindings are stored locally and persist across sessions.
Pluma's editor is a block-based visual editor, but Markdown is the storage format. Every article is stored as Markdown and can be exported as Markdown at any time. If you write a post, export it, and open the file in any text editor, you'll see clean, standard Markdown with fenced code blocks and proper formatting.
The Markdown parser handles fenced code blocks with language tags ( `python , `sql , etc.), math blocks delimited by $$ on their own lines, inline math, and a custom block syntax using ::: delimiters for structured components. Standard inline formatting -- bold, italic, strikethrough, inline code, links, footnotes -- all works as expected.
Exported Markdown files include YAML front matter with the article's title, slug, tags, excerpt, status, and date. This front matter is compatible with static site generators like Hugo, Jekyll, and Next.js, so you can drop exported files directly into a new project.
Standard markdown covers paragraphs, headings, lists, and code well, but technical writing often calls for more structured components. Pluma's custom blocks fill that gap.
The blocks marketplace at pluma.ink/blocks/ is a library of community-built blocks that extend the editor. Available blocks include Warning (callout boxes for tips, warnings, info, and danger alerts), Timeline (chronological events with dates and descriptions), Spoiler (click-to-reveal collapsible content), and Pull Quote (large stylized quotes with attribution).
Custom blocks use a simple ::: syntax in Markdown. A block starts with :::block_name, contains fields delimited by ::field_name and ::, and closes with :::. The syntax is plain text -- no proprietary binary format, no embedded HTML.
In the editor, custom blocks render as forms with one input per field and a live preview that updates as you type. Installed blocks appear in both the toolbar and the slash command menu (type / to search). Each block has a detail page in the library showing a live preview, field descriptions, and the exact Markdown syntax. Custom blocks are available on every plan -- Free, Pro, and Max.
Some blocks support repeatable entries. The Timeline block, for example, lets you add multiple date/event pairs separated by --- within a single block. This keeps related content grouped together rather than scattered across separate components.
Technical writing often requires structured data. Pluma's editor includes table support -- add rows and columns, and the content renders as clean HTML tables on your published page. No plugins, no embedded spreadsheets, no screenshots of tables.
Nested lists work with Tab and Shift+Tab for indent and outdent, supporting both ordered and unordered lists at multiple nesting levels. Blockquotes, headers, and subheaders round out the structural elements you need for well-organized technical articles.
Your content is yours. Pluma stores everything as Markdown, and every export path uses standard formats.
Single article export: From the article list, export any article as a .md file with YAML front matter (title, slug, tags, excerpt, status, date). The keyboard shortcut Ctrl+Shift+E exports the current article directly from the editor.
Bulk export: Export your entire blog as a ZIP file of Markdown files. Every article gets its own .md file with front matter, packaged using JSZip and downloaded in one click.
PDF export: Generate a styled PDF of any article for offline sharing or archival. The PDF renderer preserves code highlighting, math equations, and custom block styling.
These are standard formats. The Markdown files work with Hugo, Jekyll, Next.js, Astro, Gatsby, or any static site generator that reads Markdown with front matter. If you decide to move off Pluma, your content comes with you without conversion scripts or data loss.
Every Pluma blog has a built-in RSS feed. If your readers use feed readers -- and many developers do -- they can subscribe to your blog without any setup on your end.
Pro and Max plans give you full SEO control: custom slugs (up to 30 characters), meta descriptions, canonical URLs for cross-posted content, and social sharing tags. If you publish on Pluma and syndicate to Dev.to or Hashnode, canonical URLs ensure search engines know your Pluma blog is the original source.
Unlike platforms that hide your content behind their domain, Pluma gives you your own subdomain (username.pluma.ink) or lets you bring a custom domain. Your blog builds your brand, not someone else's. If you're comparing options, see how Pluma stacks up against Medium and Substack.
On Pro and Max plans, Pluma provides built-in analytics without any third-party trackers. You can see page views, referrers, and reading trends without loading Google Analytics or any external scripts on your readers' pages. Your readers' privacy stays intact, and your pages stay fast.
Visitor identification uses daily-rotating hashed IDs derived from IP addresses -- no raw IPs are ever stored. The analytics dashboard shows traffic by device, browser, country, and referrer, giving you the data you need without compromising anyone's privacy. Pro plans retain 90 days of analytics history; Max plans retain a full year.