├── .github └── workflows │ └── build.yaml ├── .gitignore ├── .init.stamp ├── .templaterc.json ├── AUTHORS.txt ├── CONTRIBUTORS.txt ├── Makefile ├── OFL.txt ├── README.md ├── documentation ├── ARTICLE.en_us.html ├── HostGrotesk-Promo-1.png ├── HostGrotesk-Promo.png ├── HostGrotesk-image-1.png ├── HostGrotesk-image-2.png ├── HostGrotesk-image-3.png ├── HostGrotesk-image-4.png ├── HostGrotesk-image-5.png ├── HostGrotesk-image-6.png ├── HostGrotesk-image-7.png ├── HostGrotesk-image-8.png ├── HostGrotesk-image-9.png ├── host-google-images │ ├── HostGrotesk-Promo-1-square.png │ ├── HostGrotesk-Promo-1.png │ ├── Instagram post - 10.png │ ├── Instagram post - 12.png │ ├── Instagram post - 13.png │ ├── Instagram post - 14.png │ ├── Instagram post - 15.png │ ├── Instagram post - 16.png │ ├── Instagram post - 18.png │ ├── Instagram post - 19.png │ └── Instagram post - 20.png └── images-license.txt ├── renovate.json ├── requirements-test.in ├── requirements-test.txt ├── requirements.in ├── requirements.txt ├── scripts ├── first-run.py ├── index.html └── read-config.py └── sources ├── CustomFilter_GFLatinCore.plist ├── HostGrotesk-Italic.glyphs ├── HostGrotesk.glyphs └── config.yaml /.github/workflows/build.yaml: -------------------------------------------------------------------------------- 1 | name: Build font and specimen 2 | 3 | on: push 4 | 5 | jobs: 6 | build: 7 | name: Build and test 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v4 11 | - name: Set up Python 3.10 12 | uses: actions/setup-python@v5 13 | with: 14 | python-version: "3.10" 15 | - name: Install sys tools/deps 16 | run: | 17 | sudo apt-get update 18 | sudo apt-get install ttfautohint 19 | sudo snap install yq 20 | - uses: actions/cache@v4 21 | with: 22 | path: ./venv/ 23 | key: ${{ runner.os }}-venv-${{ hashFiles('**/requirements*.txt') }} 24 | restore-keys: | 25 | ${{ runner.os }}-venv- 26 | - name: gen zip file name 27 | id: zip-name 28 | shell: bash 29 | # Set the archive name to repo name + "-assets" e.g "MavenPro-assets" 30 | run: echo "ZIP_NAME=$(echo '${{ github.repository }}' | awk -F '/' '{print $2}')-fonts" >> $GITHUB_ENV 31 | 32 | # If a new release is cut, use the release tag to auto-bump the source files 33 | # - name: Bump release 34 | # if: github.event_name == 'release' 35 | # run: | 36 | # . venv/bin/activate 37 | # SRCS=$(yq e ".sources[]" sources/config.yaml) 38 | # TAG_NAME=${GITHUB_REF/refs\/tags\//} 39 | # echo "Bumping $SRCS to $TAG_NAME" 40 | # for src in $SRCS 41 | # do 42 | # bumpfontversion sources/$src --new-version $TAG_NAME; 43 | # done 44 | 45 | - name: Build font 46 | run: make build 47 | - name: Check with fontbakery 48 | run: make test 49 | continue-on-error: true 50 | - name: proof 51 | run: make proof 52 | - name: setup site 53 | run: cp scripts/index.html out/index.html 54 | - name: Deploy 55 | uses: peaceiris/actions-gh-pages@v4 56 | if: ${{ github.ref == 'refs/heads/main' }} 57 | with: 58 | github_token: ${{ secrets.GITHUB_TOKEN }} 59 | publish_dir: ./out 60 | - name: Archive artifacts 61 | uses: actions/upload-artifact@v4 62 | with: 63 | name: ${{ env.ZIP_NAME }} 64 | path: | 65 | fonts 66 | out 67 | outputs: 68 | zip_name: ${{ env.ZIP_NAME }} 69 | 70 | # There are two ways a release can be created: either by pushing a tag, or by 71 | # creating a release from the GitHub UI. Pushing a tag does not automatically 72 | # create a release, so we have to do that ourselves. However, creating a 73 | # release from the GitHub UI *does* push a tag, and we don't want to create 74 | # a new release in that case because one already exists! 75 | 76 | release: 77 | name: Create and populate release 78 | needs: build 79 | runs-on: ubuntu-latest 80 | if: contains(github.ref, 'refs/tags/') 81 | env: 82 | ZIP_NAME: ${{ needs.build.outputs.zip_name }} 83 | GH_TOKEN: ${{ github.token }} 84 | steps: 85 | - uses: actions/checkout@v4 86 | - name: Download font artefact files 87 | uses: actions/download-artifact@v4 88 | with: 89 | name: ${{ env.ZIP_NAME }} 90 | path: ${{ env.ZIP_NAME }} 91 | - name: Copy ARTICLE.en_us.html to artefact directory 92 | run: cp documentation/ARTICLE.en_us.html ${{ env.ZIP_NAME }}/ARTICLE.en_us.html 93 | continue-on-error: true 94 | - name: Copy OFL.txt to artefact directory 95 | run: cp OFL.txt ${{ env.ZIP_NAME }}/OFL.txt 96 | - name: Remove proof/fontbakery stuff from release 97 | run: rm -rf ${{ env.ZIP_NAME }}/out 98 | - name: gen release file name 99 | shell: bash 100 | run: echo "RELEASE_ZIP_NAME=$(echo '${{ github.repository }}' | awk -F '/' '{print $2}')-${{github.ref_name}}" >> $GITHUB_ENV 101 | - name: Create release bundle 102 | run: mv ${{ env.ZIP_NAME }} ${{ env.RELEASE_ZIP_NAME }}; zip -r ${{ env.RELEASE_ZIP_NAME }}.zip ${{ env.RELEASE_ZIP_NAME }} 103 | - name: Check for release 104 | id: create_release 105 | run: | 106 | if ! gh release view ${{ github.ref_name }}; then 107 | git show -s --format=%B ${{ github.ref_name }} | tail -n +4 | gh release create ${{ github.ref_name }} -t ${{ github.ref_name }} -F - 108 | fi 109 | - name: Populate release 110 | run: | 111 | gh release upload ${{ github.ref_name }} ${{ env.RELEASE_ZIP_NAME }}.zip --clobber 112 | - name: Set release live 113 | run: | 114 | gh release edit ${{ github.ref_name }} --draft=false -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | venv 3 | build.stamp 4 | proof 5 | fonts 6 | node_modules 7 | package-lock.json 8 | package.json 9 | master_ufo 10 | instance_ufo 11 | 12 | # OS generated files # 13 | ###################### 14 | .DS_Store 15 | .DS_Store? 16 | ._* 17 | .Spotlight-V100 18 | .Trashes 19 | ehthumbs.db 20 | Thumbs.db 21 | 22 | *Burnt-old/ 23 | -------------------------------------------------------------------------------- /.init.stamp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/.init.stamp -------------------------------------------------------------------------------- /.templaterc.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [".github/**/*", "Makefile", "scripts/**/*", "requirements.txt"] 3 | } 4 | -------------------------------------------------------------------------------- /AUTHORS.txt: -------------------------------------------------------------------------------- 1 | # This is the official list of project authors for copyright purposes. 2 | # This file is distinct from the CONTRIBUTORS.txt file. 3 | # See the latter for an explanation. 4 | # 5 | # Names should be added to this file as: 6 | # Name or Organization 7 | 8 | Element Type 9 | Doğukan Karapınar 10 | İbrahim Kaçtıoğlu 11 | -------------------------------------------------------------------------------- /CONTRIBUTORS.txt: -------------------------------------------------------------------------------- 1 | # This is the list of people who have contributed to this project, 2 | # and includes those not listed in AUTHORS.txt because they are not 3 | # copyright authors. For example, company employees may be listed 4 | # here because their company holds the copyright and is listed there. 5 | # 6 | # When adding J Random Contributor's name to this file, either J's 7 | # name or J's organization's name should be added to AUTHORS.txt 8 | # 9 | # Names should be added to this file as: 10 | # Name 11 | 12 | Element Type 13 | Doğukan Karapınar 14 | İbrahim Kaçtıoğlu 15 | Indian Type Foundry 16 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | SOURCES=$(shell python3 scripts/read-config.py --sources ) 2 | FAMILY=$(shell python3 scripts/read-config.py --family ) 3 | DRAWBOT_SCRIPTS=$(shell ls documentation/*.py) 4 | DRAWBOT_OUTPUT=$(shell ls documentation/*.py | sed 's/\.py/.png/g') 5 | 6 | help: 7 | @echo "###" 8 | @echo "# Build targets for $(FAMILY)" 9 | @echo "###" 10 | @echo 11 | @echo " make build: Builds the fonts and places them in the fonts/ directory" 12 | @echo " make test: Tests the fonts with fontbakery" 13 | @echo " make proof: Creates HTML proof documents in the proof/ directory" 14 | @echo " make images: Creates PNG specimen images in the documentation/ directory" 15 | @echo 16 | 17 | build: build.stamp 18 | 19 | venv: venv/touchfile 20 | 21 | venv-test: venv-test/touchfile 22 | 23 | customize: venv 24 | . venv/bin/activate; python3 scripts/customize.py 25 | 26 | build.stamp: venv sources/config.yaml $(SOURCES) 27 | rm -rf fonts 28 | (for config in sources/config*.yaml; do . venv/bin/activate; gftools builder $$config; done) && touch build.stamp 29 | 30 | venv/touchfile: requirements.txt 31 | test -d venv || python3 -m venv venv 32 | . venv/bin/activate; pip install -Ur requirements.txt 33 | touch venv/touchfile 34 | 35 | venv-test/touchfile: requirements-test.txt 36 | test -d venv-test || python3 -m venv venv-test 37 | . venv-test/bin/activate; pip install -Ur requirements-test.txt 38 | touch venv-test/touchfile 39 | 40 | test: venv-test build.stamp 41 | TOCHECK=$$(find fonts/variable -type f 2>/dev/null); if [ -z "$$TOCHECK" ]; then TOCHECK=$$(find fonts/ttf -type f 2>/dev/null); fi ; . venv-test/bin/activate; mkdir -p out/ out/fontbakery; fontbakery check-googlefonts -l WARN --full-lists --succinct --badges out/badges --html out/fontbakery/fontbakery-report.html --ghmarkdown out/fontbakery/fontbakery-report.md $$TOCHECK || echo '::warning file=sources/config.yaml,title=Fontbakery failures::The fontbakery QA check reported errors in your font. Please check the generated report.' 42 | 43 | proof: venv build.stamp 44 | TOCHECK=$$(find fonts/variable -type f 2>/dev/null); if [ -z "$$TOCHECK" ]; then TOCHECK=$$(find fonts/ttf -type f 2>/dev/null); fi ; . venv/bin/activate; mkdir -p out/ out/proof; diffenator2 proof $$TOCHECK -o out/proof 45 | 46 | images: venv $(DRAWBOT_OUTPUT) 47 | 48 | %.png: %.py build.stamp 49 | . venv/bin/activate; python3 $< --output $@ 50 | 51 | clean: 52 | rm -rf venv 53 | find . -name "*.pyc" -delete 54 | 55 | update-project-template: 56 | npx update-template https://github.com/googlefonts/googlefonts-project-template/ 57 | 58 | update: venv venv-test 59 | venv/bin/pip install --upgrade pip-tools 60 | # See https://pip-tools.readthedocs.io/en/latest/#a-note-on-resolvers for 61 | # the `--resolver` flag below. 62 | venv/bin/pip-compile --upgrade --verbose --resolver=backtracking requirements.in 63 | venv/bin/pip-sync requirements.txt 64 | 65 | venv-test/bin/pip install --upgrade pip-tools 66 | venv-test/bin/pip-compile --upgrade --verbose --resolver=backtracking requirements-test.in 67 | venv-test/bin/pip-sync requirements-test.txt 68 | 69 | git commit -m "Update requirements" requirements.txt requirements-test.txt 70 | git push 71 | -------------------------------------------------------------------------------- /OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright 2023 The Host Grotesk Project Authors (https://github.com/Element-Type/HostGrotesk) 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | https://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Host Grotesk 2 | 3 | [![][Fontbakery]](https://Element-Type.github.io/HostGrotesk/fontbakery/fontbakery-report.html) 4 | [![][Universal]](https://Element-Type.github.io/HostGrotesk/fontbakery/fontbakery-report.html) 5 | [![][GF Profile]](https://Element-Type.github.io/HostGrotesk/fontbakery/fontbakery-report.html) 6 | [![][Outline Correctness]](https://Element-Type.github.io/HostGrotesk/fontbakery/fontbakery-report.html) 7 | [![][Shaping]](https://Element-Type.github.io/HostGrotesk/fontbakery/fontbakery-report.html) 8 | 9 | [Fontbakery]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2FElement-Type%2FHostGrotesk%2Fgh-pages%2Fbadges%2Foverall.json 10 | [GF Profile]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2FElement-Type%2FHostGrotesk%2Fgh-pages%2Fbadges%2FGoogleFonts.json 11 | [Outline Correctness]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2FElement-Type%2FHostGrotesk%2Fgh-pages%2Fbadges%2FOutlineCorrectnessChecks.json 12 | [Shaping]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2FElement-Type%2FHostGrotesk%2Fgh-pages%2Fbadges%2FShapingChecks.json 13 | [Universal]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2FElement-Type%2FHostGrotesk%2Fgh-pages%2Fbadges%2FUniversal.json 14 | 15 | 16 | Host Grotesk is a versatile uniwidth sans-serif typeface, offering both upright and italic variations across a range of weights. This typeface is meticulously crafted for optimal usage in user interfaces, by modifying and extending [Poppins](https://fonts.google.com/specimen/Poppins) by [Indian Type Foundry](https://www.indiantypefoundry.com), Jonny Pinhorn. 17 | 18 | 19 | 20 | ![Host Grotesk](documentation/HostGrotesk-Promo.png) 21 | Image designed by [Güzin Türkeri](https://www.behance.net/guzinturkeri) 22 | 23 | ## About 24 | 25 | Host Grotesk, designed by [Doğukan Karapınar](https://doughkan.com), a co-founder of Element Type. 26 | 27 | [Element Type](https://elementtype.co), based across İstanbul, Amiens, and Toronto, is a hub for innovative typeface design, font creation, and custom lettering. 28 | 29 | Mastering: [ibrahim kaçtıoğlu](http://ibrahimkactioglu.com). 30 | 31 | 32 | ## Building 33 | 34 | Fonts are built automatically by GitHub Actions - take a look in the "Actions" tab for the latest build. 35 | 36 | If you want to build fonts manually on your own computer: 37 | 38 | * `make build` will produce font files. 39 | * `make test` will run [FontBakery](https://github.com/googlefonts/fontbakery)'s quality assurance tests. 40 | * `make proof` will generate HTML proof files. 41 | 42 | The proof files and QA tests are also available automatically via GitHub Actions - look at https://Element-Type.github.io/HostGrotesk. 43 | 44 | ## Changelog 45 | 46 | **14 August 2023. Version 1.00** 47 | - Made Upright and Italic uniwidth 48 | - Refined and redesigned drawings 49 | - Updated character set to GF Latin Core. 50 | 51 | **9 May 2024. Version 1.001** 52 | - Bug fixes: Some glyphs had different width accros styles and weights. 53 | - Reworked spacing. 54 | - Reworked kerning. 55 | - Drawing improvements. 56 | - Tabular numbers, currency symbols. 57 | - Tabular math symbols. They share same width but different than numbers and currencies. 58 | - Removed `ℓ (U+2113)` and `₨ (U+20A8)`, as they were just place holders. 59 | - Removed `Alternative Quotes` stylistic set that consists: `/comma.ss01/quotesinglbase.ss01/quotedblbase.ss01/quotedblleft.ss01/quotedblright.ss01/quoteleft.ss01/quoteright.ss01 ` as they were redundant. 60 | 61 | ## License 62 | 63 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 64 | This license is available with a FAQ at 65 | https://scripts.sil.org/OFL 66 | 67 | ## Repository Layout 68 | 69 | This font repository structure is inspired by [Unified Font Repository v0.3](https://github.com/unified-font-repository/Unified-Font-Repository), modified for the Google Fonts workflow. 70 | -------------------------------------------------------------------------------- /documentation/ARTICLE.en_us.html: -------------------------------------------------------------------------------- 1 |

