Getting started: write, configure, publish
ranty turns a Git repository into a blog. Connect a repo once and, from then on, every
Markdown file you push becomes a post at ranty.dev/@you. No CMS, no web editor, no
database you can't read — your content is plain files under version control.
The loop
Publishing is three commands:
git add posts/hello-world.md
git commit -m "new post"
git push origin main
ranty receives the push, syncs the repo and publishes. The commit log is your edit
history; rolling a post back is git revert. Moving to another host is git clone, not
begging for an export.
Writing a post
A post is a .md file: a small YAML frontmatter block, then your prose.
---
title: A boring deploy is a good deploy
date: 2026-05-30
tags: [ops, git]
excerpt: Why I stopped chasing clever pipelines.
status: published
---
Your **Markdown** goes here.
Every frontmatter field is optional:
title— else derived from the file name.date— else the time of the first sync.slug— else the file (or folder) name; it's the URL.tags— a list or a comma-separated string; the first few show as pills.excerpt— else auto-generated from the body.status—published(default) ordraft.
You get GitHub-flavoured Markdown — headings, lists, tables, task lists, footnotes — and fenced code blocks are highlighted with a copy button:
defmodule Hello do
def world, do: IO.puts("hi from a code block")
end
Headings automatically become the "On this page" table of contents.
Configuring your site: ranty.yml
How your public site looks is git-first too: a single ranty.yml at the root of your
repo (not inside the posts folder).
display_name: "Mara Okafor"
role: distributed systems # short tagline next to your name
bio: I write about Git and boring tech that stays up.
avatar: assets/avatar.png # a committed image, like any other
template: minimal # minimal | archive | magazine
default_locale: en # en | pt
accent: "#5B8DEF" # a brand colour (hex)
links:
github: maraokafor
x: maraokafor
website: https://mara.dev
Push it and your live site picks it up. A missing or broken file never blanks your site — your last good config stays live and the error shows in Settings.
Your @handle is not set here: it's your account identity and URL
(ranty.dev/@handle), managed in Settings, so no repository can claim someone else's
handle. If you connect several repos, the config is read from your oldest (primary) one.
Next
- Posts with images — covers and inline images.
- Choosing a template — see all three side by side.
- Bilingual posts — one post, two languages.