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 default — Plain text with no hidden formatting, tables, or text boxes that confuse ATS parsers.
- Version control — Track every change in Git, diff sections between applications, and revert to any previous version.
- Distraction-free — No toolbar clicking. You stay in flow and focus on the content, not the tool.
- Portable — Edit in VS Code, Vim, Obsidian, or any text editor. The Markdown file is yours forever.
- Consistent output — The 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:
| Element | Markdown syntax | Used for |
|---|---|---|
| Name | # Jane Doe | Resume name — the only h1 on the page |
| Section | ## Experience | Top-level section headers |
| Sub-heading | ### Projects | Sub-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 5 | Achievement 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, CACity, 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, CA2. 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 teamsUse --- (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.9Include 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 ActionsMatch 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 searchAlways 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 names — Stick to "Experience", "Education", "Skills", "Projects", "Summary". Avoid creative alternatives like "Where I've worked" or "My toolkit" — ATS may not recognise them.
- Single column only — Multi-column layouts cause ATS to read text out of order. All themes in this builder are single-column by design.
- No tables, no text boxes — Both are either invisible or garbled in ATS output. Bullet points and plain text only.
- Spell out acronyms once — Write "Kubernetes (K8s)" on first use so both the full name and abbreviation are indexed.
- Mirror the job description — Copy exact phrases from the posting into your bullets and summary. "Managed AWS infrastructure" matches better than "ran cloud servers".
- Keep to one page — ATS 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:
- 1Open the editor — Go to /editor or click Start Building on the homepage.
- 2Paste your Markdown — Replace the sample content in the left pane with your resume. You will see a live preview on the right.
- 3Pick a theme — Open the sidebar and choose from Tehran, Isfahan, Shiraz, or Mashhad. Each has its own typographic character — see the template gallery to compare them.
- 4Adjust styling — Use the font, size, color, and spacing sliders to fine-tune the look. Changes apply in real time — no reload needed.
- 5Export — Click 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.