Download | Website | English | 简中 | 繁中 | 日本語 | 한국어
Warning
V8 is still under development and has not been officially released. If you need a stable version, please use the v7 branch.
Maple Mono is an open-source monospace font designed to make coding more comfortable and efficient.
I created it to improve my own productivity, and hope it helps more people enjoy writing code.
Why Maple Mono?
- ✨ Variable font support - Adjust the weight continuously, with carefully refined italic glyphs for flexible typography.
- ☁️ Rounded shapes and visual refinement - Rounded throughout, with redesigned
@ $ % & Q ->, refined italic connections (f i j k l x y), and multiple character-width modes. - 🪄 Enhanced smart ligatures - Extensive smart ligatures, character variants, OpenType stylistic sets, and built-in status-label ligatures make code easier to read and more expressive.
- 🔣 Extended Unicode coverage - Includes box-drawing characters, Braille, mathematical operators (U+2200–U+22FF), chess and card symbols, terminal status and progress symbols, and Claude Code loading indicators for scientific and development workflows.
- 🎨 Nerd Font icon support - Integrates Nerd Fonts natively for clear, readable interfaces across development tools and terminals.
- 🔨 Highly customizable builds - Configure OpenType features, custom tag ligatures, line height, character width, and weight mapping, or generate a custom font from source.
Simplified Chinese, Traditional Chinese, Japanese, and Korean
Maple Mono supports CJK character sets. Compared with V7, V8 greatly expands and improves its CJK coverage for Simplified Chinese, Traditional Chinese, Japanese, and Korean. CJK glyphs use a 2:1 width ratio with Latin characters to keep multilingual text and Markdown tables aligned; as a trade-off, the default CJK spacing is wider than in many other CJK fonts. See this issue for details.
| Locale | Coverage | CJK font source | Build output |
|---|---|---|---|
| CN | Simplified Chinese, with common Traditional Chinese and Japanese ranges | WenYuan Rounded SC | CN |
| TC | Traditional Chinese | Chiron Go Round TC | TC |
| JP | Japanese | Resource Han Rounded JP | JP |
| KR | Korean | Chiron Go Round TC, filtered to Korean ranges | KR |
CJK builds are disabled by default. Use the CJK build configuration to select one or more locales, static or variable output, and optional compact spacing.
Preview
- Generated with CodeImg
- Theme: Maple
- Configuration: 16px font size, 1.8 line height, default letter spacing
Getting Started
Download and Installation
Download the font archives from Releases.
You can also install Maple Mono through Scoop, Homebrew, AUR/Paru, NixPkgs, and other package managers. See the installation guide for details.
Usage and Feature Configuration
See the usage guide for usage and configuration instructions.
Naming and Font Selection
Maple Mono provides multiple font formats and character-set ranges in its releases based on user feedback. Choose the font file that fits your use case; see font selection for details.
CDN
Maple Mono
Maple Mono CN
Highlights
You can preview all highlights on the page#todo.
Custom Builds
Maple Mono provides highly customizable builds. Modify config.json or add command-line arguments to generate the font you need; see custom builds for details.
See the full build.py CLI reference.
Narrow Glyphs
V8 provides three character-width modes. Change the "width" field in config.json, or pass --width <mode> on the command line.
Available modes:
- default: 600
- narrow: 550
- slim: 500
OpenType Feature Switches
OpenType features control built-in font variants and ligatures, and are supported by most modern operating systems, browsers, terminals, and editors. Enable or disable them to control ligatures and character styles.
Maple Mono provides many fine-grained OpenType features. To reduce configuration effort, builds support three handling modes (why):
enable: Force these features on without settingcvXX/ssXX/zeroin the font feature configuration, similar to default ligatures.disable: Remove these features fromcvXX/ssXX/zero, so they remain inactive even if enabled manually.ignore: Keep the default behavior unchanged.
Normal Preset
Maple Mono's default glyph design is distinctive and personalized, which may not suit every taste or use case. The --normal build preset provides glyphs similar to JetBrains Mono (0 has a slash in the middle instead of a dot).
Custom OpenType Features
Most fonts do not support custom OpenType features, while Maple Mono supports defining them programmatically.
By default, the Python modules in scripts/feature/ generate the OpenType feature code loaded during the build. Modify those modules to adjust behavior or customize labels. To edit .fea source files directly, pass --apply-fea-file to build.py; the build script will load source/features/{regular,italic}{_cn,}.fea.
Infinite Arrow Ligatures
Inspired by Fira Code and Cascadia Code, Maple Mono supports infinite arrow ligatures.
Infinite arrow support is enabled by default during builds. Set "infinite_arrow": false in config.json, or pass --no-infinite-arrow on the command line, to disable it. Pass --infinite-arrow to override a disabled configuration. Discuss issues in #508.
Standard Zero Feature
By default, 0 uses the slashed style, and enabling zero displays the dotted form. Use --standard-zero to restore the standard OpenType semantics: the default 0 is dotted, and enabling zero displays the slashed form.
Custom Line Height
Maple Mono's default line height is 1. Change the "line_height" field in config.json, or pass --line-height <value> on the command line. The final line height is calculated as (ascender - descender) * line_height.
Custom Unicode Mapping
If Maple Mono lacks a Unicode code point, the corresponding character may not render. Customize the mapping through the "codepoint_alias" field in config.json.
For example, map existing characters to other Unicode code points:
{
"codepoint_alias": {
"U+E000": "U+E001",
"U+E002": "U+E003"
}
}Custom Weight Mapping
Change the weight of static fonts through the "weight_mapping" field in config.json.
For example, make the regular weight slightly thinner by lowering "weight_mapping.regular" from 400 to 350:
{
"weight_mapping": {
"thin": 100,
"extralight": 200,
"light": 300,
"regular": 350,
"semibold": 500,
"medium": 600,
"bold": 700,
"extrabold": 800
}
}Custom Nerd Font Configuration
Maple Mono includes Nerd Font icons and follows its naming rules. By default, each icon uses a one-Latin-character advance width, while its glyph width may vary.
- To make icons occupy one Latin-character width (Nerd Font Mono), set
"nerd_font.mono": trueinconfig.json, or add--nf-monoto the build arguments. - To use variable-width icons (Nerd Font Propo), set
"nerd_font.propo": trueinconfig.json, or add--nf-propoto the build arguments.
To customize font-patcher arguments, install fontforge (and possibly python3-fontforge). You may also need to change "nerd_font.extra_args" in config.json.
Argument Parsing Rules
Default arguments: -l --careful --outputdir dir
- When
"nerd_font.propo"istrue, add--variable-width-glyphs. - When
"nerd_font.mono"istrue, add--mono.
CJK Version
CJK fonts are not generated by default. Enable the CJK build configuration to download the required base glyphs from the GitHub Release.
Narrow CJK Spacing
If only the CJK characters have too much spacing while Latin characters look correct, use the cjk.narrow build option or the --cjk-narrow command-line argument. This prevents the font from being recognized as strictly monospace.
See #249 for a preview and discussion.
- To change Latin character width as well, use the
--widthoption.
Centered Full-Width Punctuation
Maple Mono supports the cpct feature to center full-width punctuation, which is common in Traditional Chinese; you can also enable cv99 to force this behavior. See #150 for details.
GitHub Mirror
The build script automatically downloads required resources from GitHub. If a download fails, set github_mirror in config.json or set $GITHUB as an environment variable. The target URL format is https://<github_mirror>/<user>/<repo>/releases/download/<tag>/<file>; you can also download the target .zip file and place it next to build.py.
build.py CLI
usage: build.py [-h] [-v] [-d] [--debug] [-n] [--standard-zero] [--feat FEAT]
[--apply-fea-file] [--hinted | --no-hinted]
[--liga | --no-liga]
[--infinite-arrow | --no-infinite-arrow] [--remove-tag-liga]
[--line-height LINE_HEIGHT] [--width {default,narrow,slim}]
[--format FORMATS] [--least-styles] [--cache] [--archive]
[--nf | --no-nf] [--nf-mono] [--nf-propo] [--nf-variable]
[--font-patcher] [--cjk CJK] [--cjk-variable] [--cjk-narrow]
[--cjk-scale-factor CJK_SCALE_FACTOR] [--cjk-both]
[--cjk-hinted | --no-cjk-hinted] [--cn | --no-cn]
[--cn-narrow] [--cn-scale-factor CN_SCALE_FACTOR] [--cn-both]
Builder and optimizer for Maple Mono
options:
-h, --help show this help message and exit
-v, --version show program's version number and exit
-d, --dry Output config and exit
--debug Use a fast debug build: add `Debug`, enable debug
logging, build Regular/Italic only, and skip
OTF/WOFF2/Nerd Font outputs
Feature Options:
-n, --normal Use normal preset, just like `JetBrains Mono` with
slashed zero
--standard-zero Use standard zero semantics: default dotted zero and
slashed zero when `zero` is enabled
--feat FEAT Enable and freeze the listed features, split by `,`
(e.g. `--feat zero,cv01,ss07,ss08`); contextual rules
are enabled through `calt`
--apply-fea-file Apply matching
`source/features/{regular,italic}{_cn,}.fea` to static
and variable fonts
--hinted Use hinted font as base font in NF / CJK / NF-CJK
(default)
--no-hinted Use unhinted font as base font in NF / CJK / NF-CJK
--liga Preserve all the ligatures (default)
--no-liga Remove all the ligatures
--infinite-arrow Add infinite arrow ligature support (default)
--no-infinite-arrow Do not add infinite arrow ligature support
--remove-tag-liga Remove plain text tag ligatures like `[TODO]`
--line-height LINE_HEIGHT
Scale factor for line height (e.g., 1.1)
--width {default,narrow,slim}
Set glyph width: default (600), narrow (550), slim
(500)
Build Options:
--format FORMATS Select requested base output formats as a comma-
separated list: ttf,otf,woff2; the variable base is
always built
--least-styles Only build Regular / Bold / Italic / BoldItalic style
--cache Reuse valid cached pipeline stages under `fonts/` and
preserve existing unrelated outputs
--archive Archive each existing non-JSON output directory with
config and license
Nerd Font Options:
--nf, --nerd-font Build Nerd-Font version (default)
--no-nf, --no-nerd-font
Do not build the Nerd-Font version
--nf-mono Make Nerd Font icons' width fixed
--nf-propo Make Nerd Font icons' width variable, override `--nf-
mono`
--nf-variable Build Nerd Font as a variable font
--font-patcher Force the use of Nerd Font Patcher to build NF format
CJK Options:
--cjk CJK Build Maple Mono + CJK extended fonts for locales: cn,
jp, tc, kr. Repeat or use comma-separated values.
--cjk-variable Persist CJK-extended output as merged variable fonts.
--cjk-narrow Apply narrow CJK spacing to the selected locales.
--cjk-scale-factor CJK_SCALE_FACTOR
Scale factor for selected CJK locales. Format:
<factor> or <width_factor>,<height_factor>.
--cjk-both When Nerd Font is enabled, build both NF CJK and non-
NF CJK outputs.
--cjk-hinted Auto-hint final static CJK fonts.
--no-cjk-hinted Do not auto-hint final static CJK fonts (default).
Deprecated CN Options:
--cn Deprecated alias for `--cjk cn`.
--no-cn Deprecated alias for removing `cn` from the selected
CJK locales.
--cn-narrow Deprecated alias for `--cjk-narrow` when targeting
`cn`.
--cn-scale-factor CN_SCALE_FACTOR
Deprecated alias for `--cjk-scale-factor` when
targeting `cn`.
--cn-both Deprecated alias for `--cjk-both`.
Credits
- JetBrains Mono
- Fira Code
- Cascadia Code
- Roboto Mono
- Victor Mono
- Commit Mono
- Code Sample
- Nerd Font
- Font Freeze
- Font Viewer
- Monolisa
- Recursive
Sponsorship
If this font is helpful to you, please consider sponsoring me through Afdian.
Star History
License
SIL Open Font License 1.1






