PageSourceSearch

https://roaringapps.com/contact

html roaringapps.com collected 2026-09-24 09:33:51 UTC 23,201 bytes, 460 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en" ng-app="RoaringApps">
3  <head>
4    <meta charset="utf-8">
5    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
6    <meta name="viewport" content="width=device-width, initial-scale=1">
7    <meta name="description" content="Contact information for RoaringApps.">
8    <meta name="keywords" content="mac,macos,mac os x,mojave,catalina,big sur,monterey,apple silicon,arm macs,m1 macs,catalyst apps,32-bit apps,app,application,application compatibility,apple,roaringapps,mac app store,table,windows,ios,ios 14,ios 15">
9    
10    <title>
11      Contact — RoaringApps
12    </title>
13    
14    
15    
16    
17    <!-- Stylesheets -->
18    <link rel="stylesheet" href="/assets/css/site-2131.css">
19    
20    <!-- Webfonts -->
21    <link href='https://fonts.googleapis.com/css?family=Lato:100,400,700,100italic,400italic,700italic|Rancho|Merriweather+Sans:400,300,300italic,400italic,700,700italic|Cookie' rel='stylesheet' type='text/css'>
22    
23    <!--[if lt IE 9]>
24      
24<script src="/assets/js/ie8-responsive-file-warning.js"></script>
24
25    <![endif]-->
26    
27    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
28    <!--[if lt IE 9]>
29      
29<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
29
30      
30<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
30
31    <![endif]-->
32    
33    <!-- Favicons -->
34    <link rel="shortcut icon" href="/assets/ico/favicon.png">
35    <link rel="shortcut icon" href="/favicon.ico">
36    
37    <!-- Angular $location.html5Mode = true requires this -->
38    <base href="/">
vendor: 75 bytes, lines 38-40
38
39    
40      <script async src="https://www.googletagmanager.com/gtag/js?id=
40G-3G6DX7LY1W
vendor: 18 bytes, lines 40-41
40"></script>
41      
41<script>
42        
vendor: 158 bytes, lines 42-46
42window.dataLayer = window.dataLayer || [];
43        function gtag(){dataLayer.push(arguments);}
44        gtag('js', new Date());
45      
46        gtag('config', '
46G-3G6DX7LY1W
vendor: 10 bytes, lines 46-47
46');
47      
47</script>
47
48      
48<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
48
49      
49<script type="text/javascript">
50      (adsbygoogle = window.adsbygoogle || []).push({
51      google_ad_client: "ca-pub-4932023458712014",
52      enable_page_level_ads: true
53      });
54      </script>
54
55    
55<script src="/assets/js/vendor/modernizr.js" data-cfasync='true'></script>
55
56    
57    <!-- First input delay polyfill - used by Firebase Performance Monitoring.
58    Ref: https://firebase.google.com/docs/perf-mon/get-started-web
59    Ref2: https://github.com/GoogleChromeLabs/first-input-delay
60    -->
61    
61<script type="text/javascript">
62    !function(n,e){var t,o,i,c=[],f={passive:!0,capture:!0},r=new Date,a="pointerup",u="pointercancel";function p(n,c){t||(t=c,o=n,i=new Date,w(e),s())}function s(){o>=0&&o<i-r&&(c.forEach(function(n){n(o,t)}),c=[])}function l(t){if(t.cancelable){var o=(t.timeStamp>1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,o){function i(){p(t,o),r()}function c(){r()}function r(){e(a,i,f),e(u,c,f)}n(a,i,f),n(u,c,f)}(o,t):p(o,t)}}function w(n){["click","mousedown","keydown","touchstart","pointerdown"].forEach(function(e){n(e,l,f)})}w(n),self.perfMetrics=self.perfMetrics||{},self.perfMetrics.onFirstInputDelay=function(n){c.push(n),s()}}(addEventListener,removeEventListener);
63    </script>
63
64    
65    <!-- Sentry.io error monitoring -->
66    
66<script src="https://js.sentry-cdn.com/9bccfd17b53521da4d6c21b201931d8c.min.js" crossorigin="anonymous"></script>
66
67    
68      
68<script>
69        window.ENVIRONMENT = 'production';
70      </script>
70
71  </head>
72  <body class="{{bodyClass}}" ng-cloak>
73    <a class="sr-only" href="#content">Skip to main content</a>
74
75    <div class="wrapper">
76
77        <!-- Navigation component -->
78        <header class="navbar   navbar-fixed-top " role="banner" ng-controller="HeaderCtrl">
79          <div class="container">
80            
81            <div class="navbar-header">
82              <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse">
83                <span class="sr-only">Toggle navigation</span>
84                <svg class="icon">
85              <use xlink:href="/assets/svg/icons.svg#shape-chevron-down" />
86            </svg>
87              </button>
88              <a href="/" class="navbar-brand">RoaringApps</a>
89            </div>
90            
91            <nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation">
92              <ul class="nav navbar-nav navbar-centre">
93                <li> <a href="/apps">Apps</a> </li>
94                
95            <li class="dropdown main-dropdown">
96              <a href="#" class="dropdown-toggle" data-toggle="dropdown">Collections</a>
97              <ul class="dropdown-menu" role="menu">
98                <li><a href="/collections/list-of-apple-silicon-native-apps">Apps ready for Apple Silicon</a></li>
99                <li><a href="/collections/list-of-native-windows-arm-apps">Apps native on Windows ARM</a></li>
100                <li><a href="/collections/list-of-32-bit-macos-apps">macOS 32-bit apps</a></li>
101                <li><a href="/collections/discontinued-macos-ios-apps">Discontinued apps</a></li>
102                <li><a href="/app-collection/ios-carplay-apps">iOS CarPlay apps</a></li>
103                <li><a href="/app-collections">More collections...</a></li>
104              </ul>
105            </li>
106            
107                <li> <a href="/mac-app">Download</a> </li>
108                
109                <li> <a href="/about" class="hidden-sm">About</a> </li>
110                <li> <a href="/app/+">Add App</a> </li>
111              </ul>
112              <ul class="nav navbar-nav navbar-right">
113                <li> <a href="#" data-toggle="modal" data-target="#modal-search" class="with-icon">
114                  <span class="sr-only">Search applications</span>
115                  <svg class="icon fav-icon-outline">
116                <use xlink:href="/assets/svg/icons.svg#shape-magnifying-glass" />
117              </svg>
118                </a> </li>
119                <li class="hidden-sm"> <a href="#" data-toggle="modal" data-target="#modal-feedback">Feedback</a> </li>
120                
121                <li class="dropdown account-dropdown" ng-if="user">
122                  <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{user.username}}</a>
123                  <ul class="dropdown-menu pull-right" role="menu">
124                    <li><a href="/account">Account</a></li>
125                    <li><a href="/account/watching">Notifications</a></li>
126                
127                <li ng-if="user.role == 'admin'" class="divider"></li>
128                <li ng-if="user.role == 'admin'"><a href="/admin/dashboard">Admin dashboard</a></li>
129                <li ng-if="user.role == 'admin'"><a href="/admin/mac-app-stats">Mac app stats</a></li>
130                <li ng-if="user.role == 'admin'"><a href="/admin/comments">Comments review</a></li>
131                <li ng-if="user.role == 'admin'"><a href="/admin/screenshots">Screenshot review</a></li>
132                <li ng-if="user.role == 'admin'"><a href="/admin/tags">Tag manager</a></li>
133                <li ng-if="user.role == 'admin'"><a href="/admin/itunes-importer">iTunes Importer</a></li>
134                <li ng-if="user.role == 'admin'" class="divider"></li>
135                
136                    <li><a href="{{getLogoutUrl()}}" ng-click="logout($event)">Log out</a></li>
137                  </ul>
138                </li>
139                
140                <li ng-if="!user"> <a href="{{getRegisterUrl()}}" class="account-register">Register</a> </li>
141                <li ng-if="!user"> <a href="{{getLoginUrl()}}" class="account-signin">Sign in</a> </li>
142              </ul>
143            </nav>
144            
145          </div>
146        </header>
147        <section id="main">
148
149        <div class="container">
150	<div class="row">
151		<div class="col-xs-12 col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
152			<div class="page-header underline transparent">
153				<h1>Contact</h1>
154			</div>
155		</div>
156	</div>
157	
158	
159	<div class="row">
160		<div class="col-xs-12 col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
161			<div class="border-box">
162				<p>RoaringApps is maintained by Bryce Cameron.</p>
163<p>I’m always looking for feedback, so if you’ve come across a bug, have an idea or a feature you’d like to see, or just want to have a chat, you can email me at <a href="/cdn-cgi/l/email-protection#b0d8d5dcdcdff0c2dfd1c2d9ded
1637d1c0c0c39ed3dfdd"><span class="__cf_email__" data-cfemail="89e1ece5e5e6c9fbe6e8fbe0e7eee8f9f9faa7eae6e4">[email&#160;protected]</span></a>.</p>
164<p>If the social scene is more your thing, contact me on Mastodon <a href="https://mastodon.social/@roaringapps">@<span class="__cf_email__" data-cfemail="b8ead7d9cad1d6dff9c8c8cbf8d5d9cbccd7dcd7d696cbd7dbd1d9d4">[email&#160;protected]</span></a>.</p>
165<p>RoaringApps is a one-man operation - if you’ve found the website or Mac app useful, I’d love you to <a href="https://www.buymeacoffee.com/roaringapps?ref=racf" target="_blank">shout me a coffee</a> as a token of appreciation.</p>
166
167			</div>
168		</div>
169	</div>
170	
171</div>
172
173
174
175
176      </section>
177
178        <!-- Footer -->
179        <footer role="contentinfo">
180        	<div class="container">
181        		
182        		<div class="row">
183        			<div class="col-md-6">
184        				<p><i>⚒</i> by Bryce Cameron since 10.7. 
185        					
186        				<!-- <a class="bmc-button" target="_blank" href="https://www.buymeacoffee.com/roaringapps?ref=rawf" style="align-items: center;"><span>Buy me a coffee</span><img src="https://cdn.buymeacoffee.com/buttons/bmc-new-btn-logo.svg" alt="Buy me a coffee"></a> -->
187        				
188        				<a class="bmc-button" target="_blank" href="https://www.buymeacoffee.com/roaringapps">
189        					<img src="https://cdn.buymeacoffee.com/widget/assets/coffee%20cup.svg" alt="Support RoaringApps">
190        					<span>Buy me a coffee</span>
191        				</a>								
192        				</p>
193        			</div>
194        			<div class="col-md-6">
195        				<p class="pull-right"><a href="/">Home</a> &middot; <a href="/about">About</a> &middot; <a href="/newsletter/join">Newsletter</a> &middot; <a href="/help/contribute-to-roaringapps">Contribute</a> &middot; <a href="/contact">Contact</a> &middot; <a href="/account">Account</a> &middot; <a href="/legal">Legal</a></p>
196        			</div>
197        		</div> <!-- /.row -->
198        		
199        	</div>
200        </footer>
201        
202        <!-- 
202<script data-name="BMC-Widget" data-cfasync="false" src="https://cdnjs.buymeacoffee.com/1.0.0/widget.prod.min.js" data-id="roaringapps" data-description="Support me on Buy me a coffee!" data-message="" data-color="#FF5F5F" data-position="Right" data-x_margin="18" data-y_margin="18"></script>
202 -->
203    </div>
204
205    <!-- Modals -->
206    <section class="the-modals" ng-controller="ModalCtrl">
207    <!-- Sign In -->
208    <div class="modal fade narrow" id="modal-signin" tabindex="-1" role="dialog" aria-labelledby="modal-label-signin" aria-hidden="true">
209      <div class="modal-dialog">
210      	<p class="modal-outside-meta modal-msg" ng-if="signinModalMsg">{{signinModalMsg}}</p>
211        <div class="modal-content">
212          <div class="modal-body">
213          	
214          	<form id="form-signin" ng-submit="login.submit()">
215    	      	<div class="gravatar"></div>
216    	      	
217    	      	<input type="email" name="signin-email" ng-model="form.login.email" placeholder="Email address" />
218    	      	<input type="password" name="signin-password" ng-model="form.login.password" placeholder="Password" />
219    	      	
220    	      	<button class="btn btn-action" action="submit" name="signin-submit" ng-hide="login.submitting"><span>Sign in</span></button>
221    	      	<div class="btn btn-action modal-button-loader" ng-show="login.submitting">
222    	      		<div class="spinner spinner-three-dots faster">
223    	      			<div class="bounce1"></div>
224    	      			<div class="bounce2"></div>
225    	      			<div class="bounce3"></div>
226    	      		</div>
227    	      	</div>
228    	    </form>
229          </div>
230        </div> <!-- /.modal-content -->
231        <p class="modal-outside-meta"><a href="/account/forgot">Forgot?</a> <a class="pull-right" ng-href="{{getRegisterUrl()}}"><strong>Create an account</strong></a></p>
232      </div>
233    </div>
234    
235    <!-- Register / Create account -->
236    <div class="modal fade narrow" id="modal-register" tabindex="-1" role="dialog" aria-labelledby="modal-label-register" aria-hidden="true">
237      <div class="modal-dialog">
238        <div class="modal-content">
239          <div class="modal-body">
240          	
241          	<form id="form-register" ng-submit="register.submit()">
242    	      	<div class="gravatar"></div>
243    	      	
244    	      	<input type="email" name="register-email" ng-model="form.register.email" placeholder="Email address" />
245    	      	<input type="text" name="register-username" ng-model="form.register.username" placeholder="Username" />
246    	      	<input type="password" name="register-password" ng-model="form.register.password" placeholder="Password" />
247    	      	
248    	      	<button class="btn btn-action" action="submit" name="register-submit" ng-hide="register.submitting"><span>Create account</span></button>
249    	      	<div class="btn btn-action modal-button-loader" ng-show="register.submitting">
250          			<div class="spinner spinner-three-dots faster">
251          				<div class="bounce1"></div>
252          				<div class="bounce2"></div>
253          				<div class="bounce3"></div>
254          			</div>
255          		</div>
256    	    </form>
257          </div>
258        </div> <!-- /.modal-content -->
259         <p class="modal-outside-meta">{{register.errors.join(' ')}}</p>
260      </div>
261    </div>
262    
263    <!-- Search -->
264    <div class="modal fade search-modal" id="modal-search" tabindex="-1" role="dialog" aria-labelledby="modal-label-search" aria-hidden="true">
265      <div class="modal-dialog">
266        <div class="modal-content">
267          <div class="modal-body">
268          	
269          	<form id="form-search">	      	
270    	      	<input type="search" id="search-input" name="search" ng-model="form.search.query" placeholder="Search applications" autocomplete="off" />
271    	      	<span class="search-result-count" ng-show="search.results.length > 0">{{search.results.length}} apps</span>
272    	    </form>
273    	    
274    	    <p class="search-msg" ng-show="search.searching">Searching...</p>
275    	    <p class="search-msg" ng-show="search.empty">No results</p>
276    	    
277    	    <ul class="search-results">
278    	    	<li class="result" ng-repeat="app in search.results | orderBy:'-_searchRank'">
279    	    		<a href="/app/{{app.slug}}">
280    	    			<img ng-src="{{app.icon}}" alt="{{app.icon ? app.name + ' icon' : 'No icon'}}" class="{{app.icon ? 'search-result-has-icon' : 'search-result-no-icon'}}" onerror="this.style.display='none'" />
281    	    			<strong>{{app.name}}</strong>
282    	    			<span class="dev">{{app.developer}}</span>
283    	    		</a>
284    	    	</li>
285    	    </ul>
286    	    
287          </div>
288        </div> <!-- /.modal-content -->
289         <p class="modal-outside-meta">{{register.errors.join(' ')}}</p>
290      </div>
291    </div>
292    
293    <!-- Moderate -->
294    <div class="modal fade" id="modal-moderate" tabindex="-1" role="dialog" aria-labelledby="modal-label-moderate" aria-hidden="true">
295      <div class="modal-dialog">
296        <div class="modal-content">
297          <div class="modal-header">
298          	<h4>Moderator control panel</h4>
299          </div>
300          <div class="modal-body">
301          	
302          	<form id="form-moderate">
303          		<div class="row">
304          			<div class="col-xs-12 col-sm-6">
305          				<div class="form-group">
306      						<label for="moderate-app-name">Application</label>
307      						<input type="text" name="moderate-app-name" id="moderate-app-name" ng-model="selectedApp.name" disabled />
308      					</div>
309          			</div>	
310          			<div class="col-xs-12 col-sm-6">
311      					<div class="form-group">
312    						<label for="moderate-app-slug">Slug</label>
313    						<input type="text" name="moderate-app-slug" id="moderate-app-slug" ng-model="selectedApp.slug" disabled />
314    					</div>
315      				</div>
316      				<div class="col-xs-12 col-sm-6">
317    					<div class="form-group">
318    						<label for="moderate-app-developer">Developer</label>
319    						<input type="text" name="moderate-app-developer" id="moderate-app-developer" ng-model="selectedApp.developer" disabled />
320    					</div>
321    				</div>	
322    				<div class="col-xs-12 col-sm-6">
323    					<div class="form-group">
324    						<label for="moderate-app-url">URL</label>
325    						<input type="text" name="moderate-app-url" id="moderate-app-url" ng-model="selectedApp.url" disabled />
326    					</div>
327    				</div>	   
328      			</div>   	
329      			
330      			<div class="form-group">
331    				<p ng-if="!selectedApp.statuses">This application has no status reports.</p>
332    			</div>
333    	      	
334    	      	
335          		
336      			
337      			<div class="form-group">
338      				<button class="btn btn-outline btn-danger" ng-click="moderate.delete(selectedApp.slug)">Delete app</button>
339      				<button class="btn btn-outline" ng-click="moderate.merge.chooseTo(selectedApp.slug)">Merge with...</button>
340    					<button class="btn btn-outline" ng-click="moderate.appCollection.add(selectedApp.slug)">Add to collection...</button>
341      				<button class="btn btn-outline">Update</button>
342      			</div>
343    	    </form>
344    	    
345    	    
346          </div>
347        </div> <!-- /.modal-content -->
348         <p class="modal-outside-meta">For use only by approved RoaringApps moderators.</p>
349      </div>
350    </div>
351    
352    <!-- Feedback -->
353    <div class="modal fade" id="modal-feedback" tabindex="-1" role="dialog" aria-labelledby="modal-label-feedback" aria-hidden="true">
354      <div class="modal-dialog">
355        <div class="modal-content">
356          <div class="modal-header">
357          	<h4>Submit Feedback</h4>
358          </div>
359          <div class="modal-body">
360          	<p>I develop RoaringApps in my (rather limited) spare time, so sometimes I miss bugs here and there. If you notice something not quite working properly, or have an idea for the site, I'd love to hear from you.</p>
361          	<form id="form-feedback" name="feedbackForm" ng-submit="feedback.submit(feedbackForm.$valid)" novalidate>	    <!-- novalidate disables HTML5 validation, so we can use the angular val
361idation -->   	
362    	      	<div class="row">
363    		      	<div class="col-xs-12 col-sm-6">
364    			      	<div class="form-group">
365    			      		<label for="feedback-name">Name</label>
366    			      		<input type="text" name="feedback-name" id="feedback-name" ng-model="form.feedback.name" required />
367    			      	</div>
368    		      	</div>
369    		      	<div class="col-xs-12 col-sm-6">
370    			      	<div class="form-group">
371    		      			<label for="feedback-email">Email (optional)</label>
372    		      			<input type="email" name="feedback-email" id="feedback-email" ng-model="form.feedback.email" />
373    		      		</div>
374    		      	</div>
375    		      </div>
376    			<div class="form-group" style="position: absolute; left: -5000px;" aria-hidden="true">
377    				  <label for="feedback-website">Website</label>
378    				  <input type="text" name="feedback-website" id="feedback-website" ng-model="form.feedback.website" tabindex="-1" autocomplete="off" />
379    			</div>
380          		<div class="form-group">
381          			<label for="feedback-comment">Comment</label>
382          			<textarea id="feedback-comment" ng-model="form.feedback.comment" required></textarea>
383          		</div>
384          		<div class="form-group form-action-area">
385          			<input type="submit" value="Send feedback" class="btn btn-outline" ng-disabled="feedbackForm.$invalid" />
386          		</div>
387          		<div class="form-group">
388          			<p class="msg error" ng-if="feedback.errorMsg">{{feedback.errorMsg}}</p>
389          			<p class="msg success" ng-if="feedback.successMsg">{{feedback.successMsg}}</p>
390          		</div>
391    	    </form>
392    	    
393    	    
394          </div>
395        </div> <!-- /.modal-content -->
396      </div>
397    </div>
398    
399    <!-- Report comment -->
400    <div class="modal fade" id="modal-report-comment" tabindex="-1" role="dialog" aria-labelledby="modal-label-report-comment" aria-hidden="true">
401      <div class="modal-dialog">
402        <div class="modal-content">
403          <div class="modal-header">
404          	<h4>Report comment</h4>
405          </div>
406          <div class="modal-body">
407          	<p>Report this comment to help the moderators identify items that require attention.</p>
408          	<form id="form-report-comment" name="reportCommentForm" ng-submit="reportComment.submit(reportCommentForm.$valid)" novalidate>	    
409    					<!-- novalidate disables HTML5 validation, so we can use the angular validation -->   	
410    	      	<div class="row">
411    		      	<div class="col-xs-12">
412    			      	<div class="form-group">
413    			      		<label for="report-comment-reason">Reason</label>
414    								<select name="report-comment-reason" id="report-comment-reason" ng-model="form.reportComment.reason" required>
415    									<option>Invalid advice</option>
416    									<option>Illegal/inappropriate</option>
417    									<option>Off-topic</option>
418    									<option>Personal attack</option>
419    									<option>Spam</option>
420    									<option>Other</option>
421    								</select>
422    			      	</div>
423    		      	</div>
424    		      	<div class="col-xs-12">
425    			      	<div class="form-group">
426    			      		<label for="report-comment-description">Description (optional)</label>
427    			      		<textarea id="report-comment-description" ng-model="form.reportComment.description"></textarea>
428    			      	</div>
429    		      </div>
430          		
431    					<div class="col-xs-12">
432    	      		<div class="form-group form-action-area">
433    	      			<input type="submit" value="Submit report" class="btn btn-outline" ng-disabled="reportCommentForm.$invalid" />
434    	      		</div>
435    	      		<div class="form-group">
436    	      			<p class="msg error" ng-if="reportComment.errorMsg">{{reportComment.errorMsg}}</p>
437    	      			<p class="msg success" ng-if="reportComment.successMsg">{{reportComment.successMsg}}</p>
438    	      		</div>
439    					</div>
440    				</div> <!-- /.row -->
441    				
442    	    </form>
443    	    
444    	    
445          </div>
446        </div> <!-- /.modal-content -->
447      </div>
448    </div> <!-- /.modal (report comment) -->
449    				
450    
451    </section>
452    <!-- JS and analytics only. -->
vendor: 119 bytes, lines 452-454
452
453    
454    	<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
454<script src="/assets/js/production-2131.js"></script>
454
455    
456      
456<script>
457    	if(typeof lucide !== undefined) lucide.createIcons();
458      </script>
458  
458<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":"cf8706b74b324e67b083263fb22c492a","r":1,"spa":2}' crossorigin="anonymous"></script>
458
459</body>
460</html>

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.