MS Serif and MS Sans Serif from Windows 95, converted to TTF and WOFF2 for modern web use. Two typefaces, two display resolutions, six point sizes each.
| Variant | Family name pattern | Source |
|---|---|---|
| MS Sans Serif — 96 dpi (VGA) | R95 Sans Serif Xpt |
SSERIFE.FON |
| MS Sans Serif — 120 dpi (HiRes) | R95 Sans Serif HiRes Xpt |
SSERIFF.FON |
| MS Serif — 96 dpi (VGA) | R95 Serif Xpt |
SERIFE.FON |
| MS Serif — 120 dpi (HiRes) | R95 Serif HiRes Xpt |
SERIFF.FON |
Available sizes: 8, 10, 12, 14, 18, 24 pt.
| Size | Preview |
|---|---|
| 8pt | ![]() |
| 10pt | ![]() |
| 12pt | ![]() |
| 14pt | ![]() |
| 18pt | ![]() |
| 24pt | ![]() |
| Size | Preview |
|---|---|
| 8pt | ![]() |
| 10pt | ![]() |
| 12pt | ![]() |
| 14pt | ![]() |
| 18pt | ![]() |
| 24pt | ![]() |
| Size | Preview |
|---|---|
| 8pt | ![]() |
| 10pt | ![]() |
| 12pt | ![]() |
| 14pt | ![]() |
| 18pt | ![]() |
| 24pt | ![]() |
| Size | Preview |
|---|---|
| 8pt | ![]() |
| 10pt | ![]() |
| 12pt | ![]() |
| 14pt | ![]() |
| 18pt | ![]() |
| 24pt | ![]() |
npm install @react95/fontsChoose as much or as little as you need:
// Everything — all 4 variants, all 6 sizes
import '@react95/fonts'
// One full variant (all 6 sizes)
import '@react95/fonts/sans-serif' // MS Sans Serif 96 dpi ← classic Win95 UI
import '@react95/fonts/sans-serif-hires' // MS Sans Serif 120 dpi
import '@react95/fonts/serif' // MS Serif 96 dpi
import '@react95/fonts/serif-hires' // MS Serif 120 dpi
// One size from one variant
import '@react95/fonts/sans-serif/14pt'
import '@react95/fonts/serif/8pt'
import '@react95/fonts/sans-serif-hires/24pt'Each import registers one or more @font-face rules. Reference the family by name:
body {
font-family: 'R95 Sans Serif 14pt';
font-size: 14px; /* see note below */
}Pixel-perfect rendering — these are bitmap fonts, so each size has a fixed native pixel height. Set
font-sizeto that height for a 1:1 rendering. On macOS/Safari you may also want-webkit-font-smoothing: noneto suppress subpixel antialiasing.
Import Family name Native height /sans-serif/8ptR95 Sans Serif 8pt13 px /sans-serif/10ptR95 Sans Serif 10pt16 px /sans-serif/12ptR95 Sans Serif 12pt20 px /sans-serif/14ptR95 Sans Serif 14pt24 px /sans-serif/18ptR95 Sans Serif 18pt29 px /sans-serif/24ptR95 Sans Serif 24pt37 px /sans-serif-hires/8ptR95 Sans Serif HiRes 8pt16 px /sans-serif-hires/10ptR95 Sans Serif HiRes 10pt20 px /sans-serif-hires/12ptR95 Sans Serif HiRes 12pt25 px /sans-serif-hires/14ptR95 Sans Serif HiRes 14pt29 px /sans-serif-hires/18ptR95 Sans Serif HiRes 18pt36 px /sans-serif-hires/24ptR95 Sans Serif HiRes 24pt46 px /serif/8ptR95 Serif 8pt13 px /serif/10ptR95 Serif 10pt16 px /serif/12ptR95 Serif 12pt19 px /serif/14ptR95 Serif 14pt21 px /serif/18ptR95 Serif 18pt27 px /serif/24ptR95 Serif 24pt35 px /serif-hires/8ptR95 Serif HiRes 8pt16 px /serif-hires/10ptR95 Serif HiRes 10pt20 px /serif-hires/12ptR95 Serif HiRes 12pt23 px /serif-hires/14ptR95 Serif HiRes 14pt27 px /serif-hires/18ptR95 Serif HiRes 18pt33 px /serif-hires/24ptR95 Serif HiRes 24pt43 px
sources/
SERIFE.FON ← MS Serif 96 dpi (VGA)
SERIFF.FON ← MS Serif 120 dpi (HiRes)
SSERIFE.FON ← MS Sans Serif 96 dpi (VGA)
SSERIFF.FON ← MS Sans Serif 120 dpi (HiRes)
serif/
96dpi/ 8pt/ 10pt/ 12pt/ 14pt/ 18pt/ 24pt/ ← generated
120dpi/ 8pt/ 10pt/ 12pt/ 14pt/ 18pt/ 24pt/ ← generated
sans-serif/
96dpi/ 8pt/ 10pt/ 12pt/ 14pt/ 18pt/ 24pt/ ← generated
120dpi/ 8pt/ 10pt/ 12pt/ 14pt/ 18pt/ 24pt/ ← generated
previews/
sans-serif/ 8pt.png … 24pt.png ← generated
sans-serif-hires/ 8pt.png … 24pt.png ← generated
serif/ 8pt.png … 24pt.png ← generated
serif-hires/ 8pt.png … 24pt.png ← generated
scripts/
fnt2ttf.py ← conversion pipeline (FON → TTF + WOFF2 + CSS)
preview.py ← glyph-sheet PNG generator
css/ ← generated — do not edit by hand
index.css
sans-serif.css sans-serif-hires.css serif.css serif-hires.css
sans-serif/ 8pt.css … 24pt.css
sans-serif-hires/ 8pt.css … 24pt.css
serif/ 8pt.css … 24pt.css
serif-hires/ 8pt.css … 24pt.css
Prerequisites: Python 3.9+, Node.js, pnpm.
# 1. Clone and install JS dependencies
git clone https://github.com/React95/R95-fonts
cd R95-fonts
pnpm install
# 2. Install Python conversion dependencies
pip install monobit fonttools brotli pillow
# 3. Start the demo app
pnpm devpython3 scripts/fnt2ttf.pyThe script reads each .FON file listed in FON_SPECS, converts every embedded
bitmap font to TTF and WOFF2, and writes all CSS files automatically. It also
prints a ready-to-paste exports block for package.json at the end.
python3 scripts/preview.pyReads the same .FON files directly and renders a glyph sheet (all printable
characters) for each size into sources/previews/.
- Drop the
.FONfile intosources/. - Add an entry to
FON_SPECSinscripts/fnt2ttf.py:("MYNEWFONT.FON", "sans-serif", 96), # family, dpi
- Run
python3 scripts/fnt2ttf.py— fonts, WOFF2, and CSS are generated automatically. - Copy the printed
exportsblock intopackage.json. - Run
python3 scripts/preview.pyto regenerate the glyph-sheet images. - Update the Previews section and the native-height table in this README.
pnpm dev # development server with hot reload
pnpm build # production build
pnpm preview # preview the production buildThe original bitmap data is Copyright Microsoft Corp. 1987. All rights reserved. The conversion tooling in this repository is released under the MIT License.























