<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Networking · Jared Lynskey</title>
    <link>https://jared.lynskey.co.nz/en/tags/networking/</link>
    <description>Short stories of value on software engineering and engineering leadership — performance reviews, hiring and scaling teams, CI/CD, DevOps monitoring and agentic AI. Written from Seoul.</description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>© 2026 Jared Lynskey</copyright>
    <lastBuildDate>Wed, 28 Oct 2026 00:00:00 +1300</lastBuildDate>
    <atom:link href="https://jared.lynskey.co.nz/en/tags/networking/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Cloudflare WARP as a Private Network: Connecting My Laptop, Phone and Workstation</title>
      <link>https://jared.lynskey.co.nz/en/posts/2026/2026-10-01-cloudflare-warp-dev-network/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/en/posts/2026/2026-10-01-cloudflare-warp-dev-network/</guid>
      <pubDate>Thu, 01 Oct 2026 00:00:00 +1200</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Cloudflare</category>
      <category>WARP</category>
      <category>Zero Trust</category>
      <category>Cloudflare Tunnel</category>
      <category>Networking</category>
      <category>SSH</category>
      <category>DevOps</category>
      <category>AI Agents</category>
      <category>Ollama</category>
      <category>Mobile Development</category>
      <category>IPv6</category>
      <description>How I use Cloudflare WARP and two Cloudflare Tunnels (Zero Trust) to put a laptop, a phone on 5G and an office GPU workstation on one private network: fixed private IPs, no open ports, and dev servers behind Access.</description>
      <content:encoded><![CDATA[<p>Cloudflare WARP can put your own machines on one private network without opening a single port. Run a Cloudflare Tunnel (<code>cloudflared</code>) on each machine you want to reach, have each tunnel advertise a private IP range, and enroll your laptop and phone in a Zero Trust organisation with the WARP client in include mode. From then on, a phone on 5G can open a plain connection to <code>198.18.42.2</code> and land on the workstation in the office. Below is how mine is set up, and the four things that bit me along the way.</p>
<p>My working setup is three machines that are rarely in the same place. There&rsquo;s a MacBook Air, which goes wherever I go. There&rsquo;s a workstation in the office called devbox, with a real GPU, which runs Ollama, my fine-tuning tools, a small Kubernetes cluster with its own container registry, and whatever agent I&rsquo;ve left grinding through a long job. And there&rsquo;s my phone, which is where the apps I build actually get used, and which spends most of its day on mobile data rather than wifi.</p>
<p>For a long time those three didn&rsquo;t really talk to each other. The laptop could reach devbox when it was on the office LAN and not otherwise. The phone could reach my laptop&rsquo;s dev server when both were on the same wifi, and then only if I remembered to bind to <code>0.0.0.0</code> and typed in whatever DHCP had given the Mac that morning. Everything interesting on the workstation, the Ollama API, the cluster dashboards, the traces, the registry, was bound to localhost or to the cluster network, deliberately, because none of it belongs on the internet.</p>
<p>This post is how I joined them up with Cloudflare WARP and a pair of Cloudflare Tunnels, what it changed about how I build AI features and mobile apps, and the handful of things that broke without telling me.</p>

<h2 class="relative group">What I actually wanted
    <div id="what-i-actually-wanted" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-i-actually-wanted" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>Stated as requirements, it&rsquo;s short:</p>
<ol>
<li>The laptop should be a thin client. Anything that needs a GPU, a lot of RAM or hours of runtime should run on devbox, and the laptop should reach it the same way from the office, from home and from a café.</li>
<li>The phone should reach my dev servers and my shells from anywhere, on mobile data, without a VPN I have to remember to switch on and off.</li>
<li>The things I use to see how a system is behaving, dashboards, traces, <code>docker info</code>, model lists, should be reachable by me and nobody else, and should never get a public URL.</li>
<li>No inbound ports. Not on the office router, not on my home router, not anywhere.</li>
</ol>
<p>The fourth one rules out the old answer, which is a port forward and a dynamic DNS name. It also rules out a lot of cleverness: both devbox and my laptop sit behind NAT I don&rsquo;t control, and the laptop is behind a different NAT every few hours.</p>

<h2 class="relative group">Before: a repo of SSH tunnels
    <div id="before-a-repo-of-ssh-tunnels" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#before-a-repo-of-ssh-tunnels" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>The first version of this was a small repo of my own, and it&rsquo;s still the base layer. It solves the &ldquo;clean names for things I reach over SSH&rdquo; problem on the laptop and nothing more. dnsmasq answers <code>*.test</code> with <code>127.0.0.1</code>, Caddy routes by hostname to a local port with <code>tls internal</code> so the browser is happy, and a set of autossh launch agents hold the SSH forwards open and reconnect when they drop. The hostnames say where a thing lives:</p>
<table>
	<thead>
			<tr>
					<th>Suffix</th>
					<th>Means</th>
					<th>Carried by</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>*.local.test</code></td>
					<td>this Mac</td>
					<td>nothing, it&rsquo;s a dev server</td>
			</tr>
			<tr>
					<td><code>*.ssh.test</code></td>
					<td>a server</td>
					<td>an autossh forward</td>
			</tr>
			<tr>
					<td><code>*.cloud.test</code></td>
					<td>a hosted app</td>
					<td>the hosting platform&rsquo;s own proxy</td>
			</tr>
	</tbody>
</table>
<p>So <code>https://devbox-ollama.ssh.test/api/tags</code> lists the models on the workstation, and <code>https://api.local.test</code> is the API of the app I&rsquo;m working on, running on my own machine.</p>
<p>Subdomains of <code>.test</code>, not new top-level names like <code>.ssh</code> or <code>.cloud</code>, and not <code>.local</code>. RFC 6761 reserves <code>.test</code> for exactly this, and <code>.local</code> belongs to mDNS; take it over and Bonjour discovery stops working on your Mac. dnsmasq already wildcards the whole of <code>*.test</code>, so the extra label costs nothing: one <code>/etc/resolver/test</code> file pointing at <code>127.0.0.1</code> and no further DNS changes, ever.</p>

<h3 class="relative group">HTTPS on names that don&rsquo;t exist
    <div id="https-on-names-that-dont-exist" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#https-on-names-that-dont-exist" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>Every one of those names is served over HTTPS with a certificate the browser trusts, which sounds impossible for a hostname that exists only on my laptop. Caddy does it with its own internal certificate authority. <code>tls internal</code> on a site tells Caddy to issue that site&rsquo;s certificate from a local CA instead of asking Let&rsquo;s Encrypt, and <code>caddy trust</code>, run once by the installer, puts the CA&rsquo;s root into the macOS System keychain (Chrome and Safari read it) and into Firefox&rsquo;s own store. From then on <code>https://anything.test</code> opens with no certificate warning, plain <code>http://</code> redirects to it, and nothing leaves the machine.</p>
<p>It isn&rsquo;t just cosmetic. A lot of the web platform now refuses to work on plain HTTP: secure cookies, service workers, the clipboard API, anything with <code>SameSite=None</code>. Testing a web build on plain <code>http://localhost</code> hides the bugs that show up on the real HTTPS domain. Testing on <code>https://app.local.test</code> surfaces them on my laptop instead.</p>
<p>A site block, which is the same for every service apart from the port:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-caddyfile" data-lang="caddyfile"><span class="line"><span class="cl"><span class="gh">devbox-ollama.ssh.test</span>, <span class="gh">devbox-ollama.test</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">tls</span> <span class="no">internal</span>
</span></span><span class="line"><span class="cl">	<span class="k">import</span> cors
</span></span><span class="line"><span class="cl">	<span class="k">reverse_proxy</span> <span class="n">127.0.0.1</span><span class="p">:</span><span class="mi">11435</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">import</span> proxyhdr
</span></span><span class="line"><span class="cl">		<span class="k">transport</span> <span class="s">http</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="k">keepalive</span> <span class="no">off</span>
</span></span><span class="line"><span class="cl">			<span class="k">dial_timeout</span> <span class="mi">5s</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div>
<p>The two snippets carry the fiddly parts. <code>cors</code> reflects the caller&rsquo;s <code>Origin</code> back rather than sending <code>*</code>, because <code>*</code> isn&rsquo;t allowed once credentials are involved, and it answers <code>OPTIONS</code> preflights itself with a 204 so the upstream never has to. <code>proxyhdr</code> rewrites the <code>Host</code> header to the dial address. Fussy backends, router admin pages and Chrome&rsquo;s remote-debugging endpoint among them, validate <code>Host</code>, and would otherwise reject <code>devbox-ollama.ssh.test</code> as a name they&rsquo;ve never heard of. Ollama&rsquo;s own origin check accepts loopback on any port, so rewriting <code>Host</code> to <code>127.0.0.1:11435</code> gets it through.</p>
<p><code>keepalive off</code> is the one I&rsquo;d have got wrong. The upstreams are SSH forwards that autossh tears down and rebuilds whenever the network changes. With keep-alive on, Caddy holds a pooled connection to a tunnel that has since died, and it returns baffling 404s until it&rsquo;s reloaded. Off, every request dials fresh, which on loopback costs nothing measurable.</p>
<p>Each service also answers on its old flat name (<code>devbox-ollama.test</code>), so bookmarks from before the suffix scheme still work.</p>

<h3 class="relative group">The menu bar
    <div id="the-menu-bar" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-menu-bar" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>With a dozen forwards held open by launchd, the question I kept asking was &ldquo;is it up?&rdquo;, and the answer lived in three places: <code>launchctl list</code>, <code>lsof</code> and a <code>curl</code>. So a small menu-bar plugin puts it in one place, with a dot next to every hostname:</p>
<ul>
<li>🟢 the service answered a request through the tunnel</li>
<li>🟡 the tunnel is open but the service behind it is silent</li>
<li>🔴 nothing is listening on the local port, so the tunnel itself is down</li>
</ul>
<p>The yellow state is the useful one. A green/red check can&rsquo;t tell &ldquo;the SSH forward died&rdquo; from &ldquo;Ollama crashed on the far end&rdquo;, and those have entirely different fixes. The plugin keeps no list of its own; it reads the same proxy and SSH config as everything else, so adding a service there adds it to the menu too.</p>
<p>The first version was greedy. It refreshed every ten seconds and spawned a few processes per service, about seventy a run, and macOS promptly listed it under &ldquo;apps using significant energy&rdquo;. Taking one snapshot per run and refreshing every few minutes brought it down to about 0.1% of a core. A status light that drains the battery is not helping, so it&rsquo;s worth budgeting for from the start.</p>
<p>The whole setup had one hole, and it was the one that mattered. devbox has no public name. Its SSH forward dialled a <code>192.168.x</code> address, so it only worked while the laptop was on the office LAN. Away from the office the menu bar went red and stayed red, and everything I&rsquo;d moved onto the workstation to save the laptop was out of reach at exactly the times I wasn&rsquo;t sitting next to it.</p>

<h2 class="relative group">Two tunnels, pointing the right way
    <div id="two-tunnels-pointing-the-right-way" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#two-tunnels-pointing-the-right-way" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>The fix has three parts, and the first two are Cloudflare Tunnels.</p>
<p>A Cloudflare Tunnel is <code>cloudflared</code> holding an outbound connection to Cloudflare&rsquo;s edge. Cloudflare hands requests back down that connection, so a machine behind any amount of NAT gets reachable without anything listening on a router. It follows a laptop onto hotel wifi and it survives CGNAT.</p>
<p>I run two of them, one per machine, and the reason is worth a sentence. The obvious shortcut was a single tunnel on the laptop with one more ingress rule pointing at devbox&rsquo;s SSH port on the office LAN. That needs nothing installed on devbox at all. It also routes through the laptop, and the laptop is the machine that leaves the office. It would have broken in exactly the case it existed to fix. devbox stays put, so devbox holds its own connection to the edge.</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># config.yml on devbox (runs as a systemd service)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">protocol</span><span class="p">:</span><span class="w"> </span><span class="l">auto       </span><span class="w"> </span><span class="c"># prefer QUIC, fall back to HTTP/2 over TCP 443</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">ha-connections</span><span class="p">:</span><span class="w"> </span><span class="m">4</span><span class="w">     </span><span class="c"># mains-powered, its job is to stay reachable</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">warp-routing</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">connectTimeout</span><span class="p">:</span><span class="w"> </span><span class="l">5s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">ingress</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">hostname</span><span class="p">:</span><span class="w"> </span><span class="l">ssh-devbox.example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">service</span><span class="p">:</span><span class="w"> </span><span class="l">tcp://127.0.0.1:22</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">service</span><span class="p">:</span><span class="w"> </span><span class="l">http_status:404</span></span></span></code></pre></div></div>
<p><code>tcp://</code> rather than <code>ssh://</code> is an easy one to get wrong. <code>ssh://</code> selects Cloudflare&rsquo;s browser-rendered terminal, which wraps the stream for a web page; a normal <code>ssh</code> client fed through it gets the banner and then dies at key exchange. <code>tcp://</code> is the plain byte pipe <code>cloudflared access ssh</code> expects, and as a bonus it carries <code>scp</code>, <code>rsync</code>, git over SSH and port forwards.</p>
<p>That last part is what closed the hole in the SSH layer. The SSH config now picks a route per connection:</p>
<div class="highlight-wrapper"><pre tabindex="0"><code class="language-sshconfig" data-lang="sshconfig">Match originalhost devbox !exec &#34;nc -z -G 1 &lt;office-lan-ip&gt; 22 &gt;/dev/null 2&gt;&amp;1&#34;
    ProxyCommand cloudflared access ssh --hostname ssh-devbox.example.com ...</code></pre></div>
<p>On the office LAN the probe succeeds and SSH goes direct, one hop. Anywhere else it fails and SSH goes through Cloudflare, authenticated with an Access service token so there&rsquo;s no browser login in the way. It&rsquo;s <code>Match originalhost</code>, not <code>Match host</code>: <code>host</code> matches after <code>HostName</code> has been substituted, so by then the name is already an IP and the block never fires. The upshot is that <code>devbox-ollama.ssh.test</code> works in the office, at home and on a train, and the menu bar dot stays green.</p>
<p>The laptop&rsquo;s tunnel goes the other direction. It gives dev servers on the Mac real public HTTPS hostnames: for each app I&rsquo;m working on, its API, its WebSocket server and its web build. Every one of them sits behind Cloudflare Access, which I&rsquo;ll come back to, because it&rsquo;s the part that makes this safe rather than reckless.</p>
<p>The menu bar learned about both tunnels too, and it couldn&rsquo;t do it by probing. An inbound tunnel has no local port to check, one of the two connectors doesn&rsquo;t even run on the laptop, and the obvious test, curling <code>ssh-devbox.example.com</code>, gets an answer from Cloudflare&rsquo;s edge whether or not a connector is attached, so it would read green on a dead tunnel. launchd is no better: <code>cloudflared</code> sits there &ldquo;loaded, exit 0&rdquo; with every edge connection dropped. So for tunnels the menu asks the Cloudflare API whether each one has a healthy connector, since that&rsquo;s what decides whether an <code>ssh</code> lands. If the API can&rsquo;t be reached, the section is left out rather than drawn red. The menu is read at a glance, and a false alarm there costs more than a missing line.</p>

<h2 class="relative group">The third part: WARP makes it a network
    <div id="the-third-part-warp-makes-it-a-network" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-third-part-warp-makes-it-a-network" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>Tunnels with hostnames are great for anything that speaks HTTPS, and for SSH from a machine that can run <code>cloudflared</code>. A phone can&rsquo;t. And a tunnel hostname isn&rsquo;t a TCP endpoint: Cloudflare&rsquo;s edge only terminates HTTPS and WebSocket on it, so port 22 at <code>ssh.example.com</code> is closed and no amount of fiddling with Access will open it.</p>
<p>That&rsquo;s the job for WARP. The Cloudflare One Agent (the enterprise WARP client, not the consumer &ldquo;1.1.1.1&rdquo; app, which can&rsquo;t join an organisation) is enrolled on the laptop and the phone in my Zero Trust organisation. Each tunnel advertises private routes, and a device running WARP can then open a plain socket to those addresses and land on the right machine. It stops being &ldquo;reach this service by name&rdquo; and becomes &ldquo;these machines are on a network with me&rdquo;:</p>
<table>
	<thead>
			<tr>
					<th>Address</th>
					<th>Machine</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>198.18.42.1</code> / <code>fd12:3456:789a::1</code></td>
					<td>the MacBook Air</td>
			</tr>
			<tr>
					<td><code>198.18.42.2</code> / <code>fd12:3456:789a::2</code></td>
					<td>devbox</td>
			</tr>
			<tr>
					<td><code>198.18.42.3</code> / <code>fd12:3456:789a::3</code></td>
					<td>a second Mac</td>
			</tr>
	</tbody>
</table>
<p>Those addresses are loopback aliases on each machine, created at boot, so they owe nothing to DHCP or whatever router I&rsquo;m behind. <code>198.18.42.2</code> is devbox in the office, from home, and from a phone on 5G. The Mac&rsquo;s real LAN address changes every time I move; this one never does.</p>
<p>The split tunnel is in <strong>include mode</strong> with only those routes in it (plus the Cloudflare ranges WARP needs for itself). That&rsquo;s what makes the client liveable. The default is exclude mode, where WARP carries everything except a list of private ranges, so every byte the phone sends detours through Cloudflare. That has a real battery and latency cost, enough that I&rsquo;d have ended up turning it on only when I needed it, which defeats the point. In include mode, traffic to my three machines goes through WARP and everything else goes out the normal path untouched. So the client just stays on. <code>warp-cli status</code> on the laptop says <code>Connected</code> all day and I don&rsquo;t think about it.</p>
<p>For transport I have it on MASQUE, which is HTTP/3 on UDP 443 with an HTTP/2 fallback, rather than WireGuard on UDP 2408. Some carriers and guest networks block 2408; almost nobody blocks 443. My organisation&rsquo;s policy also has post-quantum key agreement switched on for MASQUE, which I didn&rsquo;t go looking for but won&rsquo;t turn down.</p>

<h2 class="relative group">Why 198.18, and why there&rsquo;s an IPv6 address
    <div id="why-19818-and-why-theres-an-ipv6-address" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#why-19818-and-why-theres-an-ipv6-address" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>The addresses look odd, and the first ones I picked were wrong in an instructive way.</p>
<p>My first attempt was <code>10.10.0.1</code>, because that&rsquo;s what you reach for. It fails in both split-tunnel modes. In exclude mode, WARP&rsquo;s default list excludes every RFC 1918 range plus <code>100.64.0.0/10</code>, so the client would have dropped traffic to it before it ever left the device. In include mode it would collide with any real <code>10.x</code> network I happen to join; cafés, co-working spaces and plenty of offices use exactly that range. <code>198.18.0.0/15</code> is the RFC 2544 benchmarking range. It&rsquo;s reserved, it&rsquo;s never routed on the public internet, it isn&rsquo;t in WARP&rsquo;s exclude list, and no ordinary network uses it. The IPv6 addresses are ULA (<code>fd00::/8</code>) for the same reason.</p>
<p>Why there&rsquo;s IPv6 at all is the more interesting story. Once the v4 address worked I tested it from the phone on wifi, it was fine, and I called it done. On 5G it didn&rsquo;t work. The Agent said <em>connected</em>, the tunnel was healthy, Access was fine; the wifi test proved all of that. The problem was that mobile networks are mostly IPv6-only now. The phone had no native IPv4 at all and was reaching the v4 literal through the carrier&rsquo;s 464XLAT translator, which sits <em>outside</em> the tunnel when the include list holds only a v4 prefix. The traffic went out to the public internet, where <code>198.18.0.0/15</code> doesn&rsquo;t route, and was dropped without a sound. No error on the phone, nothing in the connector&rsquo;s log.</p>
<p>The fix is to give every machine a second address the phone can reach natively over IPv6, and add it to the routes and to the include list. Now the <code>fd12:3456:789a::</code> addresses are what my SSH client on the phone actually uses on mobile data.</p>

<h2 class="relative group">Offloading: the laptop as a terminal
    <div id="offloading-the-laptop-as-a-terminal" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#offloading-the-laptop-as-a-terminal" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>This is the part the whole setup exists for.</p>
<p><strong>Models and fine-tuning.</strong> Ollama runs on devbox and binds to <code>127.0.0.1:11434</code>. It&rsquo;s invisible to the rest of the office LAN, let alone the internet. On the laptop it appears at <code>https://devbox-ollama.ssh.test</code>, or as a bare port for tools that want one:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">OLLAMA_HOST</span><span class="o">=</span>127.0.0.1:11435 ollama list</span></span></code></pre></div></div>
<p>11435, not 11434, on purpose: 11434 is Ollama&rsquo;s own default, and if the laptop ever runs a local Ollama too, the two would race for the port and I&rsquo;d silently get devbox&rsquo;s answers from the &ldquo;local&rdquo; one depending on which started first.</p>
<p>The practical effect is that when I&rsquo;m building an AI feature, the model it calls is a workstation GPU rather than the laptop&rsquo;s, from wherever I am. Evaluation runs, embedding a pile of documents, a fine-tune: they run on devbox, and the laptop&rsquo;s fan stays off. When I&rsquo;m prototyping an agent, it can point at a local model on the workstation and burn through tool-calling iterations without an API bill, and switch to a hosted model once the loop is right.</p>
<p><strong>Long-running agents.</strong> An agent session that runs for an hour shouldn&rsquo;t depend on my laptop lid staying open. Run it on devbox instead and the laptop is just a window onto it: close the lid, and later <code>ssh devbox</code> from wherever I am, or from the phone, and it&rsquo;s still there. Before the tunnel this only worked in the office, which is exactly where I didn&rsquo;t need it.</p>
<p><strong>Builds and the cluster.</strong> The cluster on devbox has its own registry, so images can be built and pushed on the workstation, next to where they run, rather than uploaded over hotel wifi from a laptop. The cluster dashboard, the ingress dashboard and the registry UI are all <code>*.ssh.test</code> hostnames on the laptop.</p>
<p><strong>The mobile loop.</strong> The phone is on the same private network as the laptop, and the laptop&rsquo;s dev servers also have public hostnames behind Access. So I can take a native build of the app out of the building, on 5G, and it talks to the API running on my desk. Or it talks to the one on devbox, if that&rsquo;s where I left it. The feedback loop on a real device over a real mobile network used to mean deploying to a shared staging server. Now it means saving a file.</p>
<p>There&rsquo;s one trap here worth knowing before you debug it as an app bug. Access protects the WebSocket hostname too, and a native WebSocket client isn&rsquo;t a browser. It carries no <code>CF_Authorization</code> cookie, so the native build&rsquo;s connection to the WebSocket server is rejected at the edge with a 403 that looks nothing like an error from your own server. Browser tabs are fine because they already hold the cookie from logging in. For anything that isn&rsquo;t a browser (the native app, a script, an agent calling a dev API) the answer is an Access <strong>service token</strong>, sent as two headers:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">CF-Access-Client-Id:     &lt;client_id&gt;
</span></span><span class="line"><span class="cl">CF-Access-Client-Secret: &lt;client_secret&gt;</span></span></code></pre></div></div>
<p>The token grants nothing on its own. Access only honours it on apps whose policy names it, so its reach is exactly the list of dev hostnames and nothing wider. I file its policy under the <code>non_identity</code> decision rather than <code>allow</code>, which keeps it visible in the audit log as a bearer secret and not a person who logged in.</p>

<h2 class="relative group">The stats the internet never sees
    <div id="the-stats-the-internet-never-sees" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-stats-the-internet-never-sees" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>The other half of what I wanted was visibility. Most of what tells you how a system is behaving is, correctly, not public. On devbox that&rsquo;s:</p>
<ul>
<li>the ingress proxy&rsquo;s dashboard, and the tracing UI that holds its traces</li>
<li>a dashboard for the Kubernetes cluster</li>
<li>the container registry&rsquo;s UI (read-only)</li>
<li>Ollama&rsquo;s model list and what&rsquo;s loaded right now</li>
<li><code>docker info</code> and container stats</li>
</ul>
<p>None of those have a public hostname, and none ever will. They&rsquo;re bound to loopback or to cluster service IPs, reached over an SSH forward that itself rides the tunnel. A monitoring app on my phone reads <code>docker info --format '{{json .}}'</code> over SSH across WARP, so I can see from anywhere whether my containers are up or something has eaten all the memory.</p>
<p>That app is how I found a small bug worth mentioning. The tunnel sshd on the Mac was at <code>LogLevel DEBUG2</code> from when I was debugging it. With <code>-e</code>, sshd logs to stderr, and for a session that stderr <em>is</em> the SSH channel&rsquo;s stderr. Every command&rsquo;s output came back with <code>debug2: do_setup_env: set TMPDIR</code> appended, and the phone app, which merges the two streams, got valid JSON followed by a log line, failed to parse it, and showed the whole thing as an error. <code>LogLevel INFO</code> fixed it. Put log levels back after debugging.</p>
<p>Just as deliberate is what I <em>don&rsquo;t</em> put on this network. The old autossh tunnels also reach a few routers on other people&rsquo;s networks that I help look after. Those get no public hostname and no WARP route. A router admin page on the internet is a liability even behind a login, and it isn&rsquo;t my network to widen.</p>

<h2 class="relative group">Access is not optional
    <div id="access-is-not-optional" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#access-is-not-optional" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>A Cloudflare Tunnel hostname is on the public internet the moment its DNS record exists. There&rsquo;s no firewall in front of it; that&rsquo;s the whole point of not opening a port. The protection has to come from Cloudflare&rsquo;s edge, and that&rsquo;s what Access does. It refuses to forward a request at all until the visitor has proved who they are, so an unauthenticated scanner never reaches the laptop. That matters, because these are dev servers: a debug-mode traceback with settings in it, an open JavaScript bundler. Nothing behind these hostnames was built to face the internet.</p>
<p>The policy allows my own email addresses and nothing else, with a one-time PIN by email and single sign-on as the two ways to prove it. Sessions last eight hours, because the realistic threat is a laptop left open in a café with a day-long cookie, not someone brute-forcing a PIN.</p>
<p>SSH is authenticated twice, by two systems that don&rsquo;t know about each other. Access decides whether a TCP stream may reach sshd at all; sshd still demands my key. Losing either doesn&rsquo;t open the machine. The Mac&rsquo;s tunnel sshd also trusts Cloudflare&rsquo;s SSH CA, so Access can log me in with a short-lived certificate minted from my SSO session, while <code>authorized_keys</code> still works alongside it, so a broken Access config can&rsquo;t lock me out of my own laptop.</p>
<p>The piece I&rsquo;m happiest with is small. Exposure happens when three things line up: a DNS record, a running connector and an active zone. They become true at different times, in an order I don&rsquo;t control; the zone flips to active on its own, some time after the nameservers change, quite possibly while the Mac is asleep. So the launch agent doesn&rsquo;t run <code>cloudflared</code> directly. It runs a preflight that reads the hostnames out of the tunnel&rsquo;s own config, asks the Access API which ones are covered, and refuses to start if any aren&rsquo;t:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">HOSTNAMES</span><span class="o">=</span><span class="k">$(</span>grep -E <span class="s1">&#39;^\s*-\s*hostname:&#39;</span> <span class="s2">&#34;</span><span class="nv">$CONFIG</span><span class="s2">&#34;</span> <span class="p">|</span> sed -E <span class="s1">&#39;s/.*hostname:\s*//&#39;</span> <span class="p">|</span> sort -u<span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">PROTECTED</span><span class="o">=</span><span class="k">$(</span>curl -fsS -H <span class="s2">&#34;Authorization: Bearer </span><span class="nv">$CLOUDFLARE_API_TOKEN</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">    <span class="s2">&#34;https://api.cloudflare.com/client/v4/accounts/</span><span class="nv">$CLOUDFLARE_ACCOUNT_ID</span><span class="s2">/access/apps?per_page=100&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">    <span class="p">|</span> python3 -c <span class="s1">&#39;import sys,json; print(&#34;\n&#34;.join(a.get(&#34;domain&#34;,&#34;&#34;) for a in json.load(sys.stdin)[&#34;result&#34;]))&#39;</span><span class="k">)</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">    <span class="o">||</span> <span class="o">{</span> <span class="nb">echo</span> <span class="s2">&#34;could not reach the Access API. refusing (fail closed).&#34;</span><span class="p">;</span> <span class="nb">exit</span> 1<span class="p">;</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> h in <span class="nv">$HOSTNAMES</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    grep -qxF <span class="s2">&#34;</span><span class="nv">$h</span><span class="s2">&#34;</span> <span class="o">&lt;&lt;&lt;</span><span class="s2">&#34;</span><span class="nv">$PROTECTED</span><span class="s2">&#34;</span> <span class="o">||</span> <span class="o">{</span> <span class="nb">echo</span> <span class="s2">&#34;NOT starting: </span><span class="nv">$h</span><span class="s2"> has no Access app&#34;</span><span class="p">;</span> <span class="nb">exit</span> 1<span class="p">;</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl"><span class="nb">exec</span> cloudflared tunnel --config <span class="s2">&#34;</span><span class="nv">$CONFIG</span><span class="s2">&#34;</span> run</span></span></code></pre></div></div>
<p>The launch agent has <code>KeepAlive</code>, so a refusal retries by itself every 30 seconds and the tunnel comes up on its own once the Access apps exist. Failing closed costs an outage. Failing open costs an exposure. I know which of those I&rsquo;d rather explain.</p>

<h2 class="relative group">Four things that bit me
    <div id="four-things-that-bit-me" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#four-things-that-bit-me" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>Everything above works now. Getting there, three of the four had the same pattern: the thing that was broken produced no error anywhere, and the parts I could see all reported healthy.</p>
<p><strong>The route and the include list are two different lists.</strong> A tunnel route makes Cloudflare <em>willing</em> to carry an address to the right connector. The WARP include list is what makes the client <em>send</em> it in the first place. devbox was unreachable from the phone because its routes existed but the include list still only had the Mac&rsquo;s addresses. The phone dropped the packets locally, the connector never saw a flow, and every dashboard was green. Every new machine means adding its addresses to both.</p>
<p><strong>IPv4 literals on IPv6-only mobile networks.</strong> Covered above: works on wifi, fails on 5G, no error. If a WARP route works on wifi and not on mobile data, and the Agent shows connected, it&rsquo;s routing, not the tunnel.</p>
<p><strong>macOS sshd behind cloudflared.</strong> macOS starts its sshd with launchd socket activation, one short-lived <code>sshd -i</code> per connection. Behind cloudflared, the banner reaches the client and then the stream is torn down before the client&rsquo;s identification string gets back, so every login dies at <code>kex_exchange_identification</code>. I confirmed it from both ends and reproduced it with a plain TCP relay, which ruled out Cloudflare. The fix is a second, standalone <code>sshd -D</code> on <code>127.0.0.1:2222</code> and the WARP loopback addresses, running as my user, that exists only to be the tunnel&rsquo;s origin. Remote Login in System Settings is untouched. devbox, being Linux with a normal long-lived sshd, never had the problem.</p>
<p><strong>Config fields that stop existing.</strong> Older examples have <code>warp-routing: enabled: true</code> in the tunnel config. cloudflared 2026.8 rejects that field outright. WARP routing is on whenever the block exists and a route points at the tunnel. That one at least produced an error, which after the other three felt almost generous.</p>

<h2 class="relative group">What it changed
    <div id="what-it-changed" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-it-changed" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>The honest summary is that I stopped choosing where to work based on where the hardware is. The laptop is a good keyboard and a good screen with a long battery life, and it doesn&rsquo;t need to be more than that. The workstation does the heavy lifting from wherever I am. The phone is a real test device on a real network rather than something tethered to office wifi. And the parts of the system I use to see what it&rsquo;s doing are one click away for me and don&rsquo;t exist for anyone else.</p>
<p>At this size it fits in Cloudflare&rsquo;s free Zero Trust plan. What it cost me was time and a README I&rsquo;m glad I wrote, because every one of the failures above would have been a fresh mystery the second time.</p>
<p>If you&rsquo;re thinking about something similar, these are the questions I&rsquo;d ask of your setup:</p>
<ol>
<li>What runs on your laptop only because the laptop is the one machine you can always reach?</li>
<li>Can your phone reach your dev server on mobile data, not just on the office wifi? Test it on 5G, not wifi.</li>
<li>Which of your dashboards are public because that was the easy way to see them from outside? Each one is a candidate for a private route instead.</li>
<li>If a tunnel hostname came up without its Access app tomorrow, what would stop it? If the answer is &ldquo;I&rsquo;d remember&rdquo;, write the preflight.</li>
<li>Are your private addresses in a range the networks you visit will never use?</li>
</ol>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2026/2026-10-01-cloudflare-warp-dev-network/featured.jpg" medium="image" type="image/jpeg" />
    </item>
    <item>
      <title>What Is a Coffee Chat? How It Differs From an Interview, and What to Ask</title>
      <link>https://jared.lynskey.co.nz/en/posts/2024/2024-07-12-coffee-chats/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/en/posts/2024/2024-07-12-coffee-chats/</guid>
      <pubDate>Fri, 12 Jul 2024 00:30:03 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Engineering Manager</category>
      <category>Team</category>
      <category>People</category>
      <category>Team Size</category>
      <category>Scaling</category>
      <category>Efficiency</category>
      <category>Talent Scouting</category>
      <category>Coffee Chat</category>
      <category>Recruitment</category>
      <category>Hiring</category>
      <category>Culture Fit</category>
      <category>Networking</category>
      <description>A coffee chat is an informal 30–45 minute conversation, over coffee or a video call, to see whether a deeper conversation makes sense. It&#39;s not an interview. Why it&#39;s become my favourite way to meet developers, how I run one, the questions worth asking, what to wear and talk about if you&#39;re the one invited, and the ways people ruin them.</description>
      <content:encoded><![CDATA[<p>The developers I most want to hire are never on the job boards. They&rsquo;re heads-down building something, reasonably content where they are, and rightly suspicious of recruiter messages. Since moving into engineering management this year, the tool I&rsquo;ve come to rely on for meeting them is embarrassingly simple: a coffee.</p>
<p>A coffee chat is 30–45 minutes, informal, at a café or over a video call. No whiteboard, no panel, no trick questions. I talk about what we&rsquo;re building and why, they talk about what they&rsquo;re working on and what they&rsquo;d want next, and both of us leave knowing whether a deeper conversation makes sense. Hiring is a matching problem more than a selection problem, and this is the fastest way I know to trade the information that matching actually needs.</p>

<h4 class="relative group">Why I bother
    <div id="why-i-bother" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#why-i-bother" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p>I&rsquo;ve stopped thinking of these chats as recruiting. They&rsquo;re just conversations, and every so often one turns into a hire — sometimes eighteen months later, when the person&rsquo;s circumstances change. The pipelines that reliably produce good hires are built out of relationships like that, not out of job ads.</p>
<p>They also fix the job-description problem. JDs are generic by necessity. Over coffee, a candidate can ask the questions that actually matter to them: what does success look like in the first six months, who would I be working with, what&rsquo;s the hairiest technical problem on the team right now. People who hear honest answers to those questions self-select well.</p>
<p>And a chat shows your culture instead of describing it. Whether you turn up prepared, curious, and respectful of someone&rsquo;s time says more than any careers page. It runs both ways, too — how someone behaves in a relaxed conversation tells you more about working with them than a rehearsed interview ever will.</p>
<p>The moments where a coffee chat earns its keep: approaching someone who isn&rsquo;t looking, warming up a referral before anything formal, and talking with someone weighing a career shift — IC to management, startup to enterprise, or the reverse. In a tight talent market, that covers most of the people you want.</p>

<h4 class="relative group">How I run one
    <div id="how-i-run-one" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#how-i-run-one" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p>The first message decides everything. Generic outreach gets deleted. Do your homework and be honest about your intentions:</p>
<p><em>&ldquo;Hi Sarah, I noticed your talk on distributed systems at QCon and your blog posts on event sourcing. We&rsquo;re tackling similar challenges at [Company] as we scale our payment infrastructure. Would you be open to a 30-minute coffee chat? No interview agenda—just curious to hear your perspective and share what we&rsquo;re working on.&rdquo;</em></p>
<p>That works because it&rsquo;s specific, upfront, and offers something (a conversation about interesting problems) rather than only asking for time. Then make it easy: offer a few time options, pick a spot convenient for them or a video tool that doesn&rsquo;t need a download, and send a proper calendar invite so nobody&rsquo;s guessing.</p>
<p>The chat itself only needs a loose shape. A few minutes of real small talk and why you reached out. Then their story — current work, what they enjoy, what frustrates them, what they&rsquo;d want in the next thing — where your job is mostly to listen. Then yours: the mission, the team&rsquo;s actual challenges, hard parts included, because candidates respect transparency and can smell a sales pitch. The most valuable stretch is the open one near the end: what would need to be true for them to consider a move? Close with explicit next steps, even if the next step is just &ldquo;let&rsquo;s stay in touch&rdquo;.</p>
<p>Follow up within 24 hours with a short note that references something specific, and deliver anything you promised — an intro, a link, whatever. The boring aftermath is the real culture demo.</p>
<p>If you do this more than occasionally, keep a simple spreadsheet of who you&rsquo;ve talked to and check in every so often, even with no role open. And it needn&rsquo;t be a manager-only activity — some of the best chats happen when your engineers grab coffee with impressive people in their own networks. That&rsquo;s where good referrals come from.</p>

<h4 class="relative group">Questions that earn their slot
    <div id="questions-that-earn-their-slot" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#questions-that-earn-their-slot" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p>Ones I ask:</p>
<ul>
<li>&ldquo;What&rsquo;s been the most interesting problem you&rsquo;ve worked on recently?&rdquo;</li>
<li>&ldquo;What would you want to be different in your next role?&rdquo;</li>
<li>&ldquo;What&rsquo;s your learning style? How do you like to grow professionally?&rdquo;</li>
<li>&ldquo;What questions do you have that would help you evaluate whether this could be a fit?&rdquo;</li>
</ul>
<p>Ones I&rsquo;d ask if I were on the other side of the table:</p>
<ul>
<li>&ldquo;What&rsquo;s the biggest challenge the team is facing right now?&rdquo;</li>
<li>&ldquo;How do you measure success for this role?&rdquo;</li>
<li>&ldquo;What does the path to promotion look like?&rdquo;</li>
<li>&ldquo;Why did you join the company? What&rsquo;s kept you here?&rdquo;</li>
<li>&ldquo;What&rsquo;s something about working here that might surprise me?&rdquo;</li>
</ul>

<h4 class="relative group">If you&rsquo;re the one invited
    <div id="if-youre-the-one-invited" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#if-youre-the-one-invited" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p>Most people who look up what a coffee chat is are on the other side of the table from me: someone has asked them for one, and they want to know what they&rsquo;re walking into. Here&rsquo;s what I&rsquo;d tell you from the side that sends the invitations.</p>
<p>It isn&rsquo;t an interview. Nobody is scoring you and there&rsquo;s no test, so you don&rsquo;t need to prepare answers. It is still a first impression, though, so treat it like meeting a future colleague rather than a friend of a friend. The difference from an interview is that you&rsquo;re allowed to be curious, and you&rsquo;re expected to ask as much as you answer.</p>
<p>Wear what you&rsquo;d wear to work there on an ordinary day. If you don&rsquo;t know, smart casual is never wrong. On a video call, have the camera on and find a quiet room; that matters more than the shirt.</p>
<p>Preparation takes about half an hour. Read what the company makes and anything the person has written or built. Have a two-minute version of what you work on now and what you&rsquo;d want next, because that question is coming. Bring two or three of your own questions; the list above is a fair start.</p>
<p>As for what to talk about: your work, what you enjoy about it, what you&rsquo;re curious about in theirs. Leave salary for later unless they raise it. It&rsquo;s perfectly fine to ask whether there&rsquo;s a role in mind and what the process would look like if there were.</p>
<p>Whoever did the inviting usually pays. Offer, but don&rsquo;t make a thing of it. Send a short thank-you within a day that mentions something you actually talked about, and you&rsquo;ve done more than most.</p>
<p>And if you want one yourself, ask. Keep the message short, say why that person, and make it easy to say yes: &ldquo;I&rsquo;ve been following your team&rsquo;s work on the new search, and I&rsquo;m thinking about moving into platform engineering. Would you have 30 minutes for a coffee or a call in the next few weeks? Happy to work around you.&rdquo; Most people say yes to a request that specific.</p>

<h4 class="relative group">Ways to ruin it
    <div id="ways-to-ruin-it" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#ways-to-ruin-it" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p>The fastest is turning it into a stealth interview. Start quizzing someone on technical skills or sliding in behavioural questions and you&rsquo;ve broken the implicit deal — save that for the formal process. Over-selling is a close second: the hires that stick are the people who joined with clear eyes about the hard parts. Turning up unprepared, or going silent afterwards, does quieter damage; every chat shapes what that person tells their network about you.</p>
<p>From my side of the table, the warning signs are a candidate with no curiosity about anything, a conversation that feels purely transactional, or someone who describes every past employer with the same bitterness. Candidates should keep their own list: a rep who can&rsquo;t explain why the work matters, evasive answers about turnover or direction, and anyone more interested in selling you than understanding you.</p>
<p>Not every chat leads anywhere, and that&rsquo;s fine — most don&rsquo;t. The point is that the next time you need to fill a critical role, you&rsquo;re not starting from a blank job ad. You&rsquo;re starting from a stack of real conversations. Reach out with an invitation to coffee, not a job description.</p>

<h4 class="relative group">Further Reading
    <div id="further-reading" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#further-reading" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p><strong>Related Articles on This Site:</strong></p>
<ul>
<li><a href="https://jared.lynskey.co.nz/en/posts/2024/2024-12-19-star-interviews/" >Using the STAR Method for Developer Interviews</a> - for when the chat turns into a formal interview process</li>
<li><a href="https://jared.lynskey.co.nz/en/posts/2024/2024-02-10-prioritizing-onboarding/" >Three Things I&rsquo;m Focusing on as a New Engineering Manager</a> - what makes teams work, which is what you&rsquo;re matching for</li>
<li><a href="https://jared.lynskey.co.nz/en/posts/2024/2024-07-01-internships/" >Why You Should Intern at a Startup</a> - useful context when chatting with someone weighing a startup move</li>
</ul>
<p><strong>External Resources:</strong></p>
<ul>
<li><a href="https://review.firstround.com/articles/hiring-engineers/"  target="_blank" rel="noreferrer">First Round Review: Hiring Engineers</a> - startup hiring guides from experienced operators</li>
<li><a href="https://larahogan.me/blog/first-one-on-one-questions/"  target="_blank" rel="noreferrer">Lara Hogan&rsquo;s &ldquo;Questions for Our First 1:1&rdquo;</a> - written for 1:1s, works brilliantly over coffee</li>
<li><a href="https://www.kalzumeus.com/2012/01/23/salary-negotiation/"  target="_blank" rel="noreferrer">Patrick McKenzie on Salary Negotiation</a> - worth reading to understand the candidate&rsquo;s side of the table</li>
<li><a href="https://whothebook.com/" target="_blank" rel="noreferrer">Who: The A Method for Hiring</a> - Geoff Smart and Randy Street&rsquo;s framework for systematic hiring</li>
<li><a href="https://hbr.org/topic/subject/hiring-and-recruitment"  target="_blank" rel="noreferrer">Harvard Business Review: Hiring and Recruitment</a> - research-backed pieces on talent acquisition</li>
</ul>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2024/2024-07-12-coffee-chats/featured.jpg" medium="image" type="image/jpeg" />
    </item>
    <item>
      <title>Kiwi Chamber Leadership Breakfast: Dementia Care Robots and NZ Innovation</title>
      <link>https://jared.lynskey.co.nz/en/posts/2018/2018-11-12-kiwichamberbreakfast/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/en/posts/2018/2018-11-12-kiwichamberbreakfast/</guid>
      <pubDate>Mon, 12 Nov 2018 00:00:00 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Kiwi Chamber</category>
      <category>Networking</category>
      <category>New Zealand</category>
      <category>Korea</category>
      <category>Photography</category>
      <description>Photos and notes from the last Kiwi Chamber NZ Leadership Speaker Series breakfast of 2018: Professor Kim Gun-ha on dementia care robots, Dr Pau Medrano-Gracia on Uniservices, and New Zealand innovation.</description>
      <content:encoded><![CDATA[<p>Kiwi Chamber, the New Zealand chamber of commerce in Korea, has hosted multiple breakfast events this year, and the final one was today. I was there with a camera as the volunteer photographer. The guest speakers invited were <a href="https://profiles.auckland.ac.nz/p-medrano"  target="_blank" rel="noreferrer">Dr Pau Medrano-Gracia</a> from Auckland University and Professor Kim Gun-ha from Ewha University.</p>

<h2 class="relative group">Dementia Care Robots
    <div id="dementia-care-robots" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#dementia-care-robots" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>Professor Kim, a neurology expert, gave a lecture on &ldquo;Dementia Care Robots,&rdquo; including the daily life support function of caring robots to assist dementia patients at home. She talked about robots that can continuously train to enhance recognition capabilities and cognitive training programs that utilize them. She is also co-developing robots designed to care for dementia patients in homes, with support from the Ministry of Trade, Industry, and Energy. The robots developed in this project will undergo evaluation for effectiveness in 2019 and will be operated upon successful completion, leading to the development of dementia-care robots for households.</p>
<p><figure><span class="mc-img" style="--lqip:url('data:image/webp;base64,UklGRgoBAABXRUJQVlA4IP4AAACwBgCdASogABUAPw1sqEemIyIYBABjEMTygFnC1fKObUlMuCPffRx2qjMs6hwud2hZAKC2pEZcn/Ek30n6QAD+vGgF9ixxyGqUIN5Da06wGtaJixU9JVctynhbD2aLNaCbuHrKh0BV7zApQFTbO4ZZmkPFJQFSb9Hgmu+87waDlsynCsEAIB/1BOQrNbdJqccZ7gPnD0DUmCrKfycyXXK4FEr5PzBOfD/UPnyW4K4nCdw7pzLdChH9/8/7zIf3G422csvM3ot5yTedsh/4iSGI1FbjWI2V+/gEtoEFwnXYCjf6U+V5PD4ey+CMHj+dYwG2bGdrmJ3hVWWTrnAAAA==')"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="Dementia Care Robots"
    width="500"
    height="333"
    src="https://jared.lynskey.co.nz/img/posts/kiwicham/robots_hu_fddd1ab2bf1e39b2.webp"
    srcset="https://jared.lynskey.co.nz/img/posts/kiwicham/robots_hu_fddd1ab2bf1e39b2.webp 800w, https://jared.lynskey.co.nz/img/posts/kiwicham/robots_hu_fddd1ab2bf1e39b2.webp 1280w"
    sizes="(min-width: 768px) 50vw, 65vw"
    data-zoom-src="https://jared.lynskey.co.nz/img/posts/kiwicham/robots_hu_fddd1ab2bf1e39b2.webp"></span></figure>
</p>

<h2 class="relative group">Uniservices
    <div id="uniservices" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#uniservices" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>Dr Medrano-Gracia introduced his role within Uniservices as the Business Development Manager. They have partnered with the best minds at the University of Auckland to apply intelligent thinking to ideas that have the potential to change the world.</p>

<h2 class="relative group">Upstarters
    <div id="upstarters" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#upstarters" aria-label="Anchor">#</a>
    </span>
    
</h2>

<h3 class="relative group">New Ideas From A New Place
    <div id="new-ideas-from-a-new-place" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#new-ideas-from-a-new-place" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>If necessity is the mother of invention, it&rsquo;s no surprise that world-changing ideas are born in New Zealand. Introducing the New Zealand Tech &amp; Innovation Story.</p>
<p>One of the examples on screen was Dotterel&rsquo;s lightweight drone shroud, made with Revolution Fibres&rsquo; acoustic nanofibre to make drones whisper-quiet.</p>
<p><figure><span class="mc-img" style="--lqip:url('data:image/webp;base64,UklGRugAAABXRUJQVlA4INwAAADwBACdASogABAAPw1oqUgmIyIYBABjEMTzAE6CcSqxGbIEX7otGpjvWjbrOy0y3AAA/v8P95FBHbx/eVAFd87YDN20UkKrX+X+oRfja0b8aq3z9HfBPSUhf0mHywaw8ipKFTXXfNIqL+ySVpTrKz6x12jS1Df/q8u1uQnOTGd/Nd3Tzk+SzxOpirnxcjzyPZ1mz3/OU1efwtzVn8CmK2ehuRsYFBVudResoch6qtj5y7F/Y0jyolyhJBYJMPZEbvZwvvQ0luZEzRMNgtFHUtsJ1E9hx+2CRju11UAA')"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="Upstarters slide on Dotterel and Revolution Fibres&rsquo; whisper-quiet drones"
    width="3333"
    height="1667"
    src="https://jared.lynskey.co.nz/img/posts/kiwicham/dottereal_hu_9b87e875ec570375.webp"
    srcset="https://jared.lynskey.co.nz/img/posts/kiwicham/dottereal_hu_9b87e875ec570375.webp 800w, https://jared.lynskey.co.nz/img/posts/kiwicham/dottereal_hu_4d2cd746e5192f61.webp 1280w"
    sizes="(min-width: 768px) 50vw, 65vw"
    data-zoom-src="https://jared.lynskey.co.nz/img/posts/kiwicham/dottereal_hu_884acb3c86c8a21b.webp"></span></figure>
</p>

<h2 class="relative group">Photos taken at the event
    <div id="photos-taken-at-the-event" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#photos-taken-at-the-event" aria-label="Anchor">#</a>
    </span>
    
</h2>
<script src="https://cdn.jsdelivr.net/npm/publicalbum@latest/dist/pa-embed-player.min.js" async></script>
<div class="pa-embed-player" style="width:100%; height:480px; display:none;"
  data-link="https://photos.app.goo.gl/ZNVotgWiE8N75wpe9"
  data-title="Kiwi Chamber New Zealand Leadership Speaker Series"
  data-description="41 new photos · Album by Jared Lynskey (인재덕)">
  <img data-src="https://lh3.googleusercontent.com/S_fiPGQ-7UMgrKajgQea8ArfZaVFKheFriodbSol_G-pStF7yAXvBueXxKXd3WLz3xS44fCB6iAPw-3fx6ek9ibPOcgcHjFROsH2C821GpAdfY-k-ewtgxxFvMG1faI9ZAOd0D0pDKY=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/Yc4aEIQLfyirjLMUg-XENgYh8rnd9vRgm71k7tFsUYvSgd9ANr0O1lh6BnTyjexAVTmg1h2EUk-Wvy8P9oDVVT5oO9BYG2Z8_M4btbE46y2TrAGvV8RJ6U4FTopVu0bEnl9RIHcTu8M=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/908QZ8mnnMGPhxlqeKLl2fT3vjgOvDAhq8oRhRCKO89yYf4A8dlF3ssUri6iVf77MphwVsDTt8hVMS0kWG7TQIcGPWz2i4_NBdUT_ycawJd77j1ikQXdPO3btW9QpRLstEjD5KAqLow=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/cKnfbhH_O1I3Sjbh7Rsj6Sisl4sNFyh0QH2jXe_1t2eq8lykfwrkpKDCPwDVBPPGFzhIutuFZmjc0kn-2Vj9xn05mhTn70-cTEm1Xgp9bZCyWbSwIC2UJ7VUTKxzveXRyw-csByJ12s=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/2-ZsIjK7X5lPdZ9Ndek2DVkZKWmlDaTuhA2KKfomKcdE0D7SioIXEJJ4GTYxTYszhgipVtSm2YH6CWs1zgpAqI2wkrFFA3yLaml5YZNPIihoYDatfil-vUkFoK2DkzbFGRDasvztzL0=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/wMk8BC4YOLYu5ifL7ZzGWXxJcR3GBDq9vlTrqrEJ41iO4UB9sVchml5QL_VdxUWpEMmLZqIzzJtAETlAJ4Y5_6cK_5Rjl1cZYRbsZXtyV41Qm6S1omAtSSaO4f1sKNz4vP1ytI54OmM=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/Ny0D6YWSNFFMgikFlWNqNzzxFSKKdS95-aTEUU-CTn5vNbQh9HJ-w-zFov1scelUSaLNch3Un3heDuR8etKXHeJ4tB-5BSJUIwhiMU8nAxIsdZBu_diG9HL5hHCjTEJuwN7LQ8Q5rwI=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/ZSwhUdLytH8FS4q2msA6MqZD60bQ1Y4FKkKjaGc4QqN2_-UmsJFAFg9z3Zx0Jqd38rshACIoUz9u6VHM1GJEgdf4zK9L6j02UDom4xHls2L4XrPqLjJRF6aOK2A-MezYF360_Yzh-pI=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/F0LuVNojrNEwEqQaZbn4EsJNs_AWh9cYpKNMikjSMSCzTdOkNHqpuoBgzfCr017cj9JG-9KAe7m7VlH3QtyJXa9eHnUzsKZIwjNaKzl-l4M9j23EGEDCkSssoe_Rp1fiaZ4w_w2JFho=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/prkpXPUphIJPFOn9QWHjmkdko6NF5T3IIUXIyJmpwyJZR-DA0LDA-MySRfgPsTF8NmG-IYQP9W2IFBoPq3MGC1ifEZOfWnkGcVvSSKb5tUmaHkI6_EjFyu_Nw3Gkw9m0DYaZtUircQA=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/1YWZnRhxCJmBrG6XzoAkEnCYrlYFRwA4ov5uZDQNZ9wqZskGQoYc3QD-K0UZbnvvbOQpI7vdhcTrLhvLiYCfIKbB_ZTKXUbPgfTgAPG8ufOjoULSgnVGi_u0L17zlFvgKcRGzSRcgZg=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/T11eYvaBHWxnUkpT0NNdnb1rxLgfJ6_tlYrUmV7G3_PZjIb3qtBeFFAVeIMLl1WvjYrM3NBqS2Zyd-xQwUHQAzehYOdKo_kDjNSMqi2gC_FIok1sBpvj96NUOM_KVqVMRuFhFN6u97k=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/YHvb6sooEQpQVcihuacXRav2-1huhH1dK8YmIKTp_6Ab5SDOO7ll3QL-fJIb6PGd2iJNFpqEmjKvSk8SnzGUMTcBtmN4f1eWwe-q0F-yAz4hCr-2dVBtfFxLHtlFOETCnUzbkDc0Wlg=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/6T1fv2Q1Gu8Ddp_WqNEeaI3GAi9X-LkmWZzNtiy7sYu9TdLtsJGex7XD64XMU9msqGx7b_6RWsliFQ117CPwjY2OcFw9rF9zVDg9gPVZ49QuAFiBEJe6-bkLjOkWzSXx5nD9o34c1GI=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/kTh1W99O39xuC-mYNdTNKpecNKFGeHDNUW4ubPXXtBM0wiXPCwiDc5eFALhOyWt04E1Pn6wnuRyfu71oU9wUQ0-Sba_nvFDHuvhXJXpMwo5M-5kyeAZrpceQtL_2SeqmUGqTNkMmE6Y=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/MC9mw2-C69GVeA_AQDSXnByliQc9ylxWMSYbGwGe86yXP2umBpkNI2dLjXCzk70eS_x3QSMVrJ8Q9lhhTmjCrWGtCc7wmTG3Xr5TifebGUW93vbU08tHJGhl6jETdVg7md4BuCDwUSg=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/o_05UWzm5GoPsd4IHF8ekUa1RAUXqvtdDe8_7HADmR9LmzNmaaOF4HYATqOo-sfi8mLjv55UIJ4Jez8GPYw6p7HTs3V5sme3hEmphzUdBeENj_KVSqsS2ZzuqqCwIrK_DZPzU592RzM=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/Ey36lRjVow8B2l5rI6jqsIZeSm8ptn1YvDB_tS30cgmIlwAHL1AobKZeNT-FAGPGxd5GNWgtj25RzmZ-LFVvCHWBYJQ69QciUN7qCvrAi9pYjmco973qK02PMj_jfMotHlAEzcF0D0c=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/KEF15Rb_Xi_OYdWZZXF968cUtmXqT8cN_6zOjaVpANo80sL9r91pYbmdnF8jvuaw5wjl9ErGT72k50Ik9tD8vBq9wI0aTW9anTquvqF-AaMxMjufHRMsXLy2mza0KAwwyToMSgt4K2g=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/5qim1FL61m9x8v0lYabg_9R-v-SVeO36JOY_VpquisBR1OOKiGLDUGJG2mcU6tdrYFc0n-FrA7dkh_P5g3oo8JQ-Fu-7q_CQil8YkLMcvRPzRrFTJs2okLTqFSog59v3jTlN7wWPeAU=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/jdb6HudyJqin-RIZygtWo9ytPVX3vTsC5mT0RoQrRG0SsUsmmcz8y-2ghqMN5uhIVHnnFtbjjfUuYoTUPv-WmorBNevPJ2UJL-ywkbgCKEhmoaduFaYwFcBCthT-qlWlAs7NHaTMND0=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/3ztK0Qb-l_sWlmaxCMlzw5rIHlHrQ3vtvjkt7etBM9p2m-afmWFQuQddMF9PUQZiWUvr_Q4w3U3VG7EY3sdKPPVO9r8NIpJoPLJTdBqN2FhyREmjNL-Whcw5QLjX5sPaTFEXA4sAHSk=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/T9OBo-lAzgmFS_-Z1asZTYz7JSR4CD5VvI9xFgl8pjp3Js-U1FJ0bogvO0Isr0BvpS4L4N2Aq3Uqqm0Iz7fFH0ke4ekR2Y2VGPabKVrPwfLIiZaRVX5nVQzxAWWKNXuuFcvNQFXE6ik=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/Jwf_HRGx2dQJg-q9k4U5soM5vkwT-AO0zm9GCk8sTWZwisWFwkCLp92N-_wWBa3dterU3aodSsc8TuZPb6zqounFKbwSsDdfz6MfemEZf92c5RCdMrFCquiB7uohYs2t3l5eAtVmXnY=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/xEbSmy6mEJG52RWl77bGxusYIzI5zqel320tOShq8Kwqi1YK_GZis2Qhi1G6Xp125Naxb6DsbOXaLMkP2QhmeG4HYJnwEXxrb9ssRsJZJfi5wsrtSCIRNo-xUyqRPec7z2xWXzQWIvA=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/sSoiWMV6jl1rGWr2IHssqFeAeg8AKCtErRTaZX4XItaE-dbHAEZ_nJI2LzLdDAA_JKO7l3Edn609CDm5aVq66jnwXcv0OdJwIm1OAhXPo7qZKzZp_ENPJTVzVzWf2mXku1Fzn7YmnhI=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/xHKG_sGa3i3zkugAg7R9fCJMUzjsKoqQMwJwpTb6eh-6H8jndaqE-7mMSA0SSfqqle66O6uaHOOh921CutBSr3KCrXTdMZrJfCnN8FSo0rK0UJPhXECCu9KQA5nJqLh_jSqDwEK6_lA=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/EejNdzv77EQhUfADPvU2I9agBQlAH8lzSX6k4rWCQg1-OzTkN4PfzpRzMuShuADCsXzdAnvQH9Apjit1-RvxLJQ-AoFoSfx7F7eqzVyj8EiKeMOJ_kAgoy8nuGYQd9Sy7VfSuk9i_10=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/n69hLebjD_Vns6go_OnHNE-3WKXEuSmE7dg3VJZNC7ofjB8xfG0cfG4mqev43hmgpJucTtxpDslMTftaz3p0M5TXv_DH-4CO7cGaFxvPreHZFnnx2R_PnBfHhpqBJiTzxOi6VPlSYks=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/POD3ZSkdrh_csw-7s7zMxQRWBrPIODC4uuQSCrwrMXaS1nnDNIayPV-TB4PY4aeOnlp4Y1x5TjsngNUI7bhJCzRRRuVnt4moxHhnx2UYRAoM-OT3L-aPvIVOqcFH9Uz-t7pPHt_hmjo=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/oW_evbWI56KNRYHXUIFUFVxvkZIyP4KqqeIaiuzhMfEBDNPDREq5f4_vw8X6gQcHlF6bRCIFm2k148d0cNKm1krhLgHL0wVd8Qifmz6eI34asQGs8_EDSigIeiAWlJfX0jaJvggSh2Y=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/QXgAPlwJNM-RYtxQfXZDk9gCVrjWdeVElshVgD_sveV860MuS8uPIzTuQhsnyRPYvQolA3IPCIgv5f7rmaMLm9FyROZuGbQ-5_V0ANHrtpEkWVXGIvpZ44FtPbN2Fg-4F0MdUPbKev0=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/b-kqe-yt4bPCfJGX153QugpdLPsu8QjOvsK11rXqTIUmE1U9voGzw74pegKWxQAHMnOiHi7PuletGR1kARE0vfX8TqNuco2-l41ct3gJZWOg6CHgZyihv-szyV0m7S3eyMK5UAvX0Nc=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/OxygD01grt445EXyMWYS0mmxR3ioaT14FdDTsO7IjdwaFUZpXiEhIr-rSuQzooKPGKdrZfWp_wwLTvh8yEJH3_xqvTcYXGEJkqLHvNk35Y_TJfdD295WZ19Pg6T5_xKR132S2gHnBwE=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/fMnXj8X2nbgu4gcMPbpV_we6rmnr6dtTsQhUV26fTz9iSoQ1G6Nf3q0HXS3jtk9Ge7mFduc0hHM3U5tKdYwxcMwtkYv2mnv1jzILx2hbC5hue_xC3eWCe-0cznAvoaNhR5LjUaG36vc=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/te_ljSUiJYg3HqrsxjLzktMf09IXRvJJj_JB73A-k8U-z4UaWTB3qqxHlz2WY9YMExTap_vqURPoJXtiImcbgQPHDfxF1Hh4MC_-uH_uT35GevmjbnT5iwD6h5UmLuCikDjbVaDbHxU=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/-w_ozI7CeSRJVMqOVO6whjbckCKr9CXO2sNfhFYasBFbm5vQoR7XMH2Ob7N7mfCjWvoAlyOLF2dv4-_HEwRoWzytVNsooytn1a-Nz4mQnZrLOQUQ3U4YWd8PX0Ts_075f6N4TXpGaZw=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/3z8gqjCv2j21MOTlByi61s-ACd5ScdawtJvcNnmtF3yFffZeKrv_IEm-7CeBl4ptUTgjki8eDbDmToBsMAAyo2eAz-wWiiKA4GvSe4ZssoFN6ocPq3wuN5cbV-64EzEbbiczQs9yJrg=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/_Ho6_iOaZnY33zej0CeUEG4CA7JEdb0kpJZ5Y3l5tu22EeOnWGwVZfYdFN1xZ8hREPQ4-lbvGvF-8sZjZW7JlVfEwCA1uVlDwGqfuDRY6ElsqNXq6ZK2-GgbO3_yEkK_JrTq8O09bQk=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/FdiBHRtCOLosHzSBb_1s_kG65ec8mXb8C01p396FW-31UydYw3Af-Lyf3aAkiA6hia94xjmhyq-Kp0qWCo-nYvY3fSSPpUHNGOMtDKfmesYAIVfKC7Y_rd99Tq6MEYeWYfOCcW186uA=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/Bh1qAqPJNxiTyv44Vz5F2kTpIdJ2tdMLqWx00jGXZ38PoVHCQQA1ah2ovTwwJEQyZNNjK2eNrcKgVFTiQRqD5Sx1oa-5ZSn2w-eWtibnceks39V0IC4znPuRpB2tzH9dGg7ddSWdXGA=w1920-h1080" src="" alt="" />
</div>
<p>I really enjoy volunteering for events with the goal of promoting the relationship between the two countries.</p>
<p>For dark rooms, it&rsquo;s important to bring a fast lens! Imagine how distracting it is for the audience and speaker if you are trying to compensate for the light by using a large flash! It simply isn&rsquo;t a good look!</p>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2018/2018-11-12-kiwichamberbreakfast/featured.jpg" medium="image" type="image/jpeg" />
    </item>
  </channel>
</rss>
