New blogMaking an AI Agent You Can Trust With Money

★ Markdown-Aware chunking, visualized

Markdown-Aware Chunking for RAG

Markdown-aware chunking splits the document at headings, so each chunk is one section. It records the heading path, for example 'Refund policy > How to request a refund > Processing times', as metadata you can store with the embedding.

  • Runs in your browser
  • No signup

1,181 characters · loading tokenizer… · nothing leaves your browser

chars
chars

Markdown · 400 chars · overlap 40

6 chunks

49
avg tokens
29 / 71
min / max
0
overlap tokens
$5.86
embed 1M docs

Loading the tokenizer; token counts are estimates until it's ready.

# Refund policy for annual plans Annual plans are billed once a year, up front. This page explains when you can get money back and how long it takes. ## Eligibility You can request a full refund within 30 days of the first annual charge. After 30 days, refunds are prorated for the unused months, minus any discount you received for paying annually. Renewals follow the same rule: the 30-day window starts again on each renewal date. ## How to request a refund Open Settings, then Billing, and choose "Request refund". Pick the reason that fits best. If you are cancelling because of a bug, include the error message; it often gets fixed faster than the refund is processed. ### Processing times Card refunds usually appear within 5 to 10 business days, depending on your bank. Bank transfers can take longer. We send an email when the refund leaves our side. ## Exceptions Refunds are not available for usage-based charges such as extra API calls or storage, because those costs are incurred when you use them. Accounts closed for abuse are not eligible. ## Contact Still stuck? Email the billing team with your account ID and the last four digits of the card on file.

one chunkoverlapClick a chunk to inspect it.

Chunk inspector

Click any coloured chunk in the document to see its text, size, heading path and what it shares with its neighbours.

Chunk sizes

Tokens per chunk (estimated). A tight cluster means predictable chunks.

12913724515361169chunk size (tokens), bucket start

Embedding cost assumes text-embedding-3-small at $0.02 per 1M tokens (OpenAI, checked 8 Nov 2026), counting overlap twice.

Export config

Copy-ready code for the strategy and settings above. Comments flag where a library differs.

from langchain_text_splitters import MarkdownHeaderTextSplitter, RecursiveCharacterTextSplitter

headers = [("#", "h1"), ("##", "h2"), ("###", "h3"), ("####", "h4")]
by_heading = MarkdownHeaderTextSplitter(headers_to_split_on=headers, strip_headers=False)
sections = by_heading.split_text(text)  # each Document carries its heading path in .metadata

# Cap section size; heading metadata is copied to every piece.
capper = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=40)
chunks = capper.split_documents(sections)

Your retrieval is only as good as your chunks.

I build RAG systems with evals, so you know when the answers get better or worse.

Fix my RAG
01

How it works

Markdown-aware chunking splits the document at headings, so each chunk is one section. It records the heading path, for example 'Refund policy > How to request a refund > Processing times', as metadata you can store with the embedding.

Headings inside code fences are ignored. When a section is longer than the size limit, it falls back to recursive splitting inside that section, and every piece keeps the section's heading path.

02

When to use it

Good fit

  • Documentation, help centres and knowledge bases written in markdown.
  • When the section title is part of the answer's meaning.
  • When you want to filter or boost retrieval by section.

Watch out for

  • Very short sections become tiny chunks with little to embed.
  • Documents with no headings fall back to plain recursive splitting.
  • Inconsistent heading levels produce odd heading paths.
03

Where to start

Use a size cap that fits a typical section, and prepend the heading path to each chunk's text before embedding so the vector carries the context too.

Then test it: write down twenty real questions, check which chunks come back for each, and compare strategies on the same set. The main visualizer lets you put two strategies side by side.

04

Questions engineers actually ask

Should the heading be in the chunk text or only in metadata?
Both is common: keep the path as metadata for filtering and prepend it to the text you embed so retrieval sees it. This tool keeps the heading line in the chunk and shows the path separately.
How do I do this in LangChain?
Split with MarkdownHeaderTextSplitter, then run RecursiveCharacterTextSplitter over the resulting documents to cap their size. The export panel generates that code.
What about HTML or PDFs?
Convert them to markdown first, or use a header-aware splitter for HTML. PDFs usually need layout-aware extraction before any chunking works well.
What chunk size should I use for RAG?
There is no universal number. A few hundred tokens with a small overlap is a common starting point, but the right size depends on your documents and questions. Build a small evaluation set and compare sizes on it.
Does my text leave the browser?
No. Splitting, tokenizing and the visualization all run in your browser. Nothing you paste is sent anywhere.
05

Other strategies

06

More from the workbench

Fine print

Tools: on the house.
Engineer: by the hour.

The visualizer was free. Production RAG with evals is what I build.

I'm Himanshu, an AI and full-stack engineer. I build MVPs, AI agents and the growth plumbing around them for early-stage startups.