GitHub
Complete Guide · ~10 min read

How to Write a Resume in Markdown

A practical, example-driven guide — from your first heading to a polished, ATS-friendly PDF ready to send to recruiters.

Why write your resume in Markdown?

Markdown is a lightweight plain-text format that converts cleanly to HTML and PDF. It has become the format of choice for developers and tech professionals for several reasons:

  • ATS-safe by defaultPlain text with no hidden formatting, tables, or text boxes that confuse ATS parsers.
  • Version controlTrack every change in Git, diff sections between applications, and revert to any previous version.
  • Distraction-freeNo toolbar clicking. You stay in flow and focus on the content, not the tool.
  • PortableEdit in VS Code, Vim, Obsidian, or any text editor. The Markdown file is yours forever.
  • Consistent outputThe same Markdown produces the same PDF every time — no mysterious formatting surprises.

Markdown syntax quick reference

You only need a small subset of Markdown for a resume. Here is everything you will use:

ElementMarkdown syntaxUsed for
Name# Jane DoeResume name — the only h1 on the page
Section## ExperienceTop-level section headers
Sub-heading### ProjectsSub-sections inside a section
Bold**Senior Engineer**Job titles, company names, skill labels
Italic*Jan 2021 – Present*Dates, locations, secondary info
Bullet- Led a team of 5Achievement bullets in experience
Link[LinkedIn](https://...)URLs in contact line or projects
Divider---Separator between sections
Accent:accent[Available now]Theme accent colour (custom directive)
Muted:muted[Refs on request]Subdued/grey text (custom directive)

1. Name & contact information

The first line of your resume is your full name as an # heading. Directly below it, put a single contact line using a middle dot (·) or pipe (|) as a separator.

# Jane Doe
jane@email.com · linkedin.com/in/janedoe · github.com/janedoe · San Francisco, CA

City, State only — do not include your street address on a resume. It is unnecessary and a privacy risk. ATS systems only need to confirm you are in the right region.

For links, you can use bare URLs — they will become hyperlinks in the exported PDF. Or you can write them as Markdown links for cleaner display:

# Jane Doe
jane@email.com · [linkedin.com/in/janedoe](https://linkedin.com/in/janedoe) · [github.com/janedoe](https://github.com/janedoe) · San Francisco, CA

2. Professional summary

A summary is optional but valuable — it is the first thing an ATS reads closely and the first thing a recruiter scans. Keep it to 2–3 sentences. Front-load your most important keywords.

## Summary

Full-stack engineer with 7 years of experience building high-traffic web applications
in React and Node.js. Proven track record of shipping features at scale and mentoring
junior engineers. Open to senior IC roles at product-focused companies.

Tailor this section for each application. Paste keywords directly from the job description — ATS systems are looking for exact phrase matches.

3. Work experience

This is the most important section. The pattern for each role:

  • Bold job title and company name, separated by ·
  • Italic start–end dates on the same or next line
  • Bullet points that start with an action verb (Reduced, Built, Led, Shipped...)
  • Quantify wherever possible — percentages, headcount, dollar amounts
  • Most impactful bullet goes first
## Experience

**Senior Software Engineer** · Stripe
San Francisco, CA · *Jan 2022 – Present*

- Architected a payment retry system that reduced failed transactions by 28%
- Led a cross-functional team of 6 engineers to ship Stripe Tax ahead of schedule
- Reduced billing API p99 latency from 800 ms to 210 ms by rewriting in Go

---

**Software Engineer** · Shopify
Remote · *Jun 2019 – Dec 2021*

- Built the order fulfillment dashboard used by 1 M+ merchants worldwide
- Migrated legacy Rails services to a GraphQL API, cutting mobile load time by 35%
- Wrote the onboarding documentation adopted by 3 engineering teams

Use --- (a horizontal rule) between each job. It visually separates roles in the preview and is invisible to ATS — the perfect divider.

4. Education

Keep the education section short unless you are a new graduate. Bold the degree, follow with the school name, and put the dates in italics.

## Education

**B.S. Computer Science** · MIT
Cambridge, MA · *2015 – 2019* · GPA: 3.9

Include GPA only if it is 3.5 or above and you graduated within the last five years. After that, omit it entirely.

5. Skills

A plain comma-separated list of skills is readable but hard to scan. Using bold category labels helps both ATS parsing and human readers:

## Skills

**Languages:** TypeScript, Python, Go, SQL, Bash
**Frontend:** React, Next.js, Tailwind CSS, GraphQL
**Backend:** Node.js, FastAPI, PostgreSQL, Redis
**Infra:** AWS (Lambda, ECS, S3), Terraform, Docker, GitHub Actions

Match your skill names exactly to how they appear in job descriptions. ATS systems match on exact strings — “Node.js” and “NodeJS” may score differently.

6. Projects

For developers, a projects section can be as persuasive as work experience. Link the project name, add a one-line tech stack in italics, and use bullets to highlight impact metrics.

## Projects

**[Markdown Resume Builder](https://markdownresume.app)**
*Next.js, Puppeteer, Tailwind CSS · Open Source*

- Markdown-to-PDF resume builder with 4 professional themes and real-time preview
- 3,000+ monthly visitors · 400+ GitHub stars

---

**[OpenSearch VS Code Extension](https://marketplace.visualstudio.com)**
*TypeScript, VS Code Extension API*

- Fast codebase search extension; 5,000+ installs
- Reduced average file-open time by 60% compared to native search

Always link to a live URL or GitHub repo. A recruiter who clicks through is a signal of genuine interest — make it easy for them.

7. Custom directives

Beyond standard Markdown, this app supports two custom inline directives that map to themed CSS classes:

:accent[text]

Renders text in the theme's accent colour (blue by default). Use it to draw attention to availability, a standout credential, or your current status.

:accent[Open to full-time roles · Available April 2026]

:muted[text]

Renders text in a lighter, muted colour — ideal for secondary information that should stay on the page but not compete for attention.

:muted[References available upon request]
:muted[Work authorisation: US citizen · No sponsorship required]

Place directives on their own line — either at the top of the resume just below the contact line, or at the very bottom. They render inline but read as standalone statements.

ATS compatibility tips

Applicant Tracking Systems parse your resume before a human ever reads it. A resume that fails ATS parsing may be rejected automatically. Here is how to stay safe:

  • Use standard section namesStick to "Experience", "Education", "Skills", "Projects", "Summary". Avoid creative alternatives like "Where I've worked" or "My toolkit" — ATS may not recognise them.
  • Single column onlyMulti-column layouts cause ATS to read text out of order. All themes in this builder are single-column by design.
  • No tables, no text boxesBoth are either invisible or garbled in ATS output. Bullet points and plain text only.
  • Spell out acronyms onceWrite "Kubernetes (K8s)" on first use so both the full name and abbreviation are indexed.
  • Mirror the job descriptionCopy exact phrases from the posting into your bullets and summary. "Managed AWS infrastructure" matches better than "ran cloud servers".
  • Keep to one pageATS systems don't penalise multi-page resumes, but recruiters spending 6 seconds skimming do. One tight page beats two loose ones.

Complete example resume

Here is a full, realistic Markdown resume you can copy directly into the editor. It uses every technique covered in this guide.

# Alex Chen
alex@email.com · [linkedin.com/in/alexchen](https://linkedin.com/in/alexchen) · [github.com/alexchen](https://github.com/alexchen) · Seattle, WA

:accent[Open to senior full-stack roles · Available April 2026]

---

## Summary

Full-stack engineer with 6 years of experience shipping high-traffic React and
Node.js applications. Strong background in performance optimisation and developer
tooling. Former Stripe and AWS engineer.

---

## Experience

**Senior Software Engineer** · Stripe
Seattle, WA · *Mar 2022 – Present*

- Built the Stripe Tax calculation engine now used by 40,000+ merchants globally
- Reduced billing API response time by 55% by rewriting aggregation logic in Go
- Mentored 4 junior engineers through weekly code reviews and 1:1s

---

**Software Engineer** · Amazon Web Services
Seattle, WA · *Aug 2019 – Feb 2022*

- Contributed to the CloudWatch Logs Insights query engine (50 M+ daily queries)
- Migrated a legacy Perl data pipeline to Python + Spark, cutting runtime from 4 h to 18 min
- Wrote the internal onboarding documentation adopted by 12 new team members

---

## Skills

**Languages:** TypeScript, Python, Go, SQL, Bash
**Frontend:** React, Next.js, Tailwind CSS, Vite
**Backend:** Node.js, FastAPI, PostgreSQL, Redis, DynamoDB
**Infra:** AWS (Lambda, ECS, S3, CloudFront), Terraform, Docker, GitHub Actions

---

## Projects

**[Markdown Resume Builder](https://markdownresume.app)**
*Next.js, Puppeteer, Tailwind CSS · Open Source*

- Markdown-to-PDF resume builder with 4 professional themes and real-time preview
- 3,000+ monthly visitors · 400+ GitHub stars

---

## Education

**B.S. Computer Science** · University of Washington
Seattle, WA · *2015 – 2019* · GPA: 3.8

---

:muted[References available upon request]

Exporting to PDF

Once your Markdown is ready, exporting takes about 30 seconds:

  1. 1Open the editorGo to /editor or click Start Building on the homepage.
  2. 2Paste your MarkdownReplace the sample content in the left pane with your resume. You will see a live preview on the right.
  3. 3Pick a themeOpen the sidebar and choose from Tehran, Isfahan, Shiraz, or Mashhad. Each has its own typographic character — see the template gallery to compare them.
  4. 4Adjust stylingUse the font, size, color, and spacing sliders to fine-tune the look. Changes apply in real time — no reload needed.
  5. 5ExportClick the Export button. A PDF will download in a few seconds, rendered server-side by Puppeteer.

Selectable text, not a screenshot

The exported PDF contains real, selectable text — not a rasterised image. This means ATS systems can parse it directly from the PDF file without needing a plain-text submission.

Ready to build your resume?

Open the free editor, paste the example above as a starting point, and export your PDF in minutes.