2 | Host Grotesk is a uniwidth sans serif variable font tailored by Element Type for modern user interfaces. It features uniform letter widths and spacing across all weights and corresponding italics, ensuring seamless adaptability without compromising layout consistency. 3 |

4 |

5 | To contribute, see github.com/Element-Type/HostGrotesk 6 |

7 |
8 |

A uniwidth typeface

9 | 10 |

11 | As a uniwidth typeface, Host Grotesk allows for smooth transitions between font weights without disrupting overall design and layouts. For instance, a button's size remains constant even when the font weight increases during a hover state. Similarly, making a part of a sentence bolder will not push the letters to the next line. 12 |

13 | 14 |

15 | Calibrated for both display and text applications, Host Grotesk has low contrast stroke modulation and closed terminals that complement the straightforward construction of its letterforms, making it an excellent choice for digital media. The proportions are balanced between a generous geometric sans and a compact grotesque, suitable for both display sizes and small body copy. 16 |

17 | 18 |

19 | The Host Grotesk family is built on Jonny Pinhorn's beloved Poppins (Indian Type Foundry, 2020). While most letters are reworked and modified for the new look and duplexed proportions, Poppins' soft and approachable essence remains visible. A reliable and cohesive type family for user interfaces, branding, and communication materials, combining the contemporary workhorse category with the elevated functionality of uni-width proportions. 20 |

