1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8" /> 5 <title>Daring Fireball: Hacking the iPhone Notes App for the Admittedly Nit-Picky Purpose of Changing the Text Font to Helvetica</title> 6 7 <link rel="apple-touch-icon-precomposed" href="/graphics/apple-touch-icon.png" /> 8 <link rel="shortcut icon" href="/graphics/favicon.ico?v=005" /> 9 <link rel="mask-icon" href="/graphics/dfstar.svg" color="#4a525a"> 10 <link rel="stylesheet" type="text/css" media="screen" href="/css/fireball_screen.css?v1.2026-08-25" /> 11 <link rel="stylesheet" type="text/css" media="screen" href="/css/ie_sucks.php" /> 12 <link rel="stylesheet" type="text/css" media="print" href="/css/fireball_print.css?v01" /> 13 <link rel="alternate" type="application/atom+xml" href="/feeds/main" /> 14 <link rel="alternate" type="application/json" href="/feeds/json" /> 15 <link rel="me" href="https://mastodon.social/@gruber" /> 16 <link rel="me" href="https://mastodon.social/@daringfireball" /> 17
17<script src="/js/js-global/FancyZoom.js"></script>
17 18
18<script src="/js/js-global/FancyZoomHTML.js"></script>
18 19 <link rel="home" href="/" title="Home" /> 20 <link rel="prev" href="https://daringfireball.net/2007/09/this_late_than_never" title="Actually, Not Much Better at All This Late Than Never" /> 21 <link rel="next" href="https://daringfireball.net/2007/09/amazon_mp3_downloader" title="The Amazon MP3 Store and Amazon MP3 Downloader" /> 22 <!-- Twitter Card bullshit --> 23 <meta name="twitter:card" content="summary" /> 24 <meta name="twitter:site" content="@daringfireball" /> 25 <meta name="twitter:creator" content="@gruber" /> 26 <meta name="twitter:title" content="Hacking the iPhone Notes App for the Admittedly Nit-Picky Purpose of Changing the Text Font to Helvetica" /> 27 <meta name="twitter:description" content="How to hack the iPhone Notes app to use Helvetica as the text font." /> 28 <meta name="twitter:image" content="https://daringfireball.net/graphics/df-wide-card.png" /> 29 <!-- Facebook Open Graph bullshit --> 30 <meta property="og:title" content="Hacking the iPhone Notes App for the Admittedly Nit-Picky Purpose of Changing the Text Font to Helvetica" /> 31 <meta property="og:type" content="article" /> 32 <meta property="og:url" content="https://daringfireball.net/2007/09/hacking_the_iphone_notes_app" /> 33 <meta property="og:image" content="https://daringfireball.net/graphics/df-wide-card.png" /> 34 <meta property="og:site_name" content="Daring Fireball" /> 35 <meta property="og:description" content="How to hack the iPhone Notes app to use Helvetica as the text font." /> 36 37 <!-- Short URL: http://df4.us/6nv --> 38</head> 39 40<body onload="setupZoom()"> 41<div id="Box"> 42<div id="Banner"> 43<a href="/" title="Daring Fireball: Home"><img src="/graphics/logos/" alt="Daring Fireball" height="56" /></a> 44</div> 45<div id="Sidebar"> 46<p>By <strong>John Gruber</strong></p> 47 48<ul><!--★--> 49<li><a href="/archive/" title="Previous articles.">Archive</a></li><li>
49<script> 50// <![CDATA[ 51function ReadCookie(name) { 52 var nameEQ = name + "="; 53 var ca = document.cookie.split(';'); 54 for(var i=0; i < ca.length; i++) { 55 var c = ca[i]; 56 while (c.charAt(0)==' ') c = c.substring(1, c.length); 57 if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); 58 } 59 return null; 60} 61var display_linked_list = ReadCookie('displayLinkedList'); 62var li_linked = '<a href="/linked/" title="The Linked List.">Linked List<\/a>'; 63if (display_linked_list == "hide") { 64 // Linked List is off on home page, so show it in menu: 65 document.write(li_linked + "<\/li>\n<li>"); 66} 67else { 68 // Default to not putting separate LL item in sidebar: 69} 70// ]]> 71</script>
71</li> 72<li><a href="/thetalkshow/" title="Americaâs favorite 3-star podcast.">The Talk Show</a></li> 73<li><a href="https://dithering.fm/" title="Two episodes per week, 15 minutes per episode. Not a minute less, not a minute more.">Dithering</a></li> 74<li><a href="/projects/" title="Software projects, including SmartyPants and Markdown.">Projects</a></li> 75<li><a href="/contact/" title="How to send email or feedback regarding Daring Fireball.">Contact</a></li> 76<li><a href="/colophon/" title="About this site and the tools used to produce it.">Colophon</a></li> 77<li><a href="/feeds/">Feedsâ/âSocial</a></li> 78<!-- 79<li><a href="https://twitter.com/daringfireball">Twitter</a></li> 80 --> 81<li><a href="/feeds/sponsors/">Sponsorship</a></li> 82</ul> 83 84<div id="SidebarMartini"> 85<a href="https://workos.com/guide/the-developers-guide-to-sso?utm_source=daringfireball&utm_medium=newsletter&utm_campaign=q32026"> 86 <img alt="WorkOS" src="/martini/images/workos.png" height="90"> 87</a> 88<p><a href="https://workos.com/guide/the-developers-guide-to-sso?utm_source=daringfireball&utm_medium=newsletter&utm_campaign=q32026">WorkOS</a>: How SSO works and the fastest way to add it.</p> 89</div> 90 91</div> <!-- Sidebar --> 92 93<div id="Main"> 94 95<div class="article"> 96<h1>Hacking the iPhone Notes App for the Admittedly Nit-Picky Purpose of Changing the Text Font to Helvetica</h1> 97<h6 class="dateline">Tuesday, 25 September 2007</h6> 98 99<p>Lots of good reader feedback regarding last weeksâs â<a href="http://daringfireball.net/2007/09/marker_felt_iphone">An Important Public Service Announcement Regarding Marker Felt on the iPhone</a>â, the gist of which piece was that if you poked around your iPhoneâs file system (after installing, say, an SSH server on the iPhone) and deleted the Marker Felt font files from <em>/System/Library/Fonts/</em>, the Notes app would use Arial instead.</p> 100 101<p>Thatâs good. But, far from ideal, because everyone knows <a href="https://www.marksimonson.com/notebook/view/the-scourge-of-arial/">Arial is an inferior knock-off of Helvetica</a>. One suggestion offered by many readers was to simply make copies of the Helvetica font files, rename them to match the Marker Felt font files, and replace Marker Felt with the Helvetica-with-a-different-file-name files. That doesnât work, because font names are metadata contained within the files themselves; they donât come from the file names. (Sort of like with music files in iTunesâââthe name of the MP3 or AAC file itself doesnât matter, what matters for determining song, album, and artist names is the metadata.)</p> 102 103<p>But so while simply renaming the font files wonât work, you <em>could</em> use font editing software to manipulate the font metadata itself, either by taking a copy of Helvetica and replacing the internal metadata to match Marker Feltâs, or, by taking a copy of Marker Felt and replacing all the glyphs with copies of the glyphs from Helvetica. A few readers even said this worked. The two font editing tools most-frequently recommended by readers: <a href="http://fontforge.sourceforge.net/">FontForge</a>, an open source X11 application that, while ugly and ungraceful in the way that all X11 apps are, is useful and free; and <a href="http://www.fontlab.com/font-editor/typetool/">TypeTool</a>, a cross-platform $99 font editor from FontLab.</p> 104 105<p>That seemed like overkill to me, though. I just wanted Notes to use Helvetica. So, rather than hacking the fonts, why not hack the Notes app? This turned out to be rather easy. It ends up the CSS rules specifying the styles used for the Notes editing view are hard-coded in the application binary. The Notes application bundle is at <em>/Applications/MobileNotes.app/</em>; inside the bundle, among other files, is a file named <em>MobileNotes</em>. Thatâs the application binary itselfâââthe program file generated by the compiler from Appleâs Objective-C source code for the app.</p> 106 107<p>I canât recommend doing this. <a href="http://en.wikipedia.org/wiki/Binary_file">Binary files</a> are fragile; make a mistake while editing and itâs likely, <em>very likely</em>, the application will no longer work properly. Plus, any changes you make to MobileNotes today are going to be over
107written before the end of the week, as Apple has already indicated that the next iPhone software update is imminent.</p> 108 109<p>On the other hand, if you have the urge to hack around on your iPhone, you might as well do so now, as I strongly suspect that this weekâs imminent iPhone software update is going to render inoperable the existing ways of hacking/jailbreaking the iPhone. Notice how no oneâs yet figured out how to install or modify the software on the iPod Touch? Whatever Appleâs doing on the Touch in this regard, I expect them to begin doing on the iPhone this week. (Iâd love to be proven wrong.)</p> 110 111<p>So, anyway, how to hack your MobileNotes binary to use Helvetica:</p> 112 113<p>Transfer a copy of the MobileNotes app binary from your iPhone to your Mac and open it with <a href="http://ridiculousfish.com/hexfiend/">Hex Fiend</a>, or whatever your favorite hex editor is. (But if your favorite hex editor isnât Hex Fiend, there might be something wrong with you. And if you donât know how to transfer a copy of the binary to your Mac, you shouldnât be attempting this hack in the first place.) Search for âMarker Feltâ. You should find a sequence of bytes that look like this:</p> 114 115<pre><code>font-family: Marker Felt; 116</code></pre> 117 118<p>Change that to:</p> 119 120<pre><code>font-family: Helvetica ; 121</code></pre> 122 123<p><strong>Essential:</strong> You must type two spaces after âHelveticaâ, so that the font name occupies the exact same number of bytes as âMarker Feltâ (where each character, including spaces, is one byte). Itâs regular CSS, so itâs perfectly valid to have spaces between the font name and the rule-ending semicolon. This hack wouldnât work if Helveticaâs name were longer than Marker Feltâs.</p> 124 125<p>Save the file, then copy it back to your iPhone, overwriting the original MobileNotes binary. Restart your iPhone, and there you go, Helvetica in Notes:</p> 126 127<p><img 128 src = "/misc/2007/09/mobilenotes-helvetica.jpg" 129 alt = "Screenshot of iPhone Notes app displaying Helvetica as the text font." 130/></p> 131 132 133 134<div id="PreviousNext"> 135<table> 136<tr valign="top"><td align="right"><strong>Previous:</strong></td><td><a href="https://daringfireball.net/2007/09/this_late_than_never">Actually, Not Much Better at All This Late Than Never</a></td></tr> 137<tr valign="top"><td align="right"><strong>Next:</strong></td><td><a href="https://daringfireball.net/2007/09/amazon_mp3_downloader">The Amazon MP3 Store and Amazon MP3 Downloader</a></td></tr> 138</table> 139</div> <!-- PreviousNext --> 140</div> <!-- article --> 141 142<div id="Footer"> 143<form id="SiteSearch" action="https://daringfireball.net/search" method="get" style="margin-bottom: 2.5em;"> 144<div> 145<input name="q" type="text" value="" style="margin-right: 8px; width: 66%;" /> 146<input type="submit" value="Search" /> 147</div> 148</form> 149 150<p class="smallprint"> 151<a href="/preferences/" title="Customize the font size and presentation options for this web site.">Display Preferences</a> 152<br /><br /> 153Copyright © 2002â2026 The Daring Fireball Company LLC. 154</p> 155</div> 156 157 158<!-- Google Analytics --> 159 160<!--
161<script type="text/javascript"> 162 var _gaq = _gaq || []; 163 _gaq.push(['_setAccount', 'UA-593949-1']); 164 _gaq.push (['_gat._anonymizeIp']); 165 _gaq.push(['_trackPageview']); 166 (function() { 167 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; 168 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 169 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); 170 })(); 171</script>
171 172 --> 173 174<!-- Asynchronously load Mint --> 175<!-- No, screw mint
176<script type="text/javascript"> 177(function () { 178 var ma = document.createElement('script'); 179 ma.type = 'text/javascript'; 180 ma.src = '/mint/?js'; 181 ma.async = true; 182 var s = document.getElementsByTagName('script')[0]; 183 s.parentNode.insertBefore(ma, s); 184})(); 185</script>
185 186--> 187</div> <!-- Main --> 188 189</div> <!-- box -->
190<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a439482748f02af4',t:'MTc5MDgzNDc5MQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
190<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"d5bbc0b4e8ae452eba45dc9b72931665","spa":2}' crossorigin="anonymous"></script>
190 191</body> 192</html> 193<!-- 0.0009 seconds -->
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.