PageSourceSearch

https://daringfireball.net/2007/09/hacking_the_iphone_notes_app

html daringfireball.net collected 2026-10-01 06:06:31 UTC 13,333 bytes, 193 lines download raw bytes

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&nbsp;Gruber</strong></p>
47
48<ul><!--&#9733;-->
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 &copy; 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.