{"id":647,"date":"2026-04-14T02:17:29","date_gmt":"2026-04-14T02:17:29","guid":{"rendered":"https:\/\/www.glyphrstudio.com\/blog\/?p=647"},"modified":"2026-04-14T02:17:29","modified_gmt":"2026-04-14T02:17:29","slug":"sweet-16-and-a-look-at-the-future-of-glyphr-studio","status":"publish","type":"post","link":"https:\/\/www.glyphrstudio.com\/blog\/2026\/04\/14\/sweet-16-and-a-look-at-the-future-of-glyphr-studio\/","title":{"rendered":"Sweet 16, and a look at the future of Glyphr Studio"},"content":{"rendered":"\n<p>Back in March Glyphr Studio turned 16 years old. That&#8217;s a huge amount of time to spend on this journey of trying to make font design more accessible to everyone! And it comes at an opportune time as well &#8211; we&#8217;re seeing big changes in the world of software. Yup, that&#8217;s right, I&#8217;m talking about AI&#8230; but not in the way you might expect.<\/p>\n\n\n\n<p>From the beginning, Glyphr Studio was about more than just making a font editor. Personally, I used it as an excuse to learn new technologies and try out different interaction design ideas. Around 2010, it was playing around with HTML5 Canvas, which is now the centerpiece of the app. When v1 turned to v2, all the controls got turned into Web Components. Those were all side quests along the ultimate path of building a font editor. It would have been easy to take a different path: cobble together a tech stack, between OpenType.js, Paper.js, and something like React for the front end&#8230; you could make a typeface design app pretty easily. <\/p>\n\n\n\n<p>But what did I do instead of that? Write everything myself (or as close as possible). I know it&#8217;s cliche, but it&#8217;s as much about the journey of making an app as it is about the destination. I want a font editor, but I also want to build a font editor.<\/p>\n\n\n\n<p>With the advent of agents that can help anyone vibe code anything they want, it might be tempting to just start giving control of Glyphr Studio over to AIs writing features. It would probably be faster &#8211; and honestly, it would probably be higher quality as well. But, I&#8217;m here to say that the human-typed DIY stubborn attitude we&#8217;ve taking for the past 16 years is going to continue. Glyphr Studio will continue to be hand-coded.<\/p>\n\n\n\n<p>But there is also a kind of gray area here. We&#8217;ve relied on 3rd party libraries to do a lot of work. We did use Paper.js to do boolean shape combine actions. And, of course, OpenType.js to do all the importing and exporting. In the case of Paper.js, we were literally using a huge library just for one small function. And, OpenType.js is fantastic, but it&#8217;s development has tapered off over the past few years, and we&#8217;re still left without some of the cool new features (like variable font support). And this is where some vibe-coding can come in handy!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Version 2.9 &#8211; removing dependencies!<\/h3>\n\n\n\n<p>v2.9.0 already shipped, and it was a small trial run for removing external dependencies. I started a workspace for both implementing and testing a Path Combine library. It&#8217;s relatively small, but has a very focused purpose: accept any set of closed Bezier paths, and using some operation like Unite or Subtract, return a resulting set of paths. It is technically separate from other Glyphr Studio functions, so it lives it&#8217;s life as an NPM library: <a href=\"https:\/\/www.npmjs.com\/package\/bezier-boolean\">https:\/\/www.npmjs.com\/package\/bezier-boolean<\/a>. This is similar to the approach we took for the SVG-to-Bezier library that we&#8217;ve been working on for many years. It&#8217;s a core piece of Glyphr Studio, but can be used independently.<\/p>\n\n\n\n<p>So, v2.9.1 is already shipped and (so far) seems to be working better than Paper.js. Cool. The next big thing we&#8217;ve been working on is replacing OpenType.js &#8211; all that has to do is be able to read and write OTF, TTF, and hopefully WOFF\/WOFF2 from binary to JSON and back. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Introducing Font Flux JS<\/h3>\n\n\n\n<p>The great thing about building your own library is that it can be custom fit to your need. OpenType.js was really impressive, and got us through many years. But, in terms of the API there were always a few things that could have been more streamlined. <\/p>\n\n\n\n<p>Over the past few months I&#8217;ve essentially paused new feature development for Glyphr Studio, and focused on building a new thing called Font Flux JS. It can be used as a stand-alone library, but it&#8217;s purpose is to be the new foundation for Glyphr Studio reading and writing font files. It already has support for <em>every single<\/em> data table in both OTF and TTF &#8211; both reading and writing. And it has a lot of handy features that make it easy if, say, you wanted to create a font from scratch when all you have is a bunch of JSON data.<\/p>\n\n\n\n<p>Pretty soon I&#8217;ll be releasing a version of Glyphr Studio based on Font Flux JS. But for now, you can try it out. It&#8217;s an NPM library, but I also created a simple Demo App that let&#8217;s you edit metadata, subset characters, view any table data, and also diagnose and fix corrupted font files.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"483\" height=\"109\" src=\"https:\/\/www.glyphrstudio.com\/blog\/wp-content\/uploads\/2026\/04\/image.png\" alt=\"\" class=\"wp-image-649\" style=\"width:186px;height:auto\" srcset=\"https:\/\/www.glyphrstudio.com\/blog\/wp-content\/uploads\/2026\/04\/image.png 483w, https:\/\/www.glyphrstudio.com\/blog\/wp-content\/uploads\/2026\/04\/image-300x68.png 300w\" sizes=\"auto, (max-width: 483px) 100vw, 483px\" \/><\/figure>\n\n\n\n<p>Demo Site: <a href=\"https:\/\/www.glyphrstudio.com\/fontfluxjs\/\">https:\/\/www.glyphrstudio.com\/fontfluxjs\/<\/a><\/p>\n\n\n\n<p>Documentation: <a href=\"https:\/\/www.glyphrstudio.com\/fontfluxjs\/docs\/\">https:\/\/www.glyphrstudio.com\/fontfluxjs\/docs\/<\/a><\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/mattlag\/Font-Flux-JS\">https:\/\/github.com\/mattlag\/Font-Flux-JS<\/a><\/p>\n\n\n\n<p>NPM: <a href=\"https:\/\/www.npmjs.com\/package\/font-flux-js\">https:\/\/www.npmjs.com\/package\/font-flux-js<\/a><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">So, what then?<\/h3>\n\n\n\n<p>The first release of Font-Flux-JS-based-Glyphr-Studio will (hopefully) be transparent to end-users. It will just replace OpenType.js in terms of reading and writing font files.<\/p>\n\n\n\n<p>But, the exciting thing will be adding new UI features to Glyphr Studio to catch up with everything Font Flux JS can do. Very quickly we&#8217;ll add support for WOFF and WOFF2. After that, I&#8217;m thinking about spending some time to add Variable Font capability. Maybe Color Font features as well. Contextual alternates? Whatever folks want, I&#8217;ll probably do a poll.<\/p>\n\n\n\n<p>I also have a crazy idea of vibe-coding a whole new front end for Glyphr Studio, but still using the v2 file structure. So, it wouldn&#8217;t really be a new version, just a different UI on top of the current version. GLYPHR STUDIO 2000. Who knows, sky&#8217;s the limit.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">As always, thank <em>you<\/em><\/h2>\n\n\n\n<p>Glyphr Studio is kind of an epic solo project, but I really do enjoy answering questions and solving problems that I&#8217;ve somehow created for us all. If you have any feedback, you can find me on socials, or mail@glyphrstudio.com<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u270c\ufe0f<\/h2>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>After 1.6 decades of development, will Glyphr Studio succumb to vibe-coding AI bots? Definitely not! And also, Kind of!<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,3,12],"tags":[],"class_list":["post-647","post","type-post","status-publish","format-standard","hentry","category-release","category-retrospective","category-version-2"],"_links":{"self":[{"href":"https:\/\/www.glyphrstudio.com\/blog\/wp-json\/wp\/v2\/posts\/647","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.glyphrstudio.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glyphrstudio.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glyphrstudio.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glyphrstudio.com\/blog\/wp-json\/wp\/v2\/comments?post=647"}],"version-history":[{"count":2,"href":"https:\/\/www.glyphrstudio.com\/blog\/wp-json\/wp\/v2\/posts\/647\/revisions"}],"predecessor-version":[{"id":650,"href":"https:\/\/www.glyphrstudio.com\/blog\/wp-json\/wp\/v2\/posts\/647\/revisions\/650"}],"wp:attachment":[{"href":"https:\/\/www.glyphrstudio.com\/blog\/wp-json\/wp\/v2\/media?parent=647"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glyphrstudio.com\/blog\/wp-json\/wp\/v2\/categories?post=647"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glyphrstudio.com\/blog\/wp-json\/wp\/v2\/tags?post=647"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}