21 | -------------------------------------------------------------------------------- /documentation/HostGrotesk-Promo-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/HostGrotesk-Promo-1.png -------------------------------------------------------------------------------- /documentation/HostGrotesk-Promo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/HostGrotesk-Promo.png -------------------------------------------------------------------------------- /documentation/HostGrotesk-image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/HostGrotesk-image-1.png -------------------------------------------------------------------------------- /documentation/HostGrotesk-image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/HostGrotesk-image-2.png -------------------------------------------------------------------------------- /documentation/HostGrotesk-image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/HostGrotesk-image-3.png -------------------------------------------------------------------------------- /documentation/HostGrotesk-image-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/HostGrotesk-image-4.png -------------------------------------------------------------------------------- /documentation/HostGrotesk-image-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/HostGrotesk-image-5.png -------------------------------------------------------------------------------- /documentation/HostGrotesk-image-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/HostGrotesk-image-6.png -------------------------------------------------------------------------------- /documentation/HostGrotesk-image-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/HostGrotesk-image-7.png -------------------------------------------------------------------------------- /documentation/HostGrotesk-image-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/HostGrotesk-image-8.png -------------------------------------------------------------------------------- /documentation/HostGrotesk-image-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/HostGrotesk-image-9.png -------------------------------------------------------------------------------- /documentation/host-google-images/HostGrotesk-Promo-1-square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/host-google-images/HostGrotesk-Promo-1-square.png -------------------------------------------------------------------------------- /documentation/host-google-images/HostGrotesk-Promo-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/host-google-images/HostGrotesk-Promo-1.png -------------------------------------------------------------------------------- /documentation/host-google-images/Instagram post - 10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/host-google-images/Instagram post - 10.png -------------------------------------------------------------------------------- /documentation/host-google-images/Instagram post - 12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/host-google-images/Instagram post - 12.png -------------------------------------------------------------------------------- /documentation/host-google-images/Instagram post - 13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/host-google-images/Instagram post - 13.png -------------------------------------------------------------------------------- /documentation/host-google-images/Instagram post - 14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/host-google-images/Instagram post - 14.png -------------------------------------------------------------------------------- /documentation/host-google-images/Instagram post - 15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/host-google-images/Instagram post - 15.png -------------------------------------------------------------------------------- /documentation/host-google-images/Instagram post - 16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/host-google-images/Instagram post - 16.png -------------------------------------------------------------------------------- /documentation/host-google-images/Instagram post - 18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/host-google-images/Instagram post - 18.png -------------------------------------------------------------------------------- /documentation/host-google-images/Instagram post - 19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/host-google-images/Instagram post - 19.png -------------------------------------------------------------------------------- /documentation/host-google-images/Instagram post - 20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Element-Type/HostGrotesk/ab2ba6769119e7ae71aa2fab46eedcb993c670a3/documentation/host-google-images/Instagram post - 20.png -------------------------------------------------------------------------------- /documentation/images-license.txt: -------------------------------------------------------------------------------- 1 | The images in this repository are licensed under the CC https://creativecommons.org/licenses/by-sa/4.0/ -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:recommended" 5 | ], 6 | "rangeStrategy": "bump" 7 | } 8 | -------------------------------------------------------------------------------- /requirements-test.in: -------------------------------------------------------------------------------- 1 | fontbakery[googlefonts]>=0.9.2 2 | gftools[qa]>=0.9.23 3 | -------------------------------------------------------------------------------- /requirements-test.txt: -------------------------------------------------------------------------------- 1 | # 2 | # This file is autogenerated by pip-compile with Python 3.12 3 | # by the following command: 4 | # 5 | # pip-compile requirements-test.in 6 | # 7 | absl-py==2.1.0 8 | # via 9 | # gftools 10 | # nanoemoji 11 | # picosvg 12 | afdko==4.0.1 13 | # via gftools 14 | appdirs==1.4.4 15 | # via fs 16 | attrs==24.2.0 17 | # via 18 | # cattrs 19 | # outcome 20 | # statmake 21 | # trio 22 | # ufolib2 23 | axisregistry==0.4.11 24 | # via 25 | # fontbakery 26 | # gftools 27 | babelfont==3.0.5 28 | # via 29 | # collidoscope 30 | # gftools 31 | beautifulsoup4==4.12.3 32 | # via 33 | # fontbakery 34 | # gftools 35 | beziers==0.6.0 36 | # via fontbakery 37 | blackrenderer[skia]==0.6.0 38 | # via diffenator2 39 | booleanoperations==0.9.0 40 | # via 41 | # afdko 42 | # fontparts 43 | # ufo2ft 44 | brotli==1.1.0 45 | # via 46 | # fonttools 47 | # gftools 48 | bump2version==1.0.1 49 | # via bumpfontversion 50 | bumpfontversion==0.4.1 51 | # via gftools 52 | cattrs==24.1.1 53 | # via 54 | # statmake 55 | # ufolib2 56 | certifi==2024.8.30 57 | # via 58 | # requests 59 | # selenium 60 | cffi==1.17.1 61 | # via 62 | # cmarkgfm 63 | # cryptography 64 | # pygit2 65 | # pynacl 66 | cffsubr==0.3.0 67 | # via ufo2ft 68 | charset-normalizer==3.3.2 69 | # via requests 70 | cmarkgfm==2024.1.14 71 | # via fontbakery 72 | collidoscope==0.6.5 73 | # via fontbakery 74 | commandlines==0.4.1 75 | # via ufolint 76 | compreffor==0.5.5 77 | # via ufo2ft 78 | cryptography==43.0.1 79 | # via pyjwt 80 | defcon[lxml,pens]==0.10.3 81 | # via 82 | # afdko 83 | # fontbakery 84 | # fontparts 85 | # glyphsets 86 | # mutatormath 87 | # ufoprocessor 88 | dehinter==4.0.0 89 | # via fontbakery 90 | deprecated==1.2.14 91 | # via pygithub 92 | diffenator2==0.4.4 93 | # via gftools 94 | docopt==0.6.2 95 | # via num2words 96 | filelock==3.16.1 97 | # via youseedee 98 | font-v==2.1.0 99 | # via gftools 100 | fontbakery[beautifulsoup4,googlefonts,googlefontsalwayslatest,shaperglot]==0.12.10 101 | # via 102 | # -r requirements-test.in 103 | # gftools 104 | fontfeatures==1.8.0 105 | # via 106 | # babelfont 107 | # gftools 108 | fontmake[json]==3.9.0 109 | # via gftools 110 | fontmath==0.9.4 111 | # via 112 | # afdko 113 | # fontmake 114 | # fontparts 115 | # mutatormath 116 | # ufo2ft 117 | # ufoprocessor 118 | fontparts==0.12.2 119 | # via ufoprocessor 120 | fontpens==0.2.4 121 | # via defcon 122 | fonttools[lxml,ufo,unicode,woff]==4.53.1 123 | # via 124 | # afdko 125 | # axisregistry 126 | # babelfont 127 | # blackrenderer 128 | # booleanoperations 129 | # bumpfontversion 130 | # cffsubr 131 | # collidoscope 132 | # compreffor 133 | # defcon 134 | # dehinter 135 | # diffenator2 136 | # font-v 137 | # fontbakery 138 | # fontfeatures 139 | # fontmake 140 | # fontmath 141 | # fontparts 142 | # fontpens 143 | # fonttools 144 | # gftools 145 | # glyphsets 146 | # glyphslib 147 | # kurbopy 148 | # mutatormath 149 | # nanoemoji 150 | # statmake 151 | # ufo2ft 152 | # ufolib2 153 | # ufolint 154 | # ufoprocessor 155 | # vfblib 156 | # vharfbuzz 157 | # vttlib 158 | freetype-py==2.3.0 159 | # via 160 | # diffenator2 161 | # fontbakery 162 | fs==2.4.16 163 | # via 164 | # fontfeatures 165 | # fonttools 166 | gflanguages==0.6.4 167 | # via 168 | # diffenator2 169 | # fontbakery 170 | # gftools 171 | # glyphsets 172 | # shaperglot 173 | gfsubsets==2024.5.9 174 | # via 175 | # fontbakery 176 | # gftools 177 | gftools[qa]==0.9.68 178 | # via -r requirements-test.in 179 | gitdb==4.0.11 180 | # via gitpython 181 | gitpython==3.1.43 182 | # via font-v 183 | glyphsets==1.0.0 184 | # via 185 | # diffenator2 186 | # fontbakery 187 | # gftools 188 | glyphslib==6.8.2 189 | # via 190 | # babelfont 191 | # bumpfontversion 192 | # fontmake 193 | # gftools 194 | # glyphsets 195 | h11==0.14.0 196 | # via wsproto 197 | idna==3.10 198 | # via 199 | # requests 200 | # trio 201 | importlib-resources==6.4.5 202 | # via gfsubsets 203 | jinja2==3.1.4 204 | # via 205 | # diffenator2 206 | # fontbakery 207 | # gftools 208 | kurbopy==0.11.0 209 | # via collidoscope 210 | lxml==5.3.0 211 | # via 212 | # afdko 213 | # fontfeatures 214 | # fonttools 215 | # nanoemoji 216 | # picosvg 217 | markdown-it-py==3.0.0 218 | # via rich 219 | markupsafe==2.1.5 220 | # via jinja2 221 | mdurl==0.1.2 222 | # via markdown-it-py 223 | munkres==1.1.4 224 | # via fontbakery 225 | mutatormath==3.0.1 226 | # via ufoprocessor 227 | nanoemoji==0.15.1 228 | # via gftools 229 | networkx==3.3 230 | # via gftools 231 | ninja==1.11.1.1 232 | # via 233 | # diffenator2 234 | # gftools 235 | # nanoemoji 236 | num2words==0.5.13 237 | # via shaperglot 238 | numpy==2.1.1 239 | # via 240 | # blackrenderer 241 | # skia-python 242 | openstep-plist==0.3.1 243 | # via 244 | # babelfont 245 | # bumpfontversion 246 | # glyphslib 247 | opentype-sanitizer==9.1.0 248 | # via 249 | # fontbakery 250 | # gftools 251 | opentypespec==1.9.1 252 | # via fontbakery 253 | orjson==3.10.7 254 | # via 255 | # babelfont 256 | # ufolib2 257 | outcome==1.3.0.post0 258 | # via trio 259 | packaging==24.1 260 | # via 261 | # fontbakery 262 | # gftools 263 | picosvg==0.22.1 264 | # via nanoemoji 265 | pillow==10.4.0 266 | # via 267 | # diffenator2 268 | # gftools 269 | # nanoemoji 270 | pip-api==0.0.34 271 | # via fontbakery 272 | pngquant-cli==2.17.0.post5 273 | # via nanoemoji 274 | protobuf==3.20.3 275 | # via 276 | # axisregistry 277 | # diffenator2 278 | # fontbakery 279 | # gflanguages 280 | # gftools 281 | # shaperglot 282 | pyahocorasick==2.1.0 283 | # via diffenator2 284 | pybind11==2.13.6 285 | # via skia-python 286 | pycairo==1.27.0 287 | # via gftools 288 | pyclipper==1.3.0.post5 289 | # via 290 | # beziers 291 | # booleanoperations 292 | pycparser==2.22 293 | # via cffi 294 | pygit2==1.14.1 295 | # via gftools 296 | pygithub==2.4.0 297 | # via gftools 298 | pygments==2.18.0 299 | # via rich 300 | pyjwt[crypto]==2.9.0 301 | # via pygithub 302 | pynacl==1.5.0 303 | # via pygithub 304 | pyparsing==3.1.4 305 | # via vttlib 306 | pysocks==1.7.1 307 | # via urllib3 308 | python-bidi==0.4.2 309 | # via diffenator2 310 | python-dateutil==2.9.0.post0 311 | # via strictyaml 312 | pyyaml==6.0.2 313 | # via 314 | # fontbakery 315 | # gftools 316 | # glyphsets 317 | # shaperglot 318 | regex==2024.9.11 319 | # via nanoemoji 320 | requests==2.32.3 321 | # via 322 | # fontbakery 323 | # gftools 324 | # glyphsets 325 | # pygithub 326 | # youseedee 327 | resvg-cli==0.22.0.post3 328 | # via nanoemoji 329 | rich==13.8.1 330 | # via 331 | # fontbakery 332 | # gftools 333 | rstr==3.2.2 334 | # via stringbrewer 335 | ruamel-yaml==0.18.6 336 | # via gftools 337 | ruamel-yaml-clib==0.2.8 338 | # via ruamel-yaml 339 | selenium==4.24.0 340 | # via diffenator2 341 | shaperglot==0.5.1 342 | # via fontbakery 343 | six==1.16.0 344 | # via 345 | # fs 346 | # python-bidi 347 | # python-dateutil 348 | skia-pathops==0.8.0.post1 349 | # via 350 | # collidoscope 351 | # gftools 352 | # picosvg 353 | skia-python==87.6 354 | # via blackrenderer 355 | smmap==5.0.1 356 | # via gitdb 357 | sniffio==1.3.1 358 | # via trio 359 | sortedcontainers==2.4.0 360 | # via trio 361 | soupsieve==2.6 362 | # via beautifulsoup4 363 | sre-yield==1.2 364 | # via stringbrewer 365 | statmake==0.6.0 366 | # via gftools 367 | strictyaml==1.7.3 368 | # via 369 | # gftools 370 | # shaperglot 371 | stringbrewer==0.0.1 372 | # via fontbakery 373 | tabulate==0.9.0 374 | # via gftools 375 | termcolor==2.4.0 376 | # via shaperglot 377 | toml==0.10.2 378 | # via 379 | # fontbakery 380 | # nanoemoji 381 | tqdm==4.66.5 382 | # via 383 | # afdko 384 | # collidoscope 385 | # diffenator2 386 | trio==0.26.2 387 | # via 388 | # selenium 389 | # trio-websocket 390 | trio-websocket==0.11.1 391 | # via selenium 392 | ttfautohint-py==0.5.1 393 | # via gftools 394 | typing-extensions==4.12.2 395 | # via 396 | # pygithub 397 | # selenium 398 | # vfblib 399 | ufo2ft[cffsubr,compreffor]==3.2.8 400 | # via 401 | # fontbakery 402 | # fontmake 403 | # nanoemoji 404 | # shaperglot 405 | ufolib2[json]==0.16.0 406 | # via 407 | # babelfont 408 | # bumpfontversion 409 | # fontmake 410 | # glyphslib 411 | # nanoemoji 412 | # vfblib 413 | # vttlib 414 | ufolint==1.2.0 415 | # via fontbakery 416 | ufonormalizer==0.6.2 417 | # via 418 | # afdko 419 | # vfblib 420 | ufoprocessor==1.13.1 421 | # via afdko 422 | uharfbuzz==0.39.5 423 | # via 424 | # blackrenderer 425 | # collidoscope 426 | # diffenator2 427 | # fontbakery 428 | # vharfbuzz 429 | unicodedata2==15.1.0 430 | # via 431 | # diffenator2 432 | # fontbakery 433 | # fonttools 434 | # glyphsets 435 | unidecode==1.3.8 436 | # via gftools 437 | urllib3[socks]==2.2.3 438 | # via 439 | # pygithub 440 | # requests 441 | # selenium 442 | vfblib==0.7.1 443 | # via babelfont 444 | vharfbuzz==0.3.1 445 | # via 446 | # fontbakery 447 | # gftools 448 | # shaperglot 449 | vttlib==0.12.0 450 | # via gftools 451 | websocket-client==1.8.0 452 | # via selenium 453 | wrapt==1.16.0 454 | # via deprecated 455 | wsproto==1.2.0 456 | # via trio-websocket 457 | youseedee==0.5.3 458 | # via 459 | # diffenator2 460 | # shaperglot 461 | zopfli==0.2.3 462 | # via 463 | # fonttools 464 | # nanoemoji 465 | 466 | # The following packages are considered to be unsafe in a requirements file: 467 | # pip 468 | # setuptools 469 | -------------------------------------------------------------------------------- /requirements.in: -------------------------------------------------------------------------------- 1 | fontmake>=3.9.0 2 | gftools[qa]>=0.9.54 3 | drawbot-skia>=0.5.0 4 | sh>=2.0.6 5 | bumpfontversion>=0.4.1 6 | diffenator2>=0.3.8 7 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # 2 | # This file is autogenerated by pip-compile with Python 3.12 3 | # by the following command: 4 | # 5 | # pip-compile requirements.in 6 | # 7 | absl-py==2.1.0 8 | # via 9 | # gftools 10 | # nanoemoji 11 | # picosvg 12 | afdko==4.0.1 13 | # via gftools 14 | appdirs==1.4.4 15 | # via fs 16 | attrs==24.2.0 17 | # via 18 | # cattrs 19 | # outcome 20 | # statmake 21 | # trio 22 | # ufolib2 23 | axisregistry==0.4.11 24 | # via 25 | # fontbakery 26 | # gftools 27 | babelfont==3.0.5 28 | # via 29 | # collidoscope 30 | # gftools 31 | beautifulsoup4==4.12.3 32 | # via 33 | # fontbakery 34 | # gftools 35 | beziers==0.6.0 36 | # via fontbakery 37 | blackrenderer[skia]==0.6.0 38 | # via 39 | # diffenator2 40 | # drawbot-skia 41 | booleanoperations==0.9.0 42 | # via 43 | # afdko 44 | # fontparts 45 | # ufo2ft 46 | brotli==1.1.0 47 | # via 48 | # fonttools 49 | # gftools 50 | bump2version==1.0.1 51 | # via bumpfontversion 52 | bumpfontversion==0.4.1 53 | # via 54 | # -r requirements.in 55 | # gftools 56 | cattrs==24.1.1 57 | # via 58 | # statmake 59 | # ufolib2 60 | certifi==2024.8.30 61 | # via 62 | # requests 63 | # selenium 64 | cffi==1.17.1 65 | # via 66 | # cmarkgfm 67 | # cryptography 68 | # pygit2 69 | # pynacl 70 | cffsubr==0.3.0 71 | # via ufo2ft 72 | charset-normalizer==3.3.2 73 | # via requests 74 | cmarkgfm==2024.1.14 75 | # via fontbakery 76 | collidoscope==0.6.5 77 | # via fontbakery 78 | commandlines==0.4.1 79 | # via ufolint 80 | compreffor==0.5.5 81 | # via ufo2ft 82 | cryptography==43.0.1 83 | # via pyjwt 84 | defcon[lxml,pens]==0.10.3 85 | # via 86 | # afdko 87 | # fontbakery 88 | # fontparts 89 | # glyphsets 90 | # mutatormath 91 | # ufoprocessor 92 | dehinter==4.0.0 93 | # via fontbakery 94 | deprecated==1.2.14 95 | # via pygithub 96 | diffenator2==0.4.4 97 | # via 98 | # -r requirements.in 99 | # gftools 100 | docopt==0.6.2 101 | # via num2words 102 | drawbot-skia==0.5.1 103 | # via -r requirements.in 104 | filelock==3.16.1 105 | # via youseedee 106 | font-v==2.1.0 107 | # via gftools 108 | fontbakery[beautifulsoup4,googlefonts,googlefontsalwayslatest,shaperglot]==0.12.10 109 | # via gftools 110 | fontfeatures==1.8.0 111 | # via 112 | # babelfont 113 | # gftools 114 | fontmake[json]==3.9.0 115 | # via 116 | # -r requirements.in 117 | # gftools 118 | fontmath==0.9.4 119 | # via 120 | # afdko 121 | # fontmake 122 | # fontparts 123 | # mutatormath 124 | # ufo2ft 125 | # ufoprocessor 126 | fontparts==0.12.2 127 | # via ufoprocessor 128 | fontpens==0.2.4 129 | # via defcon 130 | fonttools[lxml,ufo,unicode,woff]==4.53.1 131 | # via 132 | # afdko 133 | # axisregistry 134 | # babelfont 135 | # blackrenderer 136 | # booleanoperations 137 | # bumpfontversion 138 | # cffsubr 139 | # collidoscope 140 | # compreffor 141 | # defcon 142 | # dehinter 143 | # diffenator2 144 | # drawbot-skia 145 | # font-v 146 | # fontbakery 147 | # fontfeatures 148 | # fontmake 149 | # fontmath 150 | # fontparts 151 | # fontpens 152 | # gftools 153 | # glyphsets 154 | # glyphslib 155 | # kurbopy 156 | # mutatormath 157 | # nanoemoji 158 | # statmake 159 | # ufo2ft 160 | # ufolib2 161 | # ufolint 162 | # ufoprocessor 163 | # vfblib 164 | # vharfbuzz 165 | # vttlib 166 | freetype-py==2.3.0 167 | # via 168 | # diffenator2 169 | # fontbakery 170 | fs==2.4.16 171 | # via 172 | # fontfeatures 173 | # fonttools 174 | gflanguages==0.6.4 175 | # via 176 | # diffenator2 177 | # fontbakery 178 | # gftools 179 | # glyphsets 180 | # shaperglot 181 | gfsubsets==2024.5.9 182 | # via 183 | # fontbakery 184 | # gftools 185 | gftools[qa]==0.9.68 186 | # via -r requirements.in 187 | gitdb==4.0.11 188 | # via gitpython 189 | gitpython==3.1.43 190 | # via font-v 191 | glyphsets==1.0.0 192 | # via 193 | # diffenator2 194 | # fontbakery 195 | # gftools 196 | glyphslib==6.8.2 197 | # via 198 | # babelfont 199 | # bumpfontversion 200 | # fontmake 201 | # gftools 202 | # glyphsets 203 | h11==0.14.0 204 | # via wsproto 205 | idna==3.10 206 | # via 207 | # requests 208 | # trio 209 | importlib-resources==6.4.5 210 | # via gfsubsets 211 | jinja2==3.1.4 212 | # via 213 | # diffenator2 214 | # fontbakery 215 | # gftools 216 | kurbopy==0.11.0 217 | # via collidoscope 218 | lxml==5.3.0 219 | # via 220 | # afdko 221 | # fontfeatures 222 | # fonttools 223 | # nanoemoji 224 | # picosvg 225 | markdown-it-py==3.0.0 226 | # via rich 227 | markupsafe==2.1.5 228 | # via jinja2 229 | mdurl==0.1.2 230 | # via markdown-it-py 231 | munkres==1.1.4 232 | # via fontbakery 233 | mutatormath==3.0.1 234 | # via ufoprocessor 235 | nanoemoji==0.15.1 236 | # via gftools 237 | networkx==3.3 238 | # via gftools 239 | ninja==1.11.1.1 240 | # via 241 | # diffenator2 242 | # gftools 243 | # nanoemoji 244 | num2words==0.5.13 245 | # via shaperglot 246 | numpy==2.1.1 247 | # via 248 | # blackrenderer 249 | # drawbot-skia 250 | # skia-python 251 | openstep-plist==0.3.1 252 | # via 253 | # babelfont 254 | # bumpfontversion 255 | # glyphslib 256 | opentype-sanitizer==9.1.0 257 | # via 258 | # fontbakery 259 | # gftools 260 | opentypespec==1.9.1 261 | # via fontbakery 262 | orjson==3.10.7 263 | # via 264 | # babelfont 265 | # ufolib2 266 | outcome==1.3.0.post0 267 | # via trio 268 | packaging==24.1 269 | # via 270 | # fontbakery 271 | # gftools 272 | picosvg==0.22.1 273 | # via nanoemoji 274 | pillow==10.4.0 275 | # via 276 | # diffenator2 277 | # gftools 278 | # nanoemoji 279 | pip-api==0.0.34 280 | # via fontbakery 281 | pngquant-cli==2.17.0.post5 282 | # via nanoemoji 283 | protobuf==3.20.3 284 | # via 285 | # axisregistry 286 | # diffenator2 287 | # fontbakery 288 | # gflanguages 289 | # gftools 290 | # shaperglot 291 | pyahocorasick==2.1.0 292 | # via diffenator2 293 | pybind11==2.13.6 294 | # via skia-python 295 | pycairo==1.27.0 296 | # via gftools 297 | pyclipper==1.3.0.post5 298 | # via 299 | # beziers 300 | # booleanoperations 301 | pycparser==2.22 302 | # via cffi 303 | pygit2==1.14.1 304 | # via gftools 305 | pygithub==2.4.0 306 | # via gftools 307 | pygments==2.18.0 308 | # via rich 309 | pyjwt[crypto]==2.9.0 310 | # via pygithub 311 | pynacl==1.5.0 312 | # via pygithub 313 | pyparsing==3.1.4 314 | # via vttlib 315 | pysocks==1.7.1 316 | # via urllib3 317 | python-bidi==0.4.2 318 | # via 319 | # diffenator2 320 | # drawbot-skia 321 | python-dateutil==2.9.0.post0 322 | # via strictyaml 323 | pyyaml==6.0.2 324 | # via 325 | # fontbakery 326 | # gftools 327 | # glyphsets 328 | # shaperglot 329 | regex==2024.9.11 330 | # via nanoemoji 331 | requests==2.32.3 332 | # via 333 | # fontbakery 334 | # gftools 335 | # glyphsets 336 | # pygithub 337 | # youseedee 338 | resvg-cli==0.22.0.post3 339 | # via nanoemoji 340 | rich==13.8.1 341 | # via 342 | # fontbakery 343 | # gftools 344 | rstr==3.2.2 345 | # via stringbrewer 346 | ruamel-yaml==0.18.6 347 | # via gftools 348 | ruamel-yaml-clib==0.2.8 349 | # via ruamel-yaml 350 | selenium==4.24.0 351 | # via diffenator2 352 | sh==2.0.7 353 | # via -r requirements.in 354 | shaperglot==0.5.1 355 | # via fontbakery 356 | six==1.16.0 357 | # via 358 | # fs 359 | # python-bidi 360 | # python-dateutil 361 | skia-pathops==0.8.0.post1 362 | # via 363 | # collidoscope 364 | # gftools 365 | # picosvg 366 | skia-python==87.6 367 | # via 368 | # blackrenderer 369 | # drawbot-skia 370 | smmap==5.0.1 371 | # via gitdb 372 | sniffio==1.3.1 373 | # via trio 374 | sortedcontainers==2.4.0 375 | # via trio 376 | soupsieve==2.6 377 | # via beautifulsoup4 378 | sre-yield==1.2 379 | # via stringbrewer 380 | statmake==0.6.0 381 | # via gftools 382 | strictyaml==1.7.3 383 | # via 384 | # gftools 385 | # shaperglot 386 | stringbrewer==0.0.1 387 | # via fontbakery 388 | tabulate==0.9.0 389 | # via gftools 390 | termcolor==2.4.0 391 | # via shaperglot 392 | toml==0.10.2 393 | # via 394 | # fontbakery 395 | # nanoemoji 396 | tqdm==4.66.5 397 | # via 398 | # afdko 399 | # collidoscope 400 | # diffenator2 401 | trio==0.26.2 402 | # via 403 | # selenium 404 | # trio-websocket 405 | trio-websocket==0.11.1 406 | # via selenium 407 | ttfautohint-py==0.5.1 408 | # via gftools 409 | typing-extensions==4.12.2 410 | # via 411 | # pygithub 412 | # selenium 413 | # vfblib 414 | ufo2ft[cffsubr,compreffor]==3.2.8 415 | # via 416 | # fontbakery 417 | # fontmake 418 | # nanoemoji 419 | # shaperglot 420 | ufolib2[json]==0.16.0 421 | # via 422 | # babelfont 423 | # bumpfontversion 424 | # fontmake 425 | # glyphslib 426 | # nanoemoji 427 | # vfblib 428 | # vttlib 429 | ufolint==1.2.0 430 | # via fontbakery 431 | ufonormalizer==0.6.2 432 | # via 433 | # afdko 434 | # vfblib 435 | ufoprocessor==1.13.1 436 | # via afdko 437 | uharfbuzz==0.39.5 438 | # via 439 | # blackrenderer 440 | # collidoscope 441 | # diffenator2 442 | # drawbot-skia 443 | # fontbakery 444 | # vharfbuzz 445 | unicodedata2==15.1.0 446 | # via 447 | # diffenator2 448 | # drawbot-skia 449 | # fontbakery 450 | # fonttools 451 | # glyphsets 452 | unidecode==1.3.8 453 | # via gftools 454 | urllib3[socks]==2.2.3 455 | # via 456 | # pygithub 457 | # requests 458 | # selenium 459 | vfblib==0.7.1 460 | # via babelfont 461 | vharfbuzz==0.3.1 462 | # via 463 | # fontbakery 464 | # gftools 465 | # shaperglot 466 | vttlib==0.12.0 467 | # via gftools 468 | websocket-client==1.8.0 469 | # via selenium 470 | wrapt==1.16.0 471 | # via deprecated 472 | wsproto==1.2.0 473 | # via trio-websocket 474 | youseedee==0.5.3 475 | # via 476 | # diffenator2 477 | # shaperglot 478 | zopfli==0.2.3 479 | # via 480 | # fonttools 481 | # nanoemoji 482 | 483 | # The following packages are considered to be unsafe in a requirements file: 484 | # pip 485 | # setuptools 486 | -------------------------------------------------------------------------------- /scripts/first-run.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # This script is run the first time any action is performed after the repository 4 | # is cloned. If you are reading this because the automatic initialization failed, 5 | # skip down to the section headed "INITIALIZATION STEPS". 6 | 7 | from sh import git 8 | import datetime 9 | import re 10 | import sys 11 | from urllib.parse import quote 12 | import subprocess 13 | 14 | BASE_OWNER = "googlefonts" 15 | BASE_REPONAME = "googlefonts-project-template" 16 | DUMMY_URL = "https://yourname.github.io/your-font-repository-name" 17 | 18 | 19 | def repo_url(owner, name): 20 | return f"https://github.com/{owner}/{name}" 21 | 22 | 23 | def web_url(owner, name): 24 | return f"https://{owner}.github.io/{name}" 25 | 26 | 27 | def raw_url(owner, name): 28 | return f"https://raw.githubusercontent.com/{owner}/{name}" 29 | 30 | 31 | def touch(): 32 | open(".init.stamp", "w").close() 33 | 34 | 35 | def lose(msg, e=None): 36 | print(msg) 37 | print("You will need to do the initialization steps manually.") 38 | print("Read scripts/first-run.py for more instructions how to do this.") 39 | if e: 40 | print( 41 | "\nHere's an additional error message which may help diagnose the problem." 42 | ) 43 | raise e 44 | sys.exit(1) 45 | 46 | 47 | try: 48 | my_repo_url = git.remote("get-url", "origin") 49 | except Exception as e: 50 | lose("Could not use git to find my own repository URL", e) 51 | 52 | m = re.match(r"(?:https://github.com/|git@github.com:)(.*)/(.*)/?", str(my_repo_url)) 53 | if not m: 54 | lose( 55 | f"My git repository URL ({my_repo_url}) didn't look what I expected - are you hosting this on github?" 56 | ) 57 | 58 | owner, reponame = m[1], m[2] 59 | 60 | if owner == BASE_OWNER and reponame == BASE_REPONAME: 61 | print("I am being run on the upstream repository (probably due to CI)") 62 | print("All I'm going to do is create the touch file and quit.") 63 | touch() 64 | sys.exit() 65 | 66 | # INITIALIZATION STEPS 67 | 68 | # First, the README file contains URLs to pages in the `gh-pages` branch of the 69 | # repo. When initially cloned, these URLs will point to the 70 | # googlefonts/Unified-Font-Repository itself. But downstream users want links 71 | # and badges about their own font, not ours! So any URLs need to be adjusted to 72 | # refer to the end user's repository. 73 | 74 | # We will also pin the dependencies so future builds are reproducible. 75 | 76 | readme = open("README.md").read() 77 | 78 | print( 79 | "Fixing URLs:", web_url(BASE_OWNER, BASE_REPONAME), "->", web_url(owner, reponame) 80 | ) 81 | 82 | readme = readme.replace(web_url(BASE_OWNER, BASE_REPONAME), web_url(owner, reponame)) 83 | # In the badges, the URLs to raw.githubusercontent.com are URL-encoded as they 84 | # are passed to shields.io. 85 | print( 86 | "Fixing URLs:", 87 | quote(raw_url(BASE_OWNER, BASE_REPONAME), safe=""), 88 | "->", 89 | quote(raw_url(owner, reponame), safe=""), 90 | ) 91 | readme = readme.replace( 92 | quote(raw_url(BASE_OWNER, BASE_REPONAME), safe=""), 93 | quote(raw_url(owner, reponame), safe=""), 94 | ) 95 | 96 | print( 97 | "Fixing URLs:", 98 | DUMMY_URL, 99 | "->", 100 | web_url(owner, reponame), 101 | ) 102 | readme = readme.replace( 103 | f"`{DUMMY_URL}`", 104 | web_url(owner, reponame), 105 | ) 106 | 107 | with open("README.md", "w") as fh: 108 | fh.write(readme) 109 | 110 | # Fix the OFL 111 | 112 | ofl = open("OFL.txt").read() 113 | ofl = ofl.replace(web_url(BASE_OWNER, BASE_REPONAME), web_url(owner, reponame)) 114 | ofl = ofl.replace("My Font", reponame.title()) 115 | ofl = ofl.replace("20**", str(datetime.date.today().year)) 116 | with open("OFL.txt", "w") as fh: 117 | fh.write(ofl) 118 | 119 | # Pin the dependencies 120 | print("Pinning dependencies") 121 | dependencies = subprocess.check_output(["pip", "freeze"]) 122 | with open("requirements.txt", "wb") as dependency_file: 123 | dependency_file.write(dependencies) 124 | 125 | # Finally, we add a "touch file" called ".init.stamp" to the repository which 126 | # prevents this first-run process from being run again. 127 | touch() 128 | -------------------------------------------------------------------------------- /scripts/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | My Font development 7 | 8 | 9 |

