How to pick the right pua start and range for your icons
- Step 1Estimate each set's size and growth — Count current icons per logical group (core UI, brand, third-party) and add headroom for growth. The BMP PUA gives you 6,400 slots total to divide.
- Step 2Assign a start hex per band — Pick non-overlapping starts with gaps for growth — e.g. core at U+E000, brand at U+F000, leaving room between. Each start must be inside U+E000–U+F8FF.
- Step 3Run the assigner once per band — Generate each band separately by pasting that band's names and its start hex. Keep the bands' name lists and manifests separate so they evolve independently.
- Step 4Check Range used against your plan — After each run, confirm the `Range used` metric fits inside the band you reserved and doesn't bleed into the next band's start.
- Step 5Document the band map — Record which range belongs to which set (core, brand, third-party) so future contributors append within the correct band instead of grabbing the next free codepoint blindly.
- Step 6Re-validate when a band grows — When a band nears its neighbor's start, you've outgrown the gap. Re-plan the band layout before appending more, or move the set to a fresh range with room.
The Private Use Area blocks
Unicode's three PUA blocks. This tool assigns only in the BMP block; the others are referenced in the overflow error message as guidance.
| Block | Range | Codepoints | Used here? |
|---|---|---|---|
| BMP PUA | U+E000 – U+F8FF | 6,400 | Yes |
| Supplementary PUA-A | U+F0000 – U+FFFFD | 65,534 | No |
| Supplementary PUA-B | U+100000 – U+10FFFD | 65,534 | No |
An example band plan
One way to carve the BMP PUA into reserved bands with growth gaps. Run the assigner once per band with the listed start.
| Band | Start | Reserved up to | Capacity | Purpose |
|---|---|---|---|---|
| Core UI | E000 | U+E3FF | 1,024 | Stable, shipped product icons |
| Brand / marketing | F000 | U+F3FF | 1,024 | Campaign + brand glyphs |
| Third-party / vendor | F400 | U+F7FF | 1,024 | Imported sets kept apart |
| Reserve | F800 | U+F8FF | 256 | Future / experimental |
Start-hex validation
How the tool treats the start value you provide.
| Start input | Parsed | Result |
|---|---|---|
E000 | 0xE000 | Accepted (low boundary) |
U+F100 | 0xF100 (prefix stripped) | Accepted |
F8FF | 0xF8FF | Accepted (high boundary) — but only room for 1 icon |
D000 | 0xD000 | Rejected — below U+E000 |
FA00 | 0xFA00 | Rejected — above U+F8FF |
ZZZZ | NaN | Rejected — not valid hex |
Cookbook
Range-planning recipes. Each shows the start, the names, and the resulting footprint so you can lay out non-overlapping bands.
Two isolated bands for two teams
ExampleCore team owns U+E000+, brand team owns U+F000+. Each runs the tool with its own start, so neither disturbs the other.
Core run (start E000): home -> \e000, user -> \e001 ... Range used: U+E000 – U+E0.. Brand run (start F000): logo -> \f000, badge -> \f001 ... Range used: U+F000 – U+F0.. No overlap: core never touches the F0xx band.
Confirming a band fits its reservation
ExampleReserve U+E000–U+E3FF (1,024 slots) for core. After generating, check Range used stays inside it.
Core list: 312 icons, start E000 Metrics: Icons assigned: 312 Range used: U+E000 – U+E137 U+E137 < U+E3FF -> fits the reserved core band with room to grow.
Detecting a band overrun into its neighbor
ExampleIf a band's Range used passes the next band's start, the bands now overlap — replan before shipping.
Brand band reserved F000-F3FF, third-party starts F400. Brand list: 1,100 icons, start F000 Metrics: Range used: U+F000 – U+F44B <- past F400! Brand now collides with third-party. Shrink, or move a band.
Hitting the hard ceiling
ExampleStart high with too many icons and the tool stops at U+F8FF instead of wrapping.
Start: F800 (only 256 slots to U+F8FF) List: 300 icons Error: Ran out of PUA space at U+F900 (PUA ends at U+F8FF). Reduce icon count or split across BMP and SPUA-A.
Why not start outside the PUA
ExampleA start in an assigned block is rejected so your icons never collide with real characters like CJK ideographs.
Start: 4E00 (CJK Unified Ideographs - real characters!) Error: PUA start must be a hex codepoint in the U+E000–U+F8FF range. The tool keeps you inside private-use space by design.
Edge cases and what actually happens
Every row below was probed against the live API. Some documented requirements (alphabetical axis order, numerical tuple order) are not actually enforced in practice — useful to know if you've been blaming the wrong thing for a 400.
Start exactly at U+F8FF
Accepted — but tinyU+F8FF is the top of the BMP PUA and is a valid start, but only one codepoint fits before overflow. A second icon throws the out-of-space error. Useful only for a single reserved glyph.
Start in an assigned Unicode block
Error — invalid rangeA start like U+4E00 (CJK) or U+0041 ('A') is rejected with the range error. The tool refuses to map icons onto real characters, which would corrupt text rendering.
Bands chosen with no growth gap
Caution — future collisionStarting the next band immediately after the previous band's current size leaves no room to append. When the earlier band grows, it overruns into the next. Leave gaps sized for expected growth.
Two bands generated but lists merged later
Breaking — restarts numberingIf you later paste both bands as one list at a single start, every icon renumbers from that start and the band isolation is lost. Keep band lists — and runs — separate.
Overflow past U+F8FF
Error — out of spaceAny assignment crossing U+F8FF throws, naming the overflow codepoint. The message suggests splitting across BMP and Supplementary PUA-A, but this tool assigns only the BMP block — you'd manage a second range yourself.
Relying on Supplementary PUA here
Unsupported — BMP onlyThe Supplementary PUA-A/B blocks (U+F0000+, U+100000+) appear only in the error text as advice. This tool will not assign there; its valid range is strictly U+E000–U+F8FF.
U+F8FF on Apple platforms
Caution — reserved glyphApple maps U+F8FF to its logo in system fonts. It's still valid private-use space, but a glyph you assign there may be shadowed by the Apple logo in some Apple rendering contexts. Many teams avoid the very top of the range for this reason.
Choosing a start that's hard to remember
Caution — documentation costAn arbitrary start like U+E137 makes the band map harder to reason about. Round starts (E000, F000, F400) are easier to document and audit.
Non-hex or empty start
Error — invalid rangeA non-hex start parses to NaN and is rejected by the same range check; an empty start falls back to the default E000. Provide clean hex digits, optionally with a U+ prefix.
Counting capacity off by one
Caution — inclusive rangeA band from U+E000 with capacity 1,024 reaches U+E3FF inclusive, not U+E400. Off-by-one errors here cause bands to touch. Compute the last slot as start + count − 1.
Frequently asked questions
Where should an icon font start?
U+E000 is the conventional and safest start — the very bottom of the BMP Private Use Area. Use higher starts (U+F000, U+F400) only to carve separate bands for distinct icon sets.
How many icons fit in the range this tool uses?
6,400 — the BMP PUA from U+E000 to U+F8FF. Beyond that the tool throws an out-of-space error rather than wrapping or spilling into other blocks.
Why can't I start below U+E000 or above U+F8FF?
Outside that range you'd be assigning codepoints that belong to real, standardized characters, which corrupts text. The tool enforces the Private Use Area boundary and rejects out-of-range starts.
How do I reserve separate bands for different teams?
Give each set its own start (e.g. core at E000, brand at F000) with a growth gap between, and run the tool once per band with separate name lists. Each band's codepoints stay isolated.
How big a gap should I leave between bands?
Size it to expected growth. If a band has 300 icons today and might double, reserve at least ~600–700 slots before the next band's start.
Does the tool use the Supplementary PUA blocks?
No. They're only mentioned in the overflow error as advice. This tool assigns strictly within the BMP PUA, U+E000–U+F8FF.
Should I avoid U+F8FF specifically?
Many teams do, because Apple system fonts render U+F8FF as the Apple logo. It's valid private-use space, but a glyph there can be shadowed in some Apple contexts. Keeping a reserve band at the very top sidesteps it.
What happens if a band overruns its reservation?
Nothing automatic — the codepoints just keep marching past your intended boundary into the next band's start, causing a collision. Check the Range used metric against your plan after each run.
Can I change a band's start later?
Only at the cost of renumbering that whole band, which breaks any shipped CSS using it. Choose starts deliberately up front and document them.
How do I compute the last codepoint a band uses?
start + count − 1 (inclusive). A band starting at U+E000 with 1,024 icons ends at U+E3FF, not U+E400. Watch this off-by-one when sizing gaps.
Does this build the font or just plan the codepoints?
It plans and addresses only — names to codepoints, CSS, and a manifest. It never produces a font binary or glyph artwork. Inspect a real font's coverage with character-coverage-map.
How can I confirm which codepoints a finished font actually contains?
Use glyph-inspector to browse glyphs and their codepoints, or glyph-count-analyzer to count them, then reconcile against your band plan.
Privacy first
Every JAD Font tool runs entirely in your browser using opentype.js and the wawoff2 WASM Brotli encoder. Your fonts never leave your device — verified by zero outbound network requests during processing.