<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="en">
	<title>Jono Cooper</title>
	<subtitle>Jono Cooper is a product engineer based in Tāmaki Makaurau. He has a passion for delivering best-in-class products, from vision to execution.</subtitle>
	<link href="https://jono.nz/feed/feed.xml" rel="self"/>
	<link href="https://jono.nz/"/>
	<updated>2026-03-20T09:00:00Z</updated>
	<id>https://jono.nz</id>
	<author>
		<name>Jono Cooper</name>
		<email>jono@jono.nz</email>
	</author>
	
	<entry>
		<title>Building the Apple Maps drawer with CSS</title>
		<link href="https://jono.nz/2026/03/20/apple-drawer-ui/"/>
		<updated>2026-03-20T09:00:00Z</updated>
		<id>https://jono.nz/2026/03/20/apple-drawer-ui/</id>
		<content type="html">&lt;style&gt;
  iframe {
    width: 100%;
    max-width: 300px;
    height: 450px;
  }
&lt;/style&gt;
&lt;p&gt;I’ve always really liked how Apple Maps works on iPhone. There’s a persistent drawer on the screen that allows you to toggle between the map, place information, or view both at the same time. It’s a really good multitasking user experience, and this same pattern is used in a few other iOS apps such as Music &amp;amp; Find My.&lt;/p&gt;
&lt;p&gt;While Google Maps also ships something similar, it’s not as consistent as Apple’s implementation. In Google Maps, the drawer design changes depending on what you tap on, and the app loses its place if you move the map. It’s almost like you can feel the many different teams working on Google Maps and they’ve all implemented their UI slightly differently.&lt;/p&gt;
&lt;p&gt;I’ve implemented &lt;a href=&quot;https://jono.nz/2019/09/04/dymajo-new-route-map/&quot;&gt;something similar in the past in Waka&lt;/a&gt;, but it was quite complicated due to fewer CSS features available at the time. It used a lot of JavaScript to handle gestures and animations, but today we can build the same thing without almost no JS at all.&lt;/p&gt;
&lt;h2 id=&quot;how-does-the-drawer-ui-work&quot; tabindex=&quot;-1&quot;&gt;How does the Drawer UI work? &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/03/20/apple-drawer-ui/#how-does-the-drawer-ui-work&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Note: I’m using pre iOS 26 screenshots, as they demonstrate these states better.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The drawer has three primary states. The first state is when the drawer is fully collapsed. The map can be interacted with, and only the header of the drawer is visible. You can drag the drawer header to move to one of the other states.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/S07N7lzK8y-1600.avif 1600w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/S07N7lzK8y-1600.webp 1600w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/S07N7lzK8y-1600.png&quot; alt=&quot;Apple Maps UI States on iOS 18&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;1120&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The second state is when both the map &amp;amp; drawer are visible. Both the map and drawer content can be interacted with. However, scrolling the drawer content will move the entire drawer to either the fully expanded or fully collapsed state.&lt;/p&gt;
&lt;p&gt;The final state is a fully visible drawer, with only a small portion of the map visible and not intractable. When scrolling the drawer content, the header stays sticky so the drawer can be collapsed without scrolling to the top. Scrolling past the top of the drawer content will close the drawer.&lt;/p&gt;
&lt;p&gt;Back &amp;amp; forward navigation is also represented through animation. Navigating forward to a new page triggers a new drawer to transition in from the bottom of the screen covering the existing drawer. Navigating back runs the animation in reverse, while in-place navigation does not trigger an animation.&lt;/p&gt;
&lt;h2 id=&quot;1-using-css-scroll-snap-to-create-a-drawer&quot; tabindex=&quot;-1&quot;&gt;1. Using CSS scroll snap to create a drawer &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/03/20/apple-drawer-ui/#1-using-css-scroll-snap-to-create-a-drawer&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, we’ll start with some HTML. We define an area for the map, the drawer header &amp;amp; content, and a few elements to wrap things all together.&lt;/p&gt;
&lt;p&gt;To keep things simple for this example, we’ll just use a scrollable image to substitute for our map, rather than bringing in Mapbox or a similar library.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;screen-top&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;section&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main-wrapper&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main-content&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        Your map or other content
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;section&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;drawer&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;header&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;drawer-header&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;East West Line&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Manukau to Swanson&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;section&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;drawer-wrapper&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;      
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;drawer-content&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
          The East West line runs every 7 minutes during peak times, and at 15 minute intervals all other times.
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;section&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To get this started, we set snapping to be mandatory on the &lt;code&gt;html&lt;/code&gt; element, and define three different snap points.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;On our &lt;code&gt;.screen-top&lt;/code&gt; element. This is at the very top of the screen, so our drawer will be completely collapsed (&lt;code&gt;--collapsed-height&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;On the &lt;code&gt;.drawer-header&lt;/code&gt;. This has &lt;code&gt;scroll-margin-top&lt;/code&gt; set, so it snaps &lt;code&gt;18rem&lt;/code&gt; from the bottom of the screen.&lt;/li&gt;
&lt;li&gt;On the &lt;code&gt;.drawer-wrapper&lt;/code&gt;. This is our fully expanded view, with the drawer header at the top of the screen. We need to use &lt;code&gt;scroll-margin-top&lt;/code&gt; again to account for the header.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;scroll-snap-type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; y mandatory&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--screen-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100svh&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--drawer-top-margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--drawer-midpoint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 18rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--collapsed-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.screen-top&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;scroll-snap-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; start&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.main-wrapper&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* we don&#39;t want the map to move when the drawer is moved up/down */&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; sticky&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--screen-height&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.drawer&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; relative&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.drawer-header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;scroll-snap-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; start&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;scroll-snap-stop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; always&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;scroll-margin-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--screen-height&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; - &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--drawer-midpoint&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/* we overlay the drawer on the map, so we can use border-radius */&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--collapsed-height&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; * -1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--collapsed-height&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.drawer-wrapper&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;scroll-snap-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; start&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;scroll-snap-stop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; always&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;scroll-margin-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--collapsed-height&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Putting it all together (and with a few extra visual styles), we end up with something that looks like this. It is starting to take shape!&lt;/p&gt;
&lt;iframe src=&quot;https://jono.nz/files/appledrawerui/example1.html&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href=&quot;https://jono.nz/files/appledrawerui/example1.html&quot;&gt;Open in new tab&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;2-scroll-driven-animations&quot; tabindex=&quot;-1&quot;&gt;2. Scroll Driven Animations &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/03/20/apple-drawer-ui/#2-scroll-driven-animations&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While this is looking close to the desired UI, there are a few issues. Firstly, in our fully expanded state, scrolling further should maintain a sticky header at the top of the drawer. While we can use &lt;code&gt;position: sticky&lt;/code&gt;, we still want the map to remain a little visible at the top of the drawer. If we use a value that is greater than &lt;code&gt;top: 0&lt;/code&gt;, the content will pop out the top of the sticky header and over our map.&lt;/p&gt;
&lt;p&gt;To fix this, we need to introduce another scrollable container. We set a height on the drawer wrapper, and allow the content to scroll.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.drawer-wrapper&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;100dvh - &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--collapsed-height&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; - &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--drawer-top-margin&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.drawer-content&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;overflow-y&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; scroll&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;While this fixes the fully expanded state, the partially expanded state now has the content scrolling independently of the drawer. We need to disable scrolling of this container unless the drawer is fully expanded.&lt;/p&gt;
&lt;p&gt;In the past, we may have used something like the IntersectionObserver JS API to control this, but we can now use CSS scroll driven animations to do this without any JavaScript.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;scroll-timeline&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; --page-scroll block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;scrollbar-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;overscroll-behavior&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; drawer-content&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;overflow-y&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;99%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;overflow-y&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;overflow-y&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; scroll&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.drawer-content&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; drawer-content auto linear&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;animation-timeline&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; --page-scroll&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To polish this off, we can also use this same &lt;code&gt;scroll-timeline&lt;/code&gt; to slightly dim the map and disable interactivity when the drawer is fully expanded.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; main-scroll-opacity&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;90%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.7&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;pointer-events&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.main-content&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; main-scroll-opacity auto linear&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;animation-timeline&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; --page-scroll&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And after inserting a scrollable image to use as a map, we’ve got a drawer that works in a similar fashion to Apple Maps. Now we just need to animate it.&lt;/p&gt;
&lt;iframe src=&quot;https://jono.nz/files/appledrawerui/example2.html&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;em&gt;Compatibility: At time of writing, CSS scroll driven animations are not supported in Firefox. On iPhone, you’ll need to be on at least iOS 26.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jono.nz/files/appledrawerui/example2.html&quot;&gt;Open in new tab&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;3-css-view-transitions&quot; tabindex=&quot;-1&quot;&gt;3. CSS View Transitions &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/03/20/apple-drawer-ui/#3-css-view-transitions&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While there’s plenty of JS animation frameworks, we can now use CSS View Transitions to handle our navigation animations. This is reasonably straightforward: we give our &lt;code&gt;.drawer&lt;/code&gt; a &lt;code&gt;view-transition-name&lt;/code&gt; and define a couple of animations using the view transition psuedo classes.&lt;/p&gt;
&lt;p&gt;Because the drawer has three different heights, we also need to account for this with some variables and another scroll driven animation.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@view-transition&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;navigation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; drawer-height&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;--current-drawer-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--collapsed-height&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* variable values are discrete, so we don&#39;t need to be accurate with our percentages */&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;10%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;--current-drawer-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--drawer-midpoint&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;--current-drawer-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;100dvh - &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--drawer-top-margin&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; drawer-height auto linear&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;animation-timeline&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; --page-scroll&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; slide-drawer-in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--current-drawer-height&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; fade-drawer&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;brightness&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;brightness&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0.95&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;::view-transition-new(drawer)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 350ms ease slide-drawer-in&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;::view-transition-old(drawer)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300ms ease fade-drawer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;brightness&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0.95&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.drawer&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;view-transition-name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; drawer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Because we’re using cross document view transitions (i.e navigating to another page), the drawer will collapse upon navigation. We’ll need to add a tiny bit of JavaScript to maintain the scroll position. If you’re using this in a single page app with &lt;code&gt;document.startViewTranstion&lt;/code&gt;, you won’t need this code.&lt;/p&gt;
&lt;p&gt;If the user hits the back button, the animation looks a little weird. We’ll need to reverse it on backward navigation. To do this, we also need to add a little bit of JavaScript to add a &lt;code&gt;backward&lt;/code&gt; view transition type, and some extra CSS for the reverse animation.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;pageswap&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  sessionStorage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;scrollTop&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;scrollTop&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;pagereveal&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// restore scroll height when navigating between pages&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; oldScrollHeight &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sessionStorage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;scrollTop&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;300&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;scrollTop &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; oldScrollHeight
  
  &lt;span class=&quot;token comment&quot;&gt;// detects if the back button is pressed&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;viewTransition&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// not supported&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; navigationType&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; entry&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; from &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; navigation&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;activation
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; isBackward &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; navigationType &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;traverse&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; entry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;index &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; from&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;index
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isBackward&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; viewTransition&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;types&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;backward&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;html:active-view-transition-type(backward)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&amp;amp;::view-transition-new(drawer)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;    
    &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300ms ease fade-drawer reverse&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&amp;amp;::view-transition-old(drawer)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 350ms ease slide-drawer-in reverse&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--current-drawer-height&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And after a bit of styling, this is the final product!&lt;/p&gt;
&lt;iframe src=&quot;https://jono.nz/files/appledrawerui/example3.html&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;em&gt;NB: If you hit the close button too many times, it’ll navigate you away from this blog post. Scroll restoration of the image is also not handled in this example.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jono.nz/files/appledrawerui/example3.html&quot;&gt;Open in new tab&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;notes&quot; tabindex=&quot;-1&quot;&gt;Notes &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/03/20/apple-drawer-ui/#notes&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We’re a little limited with some features that CSS provides, so this not a perfect replica. I would love to adjust the scroll snap speed, but there isn’t currently a way to do that. While it does work with a mouse, it is optimized for touch screens. It may be worth adding in some JavaScript to aid mouse users, and to adjust the layout to a two column design on larger screens.&lt;/p&gt;
&lt;p&gt;It’s also worth mentioning that using &lt;code&gt;backdrop-filter: blur(x)&lt;/code&gt; for a transparent blur effect (before iOS moved to Liquid Glass) is currently a bit glitchy with view transitions, so this demo avoids transparency.&lt;/p&gt;
&lt;p&gt;This is also a little glitchy in different ways on both iOS and Android when not running in an &lt;code&gt;iframe&lt;/code&gt; (due to dynamic toolbars on mobile). The easiest way around this is probably to disable scrolling on the &lt;code&gt;html&lt;/code&gt; element and make &lt;code&gt;main&lt;/code&gt; a scrollable container, adjusting CSS rules accordingly. The mobile browsers will always have toolbars present, but it should avoid weird layout reflows.&lt;/p&gt;
&lt;p&gt;Other than that, I’m happy with how this turned out and I will probably implement it in some of my projects. Feel free to use it in your own!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Autumn in the UK</title>
		<link href="https://jono.nz/2026/02/28/uk-roadtrip/"/>
		<updated>2026-02-28T12:00:00Z</updated>
		<id>https://jono.nz/2026/02/28/uk-roadtrip/</id>
		<content type="html">&lt;p&gt;&lt;a href=&quot;https://jono.nz/2025/11/13/greece-roadtrip/&quot;&gt;After visiting Greece&lt;/a&gt;, we also went for a roadtrip in the UK. We visited in Autumn, which was really nice with all the different colours. Definitely a bit colder than other places in Europe, but still a great time to visit.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08645.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Person walking dogs in Lake District&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08645-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;edinburgh&quot; tabindex=&quot;-1&quot;&gt;Edinburgh &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/02/28/uk-roadtrip/#edinburgh&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Edinburgh is the most visited city in the UK after London, and it’s easy to see why. The city has really unique neo-classical architecture, and it’s a very nice place to walk around. Just make sure to book in advance: accommodation was more expensive than any other city we’ve been to.&lt;/p&gt;
&lt;jc-gallery&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08188.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Edinburgh skyline&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08188-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08208.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Pub in Edinburgh&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08208-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08223.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Edinburgh old town&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08223-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-gallery&gt;
&lt;h2 id=&quot;scottish-highlands&quot; tabindex=&quot;-1&quot;&gt;Scottish Highlands &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/02/28/uk-roadtrip/#scottish-highlands&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After Edinburgh, we headed to the highlands. It’s a place that is really dense with different vistas and you don’t have to travel far to see a completely different landscape.&lt;/p&gt;
&lt;p&gt;We made lots of stops along the way, but there were a few places that stood out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Perth Museum&lt;/strong&gt;: A very good small museum, with interesting displays including the Stone of Scone, and a cloak made from kākāpō feathers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fairy Pools&lt;/strong&gt;: Easy walk along a series of waterfalls and pools in the mountains. You can even go for a swim if you’re brave.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pollock Country Park&lt;/strong&gt;: While you’ll probably see the Highland Coos on the road, this is a great place to see them up close.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We didn’t make it to the Quiraing as we ran out of time, but I’ve heard it’s worth visiting if you’re on the Isle of Skye.&lt;/p&gt;
&lt;jc-gallery&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08638.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Highland Coo&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08638-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08529.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;European robin&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08529-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08564.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Scottish highlands loch&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08564-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08376.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Eilean Donan&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08376-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08418.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Fairy pools walk&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08418-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08551.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Bridge and mountain in Scottish highlands&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08551-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08428.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Fairy pools walk&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08428-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08452.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Glencoe lookout&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08452-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08584.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Glasgow bridge and cememtery&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08584-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08591.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;View over Glasgow from cememtery&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08591-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08599.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Glasgow central station&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08599-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-gallery&gt;
&lt;h2 id=&quot;lake-district-and-york&quot; tabindex=&quot;-1&quot;&gt;Lake District &amp;amp; York &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/02/28/uk-roadtrip/#lake-district-and-york&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Having grown up in a different lakes district, the Lake District in the UK did feel a little familiar. However, it is still very pretty, and there’s many more little towns and places to stop off in comparison to NZ. The &lt;a href=&quot;https://maps.app.goo.gl/KTiy4WeAsoqyQB2C6&quot;&gt;hotel we stayed at&lt;/a&gt; was right on Lake Windermere, and was honestly stunning.&lt;/p&gt;
&lt;p&gt;York was also neat to visit. It’s a very well preserved medieval city, and you can walk along the old city walls. I also really recommend visiting the &lt;strong&gt;National Railway Museum&lt;/strong&gt; there. It’s newly renovated and has a huge selection of different trains and railway paraphernalia, even including a 0 Series Shinkansen.&lt;/p&gt;
&lt;jc-gallery&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08667.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Boats in Lake District&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08667-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08659.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Pier in Lake District&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08659-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08735.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Pub in Ambleside&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08735-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08695.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Car driving over pass in Lake District&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08695-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08722.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Paddleboards and sailing in Lake District&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08722-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08784.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;People enjoy coffee in York&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08784-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08736.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Old telephone booth in York&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08736-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08775.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;York medieval walls&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08775-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-gallery&gt;
&lt;h2 id=&quot;wales&quot; tabindex=&quot;-1&quot;&gt;Wales &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/02/28/uk-roadtrip/#wales&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We also spent some time in the north west and south coasts of Wales. Lots of castles and mountains, but also lots of rain. I really liked the &lt;strong&gt;Conwy Castle&lt;/strong&gt; as it felt very quintessential sitting across from a river, complete with suspension bridge. The town of Conwy nearby is also very cool, and still has medieval town walls intact.&lt;/p&gt;
&lt;jc-gallery&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08884.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Wales green landscape&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08884-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08817.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Caernarfon Castle&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08817-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08823.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Caernarfon from Castle&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08823-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08842.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Car driving over mountain pass in Wales&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08842-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08866.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Bridge leading to Conwy Castle&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08866-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08879.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Car passing through Conwy Castle&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08879-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08860.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;View of river from Conwy Castle&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08860-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-gallery&gt;
&lt;h2 id=&quot;bristol-and-bath&quot; tabindex=&quot;-1&quot;&gt;Bristol &amp;amp; Bath &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/02/28/uk-roadtrip/#bristol-and-bath&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bristol seemed fine. It seems like it would be a nice enough place to live, but it’s not a super interesting travel destination. Bath is a good day trip and quite a pretty town, but probably more enjoyable if you’re interested in Roman history.&lt;/p&gt;
&lt;jc-gallery&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08952.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Bristol marina&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08952-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08957.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Bristol street art&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08957-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08960.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Roman Baths&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08960-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08968.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Bath streetscape&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08968-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-gallery&gt;
&lt;h2 id=&quot;oxford&quot; tabindex=&quot;-1&quot;&gt;Oxford &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/02/28/uk-roadtrip/#oxford&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Oxford has got to be most the most photogenic city in the UK. The town is dominated by the university and the beautiful buildings that make up the campus. My highlight was visiting the &lt;strong&gt;Oxford University Museum of Natural History &amp;amp; Pitt Rivers Museum&lt;/strong&gt; (just out the back). Walking inside feels like being transported back to the Victorian era, and the displays really invoke a sense of discovery.&lt;/p&gt;
&lt;p&gt;If you have more than a few days in London, I would definitely do a day trip to Oxford as the journey is only around an hour each way.&lt;/p&gt;
&lt;jc-gallery&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08986.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Oxford University&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08986-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08978.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Church in Oxford&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08978-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08996.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Oxford grounds&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08996-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC09003.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Oxford University Museum&quot; src=&quot;https://assets.jono.nz/images/uk/DSC09003-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC09006.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Oxford University Museum&quot; src=&quot;https://assets.jono.nz/images/uk/DSC09006-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08989.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Oxford streetscape&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08989-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-gallery&gt;
&lt;h2 id=&quot;london&quot; tabindex=&quot;-1&quot;&gt;London &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/02/28/uk-roadtrip/#london&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After driving around for two weeks, we dropped the car off in London. I had visited around 10 years ago, so it was a bit surprising to see how much the place hasn’t changed. While it’s a city that does a great job at combining the traditional &amp;amp; modern, it seemed like there were relatively few new additions, especially when compared to other cities such as New York, Singapore, or Sydney.&lt;/p&gt;
&lt;p&gt;However, the new Elizabeth Line is great. They should really build another new one.&lt;/p&gt;
&lt;jc-gallery&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC09008.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;London streetscape&quot; src=&quot;https://assets.jono.nz/images/uk/DSC09008-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC09131.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Back alley near London Chinatown&quot; src=&quot;https://assets.jono.nz/images/uk/DSC09131-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC09059.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;View of Barbican&quot; src=&quot;https://assets.jono.nz/images/uk/DSC09059-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC09061.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;People walking in Barbican&quot; src=&quot;https://assets.jono.nz/images/uk/DSC09061-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC09066.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;St Paul&#39;s Cathedral&quot; src=&quot;https://assets.jono.nz/images/uk/DSC09066-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC09076.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Covent Garden Market&quot; src=&quot;https://assets.jono.nz/images/uk/DSC09076-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC09083.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;View from Trafalgar Square&quot; src=&quot;https://assets.jono.nz/images/uk/DSC09083-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC09146.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Kings Cross Station&quot; src=&quot;https://assets.jono.nz/images/uk/DSC09146-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC09201.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Lime Bikes in the City of London&quot; src=&quot;https://assets.jono.nz/images/uk/DSC09201-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC09164.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;London streetscape&quot; src=&quot;https://assets.jono.nz/images/uk/DSC09164-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC09248.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Docklands Light Railway&quot; src=&quot;https://assets.jono.nz/images/uk/DSC09248-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-gallery&gt;
&lt;h2 id=&quot;driving-in-the-uk&quot; tabindex=&quot;-1&quot;&gt;Driving in the UK &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/02/28/uk-roadtrip/#driving-in-the-uk&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Despite having invented trains and having great rail coverage, traveling by rail in the UK is ridiculously expensive. A car is much cheaper: it cost about £400 to rent a car for two weeks, including the one way fee from Edinburgh to London. We didn’t encounter any toll roads on our trip.&lt;/p&gt;
&lt;p&gt;We only ending up taking one train in the UK: the Southern from London to Gatwick Airport. For a 30 minute trip, it was &lt;em&gt;TWENTY ONE GREAT BRITISH POUNDS&lt;/em&gt; per person.&lt;/p&gt;
&lt;p&gt;So yeah, I would recommend hiring a car. It’s easy enough to drive in UK, and other people are generally considerate drivers. Only real things to worry about are some of the narrow lanes, road markings that haven’t been repainted in forever, and their enormous signalised roundabouts.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/uk/DSC08157.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;View of Edinburgh&quot; src=&quot;https://assets.jono.nz/images/uk/DSC08157-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;etc&quot; tabindex=&quot;-1&quot;&gt;etc &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/02/28/uk-roadtrip/#etc&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Payments:&lt;/strong&gt; I tried to pay by cash at a restaurant and got asked by the waiter if I was a drug dealer. Despite this, you will still need some cash if you want to do any laundry. Not a single laundromat took card payment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Laundry:&lt;/strong&gt; It was also surprisingly difficult to find places to do laundry. None of the hotels we stayed at had laundry rooms or laundry service, and laundromats (laundrettes) were few and far between. It’s honestly a bit weird. Do people not need to wash heavy blankets, or get items dry cleaned?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Food:&lt;/strong&gt; Eating out is quite expensive and not very exciting. Part of this is because there’s 20% VAT on cooked food (e.g a toasted sandwich will always cost at least 20% more than a fresh one). It’s odd government policy that makes groceries artificially cheap and probably doesn’t help restaurants &amp;amp; cafes very much.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Electricity:&lt;/strong&gt; A few weird things in the UK. Every bathroom having shaver sockets with a different socket and voltage feels like a relic. Our rental car was also a plug in hybrid, but public EV charging was more expensive than buying petrol. I thought that the street lamps with integrated EV chargers were cool though.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Language&lt;/strong&gt;: English is spoken in most of the UK, but even as a native English speaker I struggled in York.&lt;/p&gt;
&lt;h2 id=&quot;where-should-you-go&quot; tabindex=&quot;-1&quot;&gt;Where should you go? &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/02/28/uk-roadtrip/#where-should-you-go&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While we enjoyed our trip to the UK, there’s many other destinations in Europe I would prioritise first. The UK is one of the most expensive countries in Europe, especially when it comes to accommodation and eating out, but many museums and other attractions are free. I personally didn’t find the most of the cities too interesting, but the countryside is nice. The landscape can be a little similar to NZ, but the many villages and castles makes it quite unique.&lt;/p&gt;
&lt;p&gt;I feel like London is one of those cities that you have to visit at least once. There is so much to see and it’s culturally very important, but I also don’t think it is particularly representative of the rest of the UK. If you do have a couple of days, I would recommend driving around the Scottish Highlands. It has probably the highest density of beautiful landscapes in the country, and is quite varied with the many lochs, isles, and mountain ranges.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Things to take travelling</title>
		<link href="https://jono.nz/2026/01/23/uses-jan-2026/"/>
		<updated>2026-01-23T12:00:00Z</updated>
		<id>https://jono.nz/2026/01/23/uses-jan-2026/</id>
		<content type="html">&lt;p&gt;We’ve been doing a bit of extended travel over the last few months. This is some of the gear and things that I’ve found to be really good for travel.&lt;/p&gt;
&lt;h2 id=&quot;apps&quot; tabindex=&quot;-1&quot;&gt;Apps &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#apps&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;ubigi&quot; tabindex=&quot;-1&quot;&gt;Ubigi &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#ubigi&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;eSIMs are great because you can buy them before you reach your destination and already have mobile data when you arrive. It’s also kinda necessary these days, with so many restaurants using QR ordering, or activities where they want you to buy tickets through your phone.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ubigi.com/&quot;&gt;Ubigi&lt;/a&gt; isn’t necessarily the cheapest, but I’ve found it to be most reliable. Both in terms of coverage, but also not giving you an IP where every site is making you do CAPTCHAs every 5 minutes.&lt;/p&gt;
&lt;h3 id=&quot;tailscale&quot; tabindex=&quot;-1&quot;&gt;Tailscale &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#tailscale&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There’s very few reasons for most people to buy a public VPN, but having a VPN setup through &lt;a href=&quot;https://tailscale.com/&quot;&gt;Tailscale&lt;/a&gt; is really useful. I’ve found myself to be on lots of networks where certain sites are blocked, and it can be for any reason: the site owner could be blocking the country you’re in, or the government is censoring the internet (e.g Qatar Airways Starlink).&lt;/p&gt;
&lt;p&gt;To avoid this, you can setup a Tailscale exit node setup on your normal home internet connection. This tunnels all your traffic through a computer on your home internet connection, which allows you to bypass these restrictions. While there’s numerous other ways to do this, Tailscale is free, runs on everything, and only takes five minutes to setup.&lt;/p&gt;
&lt;h3 id=&quot;merlin-bird-id&quot; tabindex=&quot;-1&quot;&gt;Merlin Bird ID &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#merlin-bird-id&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This app is very cool, and basically a Pokédex for birds. It show you what birds are in your current area with photos, songs, and other information. It can also identify the bird through photo or sound, and it actually works surprisingly well. To top it off, it’s free and works completely offline.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://merlin.allaboutbirds.org/&quot;&gt;merlin.allaboutbirds.org&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;wise&quot; tabindex=&quot;-1&quot;&gt;Wise &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#wise&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Wise (or Revolut etc) is one of the services that I’m surprised not everyone knows about. In New Zealand, nearly every credit card has foreign transaction fees, so you will save a lot of money by using Wise (which has better rates too).&lt;/p&gt;
&lt;p&gt;While you can manually exchange currencies, I just load the money in NZD and let it automatically convert when you spend it. Once signing up, it’s also worth ordering a physical card so you can withdraw cash from ATMs. The card is free if you use an &lt;a href=&quot;https://wise.com/invite/dic/jonathanc1490&quot;&gt;invite link&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;hanly-and-duchinese&quot; tabindex=&quot;-1&quot;&gt;Hanly &amp;amp; DuChinese &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#hanly-and-duchinese&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Instead of doomscrolling, learning a language can be a great way to pass the time. I really like &lt;a href=&quot;https://www.hanlyapp.com/&quot;&gt;Hanly&lt;/a&gt; for learning Chinese characters &amp;amp; words, as it teaches them by component (rather than just learning the most frequently used characters) and has good explanations/mnemonics to help you learn them. It’s also free - no account, subscription, or internet connection required.&lt;/p&gt;
&lt;p&gt;I’ve also found &lt;a href=&quot;https://duchinese.net/&quot;&gt;DuChinese&lt;/a&gt; to be really helpful. Reading is a form of spaced repetition, and being able to listen while following along with the characters is very helpful. There is a free tier, but getting access to all the content is behind a fairly expensive subscription.&lt;/p&gt;
&lt;h2 id=&quot;hardware&quot; tabindex=&quot;-1&quot;&gt;Hardware &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#hardware&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;sony-a6700-sigma-18-50mm-f-2-8&quot; tabindex=&quot;-1&quot;&gt;Sony a6700 + Sigma 18-50mm f/2.8 &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#sony-a6700-sigma-18-50mm-f-2-8&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I’m really happy with this camera + lens combo for travelling. The autofocus in particular is amazing. It’s really fast, and I’ve missed far fewer shots on this trip because of this camera. Coming from a Sony a5100, the difference is night and day. The Sigma 18-50mm has also been great: the focal length is versatile, it’s reasonably compact, and not too expensive either.&lt;/p&gt;
&lt;p&gt;Carrying a camera on trips is great as it forces you to be a little more intentional with your shots, and you’re more likely to do &lt;a href=&quot;https://jono.nz/2025/11/13/greece-roadtrip/&quot;&gt;something with the photos afterwards&lt;/a&gt;. You’ll find your phone battery also lasts a very long time when you have a dedicated camera. I also really like this combo because it’s not so expensive to feel you have to have to baby the equipment. I’ve been using it just fine in the rain and just chuck it in a normal bag.&lt;/p&gt;
&lt;p&gt;I would recommend a &lt;a href=&quot;https://www.peakdesign.com/global/collections/straps&quot;&gt;Peak Design strap&lt;/a&gt;. One of the thinner ones is fine. It puts the weight of the camera on your shoulders rather than your neck, and it’s a bit more subtle than normal straps.&lt;/p&gt;
&lt;h3 id=&quot;rog-ally-x-bazzite&quot; tabindex=&quot;-1&quot;&gt;ROG Ally X + Bazzite &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#rog-ally-x-bazzite&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Steam Deck isn’t available in New Zealand, so installing &lt;a href=&quot;https://bazzite.gg/&quot;&gt;Bazzite&lt;/a&gt; to run SteamOS on another gaming handheld is the next best thing (or arguably better). You don’t have to use Bazzite, but it has better hardware support and includes a bunch of extras out of the box compared to a regular SteamOS install.&lt;/p&gt;
&lt;p&gt;I’m still dual booting Windows, but I’ve actually never used it. Gaming on Linux is just really good now, and there’s almost nothing that doesn’t work.&lt;/p&gt;
&lt;h3 id=&quot;retroid-pocket-5&quot; tabindex=&quot;-1&quot;&gt;Retroid Pocket 5 &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#retroid-pocket-5&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;It’s a bit weird to be carrying two gaming handhelds, but the Retroid Pocket 5 is small enough to fit in a jacket pocket. This one runs Android, and it’s really good for emulation of pretty much every system up to the PlayStation 2. I’ve been playing a lot of GameBoy Advance (there is a whole world of &lt;a href=&quot;https://github.com/PokemonHnS-Development/pokemonHnS&quot;&gt;Pokemon ROM hacks&lt;/a&gt;). The screen is also OLED and high resolution enough to use shaders that replicate the look of the original hardware.&lt;/p&gt;
&lt;p&gt;There are more powerful handhelds out there, and they seem to be getting better every year. The Retroid Pocket 6 (coming soon), and Ayn Odin 3 look to be similar, but with more powerful processors that can play PS3, and even PC games.&lt;/p&gt;
&lt;h3 id=&quot;forerunner-965&quot; tabindex=&quot;-1&quot;&gt;Forerunner 965 &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#forerunner-965&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This was another upgrade for me from an older Garmin, and I’m really happy with the upgrade. Every generation of Garmin seems to add a few features, so you get quite a lot of “new” things when you skip a few generations. It has a nice OLED screen, and I get about 3 weeks of battery is even better than my older Forerunner 745 with a MIP screen. The &lt;a href=&quot;https://apps.garmin.com/apps/d87b23bb-ec6d-47f3-82ea-d133f5dfb356&quot;&gt;Black Grid&lt;/a&gt; watchface is really nice on this screen, and has the perfect level of information density for me.&lt;/p&gt;
&lt;p&gt;The Forerunner 965 is not the newest (the 970 is out), but when choosing a Garmin, you will save a lot of money by not buying the latest model. I purchased the 965 for approximately half of what a new 970 retails for.&lt;/p&gt;
&lt;h2 id=&quot;other-gear&quot; tabindex=&quot;-1&quot;&gt;Other Gear &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#other-gear&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;phrasebooks&quot; tabindex=&quot;-1&quot;&gt;Phrasebooks &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#phrasebooks&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Using your phone to translate is great for signs and menus, but phrasebooks are honestly underrated. They tell you what is normal thing to say, and cover a lot of the common scenarios that you’ll run into. It’s also way quicker to flick through a book than it is to type out a potentially weird sentence on your phone.&lt;/p&gt;
&lt;p&gt;We got by just fine with English in Europe, but having a phrasebook for Latin America has been essential. The Lonely Planet ones are great: they’re physically compact, succinct, and inexpensive.&lt;/p&gt;
&lt;h3 id=&quot;first-aid-kit&quot; tabindex=&quot;-1&quot;&gt;First Aid Kit &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#first-aid-kit&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You can’t rely on hotels to have fully equipped first aid kits. It’s always worth carrying some gauze, bandages, antiseptic, plasters, scissors, painkillers, and antihistamines with you. When not travelling, I also highly recommend having a first aid kit in your car.&lt;/p&gt;
&lt;h3 id=&quot;usb-c-headtorch&quot; tabindex=&quot;-1&quot;&gt;USB-C Headtorch &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#usb-c-headtorch&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;These can be surprisingly handy. I got a lightweight one (42g) from &lt;a href=&quot;https://www.decathlon.co.uk/p/rechargeable-headlamp-150-lumens-ul500-usb-c-orange/344319/c184c67m8787355&quot;&gt;Decathlon&lt;/a&gt;, which is nice and bright (150 lumens), barely takes up any space in the bag, and supports USB-C to C charging.&lt;/p&gt;
&lt;h3 id=&quot;lululemon-abc-pants&quot; tabindex=&quot;-1&quot;&gt;Lululemon ABC Pants &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#lululemon-abc-pants&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A bit expensive, but they’re actually so good. They’re high quality, dry quickly, and look good. They’re also perfectly comfortable to cycle in.&lt;/p&gt;
&lt;h3 id=&quot;bellroy-venture-sling&quot; tabindex=&quot;-1&quot;&gt;Bellroy Venture Sling &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2026/01/23/uses-jan-2026/#bellroy-venture-sling&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This bag has been great for travelling. It’s compact (9L), but has enough space to fit a camera and water bottle. There’s plenty of pockets for organisation, and I like that the zips open from the ends. It feels a bit more secure, but you can also keep the bag slightly open to have a water bottle poke out the top.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>A roadtrip around Greece</title>
		<link href="https://jono.nz/2025/11/13/greece-roadtrip/"/>
		<updated>2025-11-13T12:00:00Z</updated>
		<id>https://jono.nz/2025/11/13/greece-roadtrip/</id>
		<content type="html">&lt;p&gt;In late September, we spent two weeks driving around Greece. It was an awesome experience and one of our favourite countries we’ve visited.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07077.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Acropolis at Athens&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07077-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;athens&quot; tabindex=&quot;-1&quot;&gt;Athens &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/11/13/greece-roadtrip/#athens&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Before we picked up the rental car, we spent three nights in Athens. It has a bit of a reputation for being a bit of a dirty &amp;amp; ugly city, but we really enjoyed it. The food was amazing, there’s lots of interesting neighbourhoods to explore, and it is more alive at night than anywhere else in Europe.&lt;/p&gt;
&lt;p&gt;I also think it has a lot of accidentally good urbanism. Most buildings are around six floors, but on quite narrow streets which really helps with the shade. It’s actually a little bit like Japan: not going to win any architecture awards, but it’s a nice place to walk around.&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07187.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Athens street&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07187-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07178.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Athens street&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07178-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;Both the Acropolis and Acropolis Museum are must visits when going to Athens. The ruins are well preserved and restored, and the views from the top over the city are amazing. Just don’t forget to bring a bottle of water up with you.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07203.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Inside the Acropolis Museum&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07203-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Acropolis Museum is one of the best museums I’ve been to. The galleries are really interesting and well explained, and the entire building sits over an archeological site that you can walk around on catwalks. It’s a shame that many of the artifacts from the Acropolis are in the British Museum in London, because controversy aside, the displays in Athens are much better.&lt;/p&gt;
&lt;h2 id=&quot;food&quot; tabindex=&quot;-1&quot;&gt;Food &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/11/13/greece-roadtrip/#food&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LUKUMAΔΕΣ:&lt;/strong&gt; The best place we found for Loukoumades. They have a number of different branches in Athens.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kapsa Souvlaki:&lt;/strong&gt; We thought the Gyros here were particularly good. They don’t have fries in them, which honestly makes them better.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Guarantee:&lt;/strong&gt; The sandwiches here are really nice. There’s a huge number of toppings to choose from, but they have a whole lot of suggested sandwiches too.&lt;/li&gt;
&lt;/ul&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07023.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Loukoumades from LUKUMAΔΕΣ&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07023-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07134.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Gyros from Kapsa Souvlaki&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07134-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;h1 id=&quot;corinth&quot; tabindex=&quot;-1&quot;&gt;Corinth &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/11/13/greece-roadtrip/#corinth&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Our first stop outside of Athens was Corinth. There’s a narrow and deep canal that separates the Peloponnese from the mainland here. I managed to spot it while driving but I didn’t stop to take a photo. Oops. It’s probably worth a visit.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07224.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Corinth Ruins&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07224-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We went to the ancient city of Corinth, which we were very much visiting because a decent amount of &lt;em&gt;Assassin’s Creed Odyssey&lt;/em&gt; takes places here. I enjoyed the ruins, and the museum was good too. I would say it’s more of an optional visit, but there’s a couple of places that overlook the ruins where you can go for lunch.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07252.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Mycenae Ruins&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07252-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Our next stop on the way to Nafplio was Mycenae. This site was really cool as it sits on top of a hill with spectacular views out to the coast. The excavation here is really good, and you can get a good feel of what the city was like. Like the Corinth site, there is also a museum included in the ticket which showcases some of the artifacts and explains the history in a bit more detail. We would really recommend a visit here.&lt;/p&gt;
&lt;h1 id=&quot;napfilo&quot; tabindex=&quot;-1&quot;&gt;Napfilo &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/11/13/greece-roadtrip/#napfilo&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We stayed two nights in Napfilo, which is about two hours drive from Athens. The old town here is very pretty, and it doesn’t feel too touristy. Most of the shops are open until quite late (around 10pm), so you can definitely walk around after you’ve done things for the day.&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07281.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Coastal walk at Napfilo&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07281-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07282.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Fortress at Napfilo&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07282-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;There’s two fortresses you can walk up here, one significantly higher than the other. We walked up the smaller one closer to the old town (Acronauplía), which doesn’t have any entrance fees but still offers good views. There’s also a path around the coast at the bottom of the fortress which has some nice views of the coast.&lt;/p&gt;
&lt;p&gt;We also visited the Ancient Theatre at the Asklepieion of Epidaurus, which is about a 30 minute drive from Napfilo. This has a remarkably well preserved Greek theatre, and definitely worth a visit if you’re in the area.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07363.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Ancient Theatre at the Asklepieion of Epidaurus&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07363-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;food-1&quot; tabindex=&quot;-1&quot;&gt;Food &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/11/13/greece-roadtrip/#food-1&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pidalio Tavern&lt;/strong&gt;: The food here was really unique and tasted great. They had some &lt;em&gt;cultural heritage&lt;/em&gt; dishes which were their own spin on classic greek dishes. Similar to what you would find at a more upscale restaurant, but not expensive at all: around €10-15 per dish.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;kalamata&quot; tabindex=&quot;-1&quot;&gt;Kalamata &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/11/13/greece-roadtrip/#kalamata&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We drove over the hills on the way out from Napfilo rather than taking the motorway. The drive had some incredible views, but unfortunately very few places to stop and take photos.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07400.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;View from Kalamata hill&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07400-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Kalamata was nice enough, but we really enjoyed driving down along the coast to Kardamyli and Stoupa. There’s good views along the way, and both these villages are cute places to stop. We had dinner in Stoupa, which was very memorable with a beautiful beach and the sun setting into the ocean.&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07413.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Kardamyli beach&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07413-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07415.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Stoupa beach&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07425-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;There’s a number of other places that I’ve heard are worth visiting near Kalamata, but we wanted to take a little bit of a break from driving. I would love to come back to visit the area again. One of the places that comes to mind is the fortified town of Monemvasia, but it is quite out of the way (around 3 hours from Kalamata).&lt;/p&gt;
&lt;h1 id=&quot;patras-and-olympia&quot; tabindex=&quot;-1&quot;&gt;Patras &amp;amp; Olympia &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/11/13/greece-roadtrip/#patras-and-olympia&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07459.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Olympia stadium&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07459-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Our next long drive was to Patras, although it will definitely get better soon with a new highway that is nearly completed. On the way, we stopped in Olympia, the site of the ancient Olympic Games. You do get a good feel of what the games were like thousands of years ago from walking around the ruins, and there’s also a couple of couple of museums included in the ticket. However, it’s not super different from other historical sites so I wouldn’t say Olympia is an essential visit.&lt;/p&gt;
&lt;p&gt;We also wouldn’t consider Patras to be an essential visit, but we just generally prefer to stay overnight in larger cities instead of smaller towns. We didn’t get up to too much here, but the walk up the hill to Patras Castle had some good views.&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07472.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Patras street&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07472-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07475.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;View from Patras Castle hill&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07475-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;h1 id=&quot;delphi&quot; tabindex=&quot;-1&quot;&gt;Delphi &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/11/13/greece-roadtrip/#delphi&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Our next stop was Delphi, which was an easy drive due to a massive bridge that crosses the Gulf of Corinth. On the way we had a nice lunch in Itea by the water (Alexandra Fresh Fish) before driving up the hill to Delphi.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07526.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Temple of Apollo at Delphi&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07526-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Temple of Apollo is definitely cool, especially if you’ve played AC Odyssey. The ruins are in good condition, the included museum is great, and the views over the valley are incredible. On this trip, we visited the museums after visiting the archaeological site as it really helps fill in the blanks to what you just saw.&lt;/p&gt;
&lt;p&gt;The Delphi town centre seems to mostly be hotels and staying the night here was ridiculously cheap. We stayed in a massive room here for only €20 for the night.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07526.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;View from Delphi&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07536-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;chalcis-and-artemida&quot; tabindex=&quot;-1&quot;&gt;Chalcis &amp;amp; Artemida &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/11/13/greece-roadtrip/#chalcis-and-artemida&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;After Delphi, it was a relatively short drive to Chalcis. This is technically on the Greek island of Euboea, but it’s connected to the mainland by a very short bridge (it’s maybe 30 metres long). We were getting to the end of our time in Greece at this point, so we just spent two nights relaxing here.&lt;/p&gt;
&lt;p&gt;We then finished off our time in Greece in Artemida. It’s very close to the Athens airport, but also has a large beach. Unfortunately, the weather wasn’t great while we were there so we didn’t get a chance to swim.&lt;/p&gt;
&lt;p&gt;We would recommend driving around the Peninsula to the south as it has many nice beaches and places to stop. The Temple of Poseidon is also in this area. We didn’t go in as the €20 entrance fee for historical sites starts to add up, so we just took photos from a distance.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07574.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Temple of Poseidon&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07574-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;food-to-try&quot; tabindex=&quot;-1&quot;&gt;Food to try &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/11/13/greece-roadtrip/#food-to-try&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;You will definitely eat a lot of gyros in Greece, which are honestly great wherever you go. There are also a few other specific dishes that stood out.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kolokithokeftedes&lt;/strong&gt;: I fell in love with these courgette fritters and started ordering them as a side everywhere. They’re mixed with feta and lots of herbs to make them really tasty, and usually served with tzatziki.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Loukoumades&lt;/strong&gt;: These are fried dough balls that are very QQ, actually quite similar to the fried taro balls you get at night markets in Taiwan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dakos&lt;/strong&gt;: This is a salad with essentially very hard croutons soaked in oil, topped with lots of tomatoes, feta, olives, and herbs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07560.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Dakos&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07560-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;driving-in-greece&quot; tabindex=&quot;-1&quot;&gt;Driving in Greece &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/11/13/greece-roadtrip/#driving-in-greece&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Driving can be a bit hectic, but it isn’t too bad outside of the cities. I would recommend picking up a car &lt;em&gt;after&lt;/em&gt; visiting Athens and driving straight out of there as it’s definitely the most difficult place I’ve ever driven. The other cities weren’t so bad, but the streets can be a little tight (we had a Yaris, which was great).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07499.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Toyota Yaris in Greece&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07499-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I managed the entire roadtrip without any accidents, but there’s a few things that make driving particularly difficult:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Traffic lights are only on one side of the intersection, so it can be hard to see when it’s your turn.&lt;/li&gt;
&lt;li&gt;Greek drivers drive very fast. They’re usually 20-30km/h over the speed limit.&lt;/li&gt;
&lt;li&gt;The lane markings are almost impossible to see. I don’t think they’ve ever been repainted.&lt;/li&gt;
&lt;li&gt;The road surface is pretty poor. There’s plenty of potholes, and bumps where the potholes have been filled.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In contrast, the motorways are really good (and the speed limit is 130km/h!) but are tolled. It’s a good idea to set Google Maps to &lt;em&gt;avoid tolls&lt;/em&gt; to check how much time the motorway saves you. In total, we spent €36 on tolls for 11 days of driving.&lt;/p&gt;
&lt;h1 id=&quot;etc&quot; tabindex=&quot;-1&quot;&gt;etc &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/11/13/greece-roadtrip/#etc&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/greece/DSC07379.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Street in Kalamata&quot; src=&quot;https://assets.jono.nz/images/greece/DSC07379-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Public Transport:&lt;/strong&gt; Greece isn’t covered in rail like much of Europe is, which is part of the reason we rented the car. You will also probably struggle to get to many of the historical sites without booking a tour. Within Athens, the metro is good for tourists: you can take it from the airport easily and just use contactless without having to buy tickets at a machine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Payments&lt;/strong&gt;: Contactless payments are accepted everywhere. I don’t think we used any cash at all.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Languages:&lt;/strong&gt; Most people in Greece speak very good English. The only real struggle I had was trying to get a haircut. It’s also fun to learn the Greek alphabet, as it’s pretty easy and shares many similar sounds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Food:&lt;/strong&gt; We appreciated that the culture is more to share food in Greece, but it wouldn’t be limiting if you visited by yourself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Air Conditioning:&lt;/strong&gt; Is everywhere. It was hot throughout September, except for the last few days.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Laundromats:&lt;/strong&gt; Plenty of coin laundries within walking distance.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;where-should-you-go&quot; tabindex=&quot;-1&quot;&gt;Where should you go? &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/11/13/greece-roadtrip/#where-should-you-go&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We honestly enjoyed everywhere we went but if you have to prioritise places on the mainland, we would recommend Athens, Napfilo, the peninsula south of Athens, and Delphi. If you are after a Greek Island, I visited Rhodes a few years back which I thought had a bit of everything. It’s also a good place to rent a car for a day to have a look around.&lt;/p&gt;
&lt;p&gt;There’s so many places we didn’t get to, so we would love to come back to Greece in the future.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Commuter Waka</title>
		<link href="https://jono.nz/2025/09/21/commuter-waka/"/>
		<updated>2025-09-21T11:45:00Z</updated>
		<id>https://jono.nz/2025/09/21/commuter-waka/</id>
		<content type="html">&lt;p&gt;Several years ago, I built a data visualisation for &lt;a href=&quot;https://jono.nz/2020/08/23/waka-commuter/&quot;&gt;NZ census commuter data&lt;/a&gt;. It ended up winning the competition, and recently I was asked to update it for the &lt;a href=&quot;https://www.stats.govt.nz/news/commuter-waka-updated-with-2023-census-data-and-new-features/&quot;&gt;2023 Census&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the background, Commuter Waka has actually been quite successful. I’ve received feedback from people working at local councils &amp;amp; transport consultancies, and have had a few requests for features over the years. I was able to incorporate some of these into the new visualization for the 2023 data, so it has become quite a substantial upgrade all around.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/8uoybvClvZ-1956.avif 1956w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/8uoybvClvZ-1956.webp 1956w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/8uoybvClvZ-1956.png&quot; alt=&quot;Commuter Waka in 2025&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1956&quot; height=&quot;1430&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;New features include search, filtering by mode, comparison between different years, light/dark mode, more map display options, and new charts. I was able to work with Stats NZ this time around, so a few tweaks have been made to ensure that the visualisation accurately represents the data.&lt;/p&gt;
&lt;p&gt;Notably, you can no longer select multiple areas at the same time. Due to how data is anonymized, adding values from different areas together can lead to misleading &amp;amp; inaccurate results. A mode which aggregates to the SA3 level has been added, which offers most of aggregation benefits while staying accurate.&lt;/p&gt;
&lt;p&gt;Over the years, I’ve also received several requests for custom maps (&lt;em&gt;&lt;a href=&quot;https://jono.nz/#contact&quot;&gt;please reach out if you want one!&lt;/a&gt;&lt;/em&gt;), so I’ve been able to improve the code over time. I would no longer describe the code as a mess, and is now using Svelte to power things. I really like the way you can use D3 where you use Svelte to manage the DOM, but D3 for the calculations for the visualisation. Other than that, the way things work overall in the original post remains the same.&lt;/p&gt;
&lt;p&gt;Commuter Waka is still &lt;a href=&quot;https://github.com/consindo/waka-commuter&quot;&gt;open source on GitHub&lt;/a&gt;. Feel free to send me feedback or raise a pull request!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://commuter.waka.app&quot;&gt;commuter.waka.app&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Expo 2025</title>
		<link href="https://jono.nz/2025/09/16/expo-25/"/>
		<updated>2025-09-16T12:00:00Z</updated>
		<id>https://jono.nz/2025/09/16/expo-25/</id>
		<content type="html">&lt;p&gt;We went to Expo 2025 in Osaka back in July. It was a pretty cool experience, and something I would definitely recommend going to see (although there’s not much time left for the Osaka edition).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/expo25/DSC03379.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Expo 25 pavilions near east entrance&quot; src=&quot;https://assets.jono.nz/images/expo25/DSC03379-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I was honestly surprised with the scale of the event. I had seen a few photos, but it really was a massive site with a lot of pavilions. Not every country builds a dedicated pavilion: there were common pavilion areas with conference style booths, but also plenty of countries not represented at all (looking at you NZ).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/expo25/DSC03377.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Water feature at Expo 25&quot; src=&quot;https://assets.jono.nz/images/expo25/DSC03377-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We managed to see about twenty pavilions over the two days we visited Expo. I think everyone has different favourites, but I particularly enjoyed Germany &amp;amp; Malaysia as I felt they best followed the theme of &lt;em&gt;“Designing Future Society for Our Lives”&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Germany had a very interactive pavilion where you held a little character up to parts of the exhibition and it would explain more about their technologies, plans, and vision. Lots of cool ideas, and it really felt like a future looking society.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/expo25/DSC03400.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;View of Germany pavilion at Expo 25&quot; src=&quot;https://assets.jono.nz/images/expo25/DSC03400-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I also thought the Malaysia pavilion was good as it celebrated diversity between the different regions and also showed their plans for the future. I liked that they had fake foods (similar to what you see in a Japanese restaurant), but showcasing the dishes from the different parts of the country.&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/expo25/DSC03349.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Art piece inside Malaysian pavilion&quot; src=&quot;https://assets.jono.nz/images/expo25/DSC03349-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/expo25/DSC03409.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Inside the Brazil pavilion&quot; src=&quot;https://assets.jono.nz/images/expo25/DSC03409-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;Lots of the other pavilions were good, but were less inspiring and more just vibes. France and Brazil in particular felt more like art projects than exhibitions, while India and Turkmenistan had a wild energy that is hard to put into words.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/expo25/DSC03368.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Ico-Chan gatcha&quot; src=&quot;https://assets.jono.nz/images/expo25/DSC03368-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It was just fun to walk around the event as there was still plenty to see and do without going into to the pavilions. Being Japan, there were quite a few cool souvenirs to buy. I was quite happy to get an Ico-Chan gatcha!&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/expo25/DSC03343.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;The wooden grand ring&quot; src=&quot;https://assets.jono.nz/images/expo25/DSC03343-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/expo25/DSC03424.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;The Myaku-Myaku Expo 25 mascot&quot; src=&quot;https://assets.jono.nz/images/expo25/DSC03424-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;We went in the middle of July, so it there was a fair amount of waiting in sweltering 35 degrees heat. For no apparent reason, the lines for the pavilions were much longer the second day, so we only got into five pavilions compared with 15 on the first day. We avoided the pavilions with a queue of more than 20-30 minutes, but that was nothing compared to the queue for Italy which was 3 hours long.&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/expo25/DSC03275.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;View of Umeda Sky Building from Grand Green Osaka&quot; src=&quot;https://assets.jono.nz/images/expo25/DSC03275-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/expo25/DSC03277.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;View of Grand Green Osaka&quot; src=&quot;https://assets.jono.nz/images/expo25/DSC03277-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;Despite the heat and the annoying lottery system for some pavilions, we had a great time overall. It was a quick stopover for us, so we didn’t do too much else in Osaka this time but we did visit the new Grand Green Osaka that recently opened in late 2024. It’s a huge new green space in the middle of the city, and it’s integrated very well into the surrounding shopping area and transport hub. It’s a really nice piece of urban design and definitely worth checking out if you’re in Osaka.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>South Korea</title>
		<link href="https://jono.nz/2025/07/17/korea/"/>
		<updated>2025-07-17T12:00:00Z</updated>
		<id>https://jono.nz/2025/07/17/korea/</id>
		<content type="html">&lt;p&gt;We recently visited South Korea for the first time, and had a really good time. A lot of people have been asking us for some photos &amp;amp; recommendations, so here we go.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC03146.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Hanok Cafe in Gyeongju&quot; src=&quot;https://assets.jono.nz/images/korea/DSC03146-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;seoul&quot; tabindex=&quot;-1&quot;&gt;Seoul &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/07/17/korea/#seoul&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We were surprised by Seoul. It was a lot more relaxed than we were expecting, so we spent most of our time walking around neighbourhoods and trying different food. They’ve really nailed the cafe aesthetic in Korea, but the food sometimes looks better than it tastes! Unlike NZ, cafes typically open late: around 10am, but stay open until 9pm.&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC02401.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Seoul street&quot; src=&quot;https://assets.jono.nz/images/korea/DSC02401-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC02442.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Seoul cafe&quot; src=&quot;https://assets.jono.nz/images/korea/DSC02442-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;h3 id=&quot;neighbourhoods&quot; tabindex=&quot;-1&quot;&gt;Neighbourhoods &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/07/17/korea/#neighbourhoods&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Jongno&lt;/strong&gt;: This is the historic centre of Seoul and where we spent the majority of our time. We really liked &lt;strong&gt;Ikseon-dong&lt;/strong&gt; in particular with all the &lt;em&gt;hanok&lt;/em&gt; houses - many of them now restaurants and cafes. &lt;strong&gt;Gyeongbokgung Palace&lt;/strong&gt; is definitely worth visiting and is free entry if you dress up in &lt;em&gt;hanbok&lt;/em&gt;. &lt;strong&gt;Cheonggyecheon stream&lt;/strong&gt; is an incredible piece of urbanism (it’s the one that they tore down a highway for), and the walk up &lt;strong&gt;Naksan&lt;/strong&gt; along the old fortress walls has nice city views.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hongdae:&lt;/strong&gt; There’s lots to visit here, but the real highlight is &lt;strong&gt;Gyeongui Line Forest Park.&lt;/strong&gt; This is a linear park built on an old railway alignment, but is now an amazing green space with restaurants, art, and music that stretches for kilometres.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mullae-dong:&lt;/strong&gt; This area is a vibe. It’s still light industrial, but has a lot of art and restaurants mixed in between. It’s quite an experience to walk down the alleys, and see steelworkers coexisting with trendy bars.&lt;/li&gt;
&lt;/ul&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC02536.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Cheonggyecheon stream&quot; src=&quot;https://assets.jono.nz/images/korea/DSC02536-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC02590.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Nele Island&quot; src=&quot;https://assets.jono.nz/images/korea/DSC02590-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;h3 id=&quot;restaurants-cafes&quot; tabindex=&quot;-1&quot;&gt;Restaurants/Cafes &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/07/17/korea/#restaurants-cafes&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cheongsudang Bakery&lt;/strong&gt;: This is the most aesthetic cafe we’ve ever been to. The food and drinks were pretty good too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MilToast Ikseon:&lt;/strong&gt; This had really beautiful &amp;amp; tasty steamed bread and french toast. It was a bit of a long wait, so we also recommend the french toast at &lt;strong&gt;Standard Bread&lt;/strong&gt; which has several locations in Seoul and one in Busan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BBQ YUL:&lt;/strong&gt; We went for Korean barbecue several times, but this one was definitely our favourite. They were very thoughtful with how the meat should be paired with the different condiments &amp;amp; side dishes, and the service was amazing.&lt;/li&gt;
&lt;/ul&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC02626.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Cheongsudang Bakery&quot; src=&quot;https://assets.jono.nz/images/korea/DSC02626-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC02530.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Market in Seoul&quot; src=&quot;https://assets.jono.nz/images/korea/DSC02530-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;h2 id=&quot;sokcho-seoraksan-national-park&quot; tabindex=&quot;-1&quot;&gt;Sokcho + Seoraksan National Park &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/07/17/korea/#sokcho-seoraksan-national-park&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We stayed in Sokcho to visit Seoraksan National Park, but also found the city to be really nice too. There’s a lake in the centre which you can walk around, and there’s also a good tourist fish market to visit.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC02780.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Sokcho Lake&quot; src=&quot;https://assets.jono.nz/images/korea/DSC02780-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Getting to Seoraksan on the local bus is frequent &amp;amp; direct, and is well worth the visit. There are a variety of different hikes for different skill levels (cable car is also an option). We walked up to Biseondae Rock, which was a surprisingly easy walk and mostly paved the whole way.&lt;/p&gt;
&lt;p&gt;At the end of the path, we walked up to Geumganggul cave which was the most deceiving 600m walk of my life. The steps are very steep (~200m elevation gain), but the views are absolutely worth it.&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC02748.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Geumganggul cave stairs&quot; src=&quot;https://assets.jono.nz/images/korea/DSC02748-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC02742.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;View from Geumganggul cave&quot; src=&quot;https://assets.jono.nz/images/korea/DSC02742-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;Also, because it’s Korea, we had perfect 5G service the entire hike. There’s also plenty of cafes at the entrance of the park to treat yourself after.&lt;/p&gt;
&lt;h2 id=&quot;jeju-island&quot; tabindex=&quot;-1&quot;&gt;Jeju Island &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/07/17/korea/#jeju-island&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We found Jeju to be very average. The nature is fine, but not particularly impressive when compared to NZ.&lt;/p&gt;
&lt;p&gt;It actually feels quite a lot like suburban USA—the buildings just keep sparsely sprawling over quite a large island that you will need to drive around. Jeju really seems aimed towards people living in Seoul that want to escape the city for a bit, but it’s not somewhere we would recommend going.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC02984.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Sunset from Seongsan Ilchulbong&quot; src=&quot;https://assets.jono.nz/images/korea/DSC02984-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;things-to-do&quot; tabindex=&quot;-1&quot;&gt;Things to do &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/07/17/korea/#things-to-do&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you do decide to go to Jeju, there are a few things we recommend.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Seongsan Ilchulbong:&lt;/strong&gt; We enjoyed the short walk up this mountain and watched the sunset there. The landscape around is quite unique with the surrounding mountains, islands and penisula.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Osulloc Tea Museum:&lt;/strong&gt; This is not a museum, but it is essentially the flagship of the Osulloc tea cafes found around Korea. You can take photos in the tea fields, and taste the tea in the cellar where they mature some of their teas in different wooden barrels. It’s similar energy to Zealong Tea Estate in Waikato.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;gyeongju&quot; tabindex=&quot;-1&quot;&gt;Gyeongju &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/07/17/korea/#gyeongju&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Gyeongju is the historical capital of the Silla Kingdom, and definitely worth a visit. The ancient burial mounds are found across the city, and a few have also been excavated. There are also replicas of Silla architecture around the city.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC03164.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Burial Mound in Gyeongju&quot; src=&quot;https://assets.jono.nz/images/korea/DSC03164-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Near the tombs is &lt;strong&gt;Hwangnidan-gil&lt;/strong&gt;, which is nice with all the cafes and shops in restored hanok houses. The &lt;strong&gt;Woljeonggyo Bridge&lt;/strong&gt; nearby is also really pretty, especially at night.&lt;/p&gt;
&lt;p&gt;We also visited &lt;strong&gt;Bulguksa&lt;/strong&gt;, but wouldn’t consider it essential as it’s a little bit out of the way - there’s plenty of other good temples in Korea.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC03193.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Woljeonggyo Bridge at Night&quot; src=&quot;https://assets.jono.nz/images/korea/DSC03193-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We stayed a couple of nights in Gyeongju, but you could definitely do it as a day trip from Busan if you’re staying near the high speed rail station.&lt;/p&gt;
&lt;h2 id=&quot;busan&quot; tabindex=&quot;-1&quot;&gt;Busan &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/07/17/korea/#busan&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The last stop on our trip was Busan, which is a city that really feels like two cities. It’s both a busy port city, and a place that people go for vacation. It’s definitely worth a visit, and good to do both the city and vacation parts. We probably did a few more touristy things here than the other places we visited.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC03005.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Busan Skyline&quot; src=&quot;https://assets.jono.nz/images/korea/DSC03005-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;neighbourhoods-1&quot; tabindex=&quot;-1&quot;&gt;Neighbourhoods &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/07/17/korea/#neighbourhoods-1&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gamcheon Culture Village&lt;/strong&gt;: This is a hillside village with lots of art (and souvenir shops), but many people also live there. There’s lots of nice views as the brightly painted buildings contrast with the mountains and sea. You can pick up a stamp book at the top, and then do a walking tour of the area collecting all the stamps as you go.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jung-gu&lt;/strong&gt;: There are a lot of markets in this area that cover blocks and blocks. The Jagalchi Fish Market is neat because you choose your fish and then take it upstairs to find a restaurant that will cook it for you. It’s also worth visiting the Lotte Department Store, as there’s a free observation deck on the top floor that has great views of Busan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Haeundae&lt;/strong&gt;: This is the main holiday area with a nice beach and lots of hotels. Unfortunately, a lot of the food is basically a tourist trap, but there is a good cafe street (Haeridan-gil) a little north of the metro station. There’s also a short scenic train and capsule ride (bookings required) that goes around the coast.&lt;/li&gt;
&lt;/ul&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC03064.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Gamcheon Culture Village&quot; src=&quot;https://assets.jono.nz/images/korea/DSC03064-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC03080.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Busan Tower&quot; src=&quot;https://assets.jono.nz/images/korea/DSC03080-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;h3 id=&quot;things-to-do-1&quot; tabindex=&quot;-1&quot;&gt;Things to do &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/07/17/korea/#things-to-do-1&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Spa Land&lt;/strong&gt;: These are hot pools similar to a Japanese Onsen, but with a range of extras. Once you’ve bathed (with optional scrub down), you can rejoin your partner and go to one of many different saunas, enjoy a foot bath outside, have a massage (from a chair or person), have a meal, or just lie on the ground. Highly recommend, especially for the price: around $25 NZD for 4 hours.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Busan Air Cruise&lt;/strong&gt;: Definitely a touristy gondola ride, but it does have good views of the city and beach. There’s also a good seafood place at the bottom of the hill at the terminus. It can be little confronting: the vendors will shout at you a bit and the seafood may still be moving.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC03041.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;View from Busan Gondola&quot; src=&quot;https://assets.jono.nz/images/korea/DSC03041-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;food-to-try&quot; tabindex=&quot;-1&quot;&gt;Food to try &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/07/17/korea/#food-to-try&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We found that the Korean food you get in Auckland is pretty authentic, but there were a few dishes that stood out.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tteokbokki:&lt;/strong&gt; The tteokbokki in Korea is much larger and more QQ than you find in Auckland.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bossam:&lt;/strong&gt; While you can get this in Auckland, in Korea it’s common to also have perilla leaf as a wrapping as well as normal lettuce. There is also &lt;strong&gt;Jokbal&lt;/strong&gt;, which is similar but uses pork hock instead of pork belly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gopchang:&lt;/strong&gt; This is beef/pork intestine either grilled on a BBQ, or found in a hot pot. We also had it with a &lt;strong&gt;Nakji&lt;/strong&gt; stir-fry. It’s surprisingly good but more expensive than normal cuts of meat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hanjeongsik:&lt;/strong&gt; This is a meal where you get a large number of small different dishes. It’s definitely an experience, and good way to try a lot of different things.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC02609.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Jokbal&quot; src=&quot;https://assets.jono.nz/images/korea/DSC02609-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It’s also worth noting that a lot of food in Korea is designed for sharing, so it could be a bit limiting if you are traveling solo.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC02621.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Jongo at night&quot; src=&quot;https://assets.jono.nz/images/korea/DSC02621-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also, the only good zero sugar drinks are makgeolli &amp;amp; soju.&lt;/p&gt;
&lt;h2 id=&quot;transport&quot; tabindex=&quot;-1&quot;&gt;Transport &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/07/17/korea/#transport&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Korea is more walkable than many other places in Asia and there are some really great streets. It’s generally enjoyable to take public transport and walk, but there are also plenty of places that really need a road diet. It can sometimes take a very long time to cross the road!&lt;/p&gt;
&lt;jc-image-flex&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC02645.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Street in Mullae-dong&quot; src=&quot;https://assets.jono.nz/images/korea/DSC02645-small.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC02649.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Alley in Mullae-dong&quot; src=&quot;https://assets.jono.nz/images/korea/DSC02649-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/jc-image-flex&gt;
&lt;p&gt;Both the Seoul &amp;amp; Busan metros cover the city pretty well, but the frequency can be lacking on some lines. Generally, the numbered metro lines are better. Most bus routes were frequent too, even in the small cities - we only had to take a taxi once.&lt;/p&gt;
&lt;p&gt;We didn’t have any issues getting tickets for long distance buses &amp;amp; trains and just bought them 20 minutes before departure. It wasn’t peak season (middle of summer), so it may be worth booking online if things are busier. Korea has high speed rail between the main centres, which we found to be both frequent and reasonably priced.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC03090.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; alt=&quot;Boats at fish market in Busan&quot; src=&quot;https://assets.jono.nz/images/korea/DSC03090-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We hired a car to travel around Jeju. There were a lot of speed cameras everywhere with a constantly changing speed limit, so it does take more mental energy to drive. Other drivers were also not very good, probably because they’re from places like Seoul (or other Asian cities with good public transport) so they don’t drive often&lt;/p&gt;
&lt;p&gt;I saw a few smashed up rental cars on Jeju, as well as questionable behavior like driving with wing mirrors folded in. Parking wasn’t an issue, but I wouldn’t generally recommend driving in Korea unless you need to (i.e on Jeju).&lt;/p&gt;
&lt;h2 id=&quot;payments&quot; tabindex=&quot;-1&quot;&gt;Payments &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/07/17/korea/#payments&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You can almost get away without cash, but you will need a physical card. Most places are chip + signature, and contactless is uncommon. There are lots of signs for Samsung Pay, but it’s actually for the cursed MST technology where your phone emulates a magnetic strip.&lt;/p&gt;
&lt;p&gt;Cash is useful for markets (although some vendors take card too), but you will need cash to top up your T-Money transit card. They have lots of different designs and you can shop around convenience stores to find one you like. The card works across buses and trains throughout the entire country, and you can top it up at stations or convenience stores, but it needs to be in cash.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://assets.jono.nz/images/korea/DSC02363.jpg&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://assets.jono.nz/images/korea/DSC02363-small.jpg&quot; alt=&quot;Changing of the guard at Gyeongbokgung Palace&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;etiquette&quot; tabindex=&quot;-1&quot;&gt;Etiquette &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/07/17/korea/#etiquette&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Korea is extremely safe when it comes to theft. At most cafes you find a seat first before ordering, and people leave their phone/wallet/bags on the table to reserve them - even if the table is outside on the street. When you’re done with your food, you also need to return the tray back to the counter.&lt;/p&gt;
&lt;p&gt;A lot of signage is in English (especially for transport), and most restaurants will have a kiosk or a multilingual menu. It’s a good idea to learn a few basic words, but people don’t mind if you show them a translation on your phone.&lt;/p&gt;
&lt;p&gt;Other than that, don’t sit in the priority seats on the metro, 1+1 means buy one get one free, doors open outward, and fire extinguishers are on the ground.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Desktop Linux in 2025</title>
		<link href="https://jono.nz/2025/02/09/desktop-linux-2025/"/>
		<updated>2025-02-09T12:00:00Z</updated>
		<id>https://jono.nz/2025/02/09/desktop-linux-2025/</id>
		<content type="html">&lt;p&gt;I’ve been running Linux on my main computer again for 6 months now, after not having used it on the desktop for 10 years. I’ve mostly been very happy, and I don’t miss Windows 11 at all.&lt;/p&gt;
&lt;p&gt;When trying to solve issues on Linux, you tend to find a lot of random information on personal websites and forum posts, so here’s my contribution to that. I’m currently running Fedora 41 (GNOME), but many of these tips &amp;amp; issues will apply to all distros.&lt;/p&gt;
&lt;h2 id=&quot;hardware-issues-and-fixes&quot; tabindex=&quot;-1&quot;&gt;Hardware Issues &amp;amp; Fixes &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/02/09/desktop-linux-2025/#hardware-issues-and-fixes&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’m running this on my desktop, but the laptop issues of the past (e.g no WiFi) don’t seem to be issues anymore.&lt;/p&gt;
&lt;h3 id=&quot;usb-devices-not-being-detected&quot; tabindex=&quot;-1&quot;&gt;USB devices not being detected &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/02/09/desktop-linux-2025/#usb-devices-not-being-detected&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Initially, only my mouse and keyboard was being detected. I fixed this by &lt;strong&gt;turning on IOMMU&lt;/strong&gt; in the UEFI BIOS. Kind of weird, but everything was detected afterwards.&lt;/p&gt;
&lt;h3 id=&quot;nvidia-drivers&quot; tabindex=&quot;-1&quot;&gt;Nvidia Drivers &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/02/09/desktop-linux-2025/#nvidia-drivers&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Unfortunately, this is still painful today. I actually had a good experience on Fedora 40 where everything worked out of the box, but my computer would no longer suspend after upgrading to Fedora 41—it either wouldn’t go to sleep at all, freeze trying to go to sleep, or freeze trying to wake up.&lt;/p&gt;
&lt;p&gt;After lots of trial and error, the configuration I’ve found with working supend on Fedora 41 is using the &lt;strong&gt;570.86.16 Nvidia Drivers&lt;/strong&gt; from the &lt;a href=&quot;https://negativo17.org/nvidia-driver/&quot;&gt;negativo17 repo&lt;/a&gt;, combined with &lt;strong&gt;Linux Kernel 6.13.1&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I still can’t seem to get hardware accelerated AV1 decoding to work properly, but other codecs seem to work fine. I  wouldn’t recommend buying an Nvidia card for Linux, but the RTX 4060 is the only decent spec card that fits in &lt;a href=&quot;https://teenage.engineering/products/computer-1&quot;&gt;my case&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also, good to remember the &lt;code&gt;akmods --rebuild&lt;/code&gt; command for when the kernel updates but the Nvidia driver didn’t get rebuilt with it.&lt;/p&gt;
&lt;h3 id=&quot;flickering-on-monitor&quot; tabindex=&quot;-1&quot;&gt;Flickering on monitor &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/02/09/desktop-linux-2025/#flickering-on-monitor&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is actually a problem with my monitor’s FreeSync implementation, and was a problem on Windows too. Turning off VRR in the GNOME display settings didn’t work, so disabling it in the monitor OSD did the trick.&lt;/p&gt;
&lt;h2 id=&quot;tips&quot; tabindex=&quot;-1&quot;&gt;Tips &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/02/09/desktop-linux-2025/#tips&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;enable-airplay&quot; tabindex=&quot;-1&quot;&gt;Enable AirPlay &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/02/09/desktop-linux-2025/#enable-airplay&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I have a bunch of Sonos speakers around the house, and it’s nice to use AirPlay from your computer sometimes. This is easy to set up, just create a file &lt;code&gt;~/config/pipewire/pipewire.conf.d/raop-discover.conf&lt;/code&gt; with the following contents:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;context.modules = [
  {
    name = libpipewire-module-raop-discover
    args = { }
  }
]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;use-rdp-from-a-mac&quot; tabindex=&quot;-1&quot;&gt;Use RDP from a Mac &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/02/09/desktop-linux-2025/#use-rdp-from-a-mac&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Using the built in GNOME RDP server works fine from a Windows client, but I received &lt;code&gt;Error code: 0x207&lt;/code&gt; from the Mac RDP client.&lt;/p&gt;
&lt;p&gt;To fix this, export the server configuration and then pop it open a text editor. Find the line &lt;code&gt;use redirection server name:i:0&lt;/code&gt; and change it to &lt;code&gt;use redirection server name:i:1&lt;/code&gt;. Open the RDP file/import it, and it should fix the error.&lt;/p&gt;
&lt;h3 id=&quot;adjust-monitor-brightness&quot; tabindex=&quot;-1&quot;&gt;Adjust monitor brightness &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/02/09/desktop-linux-2025/#adjust-monitor-brightness&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;On Windows I was using &lt;a href=&quot;https://github.com/emoacht/Monitorian&quot;&gt;Monitorian&lt;/a&gt; for this, but I found this &lt;a href=&quot;https://extensions.gnome.org/extension/4652/adjust-display-brightness/&quot;&gt;GNOME extension&lt;/a&gt; which works even better. The &lt;a href=&quot;https://extensions.gnome.org/extension/7281/display-configuration-switcher/&quot;&gt;display configuration switcher extension&lt;/a&gt; is also super useful if you have multiple monitors.&lt;/p&gt;
&lt;h3 id=&quot;reboot-into-uefi&quot; tabindex=&quot;-1&quot;&gt;Reboot into UEFI &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/02/09/desktop-linux-2025/#reboot-into-uefi&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I also recommend a &lt;a href=&quot;https://extensions.gnome.org/extension/5105/reboottouefi/&quot;&gt;GNOME extension&lt;/a&gt; for this.&lt;/p&gt;
&lt;h3 id=&quot;play-windows-games-through-steam&quot; tabindex=&quot;-1&quot;&gt;Play Windows games through Steam &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/02/09/desktop-linux-2025/#play-windows-games-through-steam&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;By default Steam will only show you games that have been verified to work on Linux. However, most games will just work - open the &lt;strong&gt;Steam Settings → Compatibility&lt;/strong&gt;, and &lt;strong&gt;Enable Steam Play for all other titles&lt;/strong&gt;. I just use Proton Experimental, and have yet to find a Windows game that doesn’t work (although I don’t play any games with anticheat).&lt;/p&gt;
&lt;p&gt;For playing games through the Epic Game Store and EA, I’ve had good success with &lt;a href=&quot;https://lutris.net/&quot;&gt;Lutris&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;other-good-software&quot; tabindex=&quot;-1&quot;&gt;Other good software &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2025/02/09/desktop-linux-2025/#other-good-software&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ventoy.net/en/index.html&quot;&gt;Ventoy&lt;/a&gt; - This is useful for the install. Write this to a USB drive, and then you can just drag and drop operating system .iso files into the filesystem, rather than overriding the contents of the drive every time.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://flathub.org/apps/org.freedesktop.Piper&quot;&gt;Piper&lt;/a&gt; - This is a great tool for configuring a Logitech gaming mouse.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://missioncenter.io/&quot;&gt;Mission Center&lt;/a&gt; - A Windows 10/11 style task manager—a big improvement over the default GNOME system monitor.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pinta-project.com/&quot;&gt;Pinta&lt;/a&gt; - A basic drawing app, very similar to Paint.NET.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/&quot;&gt;Tailscale&lt;/a&gt; - Join all your devices into a secure VPN. The Linux version is command line based, but there’s a great &lt;a href=&quot;https://extensions.gnome.org/extension/5112/tailscale-status/&quot;&gt;GNOME extension&lt;/a&gt; for it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sublimetext.com/&quot;&gt;Sublime Text&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://www.sublimemerge.com/&quot;&gt;Sublime Merge&lt;/a&gt; - It’s been my favourite text editor for 10+ years and their git client is great too.&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Gradiator</title>
		<link href="https://jono.nz/2024/09/17/gradiator/"/>
		<updated>2024-09-17T12:00:00Z</updated>
		<id>https://jono.nz/2024/09/17/gradiator/</id>
		<content type="html">&lt;p&gt;In 2011, we released Gradiator—a Mac &amp;amp; Linux app to create CSS3 gradients. This was one of the first apps I worked on, along with &lt;a href=&quot;https://czabania.com&quot;&gt;George Czabania&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Yesterday, I spent a couple of hours restoring it, so you can try it out in your web browser:&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;https://jono.nz/projects/gradiator/&quot;&gt;Gradiator&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-was-gradiator&quot; tabindex=&quot;-1&quot;&gt;What was Gradiator? &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2024/09/17/gradiator/#what-was-gradiator&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When CSS3 first came out, it introduced CSS gradients. Skeuomorphism was quite popular in design at the time so the use of CSS gradients became popular very quickly.&lt;/p&gt;
&lt;p&gt;However, creating these gradients was a little bit annoying. Vendor prefixes were still a thing, and different browsers had new and legacy syntax.&lt;/p&gt;
&lt;p&gt;Gradiator solved these problems by generating all the vendor specific code, and providing a nice interface to create &amp;amp; save gradients.&lt;/p&gt;
&lt;h2 id=&quot;why-couldn-t-it-run-in-a-web-browser-in-2011&quot; tabindex=&quot;-1&quot;&gt;Why couldn’t it run in a web browser in 2011? &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2024/09/17/gradiator/#why-couldn-t-it-run-in-a-web-browser-in-2011&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There were a couple of web based gradient generators at the time but we decided to ship “native” apps for Mac &amp;amp; Linux. This was for two reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You couldn’t get access to the system color picker—we really wanted the app to be able to pick a color from the screen.&lt;/li&gt;
&lt;li&gt;Copying to the clipboard was not possible without Adobe Flash.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get around these limitations we wrapped up the HTML using the native webviews for each platform, and had a bit of Python/Objective-C to pass messages between JS and the native APIs. It was super nasty: it would set &lt;code&gt;document.title&lt;/code&gt; to send a message to the other context. There was probably a better way of doing it, but we didn’t really know what we were doing at the time.&lt;/p&gt;
&lt;p&gt;This predated Electron by a couple of years, and it’s why we never released a version for Windows—EdgeHTML was still 4 years away.&lt;/p&gt;
&lt;h2 id=&quot;a-code-review-on-your-13-year-old-code&quot; tabindex=&quot;-1&quot;&gt;A code review on your 13 year old code &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2024/09/17/gradiator/#a-code-review-on-your-13-year-old-code&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When we originally wrote it, I was about half the age I am now. I honestly think it holds up pretty well and it’s more just a product of it’s time—a 2500 line JS file with plenty of jQuery.&lt;/p&gt;
&lt;p&gt;I’ve lost the original source code, which I believe used CoffeeScript and Sass. This was created before using a compiler and build system for JavaScript became popular, so the transform to JavaScript and CSS was actually very basic.&lt;/p&gt;
&lt;p&gt;Making the tweaks to make it run today wasn’t difficult. To view the GPL source, you can use &lt;em&gt;view source&lt;/em&gt; in your browser.&lt;/p&gt;
&lt;h2 id=&quot;changes-to-get-it-working&quot; tabindex=&quot;-1&quot;&gt;Changes to get it working &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2024/09/17/gradiator/#changes-to-get-it-working&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I pulled the source out of the last Linux package and made a couple of changes to get it running:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A system color picker is implemented with &lt;code&gt;input[type=color]&lt;/code&gt; (&lt;a href=&quot;https://caniuse.com/input-color&quot;&gt;good browser support circa 2019&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Copying to the clipboard is implemented using &lt;code&gt;navigator.clipboard&lt;/code&gt; (&lt;a href=&quot;https://caniuse.com/mdn-api_navigator_clipboard&quot;&gt;good browser support circa 2020&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apart from fixing up a couple odd layout issues, it basically just works. I also upgraded jQuery 1.7 to 3.7 just by swapping a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag.&lt;/p&gt;
&lt;p&gt;There’s definitely something to be said for this older style of web development.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jono.nz/projects/gradiator/&quot;&gt;jono.nz/projects/gradiator&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>CSS features I’ve been using recently</title>
		<link href="https://jono.nz/2024/09/01/css-features-2024/"/>
		<updated>2024-09-01T10:30:00Z</updated>
		<id>https://jono.nz/2024/09/01/css-features-2024/</id>
		<content type="html">&lt;p&gt;While recently redesigning this site and working on &lt;a href=&quot;https://turbomaps.io/blog&quot;&gt;new Turbomaps features&lt;/a&gt;, I took the opportunity to use a few CSS techniques new to me. Here’s a list of CSS features I recommend taking a look at.&lt;/p&gt;
&lt;h2 id=&quot;wide-gamut-color&quot; tabindex=&quot;-1&quot;&gt;Wide gamut color &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2024/09/01/css-features-2024/#wide-gamut-color&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Plenty of devices these days have wide gamut displays that can display more than just sRGB, and make colors really &lt;em&gt;“pop”&lt;/em&gt;. There’s a bunch of different methods for authoring these in CSS, but I recommend using &lt;code&gt;oklch()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In fact, you can just use &lt;code&gt;oklch()&lt;/code&gt; by default. Unlike &lt;code&gt;hsl()&lt;/code&gt; the lightness is uniform, so you can predictably create color palettes based off a single color. If your chosen color is in the P3 gamut, you may want to specify a fallback color in sRGB.&lt;/p&gt;
&lt;p&gt;The OKLCH color picker is very nice for playing around with this.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://oklch.com/&quot;&gt;oklch.com&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;system-font-stacks&quot; tabindex=&quot;-1&quot;&gt;System font stacks &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2024/09/01/css-features-2024/#system-font-stacks&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While I love web fonts, especially variable ones, you don’t always need to use them. I just used system fonts for this site and tweaked the families and weights a little to ensure everything is legible across platforms.&lt;/p&gt;
&lt;p&gt;I’ve learned to accept the quality of text rendering across platforms differs anyway, so using a completely different font isn’t such a bad thing.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://jono.nz/2024/09/01/css-features-2024/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/system-fonts/modern-font-stacks&quot;&gt;github.com/system-fonts/modern-font-stacks&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;html-web-components&quot; tabindex=&quot;-1&quot;&gt;HTML web components &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2024/09/01/css-features-2024/#html-web-components&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;HTML custom elements have been around for a while now, and they seem like they’re a really good choice for building out a component library. The idea is that you can wrap existing native elements with your custom HTML elements, style with CSS, and &lt;em&gt;progressively enhance&lt;/em&gt; with JavaScript.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;my-button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;bg&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;green&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Click me&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;my-button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Writing components in this way plays nicely with server side rendering, and provides an easy way to scope styles. Many of the attributes you would usually pass into a React component can just be native HTML attributes, and styled with CSS. No Shadow DOM required!&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;my-button[bg=&quot;green&quot;] &gt; button&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; green&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I found &lt;a href=&quot;https://adactio.com/journal/20618&quot;&gt;Jeremy Keith’s article&lt;/a&gt; to be particularly compelling. I’ve had success with HTML web components in my projects so far, and would highly recommend considering them for any design system or component library.&lt;/p&gt;
&lt;h2 id=&quot;styling-with-accessibility-attributes&quot; tabindex=&quot;-1&quot;&gt;Styling with accessibility attributes &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2024/09/01/css-features-2024/#styling-with-accessibility-attributes&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When implementing custom UI, you should be using &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA&quot;&gt;ARIA roles and attributes&lt;/a&gt;. However, you might be tempted to add additional classes to handle the styling. But you could just not—keep things simple and target the ARIA attribute.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;your-element&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-disabled&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;disabled&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;
&lt;span class=&quot;token comment&quot;&gt;/* Instead of introducing an extra class for styling: */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;your-element.disabled&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; gray&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* You can just target the ARIA attribute: */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;your-element[aria-disabled=&quot;true&quot;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; gray&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I find writing CSS in this way helps me keep accessibility top of mind.&lt;/p&gt;
&lt;h2 id=&quot;is&quot; tabindex=&quot;-1&quot;&gt;:is &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2024/09/01/css-features-2024/#is&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This can make your code much less verbose and more readable. I’ve noticed it’s particularly helpful when you’ve got lots of different attributes.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Instead of adding separate selectors: */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;your-element[bg=&quot;red&quot;], your-element[bg=&quot;green&quot;], your-element[bg=&quot;blue&quot;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* You can simplify it to the following: */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;your-element:is([bg=&quot;red&quot;], [bg=&quot;green&quot;], [bg=&quot;blue&quot;])&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/:is&quot;&gt;developer.mozilla.org/en-US/docs/Web/CSS/:is&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;avif&quot; tabindex=&quot;-1&quot;&gt;AVIF &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2024/09/01/css-features-2024/#avif&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This one isn’t a CSS feature, but AVIF is too good not to mention. The file sizes are tiny, browser support is great, and almost every modern piece of hardware has built in AV1 decode.&lt;/p&gt;
&lt;p&gt;For images on the web, I recommend:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don’t bother with WebP.&lt;/li&gt;
&lt;li&gt;Start with a minimum of 2x scale—you don’t need a 1x image.&lt;/li&gt;
&lt;li&gt;Use the &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element for a JPG/PNG fallback if you have to.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I was using webp for a while on this blog, but I’ve now switched all the recent content to AVIF. I used the &lt;a href=&quot;https://www.11ty.dev/docs/plugins/image/&quot;&gt;11ty image plugin&lt;/a&gt;, but if you’re not processing images at build time you can use &lt;code&gt;npx avif&lt;/code&gt; to easily convert a whole directory.&lt;/p&gt;
&lt;p&gt;AVIF requires a decent amount of compute to encode, so I would not recommend conversion at runtime (i.e using some SaaS service).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture&quot;&gt;developer.mozilla.org/en-US/docs/Web/HTML/Element/picture&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;text-decoration&quot; tabindex=&quot;-1&quot;&gt;text-decoration-* &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2024/09/01/css-features-2024/#text-decoration&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I always just assumed &lt;code&gt;text-decoration&lt;/code&gt; could only be &lt;code&gt;underline&lt;/code&gt;, &lt;code&gt;dotted&lt;/code&gt;, &lt;code&gt;dashed&lt;/code&gt;, or &lt;code&gt;none&lt;/code&gt;. Turns out you can set the thickness, distance, color, and more.&lt;/p&gt;
&lt;p&gt;Upon learning this, I went with some fancy dotted links on this site. They even animate on hover.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/text-decoration&quot;&gt;developer.mozilla.org/en-US/docs/Web/CSS/text-decoration&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;text-wrap-pretty&quot; tabindex=&quot;-1&quot;&gt;text-wrap: pretty &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2024/09/01/css-features-2024/#text-wrap-pretty&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This one is subtle, but a nice improvement for blog posts and documentation. You probably don’t want to apply this everywhere as it does negatively impact performance.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/text-wrap&quot;&gt;developer.mozilla.org/en-US/docs/Web/CSS/text-wrap&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;scrollbar-color&quot; tabindex=&quot;-1&quot;&gt;scrollbar-color &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2024/09/01/css-features-2024/#scrollbar-color&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I don’t find myself often needing to customize the scrollbar, but it can be good for scrollable containers within the main page (e.g the Turbomaps sidebar).&lt;/p&gt;
&lt;p&gt;You can use &lt;code&gt;scrollbar-color&lt;/code&gt; to customize the track and thumb, and &lt;code&gt;scrollbar-width&lt;/code&gt; if you’re careful.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-color&quot;&gt;developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-color&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;animated-masks&quot; tabindex=&quot;-1&quot;&gt;Animated Masks &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2024/09/01/css-features-2024/#animated-masks&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I recently came across a loading spinner implemented as an animated SVG. While great in theory, it turns out that SVG animations don’t start until the &lt;code&gt;onload&lt;/code&gt; event. This can make it problematic if you’re using the loading spinner in a &lt;em&gt;Single Page App&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ideally, you should be server side rendering, but if it has to be a SPA you can use a CSS animation instead. Many loading spinners are easy to do with CSS animations—often just a &lt;code&gt;transform: rotate(360deg)&lt;/code&gt;, but I was given a spinner than was clipping the path of a outlined square.&lt;/p&gt;
&lt;p&gt;You may be tempted to use &lt;a href=&quot;https://caniuse.com/mdn-css_properties_clip-path_is_animatable&quot;&gt;clip path animations&lt;/a&gt;, but I learned it’s still not supported in Safari. Instead, you may be able to use CSS masks and animate the position(s) to achieve the same effect.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; loader&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;mask-position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 50px 50px&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; -50px -50px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;mask-position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 25px -25px&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; -25px 25px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;your-loader&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* the linear-gradient() just generates some square &quot;images&quot; */&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;mask&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#000&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #000&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#000&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #000&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1s loader infinite ease&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 50px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 50px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/mask&quot;&gt;developer.mozilla.org/en-US/docs/Web/CSS/mask&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;dialog&quot; tabindex=&quot;-1&quot;&gt;&amp;lt;dialog&amp;gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2024/09/01/css-features-2024/#dialog&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’ve found that the HTML &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; element is not only good for modals, but dropdown &amp;amp; right-click menus too. They’re now used extensively throughout Turbomaps.&lt;/p&gt;
&lt;p&gt;However, they’re a bit tricky to animate. The trick is to use an animation in, but a transition out combined with &lt;code&gt;allow-discrete&lt;/code&gt;. You can also use &lt;code&gt;@starting-style&lt;/code&gt; instead of an animation, but the browser support still needs to improve.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; show&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;dialog&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;transition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    100ms ease-out opacity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    overlay 100ms ease-out allow-discrete&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    display 100ms ease-out allow-discrete&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;dialog[open]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100ms ease-out show 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* animate in, but use transition out */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Depending on your needs, the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/popover&quot;&gt;popover attribute&lt;/a&gt; may be better than a &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;, but the same animation techniques still apply.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/transition-behavior&quot;&gt;developer.mozilla.org/en-US/docs/Web/CSS/transition-behavior&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I will fight you if you think macOS has better text rendering than Windows. &lt;a href=&quot;https://jono.nz/2024/09/01/css-features-2024/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content>
	</entry>
	
	<entry>
		<title>Auckland’s Rapid KFC Network</title>
		<link href="https://jono.nz/2022/07/15/rapid-kfc/"/>
		<updated>2022-07-15T18:00:00Z</updated>
		<id>https://jono.nz/2022/07/15/rapid-kfc/</id>
		<content type="html">&lt;p&gt;I spent 30 minutes making a dumb map the other day, but figured it’s worth a post here as it went &lt;a href=&quot;https://www.nzherald.co.nz/lifestyle/hop-on-hop-off-tuck-in-aucklands-rapid-transit-kfc-map/YRDOFXP2V3DSJWJR2BR756SG54/&quot;&gt;somewhat viral&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/s2XAu0dbdV-1640.avif 1640w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/s2XAu0dbdV-1640.webp&quot; alt=&quot;Map of Auckland rapid transit stations within walking distance from a KFC&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1640&quot; height=&quot;1776&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I was mostly just messing around with Photoshop on the iPad editing Auckland Transport’s excellent &lt;a href=&quot;https://at.govt.nz/media/1989560/auckland-s-rapid-transit-network-map.pdf&quot;&gt;rapid transit map&lt;/a&gt;. Photoshop on iPad on the other hand, is not so excellent. Hopefully it continues to improve.&lt;/p&gt;
&lt;p&gt;There’s a couple of spots that were on the cusp of making the cut - Manukau &amp;amp; Akoranga. It’s really not the distance that’s the issue for these ones, but the oversized roads that you need to cross. Otahuhu almost made it, but the station is just a bit too far from the town centre. Hopefully one day, the town centre will sprawl all the way to the station.&lt;/p&gt;
&lt;p&gt;There is a general lack of shops integrated into stations in Auckland. With the exception of Britomart, the most you’ll get is a coffee stand in the concourse. It’s not for a lack of space either, just ambition. Would love to see our stations become more like Hong Kong, or even Sydney.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/s6uARUqZ0O-940.avif 940w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/s6uARUqZ0O-940.webp&quot; alt=&quot;Tweet ended up on the KFC instagram story&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;940&quot; height=&quot;764&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;How many of the KFCs have I actually visited on this map? Only Britomart, Newmarket, Panmure, Sylvia Park, and Auckland Airport. As much as I love KFC, I won’t be taking up the challenge to hit all of these in a single day.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Same Scale</title>
		<link href="https://jono.nz/2021/09/04/samescale/"/>
		<updated>2021-09-04T18:00:00Z</updated>
		<id>https://jono.nz/2021/09/04/samescale/</id>
		<content type="html">&lt;p&gt;Every city is different, and those differences are reflected in our maps. I find it really interesting that our the differences in landscape and urban form manifest themselves in these maps, and it’s cool to be able to directly compare two cities side by side.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/78x7cusjoh-1428.avif 1428w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/78x7cusjoh-1428.webp 1428w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/78x7cusjoh-1428.png&quot; alt=&quot;Auckland &amp;amp; Sydney Side by Side&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1428&quot; height=&quot;905&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;However, I’ve never been particularly happy with the tools that exist to do this. So I made one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://scale.waka.app&quot;&gt;scale.waka.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;why-it-s-better&quot; tabindex=&quot;-1&quot;&gt;Why it’s better? &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2021/09/04/samescale/#why-it-s-better&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I think this is a huge improvement over other tools, as it uses vector maps. This means you can zoom to any fraction (no jump in zoom levels), rotate the maps, and even tilt in 3D. I’ve also thrown in an option to switch to a satellite view, so you can see some of the differences in land use.&lt;/p&gt;
&lt;p&gt;You can also search for a location, to save you having to scroll around, and it works nicely on mobile too! I’ve also thrown in a few sample cities that I think are similar.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Sydney &amp;amp; Auckland:&lt;/em&gt; Both coastal cities in Oceania, founded in a similar time period&lt;/li&gt;
&lt;li&gt;&lt;em&gt;New York &amp;amp; Hong Kong:&lt;/em&gt; Both tiny, super dense island cities!&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Canberra &amp;amp; Washington, D.C.&lt;/em&gt;: Both planned federal capitals, created for similar reasons&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;was-it-hard-to-make&quot; tabindex=&quot;-1&quot;&gt;Was it hard to make? &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2021/09/04/samescale/#was-it-hard-to-make&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Not really! I did most of it in a morning. It was basically a matter of creating two &lt;a href=&quot;https://mapbox.com&quot;&gt;Mapbox&lt;/a&gt; maps, and syncing the events between them.&lt;/p&gt;
&lt;p&gt;The hardest part was syncing the zooms. Because of Web Mercator projection, the same zoom level at different latitudes doesn’t necessarily mean things will be the same scale. I spent (admittedly too much) time on coming up with an equation to translate the zoom levels between the two maps. If you’re curious, here’s the equation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;zoom2 = log&lt;sub&gt;2&lt;/sub&gt;( |cos(lat2)| / |cos(lat1)| / 2&lt;sup&gt;zoom1&lt;/sup&gt; )&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Other than that, it was pretty straightforward! The code is open source—you can go take a look over at &lt;a href=&quot;https://github.com/consindo/samescale&quot;&gt;https://github.com/consindo/samescale&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;is-it-finished&quot; tabindex=&quot;-1&quot;&gt;Is it finished? &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2021/09/04/samescale/#is-it-finished&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yes. It’s nice to actually be able to call a piece of software finished.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://scale.waka.app&quot;&gt;scale.waka.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Waka Commuter</title>
		<link href="https://jono.nz/2020/08/23/waka-commuter/"/>
		<updated>2020-08-23T11:45:00Z</updated>
		<id>https://jono.nz/2020/08/23/waka-commuter/</id>
		<content type="html">&lt;p&gt;I recently built a data visualization for a &lt;a href=&quot;https://www.stats.govt.nz/news/winner-announced-for-2018-census-commuter-data-visualisation-competition&quot;&gt;NZ Census data competition&lt;/a&gt;, and ended up winning! I figured I would go through some of the thinking behind it, as well as how I built it.&lt;/p&gt;
&lt;jc-center&gt;
  &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Congrats &lt;a href=&quot;https://twitter.com/consindo?ref_src=twsrc%5Etfw&quot;&gt;@consindo&lt;/a&gt;! Using Census data, Jono has developed a very cool way of showing where people all over NZ (usually) travel to and from for work and study. &lt;a href=&quot;https://t.co/oAamoSmVjB&quot;&gt;https://t.co/oAamoSmVjB&lt;/a&gt; &lt;a href=&quot;https://t.co/ieIv9LbW4h&quot;&gt;https://t.co/ieIv9LbW4h&lt;/a&gt;&lt;/p&gt;&amp;mdash; James Shaw (@jamespeshaw) &lt;a href=&quot;https://twitter.com/jamespeshaw/status/1294100223547990017?ref_src=twsrc%5Etfw&quot;&gt;August 14, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/jc-center&gt;
&lt;h2 id=&quot;the-idea&quot; tabindex=&quot;-1&quot;&gt;The idea &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/08/23/waka-commuter/#the-idea&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My overall goal with the app was to make the &lt;a href=&quot;https://datafinder.stats.govt.nz/data/category/census/2018/commuter-view/&quot;&gt;commuter view data&lt;/a&gt; as accessible as possible, so I started by creating a visualization familiar to many people: an election map. Elections can be quite binary, so I found that this visual representation translates well to arrivals &amp;amp; departures for a geographical area. While colours are pretty, I also wanted make this tool useful to real people, so I added some additional insights to complement the main map.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/wUGBY91g6e-1366.avif 1366w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/wUGBY91g6e-1366.webp 1366w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/wUGBY91g6e-1366.png&quot; alt=&quot;Waka Commuter Map View&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1366&quot; height=&quot;980&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Upon selecting a region, you’re presented with a text summary and a more abstract bubble view of arrivals &amp;amp; departures. This visualization still aims to be roughly spacial, but ignores land area and uses commuter volumes instead. A chart showing the overall travel modes is also included as this can provide additional context to people’s travel patterns. Due to data suppression, I was not able to use the commuter view dataset, and used the &lt;a href=&quot;http://nzdotstat.stats.govt.nz/WBOS/Index.aspx?DataSetCode=TABLECODE8296&quot;&gt;aggregated census data instead&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/lVSsbamXfk-1802.avif 1802w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/lVSsbamXfk-1802.webp 1802w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/lVSsbamXfk-1802.png&quot; alt=&quot;Waka Commuter Insights&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1802&quot; height=&quot;1452&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I included options to filter by arrivals/departures &amp;amp; work/education. Patterns can be quite different, so it’s fun to toggle the options and see the visualizations update in real-time! As the SA2 boundaries are small, you can also Ctrl+Click to multi-select and view insights for larger areas (e.g an entire city centre).&lt;/p&gt;
&lt;p&gt;Lastly, I ensured the app worked on mobile devices to make it accessible to the largest number of people. A few features are omitted, but is still useful and should encourage people to try the app on a PC for more detailed insights.&lt;/p&gt;
&lt;h2 id=&quot;how-i-built-it&quot; tabindex=&quot;-1&quot;&gt;How I built it &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/08/23/waka-commuter/#how-i-built-it&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Quickly. It’s not my best work, but I’ve &lt;a href=&quot;https://github.com/consindo/commuterview&quot;&gt;open sourced it on GitHub anyway&lt;/a&gt;. I had a couple of goals though, and they informed the tech I used.&lt;/p&gt;
&lt;h3 id=&quot;serverless&quot; tabindex=&quot;-1&quot;&gt;Serverless &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/08/23/waka-commuter/#serverless&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Databases are great, but they can be expensive to run. It’s also just something to maintain, and I really want this app to work forever and not worry about it.&lt;/p&gt;
&lt;p&gt;As the dataset doesn’t change (except when there’s a new Census!), I wrote some scripts to process all the data and output a JSON file for each area unit. You end up with a lot of files (2,474), but it becomes a psuedo-API.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/mWJj5s2ioA-1238.avif 1238w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/mWJj5s2ioA-1238.webp 1238w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/mWJj5s2ioA-1238.png&quot; alt=&quot;Waka Commuter psuedo-API&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1238&quot; height=&quot;472&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I ended up using &lt;a href=&quot;https://netlify.com&quot;&gt;Netlify&lt;/a&gt; to deploy it, mostly because I can’t use GitHub pages with more than one custom domain (already using it for this site). I’m impressed though—you just point it to your GitHub repo, it builds everything really quickly, and then kinda just works—SSL etc is all sorted. I’ll definitely be using it more in the future.&lt;/p&gt;
&lt;h3 id=&quot;maps&quot; tabindex=&quot;-1&quot;&gt;Maps &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/08/23/waka-commuter/#maps&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://waka.app&quot;&gt;Waka&lt;/a&gt; currently uses &lt;a href=&quot;https://leafletjs.com/&quot;&gt;Leaflet&lt;/a&gt;, but I decided to use &lt;a href=&quot;https://github.com/mapbox/mapbox-gl-js&quot;&gt;mapbox-gl-js&lt;/a&gt; for this project. I’m happy I did though, as vector maps provide a much better user experience—it not only loads faster, but you can zoom to any level, animate smoothly, rotate etc. I would love to find some time to move Waka over to vector maps in the future.&lt;/p&gt;
&lt;p&gt;It has a pretty nice styling system, that’s almost like writing a stylesheet for geojson. You define what you want it to look like when the data meets certain conditions, and it more or less just works.&lt;/p&gt;
&lt;p&gt;The only other thing to note is that I optimized the &lt;a href=&quot;https://datafinder.stats.govt.nz/layer/98970-statistical-area-2-2019-generalised/&quot;&gt;SA2 boundries&lt;/a&gt;, as they are all loaded when the user loads the app. I ran the dataset through &lt;a href=&quot;https://mapshaper.org/&quot;&gt;mapshaper.org&lt;/a&gt;, and it simplified the geometry somewhat. I also ripped out the unnecessary metadata, cut the filesize from 21MB to 945KB gzipped as a result.&lt;/p&gt;
&lt;h3 id=&quot;visualizations&quot; tabindex=&quot;-1&quot;&gt;Visualizations &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/08/23/waka-commuter/#visualizations&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I spent a few hours experimenting with other libraries, but at the end of the day, the only viable option was &lt;a href=&quot;https://d3js.org/&quot;&gt;D3.js&lt;/a&gt;. I really struggled through this, spending a lot more time on building the simple bubble &amp;amp; bar chart than I should have. As a result, the charts are much less interactive than I would like—you can hover &amp;amp; click on them, but not much more.&lt;/p&gt;
&lt;p&gt;I wrapped all my mess up in some Web Components (via lit-element), which really simplified things. I bound plenty of event handlers on the map as well as other buttons in the UI, and then just had to update attributes on the components to get everything to update nicely. In a way, it kind of works like a jQuery app from 10 years ago.&lt;/p&gt;
&lt;p&gt;That’s kinda it! Not much to it—more time was spent on the thinking &amp;amp; design than the coding itself. That’s the way it should be though—start with your customer outcomes, and the tech just becomes a means to create a solution.&lt;/p&gt;
&lt;h2 id=&quot;feedback&quot; tabindex=&quot;-1&quot;&gt;Feedback &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/08/23/waka-commuter/#feedback&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Have you used Waka Commuter? Give it a try, and I would love to hear what you think—reach out to me on Twitter &lt;a href=&quot;https://twitter.com/consindo&quot;&gt;@consindo&lt;/a&gt; for any feedback. As it’s open source, also feel free to play around with the code, or even raise a pull request.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://commuter.waka.app&quot;&gt;commuter.waka.app&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>The best NZ debit &amp; credit cards of 2020</title>
		<link href="https://jono.nz/2020/06/21/card-guide-2020/"/>
		<updated>2020-06-21T10:30:00Z</updated>
		<id>https://jono.nz/2020/06/21/card-guide-2020/</id>
		<content type="html">&lt;p&gt;There’s a large number of debit &amp;amp; credit card options in NZ, so it can be a little daunting when picking one out. That said, there isn’t nearly as much competition as the USA or Australia, so it’s actually possible to decide the definitive best cards.&lt;/p&gt;
&lt;p&gt;A huge amount of research went into the post—we hope it saves you some time and money.&lt;/p&gt;
&lt;p&gt;If you have any questions at all, tweet myself &lt;a href=&quot;https://twitter.com/consindo&quot;&gt;@consindo&lt;/a&gt; or &lt;a href=&quot;https://twitter.com/multithreddy/&quot;&gt;@multithreddy&lt;/a&gt;, who was a huge help writing this guide.&lt;/p&gt;
&lt;h3 id=&quot;before-we-start&quot; tabindex=&quot;-1&quot;&gt;Before we start &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#before-we-start&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;While you can save some money with credit cards, there are definitely better ways to save money. These include (but are not limited to) the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Buying fewer things&lt;/li&gt;
&lt;li&gt;Finding a cheaper price (visiting a different store, or find a better utility provider)&lt;/li&gt;
&lt;li&gt;Not paying credit card surcharges (many utility providers will offer a 2-3% discount for direct debit payments)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This guide assumes you pay off your full balance each month. Make sure you do this, otherwise you’ll incur interest.&lt;/p&gt;
&lt;p&gt;It’s also worth nothing that the “break even” calculations assume that you value 1 Airpoints Dollar = 1 NZD. If someone offered to trade you $100 cash for 100 Airpoints, you probably wouldn’t do it.&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#The-best-debit-card&quot;&gt;The best debit card&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#The-best-FX-travel-card&quot;&gt;The best FX/travel card&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#The-best-free-credit-card&quot;&gt;The best free credit card&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#The-best-credit-card-for-groceries&quot;&gt;The best credit card for groceries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#The-best-credit-card-for-cashback&quot;&gt;The best credit card for cashback&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#The-best-credit-card-for-airpoints&quot;&gt;The best credit card for airpoints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#Notable-mentions&quot;&gt;Notable mentions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-best-debit-card&quot; tabindex=&quot;-1&quot;&gt;The best debit card &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#the-best-debit-card&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Westpac Airpoints Debit Mastercard&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;While you’ll never need to carry cash in Aotearoa, you will need a debit card. Many merchants will not accept credit cards, due to the high interchange fees (&lt;a href=&quot;https://www.westpac.co.nz/business/business-resource-centre/resources/fees/domestic-interchange/&quot;&gt;around 1.6% for credit&lt;/a&gt;). Due to COVID-19, there’s recently been an increase in acceptance as banks have waived contactless debit fees, but it’s unlikely to last—you’ll still need a debit card for now.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.westpac.co.nz/bank-accounts/debit-cards/airpoints/&quot;&gt;Westpac Airpoints Debit Mastercard&lt;/a&gt; is the only debit card in NZ with rewards. While the fees are low, the rewards are also low, so you will still need to spend a reasonable amount to break even. I wouldn’t open a Westpac account to get this card—you would probably be better off finding a fees free debit card, such as the &lt;a href=&quot;https://www.bnz.co.nz/personal-banking/everyday-banking/everyday-cards&quot;&gt;BNZ Flexi Debit Visa&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That said, if you’re a student, this card is free. You probably can’t get a credit card either, so just get this.&lt;/p&gt;
&lt;h3 id=&quot;westpac-airpoints-debit-mastercard&quot; tabindex=&quot;-1&quot;&gt;Westpac Airpoints Debit Mastercard &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#westpac-airpoints-debit-mastercard&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.westpac.co.nz/bank-accounts/debit-cards/airpoints/&quot;&gt;westpac.co.nz/bank-accounts/debit-cards/airpoints&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/XADGmaqsuy-500.avif 500w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/XADGmaqsuy-500.webp 500w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/XADGmaqsuy-500.png&quot; alt=&quot;Westpac Airpoints Debit Mastercard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;500&quot; height=&quot;322&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rewards:&lt;/strong&gt; 1 Airpoints Dollar for every $250 spent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Card Fee:&lt;/strong&gt; $15 &lt;small&gt;p.a.&lt;/small&gt; (break even after $3,750 spend)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Additional Features:&lt;/strong&gt; Apple Pay&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Also consider:&lt;/strong&gt; &lt;a href=&quot;https://www.bnz.co.nz/personal-banking/everyday-banking/everyday-cards&quot;&gt;BNZ Flexi Debit Visa&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-best-fx-travel-card&quot; tabindex=&quot;-1&quot;&gt;The best FX/travel card &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#the-best-fx-travel-card&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;TransferWise Debit Mastercard&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://transferwise.com/invite/i/jonathanc1490&quot;&gt;TransferWise Debit Mastercard&lt;/a&gt; is great everywhere except New Zealand. It doesn’t have the EFTPOS application on the SIM, so it’s subject to the higher Debit Mastercard fees (~1.2%), and won’t be accepted anywhere where credit isn’t.&lt;/p&gt;
&lt;p&gt;Despite this, it’s great outside of the country and for online shopping &amp;amp; subscriptions in foreign currencies. TransferWise has the best foreign exchange rates, no card fees, and also makes it really easy to receive foreign currency. I used this card exclusively in the USA &amp;amp; Australia last year, and also continue to use it to pay for all of my USD online subscriptions.&lt;/p&gt;
&lt;p&gt;You will save money if you get this card.&lt;/p&gt;
&lt;p&gt;Another option is the &lt;a href=&quot;https://www.airnzonesmart.co.nz/&quot;&gt;Air NZ OneSmart&lt;/a&gt;. It rewards you with 1 Airpoints dollar for every $100 spent overseas, and $200 spent locally. However, the foreign currency rates are not as good as TransferWise, and it suffers from the same Debit Mastercard acceptance problems.&lt;/p&gt;
&lt;h3 id=&quot;transferwise-debit-mastercard&quot; tabindex=&quot;-1&quot;&gt;TransferWise Debit Mastercard &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#transferwise-debit-mastercard&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://transferwise.com/invite/i/jonathanc1490&quot;&gt;transferwise.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/C2P3YRy6b7-480.avif 480w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/C2P3YRy6b7-480.webp 480w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/C2P3YRy6b7-480.png&quot; alt=&quot;TransferWise Debit Mastercard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;480&quot; height=&quot;336&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rewards:&lt;/strong&gt; None&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Card Fee:&lt;/strong&gt; $0 &lt;small&gt;p.a.&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Additional Features:&lt;/strong&gt; Free ATM withdrawals up to NZ$350/month, Google Pay.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Also consider:&lt;/strong&gt; &lt;a href=&quot;https://www.airnzonesmart.co.nz/&quot;&gt;Air NZ OneSmart&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-best-free-credit-card&quot; tabindex=&quot;-1&quot;&gt;The best free credit card &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#the-best-free-credit-card&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;ASB Visa Light &amp;amp; SBS Visa Credit Card&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For the best free card, we have two winners, depending on what you’re looking for.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.asb.co.nz/credit-cards/visa-light.html&quot;&gt;ASB Visa Light&lt;/a&gt; is handy for larger purchases. It doesn’t charge any interest for 6 months on purchases over $1000, so it can definitely cushion the blow for items such as appliances, jewelry, or electronics. It’s also just Visa, so has wide acceptance—much more convenient than signing up to store finance, or even pay later companies such as Afterpay.&lt;/p&gt;
&lt;p&gt;The other free card to consider is the &lt;a href=&quot;https://www.sbsbank.co.nz/credit-card&quot;&gt;SBS Visa Credit Card&lt;/a&gt;. It has no card fees, but offers $1 cashback for every $150 spent (paid quarterly). It’s better than a lot of credit cards that charge fees, including ASB who charge $40/year for the same reward rate.&lt;/p&gt;
&lt;p&gt;I would get the ASB Visa Light for the occasional large purchase, and also pick up the SBS Visa if you aren’t going to get a more premium cashback or airpoints card.&lt;/p&gt;
&lt;h3 id=&quot;asb-visa-light&quot; tabindex=&quot;-1&quot;&gt;ASB Visa Light &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#asb-visa-light&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.asb.co.nz/credit-cards/visa-light.html&quot;&gt;asb.co.nz/credit-cards/visa-light&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/AUgNlT85VT-484.avif 484w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/AUgNlT85VT-484.webp 484w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/AUgNlT85VT-484.png&quot; alt=&quot;ASB Visa Light&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;484&quot; height=&quot;388&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rewards:&lt;/strong&gt; None&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Card Fee:&lt;/strong&gt; $0 &lt;small&gt;p.a.&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Additional Features:&lt;/strong&gt; 0&lt;small&gt;% p.a.&lt;/small&gt; on $1000+ purchases for 6 months (this is technically a floating rate, but hasn’t changed in the last three years), 0&lt;small&gt;% p.a.&lt;/small&gt; Balance Transfer for 6 months, Apple Pay &amp;amp; Google Pay.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;sbs-visa-credit-card&quot; tabindex=&quot;-1&quot;&gt;SBS Visa Credit Card &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#sbs-visa-credit-card&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sbsbank.co.nz/credit-card&quot;&gt;sbsbank.co.nz/credit-card&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/pCmy8D7cJ6-500.avif 500w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/pCmy8D7cJ6-500.webp 500w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/pCmy8D7cJ6-500.png&quot; alt=&quot;SBS Visa Credit Card&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;500&quot; height=&quot;324&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rewards:&lt;/strong&gt; $1 cashback for every $150 spent (paid quarterly)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Card Fee:&lt;/strong&gt; $0 &lt;small&gt;p.a.&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Additional Features:&lt;/strong&gt; None&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-best-credit-card-for-groceries&quot; tabindex=&quot;-1&quot;&gt;The best credit card for groceries &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#the-best-credit-card-for-groceries&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;American Express Platinum Edge&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;American Express isn’t widely accepted in NZ (and their contactless standard, ExpressPay even less so). However, the cards are accepted at most large retailers including all major supermarkets and gas stations—luckily, they have a card just for this.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.americanexpress.com/nz/credit-cards/platinum-edge-credit-card/&quot;&gt;The American Express Platinum Edge&lt;/a&gt; earns you membership rewards, which you can exchange for airpoints, cashback, and many other things. The reward rate for groceries is particularly good—you receive the equivalent of 1 airpoints dollar for every $50 you spend at supermarkets. Airpoints isn’t the only loyalty program though: you can exchange membership rewards for &lt;a href=&quot;https://www.americanexpress.com/en-nz/rewards/membership-rewards/travel/all&quot;&gt;other airlines&lt;/a&gt; at a rate of 1.5 miles/points for every dollar you spend on groceries. Exchanging points for cashback greatly depends on how much you are exchanging at one time. You can also maximize your rewards by purchasing gift cards at supermarkets, and then using them at other stores—good for more expensive items.&lt;/p&gt;
&lt;p&gt;While the card fee of $149 &lt;small&gt;p.a.&lt;/small&gt; is relatively high, you receive a complimentary direct domestic return flight (with bags!) each year. It basically pays for itself, so you may as well get it and take the high reward rate for certain purchases as a bonus.&lt;/p&gt;
&lt;p&gt;There’s also the occasional Amex offer, domestic travel insurance (rare in NZ), and as it’s a global card, you’ll be able to get Bank Feeds in software such as &lt;a href=&quot;https://youneedabudget.com&quot;&gt;YNAB&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;American Express also offer a &lt;a href=&quot;https://www.americanexpress.com/nz/credit-cards/airnz-base-credit-card/&quot;&gt;free airpoints card&lt;/a&gt; that rewards you with 1 airpoints dollar for every $100 spent on any purchase. Even though it’s better than the Platinum Edge for everything that isn’t groceries or fuel, you should just use a regular credit card for those purchases.&lt;/p&gt;
&lt;h3 id=&quot;american-express-platinum-edge&quot; tabindex=&quot;-1&quot;&gt;American Express Platinum Edge &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#american-express-platinum-edge&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.americanexpress.com/nz/credit-cards/platinum-edge-credit-card/&quot;&gt;americanexpress.com/nz/credit-cards/platinum-edge-credit-card&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/EJt62J7kNM-500.avif 500w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/EJt62J7kNM-500.webp 500w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/EJt62J7kNM-500.png&quot; alt=&quot;American Express Platinum Edge&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;500&quot; height=&quot;322&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rewards:&lt;/strong&gt; 1 airpoints dollar for every $50 spent on groceries, $75 spent on petrol, and $150 on other purchases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Card Fee:&lt;/strong&gt; $149 &lt;small&gt;p.a.&lt;/small&gt; (break even after $7,450 spend on groceries)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Additional Features:&lt;/strong&gt; Free domestic return flight each year, complimentary domestic &amp;amp; international travel insurance (35 days), Amex offers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Also consider&lt;/strong&gt;: &lt;a href=&quot;https://www.americanexpress.com/nz/credit-cards/airnz-base-credit-card/&quot;&gt;American Express Airpoints&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-best-credit-card-for-cashback&quot; tabindex=&quot;-1&quot;&gt;The best credit card for cashback &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#the-best-credit-card-for-cashback&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;BNZ Advantage Visa Platinum&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you’re after cashback, the &lt;a href=&quot;https://www.bnz.co.nz/personal-banking/credit-cards/bnz-advantage&quot;&gt;BNZ Advantage Platinum&lt;/a&gt; is for you. It has a reasonable cashback rate (paid monthly), and doesn’t require you to spend a minimum amount each year. It also has a number of extra goodies, including price protection—a benefit that is very rare in NZ.&lt;/p&gt;
&lt;p&gt;Choose whether you want this airpoints or cashback, and then use this card for most of your spending (except foreign currency &amp;amp; groceries).&lt;/p&gt;
&lt;p&gt;The other cashback card to consider is the &lt;a href=&quot;https://www.sbsbank.co.nz/credit-card&quot;&gt;SBS Visa Credit Card&lt;/a&gt;—detailed above in &lt;a href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#The-best-free-credit-card&quot;&gt;the best free credit card&lt;/a&gt; section.&lt;/p&gt;
&lt;h3 id=&quot;bnz-advantage-visa-platinum&quot; tabindex=&quot;-1&quot;&gt;BNZ Advantage Visa Platinum &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#bnz-advantage-visa-platinum&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bnz.co.nz/personal-banking/credit-cards/bnz-advantage&quot;&gt;bnz.co.nz/personal-banking/credit-cards/bnz-advantage&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/-4g6L2d8l5-500.avif 500w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/-4g6L2d8l5-500.webp 500w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/-4g6L2d8l5-500.png&quot; alt=&quot;BNZ Advantage Visa Platinum&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;500&quot; height=&quot;318&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rewards:&lt;/strong&gt; $1 cashback for every $90 spent (paid monthly)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Card Fee:&lt;/strong&gt; $90 &lt;small&gt;p.a.&lt;/small&gt; (break even after $8,100 spend)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Additional Features:&lt;/strong&gt; International travel insurance (90 days), purchase protection, price protection, Apple Pay &amp;amp; Google Pay.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Also consider:&lt;/strong&gt; &lt;a href=&quot;https://www.sbsbank.co.nz/credit-card&quot;&gt;SBS Visa Credit Card&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-best-credit-card-for-airpoints&quot; tabindex=&quot;-1&quot;&gt;The best credit card for airpoints &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#the-best-credit-card-for-airpoints&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Westpac Airpoints Platinum Mastercard&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;All of the Airpoints Platinum cards in New Zealand aren’t particularly different—they all have similar reward rates, travel insurance, fees etc.&lt;/p&gt;
&lt;p&gt;While the &lt;a href=&quot;https://www.westpac.co.nz/credit-cards/airpoints/airpoints-platinum-mastercard/&quot;&gt;Westpac Airpoints Platinum Mastercard&lt;/a&gt; earns status points at a slightly reduced rate to the &lt;a href=&quot;https://www.kiwibank.co.nz/personal-banking/credit-cards/airpoints-credit-cards/platinum-visa/&quot;&gt;Kiwibank Airpoints Platinum&lt;/a&gt; (they offer 1 Status Point for $200 spend), the Westpac card includes 12 months extended warranty and 90 day purchase protection. I think most people will find the extra insurance more compelling.&lt;/p&gt;
&lt;p&gt;Choose whether you want this airpoints or cashback, and then use this card for most of your spending (except foreign currency &amp;amp; groceries).&lt;/p&gt;
&lt;h3 id=&quot;westpac-airpoints-platinum-mastercard&quot; tabindex=&quot;-1&quot;&gt;Westpac Airpoints Platinum Mastercard &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#westpac-airpoints-platinum-mastercard&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.westpac.co.nz/credit-cards/airpoints/airpoints-platinum-mastercard/&quot;&gt;westpac.co.nz/credit-cards/airpoints/airpoints-platinum-mastercard&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/ypOPFt0d-b-499.avif 499w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/ypOPFt0d-b-499.webp 499w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/ypOPFt0d-b-499.png&quot; alt=&quot;Westpac Airpoints Platinum Mastercard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;499&quot; height=&quot;323&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rewards:&lt;/strong&gt; 1 airpoints dollar for every $75 spent. 1 Status Point for every $225 spent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Card Fee:&lt;/strong&gt; $150 p.a. (break even after $11,250 spend)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Additional Features:&lt;/strong&gt; Complimentary international travel insurance, 12 months extended warranty, 90 days purchase protection, Apple Pay.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Also consider:&lt;/strong&gt; &lt;a href=&quot;https://www.kiwibank.co.nz/personal-banking/credit-cards/airpoints-credit-cards/platinum-visa/&quot;&gt;Kiwibank Airpoints Platinum Visa&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;notable-mentions&quot; tabindex=&quot;-1&quot;&gt;Notable mentions &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#notable-mentions&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;flight-centre-mastercard&quot; tabindex=&quot;-1&quot;&gt;Flight Centre Mastercard &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#flight-centre-mastercard&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flightcentremastercard.co.nz/&quot;&gt;flightcentremastercard.co.nz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Flight Centre Mastercard is the only credit card in NZ without international transaction fees. It’s kinda weird really, given that it’s a store card. You also get $1 in Flight Centre credit for every $100 you spend and they also support Apple Pay &amp;amp; Google Pay (I’m looking at you, Kiwibank!)&lt;/p&gt;
&lt;h3 id=&quot;westpac-world-airpoints&quot; tabindex=&quot;-1&quot;&gt;Westpac World Airpoints &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#westpac-world-airpoints&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.westpac.co.nz/credit-cards/airpoints/airpoints-world-mastercard/&quot;&gt;westpac.co.nz/credit-cards/airpoints/airpoints-world-mastercard&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Westpac World Airpoints is the only premium credit card in NZ. It has a great airpoints earn rate, as well as other benefits including concierge and lounge access. With a card fee of $390 per year, it probably works out if you spend a lot of money (the card fee is halved), or travel frequently internationally.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.westpac.co.nz/credit-cards/hotpoints/hotpoints-world-mastercard/&quot;&gt;Westpac hotpoints World&lt;/a&gt; card also exists with largely the same benefits, and it’s technically the highest (non Amex) cashback card in NZ (~1.4%).&lt;/p&gt;
&lt;h3 id=&quot;american-express-platinum&quot; tabindex=&quot;-1&quot;&gt;American Express Platinum &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#american-express-platinum&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.americanexpress.com/nz/credit-cards/platinum-card/&quot;&gt;americanexpress.com/nz/credit-cards/platinum-card&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The American Express Platinum is a charge card with a fee of $1,250 a year. It’s a game of balancing the benefits with the annual card fee. If you travel internationally frequently, it may work out for you, but you probably won’t be traveling internationally much for a while.&lt;/p&gt;
&lt;h3 id=&quot;kiwibank-platinum-visa&quot; tabindex=&quot;-1&quot;&gt;Kiwibank Platinum Visa &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/21/card-guide-2020/#kiwibank-platinum-visa&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.kiwibank.co.nz/personal-banking/credit-cards/low-interest-cards/platinum-visa/&quot;&gt;kiwibank.co.nz/personal-banking/credit-cards/low-interest-cards/platinum-visa&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Kiwibank Platinum Visa offers no rewards or cashback. It costs $80 per year.&lt;/p&gt;
&lt;p&gt;I have no idea why you would get this.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Phew. We got there. I hope you found this helpful! A huge amount of research went into this post—thanks to &lt;a href=&quot;https://twitter.com/multithreddy/&quot;&gt;@multithreddy&lt;/a&gt; again for helping me out.&lt;/p&gt;
&lt;p&gt;If you have any questions or comments at all (about any NZ card honestly), tweet us &lt;a href=&quot;https://twitter.com/consindo/&quot;&gt;@consindo&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://twitter.com/multithreddy/&quot;&gt;@multithreddy&lt;/a&gt;.&lt;/p&gt;
&lt;style&gt;
  .post img {
    max-width: 240px;
    border: 0;
    margin: 0;
  }
&lt;/style&gt;
</content>
	</entry>
	
	<entry>
		<title>I bought some things</title>
		<link href="https://jono.nz/2020/06/15/kiwibuild/"/>
		<updated>2020-06-15T08:00:00Z</updated>
		<id>https://jono.nz/2020/06/15/kiwibuild/</id>
		<content type="html">&lt;p&gt;Everyone kept saying &lt;a href=&quot;https://www.kiwibuild.govt.nz/&quot;&gt;KiwiBuild&lt;/a&gt; was a &lt;a href=&quot;https://twitter.com/NZNationalParty/status/1208635781516025858&quot;&gt;failure&lt;/a&gt;, so I decided to try it myself. I also bought a bunch of other things—here’s my attempt at reviewing them.&lt;/p&gt;
&lt;h2 id=&quot;kiwibuild-the-scheme&quot; tabindex=&quot;-1&quot;&gt;KiwiBuild (the scheme) &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/15/kiwibuild/#kiwibuild-the-scheme&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It was fine, I guess? Apart from signing a covenant saying I can’t sell or rent the place for a year, there wasn’t much to it. I don’t think there was a discount either—half the units in the building were on the open market, and the prices look mostly the same. That said, without KiwiBuild, the apartment block may not have been built.&lt;/p&gt;
&lt;p&gt;I was also able to withdraw my &lt;a href=&quot;https://kaingaora.govt.nz/home-ownership/kiwisaver-first-home-withdrawal/&quot;&gt;KiwiSaver&lt;/a&gt;, and get a &lt;a href=&quot;https://kaingaora.govt.nz/home-ownership/first-home-grant/&quot;&gt;First Home Grant&lt;/a&gt;. Without these schemes, I wouldn’t have been able to get a deposit together.&lt;/p&gt;
&lt;p&gt;A year elapsed between purchasing the unit off the plans and moving in. The build was mostly on-time, but ended up being delayed a few months due to &lt;a href=&quot;https://shorthand.radionz.co.nz/coronavirus-timeline/index.html&quot;&gt;New Zealand’s lockdown&lt;/a&gt; to prevent the spread of COVID-19.&lt;/p&gt;
&lt;h2 id=&quot;kiwibuild-the-house-itself&quot; tabindex=&quot;-1&quot;&gt;KiwiBuild (the house itself) &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/15/kiwibuild/#kiwibuild-the-house-itself&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’m really happy with the place! It’s just really nice living in a new apartment and having modern amenities such as air conditioning, insulation, and double glazing (man, I wish this was more common in NZ). The neighborhood is also pretty good—while it’s not in the CBD, it’s only a five minute walk to the train+bus interchange and other shops. As a result, the apartment doesn’t come with car parking (although it does come with bike parking &amp;amp; lockers), which ends up reducing the total cost of the place.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/QfDbtZ4hil-1920.avif 1920w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/QfDbtZ4hil-1920.webp 1920w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/QfDbtZ4hil-1920.jpeg&quot; alt=&quot;The Kiwibuild apartment&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1080&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The apartment itself is pretty spacious for a one bedroom (54m&lt;sup&gt;2&lt;/sup&gt;) and is reasonably well designed. There’s large windows which get lots of light and it has a sun room, which is way more practical than a balcony. If I had to nitpick, the kitchen has some weird design (the microwave space isn’t big enough for a microwave) and the shower pressure could be better (this is actually to save water—&lt;a href=&quot;https://aucklandwatersupply.co.nz/&quot;&gt;Auckland is in a drought&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Overall, it’s really good. I would highly recommend a KiwiBuild home.&lt;/p&gt;
&lt;h2 id=&quot;banks&quot; tabindex=&quot;-1&quot;&gt;Banks &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/15/kiwibuild/#banks&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Avoid, if possible. I wasn’t expecting much, but there was a whole lot of drama getting a mortgage, delaying settlement by two days. Lots of stupid stuff, like not accepting digital signatures, requiring a higher deposit than agreed upon, and needing to run into a physical branch multiple times. At least I ended getting a mortgage, and a pretty good interest rate.&lt;/p&gt;
&lt;p&gt;I ended up going with &lt;a href=&quot;https://westpac.co.nz&quot;&gt;Westpac&lt;/a&gt;, but I think they’re all pretty bad.&lt;/p&gt;
&lt;h2 id=&quot;fisher-and-paykel-appliances&quot; tabindex=&quot;-1&quot;&gt;Fisher &amp;amp; Paykel Appliances &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/15/kiwibuild/#fisher-and-paykel-appliances&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/4mO5lKqGkL-1920.avif 1920w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/4mO5lKqGkL-1920.webp 1920w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/4mO5lKqGkL-1920.jpeg&quot; alt=&quot;Fisher &amp;amp; Paykel Kitchen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1080&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The apartment came with the usual (oven, rangehood, stove, dishdrawer), and I got a matching &lt;a href=&quot;https://www.fisherpaykel.com/nz/kitchen/fridges-freezers/fridges/activesmartfridge-635mm-bottom-freezer-403l-5.RF402BRGX6.html&quot;&gt;fridge&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://www.fisherpaykel.com/nz/laundry/washing-machines/front-loaders/fabricsmart-8-0kg.WH8060F1.html&quot;&gt;washing machine&lt;/a&gt;. They seem to do what they’re supposed to, look nice, and weren’t expensive. Unfortunately, the apartment didn’t allow any customization, but I’ll probably upgrade to a Fisher &amp;amp; Paykel induction stove in the future.&lt;/p&gt;
&lt;h2 id=&quot;ikea-friheten&quot; tabindex=&quot;-1&quot;&gt;IKEA FRIHETEN &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/15/kiwibuild/#ikea-friheten&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We don’t have IKEA in NZ yet, but this sofa was too good to pass up. It unfolds into a sofa bed, but in a unique way—the seat slides out, and the back folds down. As a result, it’s much more comfortable than most sofa beds. There’s also plenty of storage in the base.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/dr_JX-WuUp-1920.avif 1920w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/dr_JX-WuUp-1920.webp 1920w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/dr_JX-WuUp-1920.jpeg&quot; alt=&quot;IKEA FRIHETEN&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1920&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The only downside is that it weighs 115kg! I purchased it from &lt;a href=&quot;https://www.urbansales.co.nz/ikea-friheten-three-seat-sofa-bed-skiftebo-dark-grey&quot;&gt;Urban Sales&lt;/a&gt;, and it arrived in about six weeks (even with the lockdown).&lt;/p&gt;
&lt;h2 id=&quot;napp-mattress&quot; tabindex=&quot;-1&quot;&gt;Napp Mattress &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/15/kiwibuild/#napp-mattress&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://napp.co.nz/&quot;&gt;Napp&lt;/a&gt; is a mattresses-in-a-box, and it’s definitely one of the nicer mattresses I’ve slept on. It’s on the firmer side, but I’ve been sleeping well over the past few days. They’re made in New Zealand but the foam is from Australia, so shipping delays meant I was sleeping on an air bed for a few weeks.&lt;/p&gt;
&lt;p&gt;It also didn’t come in a box—it just came rolled up in the back seat of some dude’s Ford Falcon.&lt;/p&gt;
&lt;h2 id=&quot;target-furniture&quot; tabindex=&quot;-1&quot;&gt;Target Furniture &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/15/kiwibuild/#target-furniture&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/JDSkKZr5cD-1920.avif 1920w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/JDSkKZr5cD-1920.webp 1920w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/JDSkKZr5cD-1920.jpeg&quot; alt=&quot;Target Furniture Showroom&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1080&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I bought a &lt;a href=&quot;https://www.targetfurniture.co.nz/veno-1500-extension-table&quot;&gt;table&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://www.targetfurniture.co.nz/dining/furniture/chairs/liva-dining-chair-dark-grey&quot;&gt;chairs&lt;/a&gt; from Target, and I’ll definitely be going back to get more furniture. They have nice things, are reasonably cheap, and their showroom contains most of what they sell online. I went to their store in Botany and was able to pick up the table the same day, but had to wait a week for the chairs to arrive from Wellington.&lt;/p&gt;
&lt;h2 id=&quot;ikea-nisse&quot; tabindex=&quot;-1&quot;&gt;IKEA Nisse &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/15/kiwibuild/#ikea-nisse&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As my chairs took a week to arrive, I bought some folding chairs from &lt;a href=&quot;https://www.urbansales.co.nz/ikea-nisse-folding-chair-black&quot;&gt;Urban Sales&lt;/a&gt;. They look nice enough, and are surprisingly comfortable—I was pretty happy working from home on them.&lt;/p&gt;
&lt;h2 id=&quot;nvidia-shield-tv&quot; tabindex=&quot;-1&quot;&gt;NVIDIA Shield TV &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/15/kiwibuild/#nvidia-shield-tv&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It’s expensive, but worth it. The hardware is very nice—the device itself just hides away (like a Chromecast), and the remote has just the right amount of buttons. Except maybe, the giant Netflix button. It also has an IR blaster, so I don’t have to use the gross remote supplied with my TV.&lt;/p&gt;
&lt;p&gt;Android TV is pretty simple, but it has apps for all the streaming services I use (except Apple TV+). The AI Upscaling in the Shield works surprisingly well, especially with &lt;a href=&quot;https://www.matthuisman.nz/2018/12/how-to-live-nz-iptv-channels-on-android.html&quot;&gt;NZ’s 720p IPTV streams&lt;/a&gt;. I also have an NVIDIA graphics card, and GameStream seems to work well (both through the official app, and &lt;a href=&quot;https://moonlight-stream.org/&quot;&gt;Moonlight&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;That said, it’s almost the same price as an Xbox. If you don’t already have a gaming PC, I would probably just get an Xbox.&lt;/p&gt;
&lt;h2 id=&quot;2degrees-broadband&quot; tabindex=&quot;-1&quot;&gt;2degrees Broadband &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2020/06/15/kiwibuild/#2degrees-broadband&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The speeds ain’t bad, but I’m still looking forward to &lt;a href=&quot;https://hyperfibre.chorus.co.nz/&quot;&gt;Hyperfibre&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;speedtest&quot;&gt;
  &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/bOTA1klRNv-750.avif 750w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/bOTA1klRNv-750.webp 750w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/bOTA1klRNv-750.png&quot; alt=&quot;2ms ping, 915.49mbps down, 392.66mbps up&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;750&quot; height=&quot;400&quot;&gt;&lt;/picture&gt;
&lt;/div&gt;
&lt;style&gt;
  .speedtest {
    max-width: 350px;
  }
  .speedtest img {
    border: 0;
  }
&lt;/style&gt;
&lt;p&gt;Hope you enjoyed this little review of things! I’m still in the process of getting new things, so I might review those in a future post.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Map Creator</title>
		<link href="https://jono.nz/2020/05/03/mapcreator/"/>
		<updated>2020-05-03T10:00:00Z</updated>
		<id>https://jono.nz/2020/05/03/mapcreator/</id>
		<content type="html">&lt;p&gt;I’ve always liked transit maps. They not only help us get from A to B, but can also tell a story about a city. Well designed transit maps not only serve a utility, but are also public art.&lt;/p&gt;
&lt;p&gt;There’s lots of different types of transit maps, but the most common is the &lt;a href=&quot;https://tfl.gov.uk/maps/track/tube&quot;&gt;London Underground schematic style&lt;/a&gt;. I’ve wanted to design one of these for myself, but I’ve never had the patience to make one using Illustrator or Figma. I don’t think these tools are particularly suited towards transit maps. We should be able to define a map the same way the routes are defined—it should be as simple as specifying the nodes and connections.&lt;/p&gt;
&lt;p&gt;We’re currently in lockdown here in New Zealand, so it does feel a bit silly to work on &lt;a href=&quot;https://waka.app&quot;&gt;Waka&lt;/a&gt; at the moment. Instead, I spent the last couple of weeks building a tool to help make drawing transit maps easier. The first step was the most basic scenario—a single line, with a bend in it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/mapcreator/1-line.svg&quot; alt=&quot;One transit line with two stations and a bend&quot;&gt;&lt;/p&gt;
&lt;p&gt;Simple enough. Just draw a line, and use a bit of trigonometry to figure out the coordinates for the angles. Cool. Now, what happens when we add a second line?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/mapcreator/2-lines-no-fixes.svg&quot; alt=&quot;Two transit line with two stations and a bend&quot;&gt;&lt;/p&gt;
&lt;p&gt;It turns out, the lines overlap. This is because the lines have a width, so you need to account for that when you bend lines. I’ve made the diagram above a little bit transparent, so it’s easier to see this issue. Again, with a little bit of trigonometry, I was able to fix this all up.&lt;/p&gt;
&lt;p&gt;The lines of transit maps often swap over when the angles of the line change, so this was the next thing I accounted for. It’s a little bit difficult, as you also have to account for the change in length of line. Nevertheless, after a bit of hair pulling, I got the result I was after:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/mapcreator/2-lines-swap.svg&quot; alt=&quot;Two transit line with two stations, a bend, and a stacking swap&quot;&gt;&lt;/p&gt;
&lt;p&gt;Things get more and more complicated the moment you introduce 3, 4, 5+ lines. Modifying an equation to fix one case, will often break another. To keep track of all these different scenarios, I used &lt;a href=&quot;https://storybook.js.org/&quot;&gt;Storybook&lt;/a&gt; and wrapped everything up as a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Web_Components&quot;&gt;web component&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As the application essentially runs a &lt;a href=&quot;https://en.wikipedia.org/wiki/Breadth-first_search&quot;&gt;Breadth-first search&lt;/a&gt; and outputs a SVG, I decided against using a framework like React, Vue, or Angular for now. Web components were the perfect lightweight solution I needed.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/-7WDQerYQL-2400.avif 2400w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/-7WDQerYQL-2400.webp 2400w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/-7WDQerYQL-2400.png&quot; alt=&quot;Storybook with all the different test cases&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2400&quot; height=&quot;1548&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;By regression testing any small tweak to my code, I was able to come up with a general solution for any angle, any number of lines, and any change in stacking. As a bonus, I was able to delete lots of code once I arrived at my pair of equations!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/mapcreator/4-line.svg&quot; alt=&quot;Complex 4 line example&quot;&gt;&lt;/p&gt;
&lt;p&gt;Currently, it won’t stop you from making a bad looking map, but at least the angles will be correct! The other nice thing about getting all the math right is that you can easily change the look by modifying a few parameters.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/mapcreator/4-line-smoothed.svg&quot; alt=&quot;Complex 4 line example with different styles&quot;&gt;&lt;/p&gt;
&lt;p&gt;I’m not totally sure where I’m going to take it next, but there’s a lot of room for improvement. I might try replicating a couple of real-life maps, and seeing how far I get. At the very least, I’m going to have to add labels for stations!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Waka Local Guidebooks</title>
		<link href="https://jono.nz/2020/02/02/dymajo-waka-guidebooks/"/>
		<updated>2020-02-02T12:00:00Z</updated>
		<id>https://jono.nz/2020/02/02/dymajo-waka-guidebooks/</id>
		<content type="html">&lt;p&gt;There’s a lot more to a transport network than maps and timetables. Each city has its own quirks, and you’ll often only discover these by experiencing them for yourself. Even the smallest things such as paying a fare can be confusing if you’ve never done it before.&lt;/p&gt;
&lt;p&gt;That’s why we’re introducing local guidebooks in Waka. These are local guides to help you understand your city’s transport and get around more effectively. They’re designed to be super handy if you’ve never used the network before, but you might still learn a thing or two if you’re a long-time user! They’re also a quick &amp;amp; easy reference to things like zones &amp;amp; fares. Additionally, these guides are open source and &lt;em&gt;editable by anyone!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/oADhXK1FKF-1920.avif 1920w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/oADhXK1FKF-1920.webp 1920w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/oADhXK1FKF-1920.jpeg&quot; alt=&quot;Waka Guidebooks&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1280&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Te Whanganui-a-Tara, Wellington&lt;/em&gt; is our first city with a guidebook. We’ve currently just got the basics in there - some fare information, and how to get to the airport. We would love to &lt;a href=&quot;https://waka.app/feedback&quot;&gt;get your feedback&lt;/a&gt; to see what you think and decide whether we should roll out these guides to more cities!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://waka.app/guide/nz-wlg&quot;&gt;https://waka.app/guide/nz-wlg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For code changes, please see the GitHub releases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka/releases/tag/v2.4.5&quot;&gt;Waka Release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka-guidebooks&quot;&gt;Waka Guidebooks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Every Lot Bot</title>
		<link href="https://jono.nz/2020/01/23/every-lot-bot/"/>
		<updated>2020-01-23T10:00:00Z</updated>
		<id>https://jono.nz/2020/01/23/every-lot-bot/</id>
		<content type="html">&lt;p&gt;&lt;strong&gt;Update: These accounts are no longer online as Twitter no longer allows automated bots. Additionally, the Tokyo account is no longer available.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Over the long weekend, &lt;a href=&quot;https://twitter.com/nzsd&quot;&gt;@nzsd&lt;/a&gt; &amp;amp; I set up a bunch of bots that tweet a street view photo of every lot for a bunch of cities. They tweet every 20-30 minutes, and you can follow them here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Auckalnd: &lt;a href=&quot;https://twitter.com/everylotakl&quot;&gt;@everylotakl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Christchurch: &lt;a href=&quot;https://twitter.com/everylotchc&quot;&gt;@everylotchc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tokyo: &lt;a href=&quot;https://twitter.com/everylottokyo&quot;&gt;@everylottokyo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wellington: &lt;a href=&quot;https://twitter.com/everylotwlg&quot;&gt;@everylotwlg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They’ve already tweeted some fun stuff:&lt;/p&gt;
&lt;jc-center&gt;
  &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;1A Waitomo Avenue, Mount Eden &lt;a href=&quot;https://t.co/SN2Of4yKna&quot;&gt;pic.twitter.com/SN2Of4yKna&lt;/a&gt;&lt;/p&gt;&amp;mdash; every lot auckland (@everylotakl) &lt;a href=&quot;https://twitter.com/everylotakl/status/1219479779746824193?ref_src=twsrc%5Etfw&quot;&gt;January 21, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;/jc-center&gt;
&lt;jc-center&gt;
  &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;2B Mount Street, Te Aro &lt;a href=&quot;https://t.co/4Yc1jiLRy6&quot;&gt;pic.twitter.com/4Yc1jiLRy6&lt;/a&gt;&lt;/p&gt;&amp;mdash; every lot wellington (@everylotwlg) &lt;a href=&quot;https://twitter.com/everylotwlg/status/1219130230993911808?ref_src=twsrc%5Etfw&quot;&gt;January 20, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;/jc-center&gt;
&lt;jc-center&gt;
  &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;zh&quot; dir=&quot;ltr&quot;&gt;中央区八重洲一丁目 6-14 &lt;a href=&quot;https://t.co/8kEoJ85b6Z&quot;&gt;pic.twitter.com/8kEoJ85b6Z&lt;/a&gt;&lt;/p&gt;&amp;mdash; every lot tokyo / 東京のすべての土地 (@everylottokyo) &lt;a href=&quot;https://twitter.com/everylottokyo/status/1218835538540498944?ref_src=twsrc%5Etfw&quot;&gt;January 19, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;/jc-center&gt;
&lt;p&gt;However, the main thing I’ve noticed so far is just how ugly the average New Zealand house is. We’re now living in an age where we’re going to demolish a lot of them, but honestly, it’s for the best.&lt;/p&gt;
&lt;jc-center&gt;
  &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;162 Grahams Road, Burnside &lt;a href=&quot;https://t.co/pvC5xAKRpT&quot;&gt;pic.twitter.com/pvC5xAKRpT&lt;/a&gt;&lt;/p&gt;&amp;mdash; every lot christchurch (@everylotchc) &lt;a href=&quot;https://twitter.com/everylotchc/status/1220232739774844928?ref_src=twsrc%5Etfw&quot;&gt;January 23, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;/jc-center&gt;
&lt;p&gt;The bots use the &lt;a href=&quot;https://github.com/fitnr/everylotbot&quot;&gt;same open source code&lt;/a&gt; as some of the &lt;a href=&quot;https://twitter.com/fitnr/lists/every-lot&quot;&gt;other every lot bots&lt;/a&gt; around the world. However, ours runs as CronJob on Kubernetes (it’s using the same cluster that Waka uses!). I can’t speak too much creating the GIS database, but you can deploy your own bot with the Terraform here: &lt;a href=&quot;https://github.com/consindo/everylotbot-k8s&quot;&gt;https://github.com/consindo/everylotbot-k8s&lt;/a&gt;.&lt;/p&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
</content>
	</entry>
	
	<entry>
		<title>Leave Feedback in Waka</title>
		<link href="https://jono.nz/2020/01/08/dymajo-leave-waka-feedback/"/>
		<updated>2020-01-08T12:00:00Z</updated>
		<id>https://jono.nz/2020/01/08/dymajo-leave-waka-feedback/</id>
		<content type="html">&lt;p&gt;You can now send us feedback inside Waka! You can get there from the home page, or by heading to &lt;a href=&quot;https://waka.app/feedback&quot;&gt;waka.app/feedback&lt;/a&gt;. You’ll also be able offered to provide feedback if Waka crashes in any way. We really value your feedback, so we would love to hear what you think.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://jono.nz/images/4TJIwWb_Zr-960.avif 960w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jono.nz/images/4TJIwWb_Zr-960.webp 960w&quot;&gt;&lt;img src=&quot;https://jono.nz/images/4TJIwWb_Zr-960.jpeg&quot; alt=&quot;Waka on Samsung Galaxy Fold&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;960&quot; height=&quot;960&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;There’s also been a few changes behind the scenes. We’ve made a few minor layout improvements to support devices that are larger than phones, but smaller than tablets - the Galaxy Fold is one example. We’ve also moved our infrastructure off Amazon ECS, and onto &lt;a href=&quot;https://kubernetes.io&quot;&gt;Kubernetes&lt;/a&gt; on Digital Ocean. It makes our lives easier, but hopefully you don’t notice a difference!&lt;/p&gt;
&lt;p&gt;For code changes, please see the GitHub releases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka/releases/tag/v2.4.4&quot;&gt;Waka Release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka-server/releases/tag/v2.4.2&quot;&gt;Waka Server Release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka-importer/releases/tag/v2.4.3&quot;&gt;Waka Importer Release&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Kubernetes Forum Sydney</title>
		<link href="https://jono.nz/2019/12/16/kubernetes-forum-sydney-2019/"/>
		<updated>2019-12-16T20:07:00Z</updated>
		<id>https://jono.nz/2019/12/16/kubernetes-forum-sydney-2019/</id>
		<content type="html">&lt;p&gt;I recently had the privilege to speak about Xero’s Kubernetes platform at &lt;a href=&quot;https://events.linuxfoundation.org/events/kubernetes-forum-sydney-2019/&quot;&gt;Kubernetes Forum Sydney 2019&lt;/a&gt;. I focused on how we adopted the mindset of a platform as a product, in order to empower our development teams.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/jono-speaking-k8s-forum.jpg&quot; alt=&quot;Jono presenting the keynote at Kubernetes Forum Sydney 2019&quot;&gt;&lt;/p&gt;
&lt;p&gt;I think it went really well, and received a lot of great feedback afterwards! A recording is now available online for those who missed it.&lt;/p&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;https://jono.nz/embed/lite-yt-embed.css&quot;&gt;
&lt;script src=&quot;https://jono.nz/embed/lite-yt-embed.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;&lt;lite-youtube videoid=&quot;k3CLW8siogE&quot;&gt;&lt;/lite-youtube&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=k3CLW8siogE&quot;&gt;https://www.youtube.com/watch?v=k3CLW8siogE&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The talk has also been adapted into a post, for the Humans of Xero Blog. &lt;a href=&quot;https://medium.com/humans-of-xero/enabling-world-class-engineering-with-kubernetes-5ff514924ec8&quot;&gt;https://medium.com/humans-of-xero/enabling-world-class-engineering-with-kubernetes-5ff514924ec8&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Waka Christchurch</title>
		<link href="https://jono.nz/2019/09/17/dymajo-hello-christchurch/"/>
		<updated>2019-09-17T09:00:00Z</updated>
		<id>https://jono.nz/2019/09/17/dymajo-hello-christchurch/</id>
		<content type="html">&lt;p&gt;We’ve brought Waka to Ōtautahi, Christchurch! You can now track your bus in realtime, and check if your service will be delayed. To get started, you can simply tap the “locate me” button on Waka’s map (if you’re in Christchurch!), or choose &lt;a href=&quot;https://waka.app/region&quot;&gt;Switch City&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/waka-christchurch.jpg&quot; alt=&quot;Waka Route Map&quot;&gt;&lt;/p&gt;
&lt;p&gt;We hope Waka makes your Christchurch commute easier!&lt;/p&gt;
&lt;p&gt;For code changes, please see the GitHub releases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka/releases/tag/v2.4.1&quot;&gt;Waka Release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka-server/releases/tag/v2.4.1&quot;&gt;Waka Server Release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka-importer/releases/tag/v2.4.1&quot;&gt;Waka Importer Release&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>New Route Maps in Waka</title>
		<link href="https://jono.nz/2019/09/04/dymajo-new-route-map/"/>
		<updated>2019-09-04T12:00:00Z</updated>
		<id>https://jono.nz/2019/09/04/dymajo-new-route-map/</id>
		<content type="html">&lt;p&gt;We’ve added a great new route map to Waka today. After choosing a line from the routes page, or a service from a station, you’ll now have an overview of all the next departures.&lt;/p&gt;
&lt;p&gt;You’re able to see long it takes to get to each station, and transfers you can make at each station. To view services in other directions, or with different stopping patterns, you can tap the route icon in the top corner.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/waka-route-map.png&quot; alt=&quot;Waka Route Map&quot;&gt;&lt;/p&gt;
&lt;p&gt;We hope you love using the new route map!&lt;/p&gt;
&lt;p&gt;We also did a lot of housekeeping to prepare for adding more new cities. Please see the following GitHub releases for code changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka/releases/tag/2.4&quot;&gt;Waka Release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka-server/releases/tag/2.4&quot;&gt;Waka Server Release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka-importer/releases/tag/v2.4&quot;&gt;Waka Importer Release&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Dev Log: April - July 2019</title>
		<link href="https://jono.nz/2019/07/15/devlog-2019-07/"/>
		<updated>2019-07-15T13:10:00Z</updated>
		<id>https://jono.nz/2019/07/15/devlog-2019-07/</id>
		<content type="html">&lt;p&gt;Yikes. Haven’t done one of these in a while. It’s mostly because I’m really busy at work - turns out, everyone wants to use Kubernetes. I also bought a house, which turns out to be quite a stressful process.&lt;/p&gt;
&lt;h2 id=&quot;waka&quot; tabindex=&quot;-1&quot;&gt;Waka &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2019/07/15/devlog-2019-07/#waka&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We’ve been reducing technical debt in Waka. The server has been entirely rewritten in TypeScript, we’re adding tests, and making it really easy to add more cities. The app itself is also getting a little bit of love, and we’re looking at improving the route page and adding service alerts in the near future. Just for fun, we also rewrote waka-proxy in golang.&lt;/p&gt;
&lt;p&gt;The architecture itself hasn’t changed a lot since the last post, but we have added a new component. It’s called waka-realtime, and it’s responsible for pulling realtime information from agencies and putting them in a Redis cache. waka-worker now pulls from the Redis cache, as opposed to doing the pulls itself, and storing it in RAM.&lt;/p&gt;
&lt;p&gt;This new component allows us to make more of Waka “serverless”, and run on AWS Lambda. Even though we run our ECS cluster on spot instances, it’s still expensive to maintain a seperate test environment.&lt;/p&gt;
&lt;p&gt;There’s a lot more coming to Waka really soon, we’re looking forward to announcing the availbility of our next two cities - Sydney &amp;amp; Christchurch.&lt;/p&gt;
&lt;h2 id=&quot;nitro&quot; tabindex=&quot;-1&quot;&gt;Nitro &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2019/07/15/devlog-2019-07/#nitro&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Unfortunately, Nitro hasn’t seen a lot of work on the last couple of months. I’ve mainly been fixing up UI bugs - the server is rock solid. Upon reflection, building a really fancy user interface isn’t a good way to get a product out quickly. While it’s a clean, simple experience, the animations and transitions have proved to be difficult to stabilize. I don’t want to abandon things, and will look to getting a public beta out soon.&lt;/p&gt;
&lt;p&gt;In terms of infrastructure changes, I’ve moved the account manager (activates accounts and invitations) from ECS to Lambda.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;That’s really it for the last couple of months. Fingers crossed that I’ll have more to post about soon!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>A Cloud Native Waka</title>
		<link href="https://jono.nz/2019/04/19/waka-cloud-native/"/>
		<updated>2019-04-19T12:15:00Z</updated>
		<id>https://jono.nz/2019/04/19/waka-cloud-native/</id>
		<content type="html">&lt;p&gt;Recently, Waka has a had a bit of a rewrite to make it much easier to get started locally, and is now able to be run in a high-availability, cloud native configuration.&lt;/p&gt;
&lt;h2 id=&quot;old-waka&quot; tabindex=&quot;-1&quot;&gt;Old Waka &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2019/04/19/waka-cloud-native/#old-waka&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Old Waka was a little bit of a monolith. Everything was bundled together into the &lt;a href=&quot;https://github.com/dymajo/waka&quot;&gt;dymajo/waka&lt;/a&gt; repository. The barrier to entry was high - you had to get everything going if you wanted to develop it.&lt;/p&gt;
&lt;p&gt;Everything also used a crazy, &lt;a href=&quot;https://jono.nz/2017/10/08/transit-part1/&quot;&gt;multi-process architecture&lt;/a&gt;. It provided a way to split cities processes from each other. This was helpful when the software was less stable - an import of a new Auckland timetable could crash Wellington. &lt;strong&gt;I would not recommend this&lt;/strong&gt;. It’s way more sensible to use a proper application orchestration technology, such as Amazon ECS or Kubernetes.&lt;/p&gt;
&lt;h2 id=&quot;new-waka&quot; tabindex=&quot;-1&quot;&gt;New Waka &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2019/04/19/waka-cloud-native/#new-waka&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;New Waka addresses all these issues. The application has been split into a number of components, but still delivers an excellent development experience. It also &lt;strong&gt;doesn’t require any set-up&lt;/strong&gt; to get going.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka&quot;&gt;waka&lt;/a&gt; - the front end&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka-importer&quot;&gt;waka-importer&lt;/a&gt; - task that downloads GTFS feeds, and imports them into SQL Server&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka-server&quot;&gt;waka-orchestrator&lt;/a&gt; - service that manages manages timetable updates&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka-server&quot;&gt;waka-proxy&lt;/a&gt; - service that discovers running workers, and redirects map requests&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka-server&quot;&gt;waka-worker&lt;/a&gt; - service that provides gtfs and realtime information for each city&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka-healthcheck&quot;&gt;waka-healthcheck&lt;/a&gt; - a lambda to &lt;a href=&quot;https://assets-us-west-2.waka.app/status/index.html&quot;&gt;check if waka is up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dymajo/waka-maps&quot;&gt;waka-maps&lt;/a&gt; - scripts that generate map tiles, and upload them to S3&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-was-it-done&quot; tabindex=&quot;-1&quot;&gt;How was it done? &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2019/04/19/waka-cloud-native/#how-was-it-done&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;developer-experience&quot; tabindex=&quot;-1&quot;&gt;Developer Experience &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2019/04/19/waka-cloud-native/#developer-experience&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The developer experience has been vastly improved because no config is required to get started. This was done by making a number of assumptions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use local disk instead of DynamoDB for configuration locally.&lt;/li&gt;
&lt;li&gt;Assume SQL Server is running in Docker, but is configurable.&lt;/li&gt;
&lt;li&gt;Missing API Keys will disable external requests.&lt;/li&gt;
&lt;li&gt;waka-importer does not need to be called directly.&lt;/li&gt;
&lt;li&gt;Auto-discovery of regions.&lt;/li&gt;
&lt;li&gt;Disabled import of line shapes into S3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With the split into multiple components, it was important to keep the development experience as good as a monolith - developing in Docker containers is not fun. Originally, I thought this was going to be difficult to do - we need multiple waka-workers for each city. I didn’t want to go back to the multi-process mess. Then it hit me. &lt;strong&gt;Every component should be a class that can be instantiated&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This is awesome. When it’s running locally, the class exposes some routes that are added to waka-orchestrator’s router. When it’s running in a Docker container, it sets up its own web server, and grabs config from environmental variables.&lt;/p&gt;
&lt;h3 id=&quot;cloud-native&quot; tabindex=&quot;-1&quot;&gt;Cloud Native &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2019/04/19/waka-cloud-native/#cloud-native&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With each component being a Docker container, we now run Waka on Amazon ECS. We chose ECS over Kubernetes, because ECS is easier and cheaper to get set-up with. I also spend a lot of time working with Kubernetes at work, so I’m fully aware that it’s a much better system!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/waka-ecs.png&quot; alt=&quot;Waka ECS Services&quot;&gt;&lt;/p&gt;
&lt;p&gt;waka-orchestrator speaks to the Amazon ECS API to adjust the active version, as well as launching Fargate waka-importer tasks. For bonus points, our SQL server instance also runs on ECS with an EBS mount (there’s only timetables in there), and our cluster runs on 75% spot instances! Our stage environment runs on 100% spot instances, and auto-scales so is only available when we’re awake.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/waka-alb.png&quot; alt=&quot;Waka ALB Routes&quot;&gt;&lt;/p&gt;
&lt;p&gt;As waka has been designed in a way where no components actually talk to each other (apart from waka-proxy, which is doing auto-discovery), we effectively have a zero-trust network. All the components sit behind an Amazon Application Load Balancer (ALB), with routes to the ECS target groups. We also have the Waka admin console on the ALB, but using &lt;a href=&quot;https://auth0.com&quot;&gt;Auth0&lt;/a&gt; to authenticate these requests on the Load Balancer.&lt;/p&gt;
&lt;h2 id=&quot;help-us-build-waka&quot; tabindex=&quot;-1&quot;&gt;Help us build Waka! &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2019/04/19/waka-cloud-native/#help-us-build-waka&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;With these changes, Waka is ready for the future. We’ve got new cities in the pipeline and other exciting ideas!&lt;/p&gt;
&lt;p&gt;If you want to help us build Waka, you can now get going in a matter of minutes. Check out the &lt;a href=&quot;https://github.com/dymajo/waka&quot;&gt;front-end&lt;/a&gt; or &lt;a href=&quot;https://github.com/dymajo/waka-server&quot;&gt;server&lt;/a&gt; to get started.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Dev Log: Febuary &amp; March 2019</title>
		<link href="https://jono.nz/2019/03/10/devlog-2019-02/"/>
		<updated>2019-03-10T18:45:00Z</updated>
		<id>https://jono.nz/2019/03/10/devlog-2019-02/</id>
		<content type="html">&lt;p&gt;Oops. I’ve been a bit busy and forgot to do the dev log. As well as going on holiday, I’ve now “ungraduated” and now I’m an engineer on the Kubernetes team at &lt;a href=&quot;https://xero.com&quot;&gt;Xero&lt;/a&gt;. It’s fun though, and I also made a logo for the team:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/platform.png&quot; alt=&quot;Xero Compute Platform Logo&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;waka&quot; tabindex=&quot;-1&quot;&gt;Waka &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2019/03/10/devlog-2019-02/#waka&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.dymajo.waka&quot;&gt;Waka is now in the Google Play Store!&lt;/a&gt; It’s a trusted web activity, so it’s really just a PWA running in Chrome. The only difference between the Play Store and &lt;a href=&quot;https://waka.app&quot;&gt;waka.app&lt;/a&gt; is an adaptive icon, but I might add more system integration in the future.&lt;/p&gt;
&lt;p&gt;I’ve also been working on rewriting the server. Currently it’s a bit of a weird monolith that uses subprocesses, but I’m moving it to use containers. The idea is that when you run it in the cloud, it’s all load balanced and nice, but still just works when developing it on a single computer.&lt;/p&gt;
&lt;p&gt;I’m going to be going into more depth in my next post, so stay tuned!&lt;/p&gt;
&lt;h2 id=&quot;nitro&quot; tabindex=&quot;-1&quot;&gt;Nitro &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2019/03/10/devlog-2019-02/#nitro&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After receiving the first round of feedback, I realized that priorities and Magic Sort were missing from Nitro 3. I’ve now added both these features to Nitro 3, and they work great!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/magicsort.png&quot; alt=&quot;Nitro 3 Magic Sort&quot;&gt;&lt;/p&gt;
&lt;p&gt;I find Magic Sort is really good when you have a large list with deadlines, dates, and priorities, and just need to know what to do first. Magic Sort was already built into the Today list, but you can now activate it on any list.&lt;/p&gt;
&lt;p&gt;The second round of beta invites has also been sent, and I’ll be looking to send a third round in a couple of weeks!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Dev Log: January 2019</title>
		<link href="https://jono.nz/2019/01/17/devlog-2019-01/"/>
		<updated>2019-01-17T12:00:00Z</updated>
		<id>https://jono.nz/2019/01/17/devlog-2019-01/</id>
		<content type="html">&lt;p&gt;Happy New Year!&lt;/p&gt;
&lt;h2 id=&quot;nitro-3&quot; tabindex=&quot;-1&quot;&gt;Nitro 3 ⚡ &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2019/01/17/devlog-2019-01/#nitro-3&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’ve sent the first couple of invites to the Nitro 3 private beta. It looks like everything went smoothly - the emails went out, and people were able to sign in and start using Nitro.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/nitro-2019-beta-wave-1.png&quot; alt=&quot;Nitro Beta Wave 1 Sent&quot;&gt;&lt;/p&gt;
&lt;p&gt;A couple of things happened to get Nitro to production: I fixed all the critical bugs, added JS Module support, but also had to build a new component to onboard new users. It ended up being pretty simple - if you have a valid invite code, you can login, and it’ll set some metadata on your user in Auth0. If you try to login to Nitro without having activated your account (and thus having no metadata), it’ll tell you that you don’t have access to the application.&lt;/p&gt;
&lt;p&gt;I also added a rudimentary stats page for Admin users, as I decided not to add Google Analytics. At the moment, it’s just a count of the lists, tasks, users, and archived tasks in Nitro, but is still useful. I implemented this properly too - it doesn’t just connect straight to the database, but calls the Nitro API authenticating as a machine.&lt;/p&gt;
&lt;p&gt;It’s common in a lot of environments to not have any authentication and simply trust other traffic because it’s coming from the same network. The problem with this approach is that it’s not only hard to audit what is requesting what, but ties you a little bit more into your cloud provider (peering VPCs can be a pain). If you use machine to machine authentication, you don’t need to build a BFF (your private and public APIs are the same) but you can also make requests over a zero trust network. For example, I could run Nitro API as a container on AWS and Account Manager as a serverless function on Azure with no special networking. Auth0 made this really easy to do - you can grant an application access to an API by just flicking a switch and choosing some scopes.&lt;/p&gt;
&lt;p&gt;I’ve been using Nitro for months in a test environment - it’s always a good idea to dogfood your own app! However, I didn’t have any production infrastructure deployed. I’ve been using &lt;a href=&quot;https://terraform.io&quot;&gt;Terraform&lt;/a&gt; to provision infrastructure, so deploying to production was as easy as renaming some configuration. I would highly recommend everyone to check out Terraform - you write your infrastructure as code, and it’ll be built out like magic, even over multiple cloud server providers.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/ecs-cluster-2019-jan.png&quot; alt=&quot;Nitro ECS Cluster&quot;&gt;&lt;/p&gt;
&lt;p&gt;Nitro itself is running on AWS, on an ECS Cluster (EC2 launch type) behind a load balancer. The Nitro client is deployed into a S3 bucket, sitting behind Cloudflare. Currently, all the Docker containers are running on a single instance, but I’ll add some auto scaling when I onboard a few more people. Additionally, the database is fully managed by AWS (Postgres RDS), and again, I’m using Auth0 to provide login. This is all aided by Nitro being fully functional while offline, so if there is an outage, it’s unlikely you’ll even notice it 😁.&lt;/p&gt;
&lt;p&gt;In terms of what’s next, I’m actually not sure! I’ll definitely be checking out the feedback from the first beta users, as well as onboarding more people. Based off the feedback, I’ll be able to prioritize the most important issues, and go from there!&lt;/p&gt;
&lt;h2 id=&quot;waka&quot; tabindex=&quot;-1&quot;&gt;Waka &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2019/01/17/devlog-2019-01/#waka&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Because I actually managed to run out of things to do on Nitro, I put a little bit of work into Waka. After choosing a line on the lines screen, it’ll show the live vehicle locations if there’s any! It’ll also show the services you can transfer to at each stop. I then removed the existing route map that is visible when you press route map on the stations page - it now sends you to the unified lines page.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/waka-unified-lines-2019-jan.png&quot; alt=&quot;Waka Unified Lines - Screenshot of OuterLink&quot;&gt;&lt;/p&gt;
&lt;p&gt;This change is live for both Auckland and Wellington, and works for buses and trains!&lt;/p&gt;
&lt;p&gt;I’m definitely going to make it better though - here’s a couple of plans for that page:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Show transfers at transport hubs (e.g Otahuhu, Albany, Kilbirnie)&lt;/li&gt;
&lt;li&gt;Show how long it takes between stations&lt;/li&gt;
&lt;li&gt;A better way to select the route variant (e.g The NX1 can run to either Albany or the Hibiscus Coast, the 1 can run to one of three possible destinations)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And if you’ve jumped in from the station page, or have selected a station:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Show the live service info&lt;/li&gt;
&lt;li&gt;Show the time that a service yields at each station&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once that work is all done, it should lead into a few other changes. Notably, showing the inactive stops on the station page, and making transport hubs more prominent on the map. There’s also other work where we’re disassembling the Waka monolith (okay, it’s not really a monolith, but we want to split out the data import from the runtime).&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;That’s all for January. I’m off to take a well needed holiday! ✈&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Dev Log: December 2018</title>
		<link href="https://jono.nz/2018/12/27/devlog-2018-12/"/>
		<updated>2018-12-27T09:00:00Z</updated>
		<id>https://jono.nz/2018/12/27/devlog-2018-12/</id>
		<content type="html">&lt;p&gt;Here’s the last update for 2018!&lt;/p&gt;
&lt;h2 id=&quot;waka&quot; tabindex=&quot;-1&quot;&gt;Waka &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/12/27/devlog-2018-12/#waka&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I didn’t work on Waka this month as I wanted to focus on Nitro. However, I did finish the analysis on Auckland routes - check out the post if you haven’t already. /2018/12/15/aucklandservicelength/&lt;/p&gt;
&lt;h2 id=&quot;nitro-3&quot; tabindex=&quot;-1&quot;&gt;Nitro 3 &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/12/27/devlog-2018-12/#nitro-3&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The big thing this month is keyboard shortcuts. I took some inspiration from Slack and Instant Search on Windows, and put that experience into Nitro. You can now hit Ctrl+K, type, and jump straight into any list or task. You can also quickly navigate through your tasks, reorder them, and either triage them for today, or mark them as complete. Nitro isn’t 100% keyboard accessible yet, but I would really like to get there in the future. There’s also a nice modal which has quick reference to all the shortcuts.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/nitro-2018-dec-keyboardshortcuts.png&quot; alt=&quot;Nitro Keyboard Shortcuts&quot;&gt;&lt;/p&gt;
&lt;p&gt;I also cleaned up all the rough edges of the Auth0 implementation. You’ll now be redirected to the login page if your authentication does expire, and usually it just passes you all the way through and back to Nitro. I’ve also made sure the other Nitro Sync bits such as the WebSockets and BroadcastChannel play nicely with Auth0. It’s a pretty seamless experience, and I would highly recommend using Auth0 for your own project.&lt;/p&gt;
&lt;p&gt;I’ve also fixed a lot of bugs, and added a number of quality of life improvements. The big one is that assets are now stored properly on a CDN. Combined with Service Workers, this means that Nitro loads really fast, and works when you are 100% offline. I wasn’t intending to, but ending up vastly improving the speed of the task overlay, so it’s now really smooth on my little Surface Go.&lt;/p&gt;
&lt;p&gt;Over the next month I want to fix the final remaining issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix the the remaining bugs on mobile&lt;/li&gt;
&lt;li&gt;Improve the sync on slow connections&lt;/li&gt;
&lt;li&gt;Find and fix any last bugs!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Expect to see the initial beta invites to be sent out in January 2019!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Which transit services in Auckland travel the furthest?</title>
		<link href="https://jono.nz/2018/12/15/aucklandservicelength/"/>
		<updated>2018-12-15T12:00:00Z</updated>
		<id>https://jono.nz/2018/12/15/aucklandservicelength/</id>
		<content type="html">&lt;p&gt;I got this question a couple of weeks ago, and I realized I was in a pretty good position to answer it. Waka already has all the required data in it, so it was a matter of writing a couple of SQL queries.&lt;/p&gt;
&lt;p&gt;These results were obtained for the week of November 5th - 11th, 2018. All routes are bus routes if not specified otherwise.&lt;/p&gt;
&lt;h2 id=&quot;what-are-the-longest-routes-in-auckland&quot; tabindex=&quot;-1&quot;&gt;What are the longest routes in Auckland? &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/12/15/aucklandservicelength/#what-are-the-longest-routes-in-auckland&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first question is simple - what are the longest routes in Auckland (school buses excluded).&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Code&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Route Description&lt;/th&gt;
&lt;th style=&quot;text-align:right&quot;&gt;Length (km)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/125X&quot;&gt;125X&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Helensville To City Centre Via Westgate Express&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;58.96&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/396&quot;&gt;396&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Pukekohe Interchange To Waiuku Loop Via Patumahoe&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;49.49&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/SKY&quot;&gt;SKY&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Airport To Albany - &lt;em&gt;Commercial Bus&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;47.68&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/399&quot;&gt;399&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Pukekohe To Port Waikato Via Tuakau&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;44.21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/171X&quot;&gt;171X&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;City Centre To New Lynn Via Laingholm&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;39.23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/125&quot;&gt;125&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Helensville To Westgate&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;38.48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/997&quot;&gt;997&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Warkworth To Omaha Via Matakana And Port Wells&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;37.60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/395&quot;&gt;395&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Waiuku To Papakura Interchange&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;35.70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/N11&quot;&gt;N11&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;City To Papakura Via Great South Rd - &lt;em&gt;Night Bus&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;34.47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/120&quot;&gt;120&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Akoranga to Henderson&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;32.82&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a href=&quot;https://jono.nz/files/aucklandservicelength/routeDistance.csv&quot;&gt;Full Results&lt;/a&gt; · &lt;a href=&quot;https://jono.nz/files/aucklandservicelength/routeDistance.sql&quot;&gt;SQL Queries&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;These results are not particularly interesting. The majority of the above services are semi rural, and don’t have great frequency.&lt;/p&gt;
&lt;h2 id=&quot;what-are-the-shortest-routes-in-auckland&quot; tabindex=&quot;-1&quot;&gt;What are the shortest routes in Auckland? &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/12/15/aucklandservicelength/#what-are-the-shortest-routes-in-auckland&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ignoring the weird routes that aren’t really routes (i.e short running services) and school buses, here are the shortest routes in Auckland.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Code&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Route Description&lt;/th&gt;
&lt;th style=&quot;text-align:right&quot;&gt;Length (km)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/SBAY&quot;&gt;SBAY&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Auckland To Stanley Bay - &lt;em&gt;Ferry&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;2.17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/BAYS&quot;&gt;BAYS&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Bayswater To Auckland - &lt;em&gt;Ferry&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;2.35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/DEV&quot;&gt;DEV&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Auckland To Devonport - &lt;em&gt;Ferry&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;3.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/890&quot;&gt;890&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Albany Station To Corinthian Dr Loop&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;3.51&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/987&quot;&gt;987&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Arkles Bay Loop&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;3.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/BIRK&quot;&gt;BIRK&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Auckland To Birkenhead Via Northcote Point - &lt;em&gt;Ferry&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;4.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/161&quot;&gt;161&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;New Lynn to Brains Park&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;4.17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/807&quot;&gt;807&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Devonport Wharf To Cheltenham Loop&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;4.21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/842&quot;&gt;842&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Smales Farm Station To Crown Hill Via East Coast Rd&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;4.44&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/889&quot;&gt;889&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Constellation Station To Albany Station Via Hugh Green Dr&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;5.18&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;It’s interesting to see that there are no services under 2km, and most of these short services are ferries or local loops.&lt;/p&gt;
&lt;h2 id=&quot;which-routes-in-auckland-have-most-services-per-week&quot; tabindex=&quot;-1&quot;&gt;Which routes in Auckland have most services per week. &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/12/15/aucklandservicelength/#which-routes-in-auckland-have-most-services-per-week&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This includes both short/long running services - there’s no good way split them out.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Route&lt;/th&gt;
&lt;th style=&quot;text-align:right&quot;&gt;Services per Week&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/NX1&quot;&gt;NX1&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;2687&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/NX2&quot;&gt;NX2&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;1788&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/INN&quot;&gt;InnerLink&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;1490&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/70&quot;&gt;70&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;1427&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/SKY&quot;&gt;SkyBus&lt;/a&gt; - &lt;em&gt;Commercial Bus&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;1387&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/18&quot;&gt;18&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;1379&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/OUT&quot;&gt;OuterLink&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;1304&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/82&quot;&gt;82&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;1164&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/CTY&quot;&gt;CityLink&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;1164&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/25B&quot;&gt;25B&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;1147&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a href=&quot;https://jono.nz/files/aucklandservicelength/servicesPerWeek.csv&quot;&gt;Full Results&lt;/a&gt; · &lt;a href=&quot;https://jono.nz/files/aucklandservicelength/servicesPerWeek.sql&quot;&gt;SQL Queries&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The NX1 has the most services by far, but there’s also a lot of services that start halfway through the route. The InnerLink &amp;amp; OuterLink is also fairly high (and the real frequency is high), but because they’re weird loops the route can be split into a bunch of segments (the smallest being 900m).&lt;/p&gt;
&lt;p&gt;The SkyBus is deceiving, because there’s essentially 3 routes under the same code - Albany to Airport, City to Airport via Mt Eden Road, and City to Airport via Dominion Road.&lt;/p&gt;
&lt;h2 id=&quot;which-transit-services-in-auckland-travel-the-furthest-each-week&quot; tabindex=&quot;-1&quot;&gt;Which transit services in Auckland travel the furthest each week? &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/12/15/aucklandservicelength/#which-transit-services-in-auckland-travel-the-furthest-each-week&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now we’ll combine the number of services with how far they go, grouping by the route code.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Route&lt;/th&gt;
&lt;th style=&quot;text-align:right&quot;&gt;Distance Traveled per Week (km)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/NX1&quot;&gt;NX1&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;57,378&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/SKY&quot;&gt;SkyBus&lt;/a&gt; - &lt;em&gt;Commerical Bus&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;55,605&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/OUT&quot;&gt;OuterLink&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;32,326&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/NX2&quot;&gt;NX2&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;32,118&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/70&quot;&gt;70&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;30,257&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/380&quot;&gt;380&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;30,233&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/STH&quot;&gt;Southern Line&lt;/a&gt; - &lt;em&gt;Train&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;28,070&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/WEST&quot;&gt;Western Line&lt;/a&gt; - &lt;em&gt;Train&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;25,143&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/EAST&quot;&gt;Eastern Line&lt;/a&gt; - &lt;em&gt;Train&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;21,872&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://waka.app/l/nz-akl/83&quot;&gt;83&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;21,153&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a href=&quot;https://jono.nz/files/aucklandservicelength/kmPerWeek.csv&quot;&gt;Full Results&lt;/a&gt; · &lt;a href=&quot;https://jono.nz/files/aucklandservicelength/kmPerWeek.sql&quot;&gt;SQL Queries&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The NX1 comes out on top - the frequency is good, and as it travels a long distance on the busway and motorway. In many ways the SkyBus is similar - it travels quite far on the busway and motorway with good frequency, but it is a little deceiving as mentioned earlier.&lt;/p&gt;
&lt;p&gt;It’s not surprising to see some of our long frequent routes in here too - OUT, NX2, 70, and 83. Our trains also make an appearance - while the frequency is not as good as some of our bus network, the trains tend to travel longer distances.&lt;/p&gt;
&lt;p&gt;The most interesting apperance in here is the 380. It is not classified as a frequent service, but it has 15-20 minute service all day. As it is an airport bus, it starts extremely early (4:40am) and ends very late (12:40am) every day. It’s also a bit of a silly route - it really should be split into two halves - Airport to Manukau, and Airport to Onehunga/Mangere.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Dev Log: November 2018</title>
		<link href="https://jono.nz/2018/11/25/devlog-2018-11/"/>
		<updated>2018-11-25T09:00:00Z</updated>
		<id>https://jono.nz/2018/11/25/devlog-2018-11/</id>
		<content type="html">&lt;p&gt;This is the second installment of the dev log. Let’s see if we can keep this streak going!&lt;/p&gt;
&lt;h2 id=&quot;waka&quot; tabindex=&quot;-1&quot;&gt;Waka &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/11/25/devlog-2018-11/#waka&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’ve made some improvements to health checks - they now check if the realtime data is working in Auckland. It’s still at &lt;a href=&quot;https://assets-us-west-2.waka.app/status/index.html&quot;&gt;https://assets-us-west-2.waka.app/status/index.html&lt;/a&gt;, but will eventually be rolled into the app.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/waka-2018-healthchecks.jpg&quot; alt=&quot;SMS Notifications for Health Checks&quot;&gt;&lt;/p&gt;
&lt;p&gt;SMS notifications now trigger when the health checks fail (super simple with Amazon SNS), so I’ll know a lot sooner if Waka is down.&lt;/p&gt;
&lt;p&gt;I’m also trying to answer the question “What routes in Auckland travel the most km per week?”. I should have the answer to that tomorrow, and I’ll do a little bit of a writeup.&lt;/p&gt;
&lt;p&gt;Other than that, there’s been nothing done in actual Waka. Matt hasn’t done anything on &lt;code&gt;waka-importer&lt;/code&gt; either.&lt;/p&gt;
&lt;h2 id=&quot;nitro-3&quot; tabindex=&quot;-1&quot;&gt;Nitro 3 &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/11/25/devlog-2018-11/#nitro-3&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’ve spent most of my time coding Nitro this month.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/nitro-2018-sync-indicator.png&quot; alt=&quot;Nitro Sync Indicator&quot;&gt;&lt;/p&gt;
&lt;p&gt;The overlay position is now fixed - no matter where it’s opened from. However, it’s a bit laggy in some browsers (Edge), and can be laggy on Retina screens. I’ll fix it eventually, but not for the initial release. There’s also a new sync indicator - when a task is syncing, an icon shows up.&lt;/p&gt;
&lt;p&gt;The biggest change is from my own custom username/password auth to &lt;a href=&quot;https://auth0.com&quot;&gt;Auth0&lt;/a&gt;. It provides a decent user experience, and I don’t have to worry about other things such as sign up, 2FA, and OAuth. Unfortunately it seems to log you out a lot, but it’s not a huge deal as it’s only a single click to log back in.&lt;/p&gt;
&lt;p&gt;I also fixed a couple of other bugs and papercuts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added the sign out button back&lt;/li&gt;
&lt;li&gt;Added proper error messages on the login page&lt;/li&gt;
&lt;li&gt;Upgraded all dependencies&lt;/li&gt;
&lt;li&gt;Fixed the list ordering without all list&lt;/li&gt;
&lt;li&gt;Fixed a race condition when notes were being saved&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next month, I want to continue to focus on fixing bugs and improve the performance on slower machines and phones. I also want the sync to be a bit better - stopping your browser from closing if sync is in progress, and triggering a sync if you haven’t been using Nitro for some time. Oh, and I still need to add the settings menu.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;That’s it for November! If you have any questions, flick them through to me on &lt;a href=&quot;https://twitter.com/consindo&quot;&gt;Twitter&lt;/a&gt;, and I’ll try answer them in the next post.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Dev Log: October 2018</title>
		<link href="https://jono.nz/2018/10/22/devlog-2018-10/"/>
		<updated>2018-10-22T09:00:00Z</updated>
		<id>https://jono.nz/2018/10/22/devlog-2018-10/</id>
		<content type="html">&lt;p&gt;I haven’t been posting on this blog for a while, but I have been doing things. I’m going to aim to do one of these dev logs every month or so. The idea is that I’ll be more accountable and maybe even release something.&lt;/p&gt;
&lt;p&gt;Anyway, here’s what I’ve been doing over the last little bit.&lt;/p&gt;
&lt;h2 id=&quot;waka&quot; tabindex=&quot;-1&quot;&gt;Waka &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/10/22/devlog-2018-10/#waka&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We ended up running out of Azure Credits, and decided to move Waka to AWS. It’s generally a lot cheaper, and as I use AWS at Xero, I’m pretty familiar with how to Terraform the bits and pieces together. We had to switch from Azure Blob Storage to S3, and move from a maps server to static map tiles in a S3 Bucket. Other than that, it went fine.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mattdavidson.kiwi&quot;&gt;Matt&lt;/a&gt; is supposed to be working on &lt;a href=&quot;https://github.com/dymajo/waka-importer&quot;&gt;waka-importer&lt;/a&gt;. The idea is that you input a GTFS file, and it’ll dump everything to a SQL Database Dump &amp;amp; Upload Shapes to S3. Hopefully, this should make Waka a bit more modular. It’s mostly just extracting the existing functionality into a standalone app, so it should be done pretty soon.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/wakastatus.png&quot; alt=&quot;Waka Status Page&quot;&gt;&lt;/p&gt;
&lt;p&gt;Waka now has a &lt;a href=&quot;https://assets-us-west-2.waka.app/status/index.html&quot;&gt;status page&lt;/a&gt;. It’s pretty rough right now, but it’ll be integrated into service alerts when we add them in. This will probably happen pretty soon because I now live in Wellington, and it seems that every time I go try and catch a train, it’s been replaced by a bus.&lt;/p&gt;
&lt;p&gt;In terms of a roadmap, the next things coming will be a new unified lines view, service alerts, and hopefully a switch to Docker containers.&lt;/p&gt;
&lt;h2 id=&quot;nitro-3&quot; tabindex=&quot;-1&quot;&gt;Nitro 3 &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/10/22/devlog-2018-10/#nitro-3&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’m still working on Nitro! I get a lot of emails asking when Nitro 3 is coming, and the only thing I can say is “soon”.&lt;/p&gt;
&lt;p&gt;Nitro has taken a long time to build for a number of reasons. Firstly, it’s trying to ship an interface that feels native on both mobile &amp;amp; desktop. The end result is great - a single screen, like most native apps. However, it’s much more difficult than building something in Bootstrap, with no animations, and calling it a day.&lt;/p&gt;
&lt;p&gt;The second reason for the slow development is the syncing. Nitro works perfectly offline, and it will merge changes when you go back online. I decided to write my own sync code with a standard postgres database, but definitely ran into more issues than I had envisioned.&lt;/p&gt;
&lt;p&gt;Lastly, I don’t have enough time. I’m not a uni student anymore, and have less time to work on things. This will hopefully change when Nitro is released and is earning a little bit of money, but for now, I have to balance it around other things.&lt;/p&gt;
&lt;p&gt;Anyway, here’s what Nitro looks like right now:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/nitro-2018-oct-mobile.png&quot; alt=&quot;Nitro Mobile&quot;&gt;&lt;/p&gt;
&lt;p&gt;And here it is on the desktop:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/nitro-2018-oct-desktop.png&quot; alt=&quot;Nitro Desktop&quot;&gt;&lt;/p&gt;
&lt;p&gt;As you can see, it’s taken a little bit of inspiration from Waka - that user interface works really well on mobile. It’s also very easy to adapt it to the desktop.&lt;/p&gt;
&lt;p&gt;At the moment, I’m working on the expanded task. While the inside is done, there’s quite a few weird bugs when you try open a task from a fresh reload, search, or click too fast. For performance reasons, it’s rendered as an overlay, rather than inline with an expanding height, but it does make things a bit weird.&lt;/p&gt;
&lt;p&gt;Other than that, the next task is to finish off sync (add an indicator + fix edge cases), and add a little more polish (papercuts + settings + sign up). I haven’t been adding features for some time now because I want to get a release out the door. If you haven’t already, you can sign up for the beta at &lt;a href=&quot;http://nitrotasks.com&quot;&gt;nitrotasks.com&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;That’s it for this month! If you have any questions, flick them through to me on &lt;a href=&quot;https://twitter.com/consindo&quot;&gt;Twitter&lt;/a&gt;, and I’ll try answer them in the next post.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Turbolinks</title>
		<link href="https://jono.nz/2018/04/02/turbolinks/"/>
		<updated>2018-04-02T10:28:17Z</updated>
		<id>https://jono.nz/2018/04/02/turbolinks/</id>
		<content type="html">&lt;p&gt;Single Page Routing is cool, because it allows your pages to load without incurring the cost a full load. It can be difficult to set up, but I would recommend checking out &lt;a href=&quot;https://github.com/turbolinks/turbolinks&quot;&gt;Turbolinks&lt;/a&gt;. You can Single Page Routing running on your existing site in like, twenty minutes. It’s great.&lt;/p&gt;
&lt;p&gt;It’s a tiny little script that you just have to insert into your &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, and it swaps out the body whenever you follow a link. It prevents your CSS and JS from being redownloaded, so you don’t get an unsightly white flash when your page loads.&lt;/p&gt;
&lt;p&gt;This site is already pretty fast, as it uses &lt;a href=&quot;https://hexo.io&quot;&gt;Hexo&lt;/a&gt; to render the site out statically, but I still added Turbolinks, and now it’s even faster.&lt;/p&gt;
&lt;p&gt;The process was also pretty simple for this site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add script tag&lt;/li&gt;
&lt;li&gt;Move other script tags to the head, with a &lt;code&gt;defer&lt;/code&gt; attribute.&lt;/li&gt;
&lt;li&gt;Realize that my script only queries the elements once, so I needed to add a &lt;code&gt;data-turbolinks-permanent&lt;/code&gt; to my navigation element.
&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And I think that’s it. It’s really great for sites that don’t use a lot of JavaScript.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/turbolinks/turbolinks&quot;&gt;https://github.com/turbolinks/turbolinks&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>How does Waka work? - Part 2</title>
		<link href="https://jono.nz/2018/02/25/transit-part2/"/>
		<updated>2018-02-25T19:56:43Z</updated>
		<id>https://jono.nz/2018/02/25/transit-part2/</id>
		<content type="html">&lt;p&gt;Finally, part two of this guide! In part two, we’ll go over how the frontend works. I managed to keep &lt;a href=&quot;https://jono.nz/2017/10/08/transit-part1/&quot;&gt;part one&lt;/a&gt; reasonably well updated, but contact me if you have any issues.&lt;/p&gt;
&lt;h2 id=&quot;setting-up&quot; tabindex=&quot;-1&quot;&gt;Setting Up &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/02/25/transit-part2/#setting-up&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you’ve already set up the server, it’ll all good to go! If not, you’ll need node.js &amp;amp; npm installed - https://nodejs.org. Then, three easy steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First, get the code with &lt;code&gt;git clone https://github.com/consindo/waka.git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Install dependencies with &lt;code&gt;npm install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Build the client with  &lt;code&gt;npm run build&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;development&quot; tabindex=&quot;-1&quot;&gt;Development &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/02/25/transit-part2/#development&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you’re only working on the frontend code, and don’t want to go to the hassle of setting up your own server, you can simply use &lt;code&gt;npm run watch:live&lt;/code&gt;. If you have the server set up, you can use &lt;code&gt;npm run watch&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;Waka uses Webpack, so you get all the fancy live reloading - just head to http://locahost:8009. In terms of code style, eslint &amp;amp; prettier are all set up - just run it through them before you send a pull request.&lt;/p&gt;
&lt;h2 id=&quot;react&quot; tabindex=&quot;-1&quot;&gt;React &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/02/25/transit-part2/#react&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Waka is written in React, with React Router for the single page routing. If adding a new page or view, it’s super important to make sure it can be accessed with a URL - this is how the back button works on Android.&lt;/p&gt;
&lt;p&gt;For maps, Waka uses the DYMAJO OpenStreetMap Server, because it’s too expensive to use Mapbox or something similar. We’re currently using Leaflet with react-leaflet, but this will be replaced with mapbox-gl-js in the near future.&lt;/p&gt;
&lt;p&gt;Lots of stuff in Waka is custom because most React components are designed for the desktop. 90% of Traffic to Waka is from mobile, so make sure always build mobile first. Often, I like to plug in my phone and debug directly on that.&lt;/p&gt;
&lt;h2 id=&quot;scss&quot; tabindex=&quot;-1&quot;&gt;SCSS &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/02/25/transit-part2/#scss&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It’s all custom. It’s also a little bit of a mess, because the app has undergone a number of significant redesigns in its 1.5 year history. A new redesign is coming soon, so I’ll do my best to clean it up a little more.&lt;/p&gt;
&lt;h2 id=&quot;speed&quot; tabindex=&quot;-1&quot;&gt;Speed &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/02/25/transit-part2/#speed&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Waka uses Service Workers to run offline, and it falls back nicely. It’s not very useful offline, but at least it will load when you’re running out of the house and there’s very bad Wi-Fi. Bundle size is also reasonably well optimized, so use dynamic imports if necessary.&lt;/p&gt;
&lt;p&gt;There’s also the percieved speed - the app uses a large amount of animation in an effort to make things feel faster. If you think something needs an animation, please add it!&lt;/p&gt;
&lt;h2 id=&quot;now-what&quot; tabindex=&quot;-1&quot;&gt;Now what? &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2018/02/25/transit-part2/#now-what&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Please download the code and mess around! It’s much easier to get started with the client than the server, so if there’s something you’re dying to fix or add, it would be greatly appreciated.&lt;/p&gt;
&lt;p&gt;Any questions, suggestions, or issues - &lt;a href=&quot;http://localhost:4000/me/&quot;&gt;contact me!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;https://github.com/consindo/waka&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>How does Waka work? - Part 1</title>
		<link href="https://jono.nz/2017/10/08/transit-part1/"/>
		<updated>2017-10-08T19:56:43Z</updated>
		<id>https://jono.nz/2017/10/08/transit-part1/</id>
		<content type="html">&lt;p&gt;Matt keeps asking me how Waka works, so I’ve decided to write a guide. In Part 1, we go over how the server does things. I’ll try make an effort to keep this guide updated - contact me if it’s not.&lt;/p&gt;
&lt;h2 id=&quot;the-server-stack&quot; tabindex=&quot;-1&quot;&gt;The Server Stack &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#the-server-stack&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before you even try to start Waka, you’ll need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows or Linux (I develop on Windows, production on Linux)&lt;/li&gt;
&lt;li&gt;Node.js https://nodejs.org&lt;/li&gt;
&lt;li&gt;Microsoft SQL Server http://downloadsqlserverexpress.com&lt;/li&gt;
&lt;li&gt;Azure Storage Emulator https://azure.microsoft.com/en-us/downloads/&lt;/li&gt;
&lt;li&gt;Git https://git-scm.com/&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;handy-tools&quot; tabindex=&quot;-1&quot;&gt;Handy Tools &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#handy-tools&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SQL Server Management Studio (install when installing SQL Server) - Windows only though.&lt;/li&gt;
&lt;li&gt;Azure Storage Explorer (don’t use it a lot but it can be handy) https://azure.microsoft.com/en-us/features/storage-explorer/&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;third-party-api-s&quot; tabindex=&quot;-1&quot;&gt;Third Party API’s &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#third-party-api-s&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Auckland Transport (if you want Auckland to work) https://dev-portal.at.govt.nz/&lt;/li&gt;
&lt;li&gt;Sendgrid (to get the send a link emails working) https://sendgrid.com/&lt;/li&gt;
&lt;li&gt;Azure Application Insights (only for production) https://azure.microsoft.com/en-us/services/application-insights/&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;configuration&quot; tabindex=&quot;-1&quot;&gt;Configuration &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#configuration&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;First, get the code with &lt;code&gt;git clone https://github.com/consindo/waka.git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Install dependencies with &lt;code&gt;npm install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Build the client with  &lt;code&gt;npm run build&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;config-js&quot; tabindex=&quot;-1&quot;&gt;/config.js &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#config-js&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is app wide config. Defaults should be fine, but change the public &amp;amp; private ports if required. Make sure you don’t expose the private port to the web! You can also disable auto updates / worker management of cities by adjusting the &lt;code&gt;autoupdate&lt;/code&gt; entry.&lt;/p&gt;
&lt;h3 id=&quot;server-master-db-config-master-js-config-slave-js&quot; tabindex=&quot;-1&quot;&gt;/server-master/db/config-master.js, config-slave.js &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#server-master-db-config-master-js-config-slave-js&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;These are where the app looks for database connection strings. Make your SQL Server install allows SQL Server Authentication, and TCP/IP Network Protocol is enabled. The user set in &lt;code&gt;config-master.js&lt;/code&gt; must be allowed to Create Databases, and the user set in &lt;code&gt;config-slave.js&lt;/code&gt; must be allowed to access and modify the created database. You will need an already created database in &lt;code&gt;config-master.js&lt;/code&gt;, but this is not needed for the slave.&lt;/p&gt;
&lt;p&gt;By default, workers in the workers table use the dbconfig of &lt;code&gt;slave&lt;/code&gt;, but you can set this to &lt;code&gt;whatever&lt;/code&gt; if you want to use &lt;code&gt;config-whatever.js&lt;/code&gt; (if you need to distribute over multiple instances of SQL Server).&lt;/p&gt;
&lt;h3 id=&quot;environmental-variables&quot; tabindex=&quot;-1&quot;&gt;Environmental Variables &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#environmental-variables&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AZURE_STORAGE_ACCOUNT&lt;/code&gt; - the Azure Storage Account. For the emulator, use: &lt;code&gt;devstoreaccount1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AZURE_STORAGE_ACCESS_KEY&lt;/code&gt; - the Azure Storage Account Key. For the emulator, use:
&lt;code&gt;Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;atApiKey&lt;/code&gt; - the Auckland Transport API Key (optional if you don’t want Auckland)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SENDGRID_API_KEY&lt;/code&gt; for emails (optional)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AZURE_INSIGHTS&lt;/code&gt; for insights (optional)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AGENDA21_API_KEY&lt;/code&gt; currently a private key, returns parking information for Auckland Carparks (optional)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;starting&quot; tabindex=&quot;-1&quot;&gt;Starting &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#starting&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yay! You’ve configured Waka. Run &lt;code&gt;node index.js&lt;/code&gt; to start, and it’ll create the database and start on the port you specified.&lt;/p&gt;
&lt;p&gt;If you don’t want it to start downloading data from Auckland automatically, make sure you disable the auto updates in &lt;code&gt;/config.js&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;architecture&quot; tabindex=&quot;-1&quot;&gt;Architecture &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#architecture&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Waka has a master process that manages a collection of worker processes, each encapsulating a particular region &amp;amp; version and providing the API. Each worker process uses its own database which keeps things smaller, faster, and is easier to delete when the data has expired. There’s mapping functionality which sends all requests to a particular region to a particular version. If you’re using the auto importers you shouldn’t have to worry about the mappings, but it is possible to override.&lt;/p&gt;
&lt;p&gt;Worker spawning is done through node’s &lt;code&gt;child_process.fork&lt;/code&gt;, and all communication thereafter is done through a standard REST API - using both the public and private methods on both the master and the worker. Requests are proxied through to the mapped worker from the master. Check out all the router files for further details.&lt;/p&gt;
&lt;p&gt;Static rendering and hosting of assets is done through yet another process. For static rendering, it uses the standard public REST API, and transforms the JSON to HTML. Files in &lt;code&gt;/dist&lt;/code&gt; are all hosted under &lt;code&gt;/&lt;/code&gt; when a route cannot be found. If a file is not found in &lt;code&gt;/dist&lt;/code&gt;, the static server returns a default or 404 page, and lets the client side JavaScript take over the rest.&lt;/p&gt;
&lt;h2 id=&quot;server-master-private-api&quot; tabindex=&quot;-1&quot;&gt;Server-Master Private API &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#server-master-private-api&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you’re not using an auto importer or just need to emergency fix things, you can do so with the private API. It’s not secured, so you have to make sure the port isn’t exposed.&lt;/p&gt;
&lt;p&gt;For most of these requests, just pop a JSON object with the prefix (region) and version in the request body.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: You can now just head to &lt;a href=&quot;http://localhost:8001&quot;&gt;http://localhost:8001&lt;/a&gt; and there’s a nice UI for running these request.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /worker&lt;/code&gt; - Returns all the available workers.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /worker/add&lt;/code&gt; - Send a prefix, version to create a new worker.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /worker/load&lt;/code&gt; - Load workers from the database again (generally shouldn’t use this)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /worker/start&lt;/code&gt; - Send a prefix, version to start a particular worker.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /worker/startall&lt;/code&gt; - Starts all workers that have startpolicy ‘auto’&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /worker/stop&lt;/code&gt; - Stops a worker process.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /worker/delete&lt;/code&gt; - Stops a worker, and then deletes it from the database.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET  /mapping&lt;/code&gt; - Shows which prefixes are mapped to which workers.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /mapping/load&lt;/code&gt; - Loads mappings from the database again (generally shouldn’t use this)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /mapping/set&lt;/code&gt; - Send a prefix and a version to set the worker where requests are forwarded.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /mapping/delete&lt;/code&gt; - Unmaps a prefix - requests to a region will 404 after being deleted.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /import-start/:mode&lt;/code&gt; - Trigger a manual import of GTFS data. Use &lt;code&gt;db&lt;/code&gt; for the database import, &lt;code&gt;shapes&lt;/code&gt; for the Azure Shapes Parse &amp;amp; Upload, or &lt;code&gt;all&lt;/code&gt; for both.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /import-complete&lt;/code&gt; - Used internally from the worker - tells master that an import has completed so it can update the database and run any callbacks.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;server-worker-and-server-static-public-api&quot; tabindex=&quot;-1&quot;&gt;Server-Worker &amp;amp; Server-Static Public API &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#server-worker-and-server-static-public-api&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is the public API. You can generate them with &lt;code&gt;npm run document&lt;/code&gt; or just head to &lt;a href=&quot;https://waka.app/docs/index.html&quot;&gt;https://waka.app/docs/index.html&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;sql-migrations&quot; tabindex=&quot;-1&quot;&gt;SQL Migrations &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#sql-migrations&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Because we create the database from scratch every time a new worker is created, we don’t have to worry about migrations! Simply delete the worker and try again if you’re having any issues. The SQL files which create the tables and stored procedures are located in &lt;code&gt;/server-worker/db/procs&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I’m not sure how to do the migrations for the master database yet, but the scripts that create it on first run are in &lt;code&gt;/server-master/db/procs&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;tests&quot; tabindex=&quot;-1&quot;&gt;Tests &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#tests&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;No unit tests yet 😢. There’s a couple of tests in the Auckland auto importer that does a quick check before changing the live mapping, but that’s it. There’s definitely room for improvement here.&lt;/p&gt;
&lt;h2 id=&quot;other-things&quot; tabindex=&quot;-1&quot;&gt;Other Things &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#other-things&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Here’s some things you might want to do when modifying or using Waka as a dev.&lt;/p&gt;
&lt;h3 id=&quot;adding-a-new-city&quot; tabindex=&quot;-1&quot;&gt;Adding a New City &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#adding-a-new-city&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Add an importer with countrycode-airportcode as the prefix in &lt;code&gt;/server-worker/importers&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Use the private API to add, start, run the importer, and set the mapping to your version.&lt;/li&gt;
&lt;li&gt;Fix anything that’s broken when you try use that city.
&lt;ul&gt;
&lt;li&gt;Lines requires special config.&lt;/li&gt;
&lt;li&gt;Realtime also requires special config.&lt;/li&gt;
&lt;li&gt;Stations, Stop Times, and Timetable should be pretty smooth sailing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Add an auto importer to keep versions &amp;amp; mappings up to date.&lt;/li&gt;
&lt;li&gt;Send a pull request!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;now-what&quot; tabindex=&quot;-1&quot;&gt;Now what? &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2017/10/08/transit-part1/#now-what&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hopefully you download the code and have a play - fix a few issues, or even just file some 😃 https://github.com/consindo/waka/issues&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://jono.nz/2018/02/25/transit-part2/&quot;&gt;Part 2&lt;/a&gt;, we’ll go over the client-side development.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Mobile Safari Hacks</title>
		<link href="https://jono.nz/2016/12/30/ioshacks/"/>
		<updated>2016-12-30T08:30:00Z</updated>
		<id>https://jono.nz/2016/12/30/ioshacks/</id>
		<content type="html">&lt;p&gt;While developing &lt;a href=&quot;https://waka.app&quot;&gt;Waka&lt;/a&gt;, I’ve discovered that Mobile Safari is the new IE6. Most of this arises because Apple has layered on a number of fancy features that work great for most sites, but create problems when you trying making a web app. Here’s a couple of issues and fixes for these things:&lt;/p&gt;
&lt;h2 id=&quot;desktop-safari-is-completely-different-to-mobile-safari&quot; tabindex=&quot;-1&quot;&gt;Desktop Safari is completely different to Mobile Safari &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2016/12/30/ioshacks/#desktop-safari-is-completely-different-to-mobile-safari&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Desktop Safari looks great, but the app doesn’t work on iOS.
&lt;strong&gt;Solution:&lt;/strong&gt; Unfortunately, you always have to be testing on real devices. This goes for Android too, because these devices are a lot slower than your dev machine.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/throttle.png&quot; alt=&quot;Chrome CPU Throttling&quot;&gt;&lt;/p&gt;
&lt;p&gt;It’s also a good idea to enable CPU Throttling in Chrome in order to get an idea of how your app will perform.&lt;/p&gt;
&lt;h2 id=&quot;viewport-height-is-too-high&quot; tabindex=&quot;-1&quot;&gt;Viewport Height is too high &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2016/12/30/ioshacks/#viewport-height-is-too-high&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; 100vh includes the height of the browser controls, which are overlaid so there’s the fancy blur effect.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/ios-vh-issue.png&quot; alt=&quot;iOS Viewport Height Issue&quot; title=&quot;Image from https://nicolas-hoizey.com/2015/02/viewport-height-is-taller-than-the-visible-part-of-the-document-in-some-mobile-browsers.html&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; If you can’t use height 100%, I would recommend using a CSS variable, and line of code like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;document.body.style.setProperty(&#39;--real-height&#39;, document.documentElement.clientHeight + &#39;px&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Make sure to bind this to your window.onresize event!&lt;/p&gt;
&lt;h2 id=&quot;no-kinetic-scrolling-in-child-elements&quot; tabindex=&quot;-1&quot;&gt;No Kinetic Scrolling in Child Elements &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2016/12/30/ioshacks/#no-kinetic-scrolling-in-child-elements&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Having overflow:scroll in a container doesn’t have any inertia.
&lt;strong&gt;Solution:&lt;/strong&gt; On your element, set &lt;code&gt;-webkit-overflow-scrolling: touch;&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;webkit-overflow-scrolling-bubbles-to-page&quot; tabindex=&quot;-1&quot;&gt;-webkit-overflow-scrolling bubbles to page &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2016/12/30/ioshacks/#webkit-overflow-scrolling-bubbles-to-page&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; When you’re at the top of the element, the entire page scrolls, not the element.
&lt;strong&gt;Solution:&lt;/strong&gt; You’ll need two elements, something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;scrollable&amp;quot;&amp;gt;
  &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;
    Content
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On the inner element, you’ll need to set &lt;code&gt;min-height: 101%&lt;/code&gt;. Then, &lt;code&gt;onTouchStart&lt;/code&gt;, you’ll need some JavaScript that moves the scroll position down a single pixel at the top of the page, or up a pixel at the bottom.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let top = e.scrollTop
let totalScroll = e.scrollHeight
let currentScroll = top + e.offsetHeight
 
if (top === 0) {
  e.scrollTop = 1
} else if (currentScroll === totalScroll) {
  e.scrollTop = top - 1
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;flexbox-is-funky-in-row-direction&quot; tabindex=&quot;-1&quot;&gt;Flexbox is funky in row direction &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2016/12/30/ioshacks/#flexbox-is-funky-in-row-direction&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Flexbox generally doesn’t work in the row direction on iOS.
&lt;strong&gt;Solution:&lt;/strong&gt; If setting the container height with the CSS variable you made doesn’t work, use &lt;code&gt;calc()&lt;/code&gt; with that variable. It’s really not ideal, but this is what I’ve found works best.&lt;/p&gt;
&lt;h2 id=&quot;force-touch&quot; tabindex=&quot;-1&quot;&gt;Force Touch &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2016/12/30/ioshacks/#force-touch&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; If you force touch on an link that you styled like a button because you have fancy single page routing, it’ll pop up a preview.
&lt;strong&gt;Solution:&lt;/strong&gt; If iOS, don’t use the anchor tag (or at least a href). Bind an event to the button, &lt;a href=&quot;https://developer.mozilla.org/en/docs/Web/API/History&quot;&gt;and push the new URL to the History&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;no-caching-when-pinned-to-home-screen&quot; tabindex=&quot;-1&quot;&gt;No caching when pinned to home screen &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2016/12/30/ioshacks/#no-caching-when-pinned-to-home-screen&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; There’s no HTTP caching when the app is pinned to home screen. Makes for long initial load times.
&lt;strong&gt;Solution:&lt;/strong&gt; You’re gonna have to use &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Using_the_application_cache&quot;&gt;AppCache&lt;/a&gt; for this one.&lt;/p&gt;
&lt;p&gt;That’s all I can think of for now. If you have a Mobile Safari hack, message me, and I’ll add it to this post!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>XPS 13 vs Surface</title>
		<link href="https://jono.nz/2016/08/31/xps13/"/>
		<updated>2016-08-31T22:00:00Z</updated>
		<id>https://jono.nz/2016/08/31/xps13/</id>
		<content type="html">&lt;p&gt;I recently bought a Dell XPS 13, to replace my Surface Pro 3. These devices roughly cost the same, but I managed to snag a last generation XPS with the improved screen for the same price as a current generation with the regular HD display. I miss out on USB-C and improved graphics, but that’s not a huge deal.&lt;/p&gt;
&lt;p&gt;While both of these devices are a generation behind, they’re very similar to the current model, so this comparison is still valid.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/xps13.jpg&quot; alt=&quot;My XPS 13&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-the-xps-does-better&quot; tabindex=&quot;-1&quot;&gt;What the XPS does better &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2016/08/31/xps13/#what-the-xps-does-better&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Screen&lt;/strong&gt; This is the best part of the XPS 13. The 3200x1800 resolution is great, and apps like Photoshop look great at 200% scaling. There’s more pixels on this thing than the 15&amp;quot; MacBook Pro! Oh, and the tiny bezels are beautiful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Battery&lt;/strong&gt; Even with the crazy screen, the XPS lasts 9 hours. The Surface with a fresh battery only lasts 5 hours. The power management also seems a lot better - the Surface always used to randomly turn on in my bag.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Connectivity&lt;/strong&gt; The XPS has an extra USB port, lock slot and a full sized SD card reader. The newer model even has Thunderbolt over USB-C! Oh, and if you thought Broadcom Wi-Fi was bad, the Atheros chip in the Surface will drive your head through a wall.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-the-surface-does-better&quot; tabindex=&quot;-1&quot;&gt;What the Surface does better &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2016/08/31/xps13/#what-the-surface-does-better&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stylus&lt;/strong&gt; The Surface has pen support, which works really well. It’s great if you want to annotate things, or draw. However, I find paper better because you can spread it around on a table and refer back a bit easier. Oh, and since printing is an enormous hassle, I just handwrite my assignments anyway. ¯&#92;_(ツ)_/¯&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Keyboard&lt;/strong&gt; The Type Cover 4 is less mushy, even though it has less travel.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Audio&lt;/strong&gt; The Surface has front facing speakers and never any software issues. On the XPS, very occasionally headphones aren’t detected or the sound quality deteriorates (a reboot fixes this).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;things-other-people-have-issues-with&quot; tabindex=&quot;-1&quot;&gt;Things other people have issues with &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2016/08/31/xps13/#things-other-people-have-issues-with&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Webcam&lt;/strong&gt; The XPS 13 has stupid webcam placement, but I use my phone for video calling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Form Factor&lt;/strong&gt; The Surface is also a tablet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows Hello&lt;/strong&gt; Only the Surface Pro 4 has this, but it’s really cool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows 10 Pro&lt;/strong&gt; The Surface comes with it, but I had a spare license for my XPS.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-both-could-do-better&quot; tabindex=&quot;-1&quot;&gt;What both could do better &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2016/08/31/xps13/#what-both-could-do-better&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Trackpad&lt;/strong&gt; The trackpad on the Type Cover 4 is too small. The XPS 13 doesn’t support four finger gestures. I just wish I could switch desktops with 3 fingers. There’s also a lot of apps in Windows that don’t handle precision scrolling well *&lt;em&gt;cough&lt;/em&gt;* &lt;em&gt;Electron&lt;/em&gt; *&lt;em&gt;cough&lt;/em&gt;*.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Windows 10&lt;/strong&gt; Sometimes Windows Explorer messes up and I can’t use instant search. It’s very annoying, and I need to restart the process.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-verdict&quot; tabindex=&quot;-1&quot;&gt;The Verdict &lt;a class=&quot;header-anchor&quot; href=&quot;https://jono.nz/2016/08/31/xps13/#the-verdict&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I like the XPS more, if only because of the nicer screen and significantly better battery. If a tablet and stylus is important to you, get a Surface.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>This is my awesome website</title>
		<link href="https://jono.nz/2016/07/17/hi/"/>
		<updated>2016-07-17T16:54:21Z</updated>
		<id>https://jono.nz/2016/07/17/hi/</id>
		<content type="html">&lt;p&gt;Hi, I’m Jono. I’ve had a couple of blogs over the years, but they tend to disappear as I abandon side projects and domain names. I finally have a domain name that I like, so I’ve decided to build a proper website. I haven’t completely finished yet, but the aim is to have all my work, projects, and writing in one place.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jono.nz/images/hi.jpg&quot; alt=&quot;Picture of Jono&quot;&gt;&lt;/p&gt;
&lt;p&gt;Who am I? Well, that page isn’t done yet, but I’m a student currently living in Auckland, New Zealand. At the moment, I study Computer Science &amp;amp; Applied Mathematics at the University of Auckland. On the side, I build websites for other people, make apps and travel the world.&lt;/p&gt;
&lt;p&gt;I’m currently building a beautiful FTP + SFTP app for Windows 10. It’s not released yet, but you can check it out and sign up to the beta at &lt;a href=&quot;https://dymajo.com&quot;&gt;dymajo.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That’s really it for now. Feel free to copy and share anything written on the blog, with attribution. The website design and source code is also freely available on &lt;a href=&quot;https://github.com&quot;&gt;GitHub&lt;/a&gt;. Do whatever you like with it, but linking back is highly appreciated.&lt;/p&gt;
</content>
	</entry>
</feed>