My Font testing pages

10 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /scripts/read-config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # Yes, this is a Bad YAML Parser, but at this stage we are not in the 3 | # venv and do not know what modules the user has available, so for 4 | # maximum compatibility, we are just assuming a plain Python distribution. 5 | import argparse 6 | import re 7 | import sys 8 | import os 9 | 10 | parser = argparse.ArgumentParser() 11 | group = parser.add_mutually_exclusive_group(required=True) 12 | group.add_argument('--sources',action='store_true') 13 | group.add_argument('--family',action='store_true') 14 | args = parser.parse_args() 15 | 16 | with open(os.path.join("sources", "config.yaml")) as config: 17 | data = config.read() 18 | 19 | if args.family: 20 | m = re.search(r"(?m)^familyName: (.*)", data) 21 | if m: 22 | print(m[1]) 23 | sys.exit(0) 24 | else: 25 | print("Could not determine family name from config file!") 26 | sys.exit(1) 27 | 28 | toggle = False 29 | sources = [] 30 | for line in data.splitlines(): 31 | if re.match("^sources:", line): 32 | toggle = True 33 | continue 34 | if toggle: 35 | m = re.match(r"^\s+-\s*(.*)", line) 36 | if m: 37 | sources.append("sources/"+m[1]) 38 | else: 39 | toggle = False 40 | if sources: 41 | print(" ".join(sources)) 42 | sys.exit(0) 43 | else: 44 | print("Could not determine sources from config file!") 45 | sys.exit(1) 46 | -------------------------------------------------------------------------------- /sources/CustomFilter_GFLatinCore.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | list 7 | 8 | zero 9 | one 10 | two 11 | three 12 | four 13 | five 14 | six 15 | seven 16 | eight 17 | nine 18 | space 19 | nbspace 20 | period 21 | colon 22 | ellipsis 23 | exclam 24 | asterisk 25 | numbersign 26 | slash 27 | backslash 28 | hyphen 29 | parenleft 30 | parenright 31 | braceleft 32 | braceright 33 | bracketleft 34 | bracketright 35 | quotedblleft 36 | quotedblright 37 | quoteleft 38 | quoteright 39 | guillemetleft 40 | guillemetright 41 | quotedbl 42 | quotesingle 43 | bar 44 | plus 45 | multiply 46 | divide 47 | equal 48 | greater 49 | less 50 | percent 51 | dieresiscomb 52 | gravecomb 53 | acutecomb 54 | hungarumlautcomb 55 | macroncomb 56 | dotaccent 57 | A 58 | Aacute 59 | Abreve 60 | Acaron 61 | Acircumflex 62 | Adieresis 63 | Agrave 64 | Amacron 65 | Aogonek 66 | Aring 67 | Atilde 68 | AE 69 | B 70 | C 71 | Cacute 72 | Ccaron 73 | Ccedilla 74 | Cdotaccent 75 | D 76 | Eth 77 | Dcaron 78 | Dcroat 79 | E 80 | Eacute 81 | Ecaron 82 | Ecircumflex 83 | Edieresis 84 | Edotaccent 85 | Egrave 86 | Emacron 87 | Eogonek 88 | F 89 | G 90 | Gbreve 91 | Gcommaaccent 92 | Gdotaccent 93 | H 94 | Hbar 95 | I 96 | IJ 97 | Iacute 98 | Icircumflex 99 | Idieresis 100 | Idotaccent 101 | Igrave 102 | Imacron 103 | Iogonek 104 | J 105 | K 106 | Kcommaaccent 107 | L 108 | Lacute 109 | Lcaron 110 | Lcommaaccent 111 | Lslash 112 | M 113 | N 114 | Nacute 115 | Ncaron 116 | Ncommaaccent 117 | Ntilde 118 | Eng 119 | O 120 | Oacute 121 | Ocircumflex 122 | Odieresis 123 | Ograve 124 | Ohungarumlaut 125 | Omacron 126 | Oslash 127 | Otilde 128 | OE 129 | P 130 | Thorn 131 | Q 132 | R 133 | Racute 134 | Rcaron 135 | Rcommaaccent 136 | S 137 | Sacute 138 | Scaron 139 | Scedilla 140 | Scommaaccent 141 | Germandbls 142 | T 143 | Tcaron 144 | Tcommaaccent 145 | U 146 | Uacute 147 | Ubreve 148 | Ucircumflex 149 | Udieresis 150 | Ugrave 151 | Uhungarumlaut 152 | Umacron 153 | Uogonek 154 | Uring 155 | V 156 | W 157 | Wacute 158 | Wcircumflex 159 | Wdieresis 160 | Wgrave 161 | X 162 | Y 163 | Yacute 164 | Ycircumflex 165 | Ydieresis 166 | Ygrave 167 | Z 168 | Zacute 169 | Zcaron 170 | Zdotaccent 171 | a 172 | aacute 173 | abreve 174 | acaron 175 | acircumflex 176 | adieresis 177 | agrave 178 | amacron 179 | aogonek 180 | aring 181 | atilde 182 | ae 183 | b 184 | c 185 | cacute 186 | ccaron 187 | ccedilla 188 | cdotaccent 189 | d 190 | eth 191 | dcaron 192 | dcroat 193 | e 194 | eacute 195 | ecaron 196 | ecircumflex 197 | edieresis 198 | edotaccent 199 | egrave 200 | emacron 201 | eogonek 202 | f 203 | g 204 | gbreve 205 | gcommaaccent 206 | gdotaccent 207 | h 208 | hbar 209 | i 210 | idotless 211 | iacute 212 | icircumflex 213 | idieresis 214 | idotaccent 215 | igrave 216 | ij 217 | imacron 218 | iogonek 219 | j 220 | jdotless 221 | k 222 | kcommaaccent 223 | l 224 | lacute 225 | lcaron 226 | lcommaaccent 227 | lslash 228 | m 229 | n 230 | nacute 231 | ncaron 232 | ncommaaccent 233 | ntilde 234 | eng 235 | o 236 | oacute 237 | ocircumflex 238 | odieresis 239 | ograve 240 | ohungarumlaut 241 | omacron 242 | oslash 243 | otilde 244 | oe 245 | p 246 | thorn 247 | q 248 | r 249 | racute 250 | rcaron 251 | rcommaaccent 252 | s 253 | sacute 254 | scaron 255 | scedilla 256 | scommaaccent 257 | germandbls 258 | t 259 | tcaron 260 | tcommaaccent 261 | u 262 | uacute 263 | ubreve 264 | ucircumflex 265 | udieresis 266 | ugrave 267 | uhungarumlaut 268 | umacron 269 | uogonek 270 | uring 271 | v 272 | w 273 | wacute 274 | wcircumflex 275 | wdieresis 276 | wgrave 277 | x 278 | y 279 | yacute 280 | ycircumflex 281 | ydieresis 282 | ygrave 283 | z 284 | zacute 285 | zcaron 286 | zdotaccent 287 | ordfeminine 288 | ordmasculine 289 | .notdef 290 | comma 291 | semicolon 292 | exclamdown 293 | question 294 | questiondown 295 | periodcentered 296 | bullet 297 | periodcentered.loclCAT 298 | periodcentered.loclCAT.case 299 | endash 300 | emdash 301 | underscore 302 | quotesinglbase 303 | quotedblbase 304 | guilsinglleft 305 | guilsinglright 306 | at 307 | ampersand 308 | paragraph 309 | section 310 | copyright 311 | registered 312 | trademark 313 | degree 314 | cent 315 | dollar 316 | euro 317 | sterling 318 | yen 319 | minus 320 | asciitilde 321 | asciicircum 322 | dotaccentcomb 323 | caroncomb.alt 324 | circumflexcomb 325 | caroncomb 326 | brevecomb 327 | ringcomb 328 | tildecomb 329 | commaturnedabovecomb 330 | commaaccentcomb 331 | cedillacomb 332 | ogonekcomb 333 | dieresis 334 | grave 335 | acute 336 | hungarumlaut 337 | circumflex 338 | caron 339 | breve 340 | ring 341 | tilde 342 | macron 343 | cedilla 344 | ogonek 345 | 346 | name 347 | GF_Latin_Core 348 | 349 | 350 | 351 | -------------------------------------------------------------------------------- /sources/config.yaml: -------------------------------------------------------------------------------- 1 | buildStatic: true 2 | buildVariable: true 3 | buildTTF: true 4 | buildOTF: true 5 | buildWebfont: true 6 | sources: 7 | - HostGrotesk.glyphs 8 | - HostGrotesk-Italic.glyphs 9 | axisOrder: 10 | - wght 11 | familyName: Host Grotesk 12 | --------------------------------------------------------------------------------