<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="/feed.xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Jake Van Alstyne on jvalol</title><link>https://jva.lol/</link><description>Recent content in Jake Van Alstyne on jvalol</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://jva.lol/index.xml" rel="self" type="application/rss+xml"/><item><title>I had a house</title><link>https://jva.lol/weblog/you-made-my-house-a-home/</link><pubDate>Wed, 09 Sep 2026 05:44:57 -0600</pubDate><guid>https://jva.lol/weblog/you-made-my-house-a-home/</guid><description>I lived alone for many years. In a house. She came along. Now it’s home.</description><content:encoded>&lt;p&gt;I lived alone in a house.&lt;/p&gt;
&lt;p&gt;Nothing was wrong with it really, it gave me a place to live, sleep, cook, etc.&lt;/p&gt;
&lt;p&gt;She asked if she could come over for an hour.&lt;/p&gt;
&lt;p&gt;An hour turned into &lt;a href="https://jva.lol/weblog/i-got-engaged/"&gt;more&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A house is shelter, it keeps the rain off.&lt;/p&gt;
&lt;p&gt;Recently I spent &lt;a href="https://jva.lol/weblog/i-should-have-gone-to-the-hospital/"&gt;two and a half days on the bathroom floor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I was in a house with a toilet, but I was at home because she was there.&lt;/p&gt;
&lt;p&gt;You made my house a home, &lt;a href="https://jenmedrano.com/"&gt;Jen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/weblog/you-made-my-house-a-home/jen_hu_aa468ab04f74fe82.jpg" class="flavor flavor-small" srcset="https://jva.lol/weblog/you-made-my-house-a-home/jen_hu_aa468ab04f74fe82.jpg 480w, https://jva.lol/weblog/you-made-my-house-a-home/jen_hu_6bca0525e931df41.jpg 800w" sizes="min(100vw, 224px)"
width="480" height="640" loading="lazy" decoding="async" alt="Jen in a fur trapper hat, smiling" /&gt;&lt;span class="flavor-caption"&gt;She hates this picture.&lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title>I should have gone to the hospital</title><link>https://jva.lol/weblog/i-should-have-gone-to-the-hospital/</link><pubDate>Sun, 06 Sep 2026 20:03:00 -0600</pubDate><guid>https://jva.lol/weblog/i-should-have-gone-to-the-hospital/</guid><description>I had a rough weekend</description><content:encoded>&lt;p&gt;Yesterday I saved my own life. Not figuratively, literally.&lt;/p&gt;
&lt;p&gt;WARNING: this is gross&lt;/p&gt;
&lt;p&gt;On Friday I woke up with the worst abdominal pain imaginable. I didn&amp;rsquo;t know what was happening, just that I was in immense pain.&lt;/p&gt;
&lt;p&gt;My fiancée said, “We need to get you to a hospital!”&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m a very independent man, so I said, “No, I&amp;rsquo;m sure I can figure this out.”&lt;/p&gt;
&lt;p&gt;While enduring this pain, I tried to think.&lt;/p&gt;
&lt;p&gt;And the first vomit came. It was my dinner the night before.&lt;/p&gt;
&lt;p&gt;“Phew,” I thought. Must have been food poisoning.&lt;/p&gt;
&lt;p&gt;It was not.&lt;/p&gt;
&lt;p&gt;I puked again. And again. And again.&lt;/p&gt;
&lt;p&gt;I thought, “maybe this is just blockage.”&lt;/p&gt;
&lt;p&gt;Maybe if I drink some water it might soften this up.&lt;/p&gt;
&lt;p&gt;It came back out every time.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t know (I didn&amp;rsquo;t), the stomach refuses to send anything further if there&amp;rsquo;s a blockage; meaning nowhere for this to go. So it decides to force you to vomit.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t take care of a blockage (I do recommend the hospital), eventually you will die of thirst.&lt;/p&gt;
&lt;p&gt;I had heard of this, but had zero experience with it. The pain wasn&amp;rsquo;t like a computer error. Nothing tells you what&amp;rsquo;s wrong. Which is kind of the important part if you want to know how to fix it.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s just a loud and incredibly painful signal that something in your body is wrong.&lt;/p&gt;
&lt;p&gt;&lt;span class="flavor-cell"&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/i-should-have-gone-to-the-hospital/check-engine.mp4" aria-label="A check engine light blinking on a dark dashboard."&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Something is wrong. But, uh, what is wrong? And how do I fix it?&lt;/span&gt;&lt;/span&gt;&lt;span class="flavor-cell"&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/i-should-have-gone-to-the-hospital/stubborn.mp4" aria-label="A small dog lying flat on the grass, refusing to walk, being dragged along by its leash."&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;My fiancée, trying to take me to the hospital and me resisting.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Moving on.&lt;/p&gt;
&lt;p&gt;I would need to vomit regularly whether I ate or drank or not.&lt;/p&gt;
&lt;p&gt;Eventually I noticed the colors coming out were changing. So I thought, “at least that feels like progress.” So I just kept accepting the only path forward without a hospital (I&amp;rsquo;m a stubborn fool, I know. It&amp;rsquo;ll probably get me killed someday) is to keep vomiting.&lt;/p&gt;
&lt;p&gt;The pain got less and less, so I knew it was working.&lt;/p&gt;
&lt;p&gt;It took two and a half painful days of constantly leaning over the toilet.&lt;/p&gt;
&lt;p&gt;But in one magical moment, pardon my language (but I did warn this is gross), I needed to take a shit.&lt;/p&gt;
&lt;p&gt;I had the most compacted shit of my life. And then another. And another.&lt;/p&gt;
&lt;p&gt;Now, if it had gone on long enough with no progress, I would have gone to the hospital. Instead, I followed my gut (pun intended).&lt;/p&gt;
&lt;p&gt;Two and a half days of suffering in bed, around 25 times over the toilet. My fiancée said ‘let&amp;rsquo;s go to the hospital’ the second she realized the absolute agony I was in, and that this could have been something more serious. I&amp;rsquo;m a stubborn fool. She&amp;rsquo;s not a fan of that quality of mine, but hey. My stupid, stubborn independence caused me two and a half days of extreme pain. Thank god my fiancée was there, she took care of me while I was puking everywhere and developing the shakes and the sweats.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve learned my lesson. Drink water, and consume more fiber, Jake!&lt;/p&gt;
&lt;p&gt;I should have gone to the hospital.&lt;/p&gt;</content:encoded></item><item><title>My use of AI</title><link>https://jva.lol/weblog/my-use-of-ai/</link><pubDate>Sun, 23 Aug 2026 22:30:00 -0600</pubDate><guid>https://jva.lol/weblog/my-use-of-ai/</guid><description>Using AI to work on, well, anything I do (including this)</description><content:encoded>&lt;p&gt;I write a lot, most of what I write never gets put anywhere. I&amp;rsquo;ve even written about that on &lt;a href="https://jva.lol/weblog/the-post-you-almost-didnt-publish/"&gt;this blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Yo, I&amp;rsquo;m &lt;em&gt;well&lt;/em&gt; aware we&amp;rsquo;re in an AI transition. People are (rightfully) skeptical about AI generated content. Definitely got some feedback myself. Some stuff I&amp;rsquo;ve written got the eye of Sauron. Some stuff was actually written by AI, some was edited for grammar and stuff by AI. I&amp;rsquo;ve added some controls from my side to make it clear what was and wasn&amp;rsquo;t created/edited by AI.&lt;/p&gt;
&lt;h2 id="i-promised-something"&gt;
i promised something
&lt;a class="anchor" href="#i-promised-something"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I said I&amp;rsquo;d never use AI again to write anything. Then I used it as an editor. Then I got flamed again. I don&amp;rsquo;t know about you, but I don&amp;rsquo;t think it&amp;rsquo;s going anywhere. I&amp;rsquo;m a technologist, it&amp;rsquo;s how I built my life, my home, and family. I don&amp;rsquo;t claim to know everything, but I know I know how to learn. And I know I&amp;rsquo;m not afraid to experiment. My concession here is that I failed to hold up the promise perfectly. I want &lt;strong&gt;my&lt;/strong&gt; voice to be heard. If I&amp;rsquo;m not speaking, it&amp;rsquo;s not my voice.&lt;/p&gt;
&lt;h2 id="so-it-isnt-the-writing"&gt;
so it isn&amp;rsquo;t the writing
&lt;a class="anchor" href="#so-it-isnt-the-writing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I did get accused of AI writing something I literally typed out character by character. So, this whole thing should at least be a two-way street. I get the skepticism. I just think sometimes the benefit of the doubt, a little affordance for someone who is using a tool they&amp;rsquo;re new to and playing with, isn&amp;rsquo;t a lot to ask. You&amp;rsquo;re probably reading this on a device that involved some serious level of engineering and automation. Just pointing out, we&amp;rsquo;re all in some different version of the same boat. Tech is crazy, pretty much everyone in my personal life is scared of it. And I&amp;rsquo;m talking just laptops, smartphones. They have &lt;strong&gt;no&lt;/strong&gt; idea what I&amp;rsquo;m doing when I&amp;rsquo;m on my computer. So, I (kind of) get it.&lt;/p&gt;
&lt;h2 id="you-cant-lose-if-you-dont-play"&gt;
you can&amp;rsquo;t lose if you don&amp;rsquo;t play
&lt;a class="anchor" href="#you-cant-lose-if-you-dont-play"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s one of my favorite aphorisms. &amp;ldquo;You can&amp;rsquo;t lose if you don&amp;rsquo;t play.&amp;rdquo; Here&amp;rsquo;s another one, &amp;ldquo;A boat in the harbor is safe. But that&amp;rsquo;s not what boats are for.&amp;rdquo; So, I post. I use AI. I only delete comments as an admin when they are straight toxic, offensive, etc. Or obvious mistaken duplicates.&lt;/p&gt;
&lt;p&gt;I just want the internet to get to the simple kind of place it used to be, with no ads, slim dependencies, no tracking, etc.&lt;/p&gt;
&lt;p&gt;I figure any tool that gets me there is worth a shot. Stumble along the way? Sure. Who hasn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;If you read this and you liked it, I&amp;rsquo;m pretty easy to reach if you have questions.&lt;/p&gt;
&lt;p&gt;Cheers,
Jake.&lt;/p&gt;</content:encoded></item><item><title>I got engaged</title><link>https://jva.lol/weblog/i-got-engaged/</link><pubDate>Sun, 23 Aug 2026 11:20:05 -0600</pubDate><guid>https://jva.lol/weblog/i-got-engaged/</guid><description>One night, I just popped the question. She said yes. Like 6 times.</description><content:encoded>&lt;p&gt;So, I had a girlfriend. There was this friend of mine, and she had a boyfriend. We knew each other for years, we had a lot of chemistry. So much that one of our friends said &amp;ldquo;Just get it over with already.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t know why I stopped seeing her around, when she was usually there in our regular spots. Later she told me she needed to not see me. She had a boyfriend after all. I had a girlfriend. Feelings between us were there, everyone saw it, but you just don&amp;rsquo;t cross that boundary.&lt;/p&gt;
&lt;p&gt;It wasn&amp;rsquo;t planned between us at all, but one day her boyfriend broke up with her. I hadn&amp;rsquo;t seen her in months. And then one day, I broke up with my girlfriend.&lt;/p&gt;
&lt;p&gt;It took another few months but eventually she heard about it. She called me. At first I think it was to check in and see if I was doing okay. We talked for an hour.&lt;/p&gt;
&lt;p&gt;A few weeks later she called again. We talked for another hour.&lt;/p&gt;
&lt;p&gt;A few weeks after that, she called again. We talked for 7 hours and 45 minutes.&lt;/p&gt;
&lt;p&gt;She said maybe she&amp;rsquo;d come visit me at my house, but only for an hour.&lt;/p&gt;
&lt;p&gt;That turned into &lt;em&gt;hours&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Then it turned into &lt;em&gt;days, weeks, months&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We haven&amp;rsquo;t been apart since.&lt;/p&gt;
&lt;p&gt;You get the picture.&lt;/p&gt;
&lt;p&gt;When she first heard I started dating someone, years ago, she asked me &amp;ldquo;You don&amp;rsquo;t have to answer this, but are you &lt;em&gt;in&lt;/em&gt; love with her?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;My gut reaction (which I always follow) was to say &amp;ldquo;You&amp;rsquo;re right. I don&amp;rsquo;t want to answer.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I think that gut reaction told me more than it told her.&lt;/p&gt;
&lt;p&gt;So, somewhere in those first days and weeks and months, the word love was uttered, at first specifically in lowercase (I actually said that. &amp;ldquo;I lowercase love you.&amp;rdquo;) and then it turned into uppercase, and then into &amp;ldquo;I am not just &lt;em&gt;in&lt;/em&gt; love with you. I am &lt;em&gt;so in love with you&lt;/em&gt;.&amp;rdquo; Things that were, or should have been obvious to both of us, and our friends, for years, became real.&lt;/p&gt;
&lt;p&gt;The other night we were sitting on my balcony, sharing a beer. I wasn&amp;rsquo;t planning it, it just felt like a natural, organic, gut feeling. I just popped the question. I had no ring. She didn&amp;rsquo;t care, she just kept saying yes. Like 6 times.&lt;/p&gt;
&lt;p&gt;I bought a ring for her, it isn&amp;rsquo;t ready yet but I think it will be perfect.&lt;/p&gt;
&lt;p&gt;We don&amp;rsquo;t exactly do things the traditional way. But I do want people to know she&amp;rsquo;s loved. And married.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t know if I&amp;rsquo;ll have a ring for myself, I probably should. I don&amp;rsquo;t really care. But we&amp;rsquo;re shooting from the hip here (Old-timey western cowboy style. We&amp;rsquo;re both from Utah, she from one of the smallest towns I&amp;rsquo;ve ever heard of, me from the biggest city in the state. It&amp;rsquo;s kind of our style, she and I.)&lt;/p&gt;
&lt;p&gt;(Update: we have both rings now.)&lt;/p&gt;
&lt;p&gt;Anyway we are &lt;em&gt;in&lt;/em&gt; love with each other. And we&amp;rsquo;re going to get married. When? Probably soon, but see the above paragraph. Where? How? We&amp;rsquo;ll figure it out.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m &lt;em&gt;in&lt;/em&gt; love with you, &lt;a href="https://jenmedrano.com/"&gt;Jen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/weblog/i-got-engaged/rings_hu_e9987aae95964031.jpg" class="flavor" srcset="https://jva.lol/weblog/i-got-engaged/rings_hu_e9987aae95964031.jpg 480w, https://jva.lol/weblog/i-got-engaged/rings_hu_db95d72947f927c3.jpg 800w" sizes="min(100vw, 352px)"
width="480" height="393" loading="lazy" decoding="async" alt="Two clasped hands, a princess-cut solitaire on one ring finger and a wide brushed black band on the other" /&gt;&lt;span class="flavor-caption"&gt;Welp, we got the rings!&lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title>The post you (almost) didn't publish</title><link>https://jva.lol/weblog/the-post-you-almost-didnt-publish/</link><pubDate>Thu, 20 Aug 2026 12:54:25 -0600</pubDate><guid>https://jva.lol/weblog/the-post-you-almost-didnt-publish/</guid><description>Why do we hesitate? Or skip entirely?</description><content:encoded>&lt;p&gt;I&amp;rsquo;ve written about &lt;a href="https://jva.lol/weblog/were-all-terminally-online/"&gt;being terminally online&lt;/a&gt;, which I am 100% guilty of. If you&amp;rsquo;re reading this you might be too.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t know about you, but I&amp;rsquo;ve written a lot of things I never posted. I also had AI straight up write stuff, people smelled it right away and I definitely got that feedback.&lt;/p&gt;
&lt;p&gt;The internet is a tough place, I mean, the world is a tough place. There&amp;rsquo;s always going to be someone upset. Wasn&amp;rsquo;t it Douglas Adams, somewhere in the Hitchhiker&amp;rsquo;s books, who wrote with the opening line &amp;ldquo;In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I write more than I post. Why don&amp;rsquo;t I post? Sometimes because I don&amp;rsquo;t trust I won&amp;rsquo;t get flamed for it, mostly because I doubt anyone will read it anyway. Sometimes (and I think I&amp;rsquo;ve been pretty transparent about it here) it&amp;rsquo;s because it was either entirely written by AI, or at least drafted by it.&lt;/p&gt;
&lt;p&gt;But hey. A ship in the harbor is safe but that&amp;rsquo;s not what ships are for. I like writing, I like tech, I like playing with the latest stuff.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/the-post-you-almost-didnt-publish/sailboat-open-sea.mp4" aria-label="A lone sailboat crossing open water"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Safe in the harbor, just not what the boat is for.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I like sailing (not literally), I like putting myself out there. I&amp;rsquo;m safe, I have a roof over my head, I have food and supplies, and I don&amp;rsquo;t mind getting a, I don&amp;rsquo;t know, 10 to 1 backlash when I talk.&lt;/p&gt;
&lt;p&gt;I love seeing other people putting themselves out there too. I figure if you&amp;rsquo;ve got your blog and you post, you&amp;rsquo;ve probably been doing it a while and know what I&amp;rsquo;m describing.&lt;/p&gt;
&lt;p&gt;This post is part me describing my experience, and part encouraging any readers who also post. More importantly, those who hesitate to post.&lt;/p&gt;</content:encoded></item><item><title>Why did I call it PopsicleBoat?</title><link>https://jva.lol/weblog/ive-been-asked-and-kind-of-wondered-myself/</link><pubDate>Mon, 17 Aug 2026 13:01:34 -0600</pubDate><guid>https://jva.lol/weblog/ive-been-asked-and-kind-of-wondered-myself/</guid><description>(It sounded fun?)</description><content:encoded>&lt;p&gt;I called it PopsicleBoat because of a few reasons, I think. It evokes childhood memories. It is a metaphor for the intent: a playful place where people can connect and stick together, through calm and stormy weather. I don&amp;rsquo;t think I can explain it better than that.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/ive-been-asked-and-kind-of-wondered-myself/wooden-boat.mp4" aria-label="A kid playing with a small handmade wooden boat"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Sticks together. Floats together. (see what I did there? heh)&lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title>My comment section is static HTML</title><link>https://jva.lol/weblog/my-comment-section-is-static-html/</link><pubDate>Fri, 14 Aug 2026 17:26:50 -0600</pubDate><guid>https://jva.lol/weblog/my-comment-section-is-static-html/</guid><description>Static HTML comment section, no libraries, dependencies. Baked in by design.</description><content:encoded>&lt;h2 id="the-comment-section-here-is-static-html-reading-costs-nobody-anything"&gt;
The comment section here is static HTML. Reading costs nobody anything.
&lt;a class="anchor" href="#the-comment-section-here-is-static-html-reading-costs-nobody-anything"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Posting a comment does take a little more. It&amp;rsquo;s how I keep guard against bots and spammers, etc.&lt;/p&gt;
&lt;p&gt;This blog is a Hugo site. It has a comment section. If you view source on
any post with comments, you will find them in the HTML, because they are
compiled into the page at build time like everything else. There is no
widget, no iframe, no tracker, and no third-party script, and loading a
post makes no request to any server but this one. The page does carry
some JavaScript (the site search, a few small comforts), but the
comments never need it: with JavaScript off you can read every comment
and post one.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/my-comment-section-is-static-html/bread-from-oven.mp4" aria-label="A fresh loaf of bread coming out of the oven"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Baked. Fun, huh?&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="the-shape"&gt;
The shape
&lt;a class="anchor" href="#the-shape"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The comments live on a small Phoenix server I run, called PopsicleBoat.
Each post has a companion thread there; publishing a post makes one API
call that creates the thread and writes its URL into the post&amp;rsquo;s front
matter. That URL is the only coupling between the two systems.&lt;/p&gt;
&lt;p&gt;At build time, Hugo fetches each thread&amp;rsquo;s &lt;code&gt;replies.json&lt;/code&gt; and renders the
replies as plain HTML once per post per build, cached, capped
indentation. If the server is unreachable, the build carries on and
renders no comments. The comment system cannot break the blog.&lt;/p&gt;
&lt;p&gt;Below the replies is a plain HTML form: a textarea and a submit button,
POSTing to the boat. No script, no cookie, no request on pageview. The
boat walks you through signing in if needed, you confirm, and it sends
you back to the post with &lt;code&gt;#just-posted&lt;/code&gt; on the URL. A hidden note
appears via CSS &lt;code&gt;:target&lt;/code&gt; to say your comment is on its way. It is: the
boat pings my build hook, and about a minute later the comment is part
of the page. One of the small comforts is that it refreshes for you when it lands. A manual refresh does the same.&lt;/p&gt;
&lt;h2 id="why-this-shape"&gt;
Why this shape
&lt;a class="anchor" href="#why-this-shape"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Reading is static. Writing is dynamic. That is the whole idea.&lt;/p&gt;
&lt;p&gt;A reader costs nothing and depends on nothing. The page they get here is the
page I built, comments included. A writer touches the server once, at
the moment of writing, which is the point where a server is not just
useful, but like a moat: identity, spam defense, notifications. A comment writer is protected, a website owner (like me) is notified when written to.&lt;/p&gt;
&lt;p&gt;The durability falls out for free. The comments are in my generated
pages, so they stay with the blog no matter what happens to the comment
server. Most comment systems get this backwards: the conversation lives
on their infrastructure and your page borrows it at read time, every
read, forever.&lt;/p&gt;
&lt;p&gt;There is no captcha. Spam defense is the boat&amp;rsquo;s job and stays invisible:
a honeypot, time-to-submit checks, rate limits, and the sign-in step
itself. The boat is, to put it simply, the guard at the gate.&lt;/p&gt;
&lt;h2 id="the-honest-costs"&gt;
The honest costs
&lt;a class="anchor" href="#the-honest-costs"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Comments lag by a build. About a minute here on this blog.&lt;/p&gt;
&lt;p&gt;Commenting requires an account on the boat. That stops some people. I
keep it because a signed name is what makes the no-captcha posture
possible.&lt;/p&gt;
&lt;p&gt;If the boat is down during a build, that build renders the affected
posts without new comments until a later build picks them up. I prefer a
page that sometimes forgets to a page that sometimes fails.&lt;/p&gt;
&lt;h2 id="if-you-want-this"&gt;
If you want this
&lt;a class="anchor" href="#if-you-want-this"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The API is written up in one page: create a thread, get replies as JSON, point a build
hook at your host. Documented at
&lt;a href="https://www.popsicleboat.com/for-bloggers/api"&gt;https://www.popsicleboat.com/for-bloggers/api&lt;/a&gt; — you mint your own token,
shown once, to you. No one else sees it.&lt;/p&gt;</content:encoded></item><item><title>We're all terminally online. I know I am. I know you are too if you're reading this</title><link>https://jva.lol/weblog/were-all-terminally-online/</link><pubDate>Thu, 13 Aug 2026 09:00:00 -0600</pubDate><guid>https://jva.lol/weblog/were-all-terminally-online/</guid><description>You found a personal blog and you’re reading it. The condition is confirmed. I don’t have a solution, just observations.</description><content:encoded>&lt;p&gt;&amp;ldquo;Terminally online&amp;rdquo; is usually an insult. You say it about someone who knows what happened on some platform today, in detail, involving people you&amp;rsquo;ve never met in person. I&amp;rsquo;d like to point out that you are currently reading a personal blog, and you&amp;rsquo;ve probably never met me. Same with other blogs, or forums like reddit or hacker news.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going to skip the part where people pretend they&amp;rsquo;re going to log off. I&amp;rsquo;ve watched people announce their departures from the internet the way people announce diets. It lasts about as long, and the announcement itself happens online, which is telling. We&amp;rsquo;re online, friends.&lt;/p&gt;
&lt;p&gt;Most of the internet wants your time in one specific shape: a feed you scroll alone. It&amp;rsquo;s engineered to be bottomless on purpose, and it works on me the same as it works on you. An hour goes by and I couldn&amp;rsquo;t tell you one thing I saw. It was time with the texture of static. Maybe that&amp;rsquo;s dramatic, but tell me it doesn&amp;rsquo;t ring true. There is &lt;em&gt;so much&lt;/em&gt; out there.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/were-all-terminally-online/crt-static.mp4" aria-label="A CRT television screen showing nothing but static"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Static, noise. Where&amp;#39;s the signal?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m mostly just putting my thoughts out there, I don&amp;rsquo;t see a significant problem, and if I did I wouldn&amp;rsquo;t have a solution. I mean I guess I could change my life completely, work for the national parks department or something.&lt;/p&gt;</content:encoded></item><item><title>I hid something on this site</title><link>https://jva.lol/weblog/easter-egg-can-you-find-it/</link><pubDate>Sat, 08 Aug 2026 14:15:11 -0600</pubDate><guid>https://jva.lol/weblog/easter-egg-can-you-find-it/</guid><description>There’s an easter egg now. It’s kind of nested, like those Russian stacking dolls.</description><content:encoded>&lt;p&gt;There&amp;rsquo;s an easter egg &lt;span class="ln" data-n="1"&gt;o&lt;/span&gt;n this site now! I&amp;rsquo;m not going to say where it is. (I sort of am. Um, that&amp;rsquo;s what the spoi&lt;span class="ln" data-n="2"&gt;l&lt;/span&gt;ers at the bottom are for. Which itself was a new feature a&lt;span class="ln" data-n="3"&gt;d&lt;/span&gt;dition.)&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/easter-egg-can-you-find-it/parachute.mp4" aria-label="The Perseverance rover&amp;rsquo;s parachute inflating above the lander on Mars"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;NASA hid &amp;#39;Dare Mighty Things&amp;#39; in binary in this parachute. There&amp;#39;s something hidden here too.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Hints first. It&amp;rsquo;s small. It&amp;rsquo;s on almost &lt;span class="ln" data-n="4"&gt;e&lt;/span&gt;very page. It mean&lt;span class="ln" data-n="5"&gt;s&lt;/span&gt; some&lt;span class="ln" data-n="6"&gt;t&lt;/span&gt;hing to me personally, so if you kno&lt;span class="ln" data-n="7"&gt;w&lt;/span&gt; m&lt;span class="ln" data-n="8"&gt;e&lt;/span&gt; you can pro&lt;span class="ln" data-n="9"&gt;b&lt;/span&gt;ab&lt;span class="ln" data-n="10"&gt;l&lt;/span&gt;y guess. Clicking it d&lt;span class="ln" data-n="11"&gt;o&lt;/span&gt;es somethin&lt;span class="ln" data-n="12"&gt;g&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;One hint: it&amp;rsquo;s nested, like those Russian stacking dolls. They kee&lt;span class="ln" data-n="13"&gt;p&lt;/span&gt; &lt;span class="ln" data-n="14"&gt;o&lt;/span&gt;pening long after you&amp;rsquo;d think they&amp;rsquo;ve &lt;span class="ln" data-n="15"&gt;s&lt;/span&gt;&lt;span class="ln" data-n="16"&gt;t&lt;/span&gt;opped. (ashes aren&amp;rsquo;t the end of the game)&lt;/p&gt;
&lt;p&gt;One more hint: When you&amp;rsquo;re lost in the woods and you &lt;span class="ln" data-n="17"&gt;f&lt;/span&gt;&lt;span class="ln" data-n="18"&gt;i&lt;/span&gt;nd a cozy fi&lt;span class="ln" data-n="19"&gt;r&lt;/span&gt;e built by friendly and welcoming people, you don&amp;rsquo;t ju&lt;span class="ln" data-n="20"&gt;s&lt;/span&gt;&lt;span class="ln" data-n="21"&gt;t&lt;/span&gt; warm your hands and wander off. You sit, you enjoy the company, and when it&amp;rsquo;s time to go to the next thing, you carry a light with you. What would you do &lt;em&gt;first&lt;/em&gt;?&lt;/p&gt;
&lt;h2 id="spoilers"&gt;
Spoilers
&lt;a class="anchor" href="#spoilers"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Where is it? &lt;label class="spoiler"&gt;&lt;input type="checkbox"&gt;&lt;span&gt;The ankh at the bottom of most pages. Click it.&lt;/span&gt;&lt;/label&gt;
&lt;/li&gt;
&lt;li&gt;Something happened. Now what? &lt;label class="spoiler"&gt;&lt;input type="checkbox"&gt;&lt;span&gt;Click it again.&lt;/span&gt;&lt;/label&gt;
&lt;/li&gt;
&lt;li&gt;Is that everything? &lt;label class="spoiler"&gt;&lt;input type="checkbox"&gt;&lt;span&gt;No. Some letters burn brighter than others. Start with the oldest pages.&lt;/span&gt;&lt;/label&gt;
&lt;/li&gt;
&lt;li&gt;Which pages have the letters? &lt;label class="spoiler"&gt;&lt;input type="checkbox"&gt;&lt;span&gt;The sidebar lists every weblog post, newest at the top. Counting up from the bottom: the 1st, 1st again, 2nd, 3rd, 5th, and 8th oldest. Two letters share the first post. Yes, that sequence.&lt;/span&gt;&lt;/label&gt;
&lt;/li&gt;
&lt;li&gt;I found a word. Now what? &lt;label class="spoiler"&gt;&lt;input type="checkbox"&gt;&lt;span&gt;It&amp;rsquo;s not just a word. &lt;em&gt;&amp;ldquo;Speak, friend, and enter.&amp;rdquo;&lt;/em&gt; Addresses here look like jva.lol/word.&lt;/span&gt;&lt;/label&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>AI is good. Scary good. Scary in a good way.</title><link>https://jva.lol/weblog/ai-is-good-scary-good-scary-in-a-good-way/</link><pubDate>Fri, 07 Aug 2026 15:10:18 -0600</pubDate><guid>https://jva.lol/weblog/ai-is-good-scary-good-scary-in-a-good-way/</guid><description>In which I describe my journey using AI</description><content:encoded>&lt;p&gt;I&amp;rsquo;ve been using AI for over a year now. It keeps getting better. I&amp;rsquo;m sitting here, 20 years of hands on development behind me, and it&amp;rsquo;s unbelievable.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/ai-is-good-scary-good-scary-in-a-good-way/cnc-lathe.mp4" aria-label="A CNC lathe shaving a curl of steel off a spinning part"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Twenty years of doing it by hand. This does almost all of the fiddly part.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Lots of tools could find typos before I post them. Not a lot of them could respond to when a color in my theme is wrong, or a component positioned slightly off. It almost doesn&amp;rsquo;t matter which model I use, the days of hand tweaking my work seem over.&lt;/p&gt;
&lt;p&gt;For cents (in U.S. dollars), today I (or AI did, directed by me) edited a photo I took of my girlfriend with her niece. My GF&amp;rsquo;s hair slightly obscured her niece&amp;rsquo;s face. Got a cleaned up photo that looked perfect in minutes.&lt;/p&gt;
&lt;p&gt;The skepticism about whether you can trust what&amp;rsquo;s generated or edited is totally valid, and I&amp;rsquo;m not above it. This blog runs a rule where nothing ships in my voice until I&amp;rsquo;ve rewritten it myself, precisely because AI text can&amp;rsquo;t be trusted to be mine. Then I turned the same kind of tool on a photo of my girlfriend and her niece and moved someone&amp;rsquo;s hair.&lt;/p&gt;
&lt;p&gt;It does have significant value though. For 20 years I&amp;rsquo;ve hand coded every single line. There was always boilerplate and libraries etc. I&amp;rsquo;ve relied on tools I didn&amp;rsquo;t write the whole time. I didn&amp;rsquo;t write a single bit of the AI I&amp;rsquo;m using. I didn&amp;rsquo;t write a lick of Tailwind either, but I have used it. Even comedians need a stage. A camera crew. A broadcast network. An audience which means tickets, security, omg I could go on and on.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve &lt;a href="https://jva.lol/weblog/my-experiment-with-ai/"&gt;written about AI here&lt;/a&gt;, for instance how I got called out because it smelled like AI wrote it and not my voice. Shot taken, message received. I&amp;rsquo;m still going to use AI. But it&amp;rsquo;s important to use your own voice. People can clearly tell when you don&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;I, for one, am having a blast. I do have to remind myself to be the voice, though. It&amp;rsquo;s easy to slip into the trap where you literally have AI make all the decisions.&lt;/p&gt;
&lt;p&gt;But the boilerplate and styling fixes I don&amp;rsquo;t have to do by hand? Yeah. Gimme.&lt;/p&gt;</content:encoded></item><item><title>I've made posting here with a companion thread on PopsicleBoat automatic</title><link>https://jva.lol/weblog/ive-made-posting-here-with-a-companion-thread-on-popsicleboat-automatic/</link><pubDate>Wed, 05 Aug 2026 11:34:43 -0600</pubDate><guid>https://jva.lol/weblog/ive-made-posting-here-with-a-companion-thread-on-popsicleboat-automatic/</guid><description>I have scripts in place to start a fully connected blog post, complete with a companion comments section on PopsicleBoat</description><content:encoded>&lt;p&gt;I have had scripts to make things easier for a while, but I&amp;rsquo;m writing now because I&amp;rsquo;ve wired them all together to make posting here with a companion PopsicleBoat comment thread easier than ever.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/ive-made-posting-here-with-a-companion-thread-on-popsicleboat-automatic/printing-press.mp4" aria-label="Color plates blurring past under a newspaper press at speed"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Press the button, it&amp;#39;s printed. Not on paper but you get what I mean. Complete with a companion comments thread on PopsicleBoat.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s basically one script with a few prompts. (I used it to create this post, for instance):&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;scripts/new-post
Title: I&amp;#39;ve made posting here with a companion thread on PopsicleBoat automatic
Slug [ive-made-posting-here-with-a-companion-thread-on-popsicleboat-automatic]:
Media for this post (scaffolds a page bundle)? [Y/n]: y
Description (meta/OG line; blank to fill in later): Automatic comment section for any new blog post here
Summary (list-page line; blank to fill in later): I have scripts in place to start a fully connected blog post, complete with a companion comments section on PopsicleBoat
Categories, comma-separated [Projects]: Projects
Tags, comma-separated (e.g. popsicleboat, hugo): popsicleboat, hugo
Created content/weblog/ive-made-posting-here-with-a-companion-thread-on-popsicleboat-automatic/index.md — write the essay.
Committing it will prompt for its companion thread (empty space answer skips).
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I&amp;rsquo;ll commit in a moment, and then name the companion thread. I (and you, if you&amp;rsquo;re reading) will see the result.&lt;/p&gt;
&lt;p&gt;The main point of this is to demonstrate how easy it could be for you too, if you want it.&lt;/p&gt;
&lt;p&gt;Most of each is YAML quoting and error handling. The two bits are the actual idea.&lt;/p&gt;
&lt;p&gt;The scaffold defaults to a Hugo page bundle, so a post always has somewhere to put images:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;read -r -p &amp;#34;Media for this post (scaffolds a page bundle)? [Y/n]: &amp;#34; bundle
case $bundle in
[nN]*) post=&amp;#34;content/weblog/$slug.md&amp;#34; ;;
*) post=&amp;#34;content/weblog/$slug/index.md&amp;#34; ;;
esac
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And the commit hook re-stages the post after wiring the thread URL into it, which is why the thread arrives in the same commit instead of a follow-up:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;if scripts/companion-thread &amp;#34;$post&amp;#34;; then
git add &amp;#34;$post&amp;#34;
fi
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;One caveat if you want to copy this: it leans on three things I set up once and forgot about. A &lt;code&gt;POPSICLEBOAT_TOKEN&lt;/code&gt; in my shell, a &lt;code&gt;companion-thread.template.md&lt;/code&gt; written in my own words that the command fills in per post, and &lt;code&gt;scripts/setup&lt;/code&gt; having turned the git hooks on. Without those the scaffold still works, the hook just shrugs and tells you to wire the thread later.&lt;/p&gt;
&lt;p&gt;Worth admitting: writing this post broke the tooling it describes. Pasting the scaffold script in dragged along the review marker from its own comments, and the gate that keeps unreviewed copy off the site saw it and blocked the commit. Nothing to rewrite, the marker was the subject. The gate ignores fenced code now.&lt;/p&gt;</content:encoded></item><item><title>23 languages, one I can check</title><link>https://jva.lol/weblog/23-languages-one-i-can-check/</link><pubDate>Sun, 02 Aug 2026 14:44:13 -0600</pubDate><guid>https://jva.lol/weblog/23-languages-one-i-can-check/</guid><description>In which I ship translations I can’t read, on the strength of the one I can</description><content:encoded>&lt;p&gt;&lt;a href="https://popsicleboat.com"&gt;PopsicleBoat&lt;/a&gt; is available in 23 languages besides English now. I speak two of them: English and German.&lt;/p&gt;
&lt;p&gt;I wired gettext in early, so every visible string in the app has been going through a translation function from the beginning. That part was just discipline. What I never had was the translations themselves. There are about 1,500 strings in there. Getting those into Arabic, Thai, Korean, Ukrainian, and twenty more is not something I was ever going to do myself, and paying 23 translators for a hobby project was never going to happen either. So it just sat there, one language, waiting.&lt;/p&gt;
&lt;p&gt;The AI did it. All of them, in an afternoon.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/23-languages-one-i-can-check/solari-board.mp4" aria-label="A split-flap train board clattering through garbled characters until each word lands"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;It lands on the right word. Usually.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="the-part-that-bothered-me"&gt;
The part that bothered me
&lt;a class="anchor" href="#the-part-that-bothered-me"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;You can&amp;rsquo;t check the work. That&amp;rsquo;s the whole problem. I can look at the Thai file and tell you it&amp;rsquo;s Thai, and that&amp;rsquo;s the end of what I know. If it&amp;rsquo;s stiff, or wrong, or accidentally rude, I have no way to find out until a person who speaks it tells me. Shipping a thing you can&amp;rsquo;t read to people who &lt;em&gt;can&lt;/em&gt; read it is a little scary. I want to get things right, but seriously. How would I know the Thai translation tracks for a native Thai speaker?&lt;/p&gt;
&lt;h2 id="why-i-shipped-it-anyway"&gt;
Why I shipped it anyway
&lt;a class="anchor" href="#why-i-shipped-it-anyway"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;German. I read it, write it, and speak it fluently. I lived in Germany for 3 years. German happens to be one of the 23, and it&amp;rsquo;s the only one aside from English I can verify.&lt;/p&gt;
&lt;p&gt;So I read the German. I didn&amp;rsquo;t skim, I read. I scoured. And it&amp;rsquo;s good. Not &amp;ldquo;technically correct&amp;rdquo; good, actually good. The tone matches, the informal tonality is consistent, the UI strings are the ones a German app would use instead of the literal translation of the English. A few things I&amp;rsquo;d have phrased differently, which is also true of things I write in English. So in general, it&amp;rsquo;s been a good exercise in reviewing copy that faces users. Probably (almost certainly) still rough edges especially in languages I don&amp;rsquo;t know, but also the two I do. But AI brought me a &lt;em&gt;loooooooong&lt;/em&gt; way to supporting languages I simply don&amp;rsquo;t know.&lt;/p&gt;
&lt;h2 id="what-id-suggest-you-do-if-youre-curious"&gt;
What I&amp;rsquo;d suggest you do if you&amp;rsquo;re curious
&lt;a class="anchor" href="#what-id-suggest-you-do-if-youre-curious"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;This has been an experiment, mostly. Of course I&amp;rsquo;d love a global audience, but this was not an anticipatory effort. It was more like &amp;ldquo;Can AI do this?&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;One thing I didn&amp;rsquo;t expect: shipping a language nobody reads yet teaches you nothing, because nobody is there to tell you it&amp;rsquo;s wrong.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re interested in trying this for your own site, here&amp;rsquo;s the general flow I followed:
check the language translations you know -&amp;gt; decide if it&amp;rsquo;s good enough to have confidence in the ones you don&amp;rsquo;t -&amp;gt; commit, but brace yourself for corrections from users&lt;/p&gt;
&lt;p&gt;If I didn&amp;rsquo;t know German, I don&amp;rsquo;t think I&amp;rsquo;d have pushed this. But because I know my own fluency, I could spot check the German translation and it was &lt;em&gt;good&lt;/em&gt;. It was like, &lt;em&gt;really good&lt;/em&gt;. So that gave me confidence on all the languages I do &lt;em&gt;not&lt;/em&gt; know.&lt;/p&gt;
&lt;p&gt;Way cool, friends. This technology is not just a toy. It&amp;rsquo;s wildly powerful.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a feedback link in the sidebar and it goes to me. If something reads wrong in your language, that&amp;rsquo;s the fastest way to fix it, and honestly I&amp;rsquo;d rather hear it from you than not know.&lt;/p&gt;
&lt;p&gt;Cheers
Jake&lt;/p&gt;</content:encoded></item><item><title>Commenting now works with two redirects</title><link>https://jva.lol/weblog/a-comment-section-from-a-form-and-two-redirects/</link><pubDate>Sun, 26 Jul 2026 12:03:32 -0600</pubDate><guid>https://jva.lol/weblog/a-comment-section-from-a-form-and-two-redirects/</guid><description>In which a static page takes your comment, posts it, and shows it back to you</description><content:encoded>&lt;p&gt;This blog is static HTML using &lt;a href="https://github.com/gohugoio/hugo"&gt;hugo&lt;/a&gt;. There&amp;rsquo;s no comment backend, no database, no JavaScript framework. And yet under this post there&amp;rsquo;s a place to submit a comment. And under every comment there&amp;rsquo;s a link to reply if you want, and if you do, the blog navigates briefly to &lt;a href="https://popsicleboat.com"&gt;popsicleboat&lt;/a&gt; and returns to this page, scrolled to a bar that tells you what&amp;rsquo;s going on with a spinner. Then the page automatically refreshes when it&amp;rsquo;s ready, showing what you wrote. It takes about a minute because the hugo site needs to rebuild.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jva.lol/weblog/posting-here-start-to-finish/"&gt;Last time&lt;/a&gt; I wrote about the author side: write, run a command to link your post to popsicleboat to enable comments hosted there, and push. Things have changed a bit since then. This is to describe the reader side and how comments work. I made it more frictionless and that took more machinery. Here&amp;rsquo;s the whole loop.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/a-comment-section-from-a-form-and-two-redirects/moon-free-return.mp4" aria-label="NASA&amp;rsquo;s Apollo 13 visualization: the far side of the Moon rolling past on the free-return trip home"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Round trip. Comments go out -&amp;gt; circle the flow -&amp;gt; come back home.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;And things continue to change, this project is very much alive. If you&amp;rsquo;re reading this blog keep in mind older posts describing how things work are probably a touch out of date.&lt;/p&gt;
&lt;h2 id="what-submit-actually-does"&gt;
What submit actually does
&lt;a class="anchor" href="#what-submit-actually-does"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The reply box is a plain HTML form. No javascript attached. Submitting it POSTs text across the internet to &lt;a href="https://popsicleboat.com"&gt;PopsicleBoat&lt;/a&gt;&amp;rsquo;s endpoint.&lt;/p&gt;
&lt;p&gt;That POST carries no cookies. Browsers stopped sending them on cross-site form posts years ago, a security design against CSRFs. Because the request carries no authority, the endpoint can&amp;rsquo;t post anything on your behalf. All it does is park your draft server-side under a random token, then answer with a redirect to the thread, token in hand. The redirect is a 303, which turns the POST into an ordinary top-level GET, and on an ordinary GET your PopsicleBoat session is back.&lt;/p&gt;
&lt;p&gt;The moment you land on PopsicleBoat, three checks run:
1 - you&amp;rsquo;re signed in&lt;/p&gt;
&lt;p&gt;2 - the draft is recent (to verify it is the post just made)&lt;/p&gt;
&lt;p&gt;3 - you arrived from the same internet address the draft was submitted from.&lt;/p&gt;
&lt;p&gt;The idea is that alone, each of these checks would be leaky. Together they assert this is the comment from the same person at the same moment. This prevents abuse.&lt;/p&gt;
&lt;p&gt;All three pass and the reply posts on the spot, through the same pipeline as the boat&amp;rsquo;s own composer, so rate limits and moderation apply the same. No second button, no form over there, nothing to confirm. From your side it was simple like any other commenting mechanism:
1 - type&lt;/p&gt;
&lt;p&gt;2 - submit&lt;/p&gt;
&lt;p&gt;and you&amp;rsquo;re already on your way back to where you clicked submit.&lt;/p&gt;
&lt;p&gt;The only caveat for this particular blog is it does need to rebuild since comments and replies are static, as is the whole blog. The good news is it&amp;rsquo;s pretty easy to configure that because it&amp;rsquo;s hosted on netlify and setting the build hook is a one time process. Most popular hosting sites offer something similar.&lt;/p&gt;
&lt;h2 id="the-build-hook"&gt;
The build hook
&lt;a class="anchor" href="#the-build-hook"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve written about it before but since it&amp;rsquo;s context here it&amp;rsquo;s worth a refresher.&lt;/p&gt;
&lt;p&gt;For this blog the hook lives in the Netlify dashboard under Site configuration → Build &amp;amp; deploy → Build hooks. Click &amp;ldquo;Add build hook,&amp;rdquo; give it a name, and Netlify gives you a unique URL. Anything that sends an empty POST to that URL triggers a fresh build and deploy of the site. That URL is what you paste into your PopsicleBoat account settings (the build-hook field), and it&amp;rsquo;s what PopsicleBoat pings the moment a new reply posts, triggering the build.&lt;/p&gt;
&lt;p&gt;Everything after the trigger is just information for the reader: a status bar with a spinner sitting where the comment will appear.&lt;/p&gt;
&lt;h2 id="when-it-asks-first"&gt;
When it asks first
&lt;a class="anchor" href="#when-it-asks-first"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The checks exist for cases where posting silently would be wrong, and every miss falls back to a default. Basically the way it was before. The composer open, with your draft already in it, and one button.&lt;/p&gt;
&lt;p&gt;The address check matters because the landing URL is shareable. PopsicleBoat notes the IP address that submits a draft, and it auto-posts only when the browser that opens the landing link is at that same address. Without it, sending that link to a friend would post &lt;em&gt;your&lt;/em&gt; words under &lt;em&gt;their&lt;/em&gt; name the moment they opened it. And if you&amp;rsquo;re signed out, you sign in (or make an account) first; the draft survives the detour, waiting up to half an hour, enough to confirm an email and still find your words in the box. The draft is only consumed at the moment of posting, so nothing you typed disappears.&lt;/p&gt;
&lt;p&gt;The reason I call it an &amp;ldquo;arrival&amp;rdquo; rather than &amp;ldquo;your return&amp;rdquo; is that the landing URL is just a URL. Whoever opens it, whether it&amp;rsquo;s you, or a friend you pasted it to, or a browser restoring a tab arrives with the token… PopsicleBoat can&amp;rsquo;t tell from the token alone who&amp;rsquo;s holding it. So it compares the arriving browser&amp;rsquo;s IP address to the one that submitted the draft, and only auto-posts when they match.&lt;/p&gt;
&lt;h2 id="the-trip-back"&gt;
The trip back
&lt;a class="anchor" href="#the-trip-back"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;After the reply posts, a toast briefly appears from the top saying it&amp;rsquo;ll show up on the blog in a few minutes and that you&amp;rsquo;re being sent back. A couple of seconds later you&amp;rsquo;re on the originating page again. Not at the top of it, the return URL carries a fragment that steers the scroll to the place where there&amp;rsquo;s a placeholder note with a small spinner and a basic notice that your comment will appear shortly, sitting exactly where your comment is about to appear.&lt;/p&gt;
&lt;p&gt;PopsicleBoat &lt;em&gt;only&lt;/em&gt; honors that return URL because this blog is the verified website on my profile there. A tampered return address gets dropped, so the endpoint can&amp;rsquo;t be used as a redirect for anywhere else. That&amp;rsquo;s important, I&amp;rsquo;ve written about it before but if you want to use PopsicleBoat there &lt;em&gt;is&lt;/em&gt; some configuration.&lt;/p&gt;
&lt;h2 id="the-page-finishes-the-job"&gt;
The page finishes the job
&lt;a class="anchor" href="#the-page-finishes-the-job"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Posting also pinged my build hook, immediately. The pinger fires on the leading edge and then holds a window, so one reply means one instant rebuild and a burst of replies means two, not a dozen. Netlify rebuilds, Hugo fetches the thread&amp;rsquo;s &lt;code&gt;replies.json&lt;/code&gt;, and the comment becomes static paragraphs in the HTML like every other one. If PopsicleBoat goes down or just goes away for any reason, those comments still live on the site where they were made.&lt;/p&gt;
&lt;p&gt;Meanwhile the note you landed on is doing the only JavaScript in the whole loop: every ten seconds it checks a tiny build-stamp file. When the stamp changes, the page reloads itself, scrolls to your new comment, and puts a highlight on it. The script is a couple of kilobytes served from this site, and it only runs when you arrive with the fragment. A plain visit to the page runs nothing. Note: This is not required for integration with PopsicleBoat. The script is specific to jva.lol.&lt;/p&gt;
&lt;h2 id="threads-that-stay-readable"&gt;
Threads that stay readable
&lt;a class="anchor" href="#threads-that-stay-readable"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Every top level comment and reply can be replied to in a basically unlimited nesting structure. Indentation steps in for three levels and then stops; deeper runs fold behind a, for example, &amp;ldquo;7 more replies&amp;rdquo; link, and every three levels inside a fold it folds again. Inside each fold the indent restarts from the edge, so a parent and its child always read as parent and child instead of drifting off the right side of a phone or tablet, or any device. The idea is that it&amp;rsquo;s adaptive and never loses control or context from where you are.&lt;/p&gt;
&lt;h2 id="what-your-browser-never-does-here"&gt;
What your browser never does here
&lt;a class="anchor" href="#what-your-browser-never-does-here"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;No cookies from this site. No third-party script, no iframe, no tracker. Reading the conversation is reading HTML that was baked at build time, and this site keeps its own copy of every reply. Writing is one form and two redirects: a POST that parks a draft -&amp;gt; a 303 to where your account lives -&amp;gt; a redirect home.&lt;/p&gt;
&lt;p&gt;The author-side setup is unchanged from the &lt;a href="https://jva.lol/weblog/posting-here-start-to-finish/"&gt;earlier post&lt;/a&gt;, and the general arrangement is documented at &lt;a href="https://www.popsicleboat.com/comments"&gt;popsicleboat.com/comments&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This page is the demo. The box below is that form.&lt;/p&gt;</content:encoded></item><item><title>My new post script</title><link>https://jva.lol/weblog/testing-my-new-post-script/</link><pubDate>Fri, 24 Jul 2026 22:08:48 -0600</pubDate><guid>https://jva.lol/weblog/testing-my-new-post-script/</guid><description>Making it easier to post with all the wiring for comments</description><content:encoded>&lt;p&gt;Not a lot to it, just &lt;code&gt;scripts/new-post&lt;/code&gt; and follow the prompts to setup the boilerplate. Then write the content. Then to wire up comments on PopsicleBoat, &lt;code&gt;scripts/companion-prompt&lt;/code&gt; That&amp;rsquo;s it!&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/testing-my-new-post-script/waffle-iron.mp4" aria-label="A waffle iron opens and identical golden waffles are lifted out"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Boilerplate, fresh. Kind of like making waffles. Get it? Hehe.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New Post&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#!/usr/bin/env bash
#
# new-post — scaffold a weblog post interactively.
#
# Prompts for the front matter this blog actually uses (title, slug, bundle,
# description, summary, categories, tags), writes the post with a correct
# RFC3339 date and an empty popsicleboat: line, and leaves the body to you.
# Committing the post later triggers scripts/companion-prompt, which asks for
# the thread&amp;#39;s space and wires the discussion thread (spec 0006).
set -euo pipefail
cd &amp;#34;$(git rev-parse --show-toplevel)&amp;#34;
die() { echo &amp;#34;new-post: $1&amp;#34; &amp;gt;&amp;amp;2; exit 1; }
# Quote a YAML scalar: double quotes unless the value has one, then single.
yaml_quote() {
case $1 in
*\&amp;#34;*\&amp;#39;* | *\&amp;#39;*\&amp;#34;*) die &amp;#34;can&amp;#39;t hold both quote kinds in front matter: $1&amp;#34; ;;
*\&amp;#34;*) printf &amp;#34;&amp;#39;%s&amp;#39;&amp;#34; &amp;#34;$1&amp;#34; ;;
*) printf &amp;#39;&amp;#34;%s&amp;#34;&amp;#39; &amp;#34;$1&amp;#34; ;;
esac
}
# Comma-separated answer -&amp;gt; YAML list lines (&amp;#34;- item&amp;#34; per entry).
yaml_list() {
local IFS=&amp;#39;,&amp;#39; item
for item in $1; do
item=$(printf &amp;#39;%s&amp;#39; &amp;#34;$item&amp;#34; | sed -E &amp;#39;s/^ +| +$//g&amp;#39;)
[ -n &amp;#34;$item&amp;#34; ] &amp;amp;&amp;amp; printf -- &amp;#34;- %s\n&amp;#34; &amp;#34;$item&amp;#34;
done
}
read -r -p &amp;#34;Title: &amp;#34; title
[ -n &amp;#34;$title&amp;#34; ] || die &amp;#34;a post needs a title&amp;#34;
default_slug=$(printf &amp;#39;%s&amp;#39; &amp;#34;$title&amp;#34; |
tr &amp;#39;[:upper:]&amp;#39; &amp;#39;[:lower:]&amp;#39; |
sed -E &amp;#34;s/&amp;#39;//g; s/[^a-z0-9]+/-/g; s/^-+//; s/-+$//&amp;#34;)
read -r -p &amp;#34;Slug [$default_slug]: &amp;#34; slug
slug=${slug:-$default_slug}
[ -n &amp;#34;$slug&amp;#34; ] || die &amp;#34;a post needs a slug&amp;#34;
read -r -p &amp;#34;Page bundle, for images alongside the post? [y/N]: &amp;#34; bundle
case $bundle in
[yY]*) post=&amp;#34;content/weblog/$slug/index.md&amp;#34; ;;
*) post=&amp;#34;content/weblog/$slug.md&amp;#34; ;;
esac
[ -e &amp;#34;$post&amp;#34; ] &amp;amp;&amp;amp; die &amp;#34;$post already exists&amp;#34;
read -r -p &amp;#34;Description (meta/OG line; blank to fill in later): &amp;#34; description
read -r -p &amp;#34;Summary (list-page line; blank to fill in later): &amp;#34; summary
read -r -p &amp;#34;Categories, comma-separated [Projects]: &amp;#34; categories
categories=${categories:-Projects}
read -r -p &amp;#34;Tags, comma-separated (e.g. popsicleboat, hugo): &amp;#34; tags
ts=$(date &amp;#34;+%Y-%m-%dT%H:%M:%S%z&amp;#34;)
ts=&amp;#34;${ts:0:22}:${ts:22}&amp;#34; # RFC3339 wants a colon in the offset
mkdir -p &amp;#34;$(dirname &amp;#34;$post&amp;#34;)&amp;#34;
{
echo &amp;#34;---&amp;#34;
echo &amp;#34;title: $(yaml_quote &amp;#34;$title&amp;#34;)&amp;#34;
echo &amp;#34;description: $(yaml_quote &amp;#34;$description&amp;#34;)&amp;#34;
echo &amp;#34;date: $ts&amp;#34;
echo &amp;#34;summary: $(yaml_quote &amp;#34;$summary&amp;#34;)&amp;#34;
echo &amp;#39;popsicleboat: &amp;#34;&amp;#34; # wired at commit by scripts/companion-prompt&amp;#39;
echo &amp;#34;categories:&amp;#34;
yaml_list &amp;#34;$categories&amp;#34;
if [ -n &amp;#34;$tags&amp;#34; ]; then
echo &amp;#34;tags:&amp;#34;
yaml_list &amp;#34;$tags&amp;#34;
fi
echo &amp;#34;---&amp;#34;
echo &amp;#34;&amp;#34;
} &amp;gt; &amp;#34;$post&amp;#34;
echo &amp;#34;&amp;#34;
echo &amp;#34;Created $post — write the essay.&amp;#34;
echo &amp;#34;Committing it will prompt for its companion thread (empty space answer skips).&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Companion Prompt&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#!/usr/bin/env bash
#
# companion-prompt — wire a new post&amp;#39;s companion thread at commit time.
#
# For each NEW post staged in this commit (content/weblog/*.md or a new
# bundle&amp;#39;s index.md) whose `popsicleboat:` field is empty, prompt for the
# thread&amp;#39;s space and an optional per-post thread title, write the answers
# into the front matter, run scripts/companion-thread, and re-stage the
# post — so the commit lands with its Discuss thread created and wired.
#
# Never blocks a commit. Degraded paths (no terminal, no POPSICLEBOAT_TOKEN,
# empty space answer, API failure) print how to wire the thread later and let
# the commit through. Skip the hook with COMPANION_PROMPT=0, or --no-verify.
set -uo pipefail
cd &amp;#34;$(git rev-parse --show-toplevel)&amp;#34;
[ &amp;#34;${COMPANION_PROMPT:-1}&amp;#34; = &amp;#34;0&amp;#34; ] &amp;amp;&amp;amp; exit 0
new_posts=$(git diff --cached --name-only --diff-filter=A -- \
&amp;#39;content/weblog/*.md&amp;#39; &amp;#39;content/weblog/*/index.md&amp;#39; | grep -v &amp;#39;_index\.md$&amp;#39; || true)
[ -z &amp;#34;$new_posts&amp;#34; ] &amp;amp;&amp;amp; exit 0
# Posts that already carry a thread URL (or no field at all) need no prompt.
needs_thread() {
grep -qE &amp;#39;^popsicleboat: *(&amp;#34;&amp;#34;)? *(#.*)?$&amp;#39; &amp;#34;$1&amp;#34;
}
pending=()
while IFS= read -r post; do
[ -f &amp;#34;$post&amp;#34; ] &amp;amp;&amp;amp; needs_thread &amp;#34;$post&amp;#34; &amp;amp;&amp;amp; pending+=(&amp;#34;$post&amp;#34;)
done &amp;lt;&amp;lt;&amp;lt; &amp;#34;$new_posts&amp;#34;
[ &amp;#34;${#pending[@]}&amp;#34; -eq 0 ] &amp;amp;&amp;amp; exit 0
later() { # how to finish the job after a degraded path
echo &amp;#34;companion-prompt: wire it later with: scripts/companion-thread $1 --space &amp;lt;space&amp;gt;&amp;#34; &amp;gt;&amp;amp;2
}
# -r /dev/tty lies without a controlling terminal (macOS: open fails with
# &amp;#34;Device not configured&amp;#34;), so probe by actually opening it.
if ! { : &amp;lt; /dev/tty; } 2&amp;gt;/dev/null; then
echo &amp;#34;companion-prompt: no terminal — committing without companion threads.&amp;#34; &amp;gt;&amp;amp;2
for post in &amp;#34;${pending[@]}&amp;#34;; do later &amp;#34;$post&amp;#34;; done
exit 0
fi
if [ -z &amp;#34;${POPSICLEBOAT_TOKEN:-}&amp;#34; ]; then
echo &amp;#34;companion-prompt: POPSICLEBOAT_TOKEN not set — committing without companion threads.&amp;#34; &amp;gt;&amp;amp;2
for post in &amp;#34;${pending[@]}&amp;#34;; do later &amp;#34;$post&amp;#34;; done
exit 0
fi
# Insert a front-matter line right after the popsicleboat: field.
insert_after_popsicleboat() {
local file=$1 line=$2
awk -v add=&amp;#34;$line&amp;#34; &amp;#39;{ print } !done &amp;amp;&amp;amp; /^popsicleboat:/ { print add; done = 1 }&amp;#39; \
&amp;#34;$file&amp;#34; &amp;gt; &amp;#34;$file.tmp&amp;#34; &amp;amp;&amp;amp; mv &amp;#34;$file.tmp&amp;#34; &amp;#34;$file&amp;#34;
}
for post in &amp;#34;${pending[@]}&amp;#34;; do
echo &amp;#34;&amp;#34;
echo &amp;#34;New post: $post&amp;#34;
read -r -p &amp;#34; PopsicleBoat space for its thread (empty to skip): &amp;#34; space &amp;lt; /dev/tty
if [ -z &amp;#34;$space&amp;#34; ]; then
later &amp;#34;$post&amp;#34;
continue
fi
read -r -p &amp;#34; Thread title override (empty for the template default): &amp;#34; title &amp;lt; /dev/tty
insert_after_popsicleboat &amp;#34;$post&amp;#34; &amp;#34;popsicleboat_space: \&amp;#34;$space\&amp;#34;&amp;#34;
if [ -n &amp;#34;$title&amp;#34; ]; then
case $title in
*\&amp;#34;*\&amp;#39;* | *\&amp;#39;*\&amp;#34;*)
echo &amp;#34; title has both quote kinds — front matter can&amp;#39;t hold that; using the template default.&amp;#34; &amp;gt;&amp;amp;2
;;
*\&amp;#34;*)
insert_after_popsicleboat &amp;#34;$post&amp;#34; &amp;#34;popsicleboat_title: &amp;#39;$title&amp;#39;&amp;#34;
;;
*)
insert_after_popsicleboat &amp;#34;$post&amp;#34; &amp;#34;popsicleboat_title: \&amp;#34;$title\&amp;#34;&amp;#34;
;;
esac
fi
if scripts/companion-thread &amp;#34;$post&amp;#34;; then
git add &amp;#34;$post&amp;#34;
else
echo &amp;#34;companion-prompt: thread creation failed — committing the post unwired.&amp;#34; &amp;gt;&amp;amp;2
later &amp;#34;$post&amp;#34;
git add &amp;#34;$post&amp;#34; # keep the space/title answers we wrote either way
fi
done
&lt;/code&gt;&lt;/pre&gt;</content:encoded></item><item><title>Posting here, start to finish</title><link>https://jva.lol/weblog/posting-here-start-to-finish/</link><pubDate>Fri, 24 Jul 2026 20:24:29 -0600</pubDate><guid>https://jva.lol/weblog/posting-here-start-to-finish/</guid><description>Write -&gt; one command -&gt; push. The comments take care of themselves</description><content:encoded>&lt;p&gt;Here&amp;rsquo;s the whole process of publishing a post on this blog now, comment section included.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/posting-here-start-to-finish/artemis-liftoff.mp4" aria-label="Artemis I lifting off at night: the whole rocket lit on the pad, then engines light and everything goes bright"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Launching a post. You just push the button, the machinery handles the rest. I mean, there&amp;#39;s no propellants or fire… It&amp;#39;d be cool but (self check) read the room bud. This is a website.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I write the post, a markdown file with some front matter, same as any Hugo blog.&lt;/p&gt;
&lt;p&gt;I run one command &lt;code&gt;scripts/companion-thread content/weblog/posting-here-start-to-finish.md --space blogging&lt;/code&gt; with POPSICLEBOAT_TOKEN exported in my shell, it creates a discussion thread for the post over on PopsicleBoat and writes the thread&amp;rsquo;s URL back into the file. That&amp;rsquo;s the entire integration.&lt;/p&gt;
&lt;p&gt;I push, Netlify builds the site, and the post goes up with a &amp;ldquo;Discuss this post&amp;rdquo; link at the bottom.&lt;/p&gt;
&lt;p&gt;The part I like is what readers get. The replies don&amp;rsquo;t live in an iframe and don&amp;rsquo;t load from a script. When the site builds, it fetches the public replies from the thread and bakes them into the page as plain HTML with no JavaScript, no tracker, no third-party anything running on your machine. The conversation is just part of the page.&lt;/p&gt;
&lt;p&gt;The page also keeps itself current. When someone replies, PopsicleBoat waits a couple of minutes. So a burst of replies becomes one build instead of five. It then pings my build hook. Netlify rebuilds, and the reply is sitting on the page about three minutes after it was written.&lt;/p&gt;
&lt;p&gt;If a comment thread ever goes away, your page quietly drops the comments callout.&lt;/p&gt;
&lt;h2 id="what-it-took-to-set-up-once"&gt;
What it took to set up, once
&lt;a class="anchor" href="#what-it-took-to-set-up-once"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;None of the above is the setup. The setup happened once, and it was three things.&lt;/p&gt;
&lt;p&gt;1 - A token. The command talks to PopsicleBoat with a personal access token. I run the service, so I mint mine on the server: &lt;code&gt;fly ssh console -a popsicleboat -C &amp;quot;sh -c 'cd /app &amp;amp;&amp;amp; MIX_ENV=prod mix popsicleboat.create_api_token jake \&amp;quot;blog\&amp;quot;'&amp;quot;&lt;/code&gt;. If you wanted one for your blog, I&amp;rsquo;d issue it to you. It&amp;rsquo;s shown once, you export it in your shell, and that&amp;rsquo;s the last time you think about it.&lt;/p&gt;
&lt;p&gt;2 - A script. &lt;code&gt;companion-thread&lt;/code&gt; is about a hundred lines of Python sitting in my blog&amp;rsquo;s repo. All it does is call one API endpoint with the post&amp;rsquo;s title and URL, then paste the thread URL it gets back into the front matter.&lt;/p&gt;
&lt;p&gt;3 - A build hook. I pasted my Netlify build-hook URL into my PopsicleBoat profile. That&amp;rsquo;s the whole &amp;ldquo;keeps itself current&amp;rdquo; trick! Netlify, Vercel, and Cloudflare Pages all take the same ping, so pretty much any static host works.&lt;/p&gt;
&lt;p&gt;I &lt;a href="https://jva.lol/weblog/easier-way-to-post-with-comments/"&gt;wrote earlier&lt;/a&gt; about getting this from ~5 steps down to about 2, at least after the initial setup: The token, the build hook, and the script to wire a new post with the URL. After that, you write, a script writes the thread&amp;rsquo;s URL into the front matter of the post. This is what those steps buy: write, push. The comments handle themselves.&lt;/p&gt;
&lt;p&gt;Caveat: This is what works for my (this) blog. The command for updating the Hugo front matter is specific to mine. But once the instrumentation is in place, it&amp;rsquo;s a really pleasing and clean process to post a new entry (like this one) with comments baked in.&lt;/p&gt;
&lt;p&gt;The setup for other blogs is laid out on &lt;a href="https://www.popsicleboat.com/comments"&gt;popsicleboat.com/comments&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>What's new, late July</title><link>https://jva.lol/weblog/whats-new-aboard-late-july/</link><pubDate>Fri, 24 Jul 2026 16:31:24 -0600</pubDate><guid>https://jva.lol/weblog/whats-new-aboard-late-july/</guid><description>New changes and improvements from the back half of July</description><content:encoded>&lt;p&gt;Here&amp;rsquo;s what&amp;rsquo;s been going on with popsicleboat the latter half of July 2026.&lt;/p&gt;
&lt;p&gt;1 - Background images on profiles. (The headline. A member can put a photo behind
their profile picture. It adds a little flavor to your profile, it shows as a strip on the profile page and fills the little
identity card in the sidebar.&lt;/p&gt;
&lt;p&gt;Fully optional; profiles without one look exactly
like before. Uploading got simpler at the same time: pick a file, see it
immediately, it saves itself — no Upload button, and the sidebar card updates
live. Using Phoenix LiveView, practically no friction to updating either your profile photo or your background photo. Both optional either way.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/whats-new-aboard-late-july/oregon-coast.mp4" aria-label="A drone gliding along Oregon coast cliffs toward a fog bank"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;I just picked this because it felt fresh the way the changes I&amp;#39;ve made do. Also I like drone footage of cool things.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;2 - A tidier profile page. Your posts and replies now sit side by side. The
per-space groups are now collapsible. Reply excerpts render their markdown instead of
showing raw asterisks.&lt;/p&gt;
&lt;p&gt;3 - A Feedback link. Guests get an email link in the sidebar footer, signed-in
members get a direct line through the message dock. Either way feedback comes directly to me. If something&amp;rsquo;s broken or you&amp;rsquo;d like something to behave differently, just let me know whether you&amp;rsquo;rs signed in or not.&lt;/p&gt;
&lt;p&gt;Progress as usual, small improvements to quality of life for both users, potential users, and admins.&lt;/p&gt;</content:encoded></item><item><title>Easier way to post to my blog with comments already setup</title><link>https://jva.lol/weblog/easier-way-to-post-with-comments/</link><pubDate>Thu, 23 Jul 2026 02:31:46 -0600</pubDate><guid>https://jva.lol/weblog/easier-way-to-post-with-comments/</guid><description>This project already worked but it took ~5 steps to setup. It’s down to about 2 now.</description><content:encoded>&lt;p&gt;It&amp;rsquo;s wild, I&amp;rsquo;ve been building this using my own blog as a testing environment. It just keeps getting better. To be real and fair, there is a learning curve. But essentially where it stands now is you create an account on PopsicleBoat, you create and register an api key, and when you make a new post on your site you automatically get a comment section. Only if you want, per post, or not at all. You also own all the content, it&amp;rsquo;s a JSON file you own. PopsicleBoat could vanish and you&amp;rsquo;d still have those comments.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t know of any third party commenting system like this, which is why I built it.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/weblog/easier-way-to-post-with-comments/grind-on-demand_hu_56d00285d47fe1c9.jpg" class="flavor" srcset="https://jva.lol/weblog/easier-way-to-post-with-comments/grind-on-demand_hu_56d00285d47fe1c9.jpg 480w, https://jva.lol/weblog/easier-way-to-post-with-comments/grind-on-demand_hu_4e050e9e0e6ea34b.jpg 800w" sizes="min(100vw, 352px)"
width="480" height="320" loading="lazy" decoding="async" alt="A café coffee grinder labeled GRIND ON DEMAND, one button below the bean hopper" /&gt;&lt;span class="flavor-caption"&gt;The cool thing is you don&amp;#39;t have to do much. Put the beans in (setup) and let the machine do the work.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s ad free, tracking free, matter of fact the whole spirit of it is to make the modern internet free of… well, lots of things. Just enjoyable again, but with the touch and niceties that technology advances afford. Like cool user interfaces.&lt;/p&gt;
&lt;p&gt;Anyway, the hurdle I noticed recently is that this particular offer had a steep learning curve (and let&amp;rsquo;s be honest, could still be steep). This post is just to say (more or less) that I&amp;rsquo;ve made strides to make it less steep. Testing it myself on my own blog was a little painful. Now it&amp;rsquo;s a little less painful.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a work in progress but it&amp;rsquo;s come really far and is truly functional. I&amp;rsquo;m using it for this post itself.&lt;/p&gt;
&lt;p&gt;Cheers&lt;/p&gt;
&lt;p&gt;-Jake&lt;/p&gt;</content:encoded></item><item><title>Adding a Claude skill to make a new blog entry discussion thread as easy as possible</title><link>https://jva.lol/weblog/a-skill-for-companion-threads/</link><pubDate>Wed, 22 Jul 2026 23:43:37 -0600</pubDate><guid>https://jva.lol/weblog/a-skill-for-companion-threads/</guid><description>In which I use a Claude skill to create a blog entry with a full comment section without a library</description><content:encoded>&lt;p&gt;I&amp;rsquo;ve written a Claude skill to make it easier to make a post here that has a comment section owned by this blog, but hosted and managed on PopsicleBoat. It&amp;rsquo;s, for lack of better phrasing, in alpha mode. It works. But it&amp;rsquo;s a process that is a little unappetizing. Still. It works.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/a-skill-for-companion-threads/robot-vacuum-gliding.mp4" aria-label="A robot vacuum gliding across a wooden floor"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Set it up once. It does the job after that. That&amp;#39;s the whole point of automation, right?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The idea is to make it as easy as possible. Right now it&amp;rsquo;s ~5 steps. I&amp;rsquo;m working on that. But the premise, to me, is valuable. People with online content who want interaction are encumbered usually with large libraries they have to bring in.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t know about you, but I miss the old simpler internet.&lt;/p&gt;
&lt;p&gt;With PopsicleBoat, not only can you have a comment section with just a few lines of code but you get moderation powers, and it all comes without ads or tracking. If you want that stuff it&amp;rsquo;s on you. You&amp;rsquo;re outsourcing discourse and commenting. For free.&lt;/p&gt;
&lt;p&gt;The challenge for me right now is making it even easier for you. It&amp;rsquo;s still an early project.&lt;/p&gt;
&lt;p&gt;BUT: it&amp;rsquo;s also a social space. There&amp;rsquo;s friend networks, instant messaging, video calls (be cool if it grew to video conferencing but that&amp;rsquo;s a lofty goal to be sure.)&lt;/p&gt;
&lt;p&gt;Anywho, this is Jake (the creator) testing some of it out. And… signing out. Peace.&lt;/p&gt;</content:encoded></item><item><title>Adding modern features: the collapsible/resizable sidebar</title><link>https://jva.lol/weblog/collapsible-sidebar/</link><pubDate>Wed, 22 Jul 2026 21:55:21 -0600</pubDate><guid>https://jva.lol/weblog/collapsible-sidebar/</guid><description>In which I discuss making the sidebar resizable and collapsible</description><content:encoded>&lt;p&gt;While I&amp;rsquo;ve been working on PopsicleBoat, I&amp;rsquo;ve been looking at every possible angle I can think of to make it bloated as hell (just kidding). No, it just occurred to me any website with an audience and a community and users etc needs the same kind of layout said audiences are used to. Including a collapsible nav sidebar. So, I focused on that. I think there&amp;rsquo;s room to improve, such as instead of fully hiding it could be a thin rail with icons but that will take additional attention since the sidebar currently does &lt;em&gt;not&lt;/em&gt; have icons. I&amp;rsquo;ll have to think about that.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/collapsible-sidebar/accordion.mp4" aria-label="An accordion player working the bellows in a summer field"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;This took more work than I thought, but heyo. The sidebar is collapsible now. They don&amp;#39;t make music though :(&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Anyway, I&amp;rsquo;ll skip the technical details. I&amp;rsquo;m just happy it&amp;rsquo;s working, you can resize it, collapse it entirely, or double click on the edge to restore it to default size.&lt;/p&gt;
&lt;p&gt;Cheers, ya&amp;rsquo;all!&lt;/p&gt;</content:encoded></item><item><title>I used AI - it was obvious</title><link>https://jva.lol/weblog/my-experiment-with-ai/</link><pubDate>Tue, 21 Jul 2026 00:00:00 +0000</pubDate><guid>https://jva.lol/weblog/my-experiment-with-ai/</guid><description>I got caught, and I’m going back to my own voice.</description><content:encoded>&lt;p&gt;&lt;em&gt;(Yes, even this one. You can probably tell easily. Drafting is not as good as formatting, syntax, etc. So this is the learning curve I&amp;rsquo;m on. Thanks for reading.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been playing with AI lately. A lot of it has gone well, where the seams show is when I try to connect with real people.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/weblog/my-experiment-with-ai/scarecrow-disguise_hu_a270abf584b8ff5a.jpg" class="flavor"
width="480" height="443" loading="lazy" decoding="async" alt="A makeshift scarecrow, a windbreaker on a stick with a plastic-bag head, in front of a cornfield" /&gt;&lt;span class="flavor-caption"&gt;Nobody was fooled. Except the crows. Which maybe has a metaphor to it but it&amp;#39;s really just a joke.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="the-bump"&gt;
the bump
&lt;a class="anchor" href="#the-bump"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I sent a few cold emails, basically none of which landed well. Some a little repulsed. They detected the language wasn&amp;rsquo;t my own. In my defense I&amp;rsquo;m mostly just playing. Not trying to change the world. I just have a new shiny toy I can&amp;rsquo;t resist. Apologies to those who smelled someone selling something using language that wasn&amp;rsquo;t my own, especially given my self-professed love of the honest and raw internet.&lt;/p&gt;
&lt;h2 id="the-uncomfortable-part"&gt;
the uncomfortable part
&lt;a class="anchor" href="#the-uncomfortable-part"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I used AI. It was obvious to anyone who saw the text it generated. It is genuinely useful for lots of reasons, for code features, dependency upgrades, etc. I got carried away, but I mean, it &lt;em&gt;is&lt;/em&gt; a lot of fun. And I&amp;rsquo;ve been steered towards using it daily in my actual job. So, I forgive myself.&lt;/p&gt;
&lt;h2 id="what-the-tell-actually-is"&gt;
what the tell actually is
&lt;a class="anchor" href="#what-the-tell-actually-is"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I myself am not skilled at detecting AI generated text. Let&amp;rsquo;s be honest, it&amp;rsquo;s usually pretty convincing. I know I&amp;rsquo;m not the only one who&amp;rsquo;s tried, else how would people have a sense for detecting it? The words, the em-dashes, the rhythm, composed metaphors, etc. The list goes on and on. I suppose someone could even (or maybe already has) write AI detection software. The real tell for me was feedback from others. People can smell AI slop. The feedback was valuable (not terribly rude, loud, or a lot, just honest). That feedback is what led to this post.&lt;/p&gt;
&lt;h2 id="finding-my-own-voice"&gt;
finding my own voice
&lt;a class="anchor" href="#finding-my-own-voice"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve written a lot on my blog before AI became a part of my daily life. It clearly has my own voice. I know because I personally did write it. None of it really got an audience, but that&amp;rsquo;s not the point either. The point is that I&amp;rsquo;m learning this strange new world and the scientist in me likes to play and experiment. The experiments of the last couple weeks have taught me something and I&amp;rsquo;ve internalized it. I need to use my own voice. Always.&lt;/p&gt;
&lt;h2 id="what-changed"&gt;
what changed
&lt;a class="anchor" href="#what-changed"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I don&amp;rsquo;t think AI is going away for anyone, I&amp;rsquo;ll still use it. But I&amp;rsquo;ve learned to use it appropriately. For instance, I asked it to generate the boilerplate for this post. But every word in it came from me. The boilerplate was convenient, the content is authentic.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve learned a lot, friends. That (in my view) is the point of experimentation.&lt;/p&gt;
&lt;p&gt;From here on out, you&amp;rsquo;ll never hear a word from me that didn&amp;rsquo;t come from my own brain. Including this. I&amp;rsquo;ll keep playing because (and don&amp;rsquo;t tell me you don&amp;rsquo;t too) it&amp;rsquo;s &lt;em&gt;fun&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Cheers&lt;/p&gt;
&lt;p&gt;Edit (2026-08-15): A reader quoted that last line back to me, and they were right to. It didn&amp;rsquo;t survive. I still draft with AI sometimes, and sometimes more of the draft&amp;rsquo;s wording survives my edit than I intend. The more honest version of the pledge is smaller: the ideas are mine, the editing is mine, and when the seams show I&amp;rsquo;d rather be caught than delete the evidence. The post above stays exactly as I wrote it. Signed, JVA(lol).&lt;/p&gt;</content:encoded></item><item><title>A glance is not a reading</title><link>https://jva.lol/weblog/a-glance-is-not-a-reading/</link><pubDate>Sun, 19 Jul 2026 15:09:00 -0600</pubDate><guid>https://jva.lol/weblog/a-glance-is-not-a-reading/</guid><description>In which ’new’ gets defined wrong twice before it gets defined right</description><content:encoded>&lt;p&gt;I added a little badge to the PopsicleBoat sidebar recently. It says something like &lt;strong&gt;All Posts · 13&lt;/strong&gt;, and up top there&amp;rsquo;s a list of what those 13 things are. I built it because I kept losing track of my own new posts. If the guy who made the site can&amp;rsquo;t find the new stuff, nobody else has a chance.&lt;/p&gt;
&lt;p&gt;The badge itself was easy. The hard part was one word: &lt;em&gt;new&lt;/em&gt;. Took me three tries to get it right.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/weblog/a-glance-is-not-a-reading/cat-with-book_hu_145c02671f4846c2.jpg" class="flavor" srcset="https://jva.lol/weblog/a-glance-is-not-a-reading/cat-with-book_hu_145c02671f4846c2.jpg 480w, https://jva.lol/weblog/a-glance-is-not-a-reading/cat-with-book_hu_eccdd3c8083b9a24.jpg 800w" sizes="min(100vw, 352px)"
width="480" height="270" loading="lazy" decoding="async" alt="A cat lounging in a hammock with a paw on an open book, looking off into the grass" /&gt;&lt;span class="flavor-caption"&gt;Just having a book open doesn&amp;#39;t mean you read the page.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;1 - The obvious idea. New means posted since you last visited. So you give each user a timestamp, stamp it when they open the board, and anything after that is new. Databases love this. It&amp;rsquo;s one column and one comparison, and it&amp;rsquo;s basically how half the software you use decides what to bold.&lt;/p&gt;
&lt;p&gt;Then I actually used it. I opened the board, clicked the first new post, read it, came back, and the whole list was gone. All thirteen. The badge still said 13 but the list under it was empty. Turns out opening the board had stamped my timestamp, so by the time I came back nothing was &amp;ldquo;since your last visit&amp;rdquo; anymore. I read one post and the system decided I&amp;rsquo;d seen all thirteen.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s kind of funny when you look at it. Just showing up counted as reading everything.&lt;/p&gt;
&lt;p&gt;2 - Next, sessions. Don&amp;rsquo;t let one visit wipe the list, hold it steady while you&amp;rsquo;re actually around and only move it forward after you&amp;rsquo;ve been gone a while. And it worked, sort of. The list survived a click and a return now. But then I opened a post, read it, came back, and the badge still said 13. And the post I just read was sitting right there in the list, still marked new, staring at me.&lt;/p&gt;
&lt;p&gt;Of course it was. I&amp;rsquo;d made the line move a little more politely but &amp;ldquo;new&amp;rdquo; was still about time. The system knew when I was on the board, it just had no idea what I actually read. Both versions had the same problem underneath: they watched the clock when they should have been watching the posts.&lt;/p&gt;
&lt;p&gt;3 - The one that stuck. A read is a fact about you and one post. Nothing more. So I made a little join table (this user read this post) and write a row the moment you open a thread. And suddenly everything just works. Open a post and the badge ticks down by one, right away. Go back to the board and that post is gone from the list, but the other twelve are still there waiting. Nothing you didn&amp;rsquo;t open gets checked off for you. I kept the old timestamp too, but only as a floor, so posts from before the feature even existed don&amp;rsquo;t clog up the count.&lt;/p&gt;
&lt;p&gt;I also added a &lt;em&gt;Mark all as read&lt;/em&gt; button, because every inbox turns into a chore eventually and sometimes you just want to wave the whole pile away. That one&amp;rsquo;s honest too. It&amp;rsquo;s you saying you&amp;rsquo;re done with them, not the system guessing because you happened to show up.&lt;/p&gt;
&lt;p&gt;The thing that gets me looking back is that I already knew the right answer. Not as a programmer, as a user. Every notification thing that&amp;rsquo;s ever annoyed me annoyed me for this exact reason. They all confused me being there with me paying attention. I just never bothered to think about it for popsicleboat until during testing a badge refused to count down twice in a row.&lt;/p&gt;
&lt;p&gt;Also, currently I&amp;rsquo;m basically the only user so I have to stress test it myself. I forgive me for missing it before. But, it&amp;rsquo;s fixed now!&lt;/p&gt;</content:encoded></item><item><title>What's new, mid-July</title><link>https://jva.lol/weblog/whats-new-aboard-mid-july/</link><pubDate>Sat, 18 Jul 2026 14:05:00 -0600</pubDate><guid>https://jva.lol/weblog/whats-new-aboard-mid-july/</guid><description>New changes and improvements this July</description><content:encoded>&lt;p&gt;A few new things on PopsicleBoat this week. Like always it&amp;rsquo;s all additions, bug fixes, etc. I post these for the people using it, but I&amp;rsquo;ll drop them here too.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/whats-new-aboard-mid-july/mini-port.mp4" aria-label="A tilt-shift timelapse of a container port, cranes and trucks moving like toys"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Busy week, but honestly at least for me personally, so much fun.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;1 - Unread counts. The All Posts link in the sidebar now shows a badge with how many posts you haven&amp;rsquo;t read, and they&amp;rsquo;re listed at the top of the feed. Reading one clears just that one, and there&amp;rsquo;s a &amp;ldquo;Mark all as read&amp;rdquo; button for when it piles up. (I wrote up the surprisingly annoying part of getting that right &lt;a href="https://jva.lol/weblog/a-glance-is-not-a-reading/"&gt;here&lt;/a&gt;.) Once you&amp;rsquo;ve got a few spaces going, your home page opens with recent posts instead of the welcome page.&lt;/p&gt;
&lt;p&gt;2 - A website on your profile. There&amp;rsquo;s a website field now, for your blog or wherever you live online. It shows under your name so people know who you are. It&amp;rsquo;s got a &lt;code&gt;rel=&amp;quot;me&amp;quot;&lt;/code&gt; on it too, so if your site links back, Mastodon, etc, can verify it&amp;rsquo;s really you.&lt;/p&gt;
&lt;p&gt;3 - Reply notifications in the browser. You can get a browser notification when someone replies to you, without handing over an email address. It&amp;rsquo;s opt in, obviously. Your browser asks first, nothing personal leaves your machine, and if a reply lands while your laptop&amp;rsquo;s closed it&amp;rsquo;s waiting when you open it.&lt;/p&gt;
&lt;p&gt;4 - Alt text on media. When you attach an image you can give it alt text now, at upload or after, so screen readers can describe it.&lt;/p&gt;
&lt;p&gt;5 - Download your data. There&amp;rsquo;s a button in settings to download your stuff, profile and posts and replies and media links, all in one file. I don&amp;rsquo;t want anyone stuck here who doesn&amp;rsquo;t want to be.&lt;/p&gt;
&lt;p&gt;6 - One link for the comment-section thing. If you know someone with a blog who wants comments without running a comment system, popsicleboat.com/comments lays it all out on one page now.&lt;/p&gt;
&lt;p&gt;Basically all in the service of making things easier for you to use the whole project for your whole project, or just part, or none of it at all.&lt;/p&gt;</content:encoded></item><item><title>The notification that gave up after a minute</title><link>https://jva.lol/weblog/the-notification-that-gave-up-after-a-minute/</link><pubDate>Fri, 17 Jul 2026 21:45:00 -0600</pubDate><guid>https://jva.lol/weblog/the-notification-that-gave-up-after-a-minute/</guid><description>In which four healthy-looking layers hide two quiet failures</description><content:encoded>&lt;p&gt;I added browser push notifications recently.&lt;/p&gt;
&lt;p&gt;Then I replied to one of my own posts from my phone, looked at my laptop, and saw nothing.&lt;/p&gt;
&lt;p&gt;The reply was on the site, everything else worked, like the inbox badge, notification email, etc. Just the browser push notification did not.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/the-notification-that-gave-up-after-a-minute/hourglass.mp4" aria-label="A small wooden hourglass on a table, sand running down"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;It&amp;#39;s a timing thing. Fixed it but it took a second (no pun intended) to remember browser defaults are conservative.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I had given my browser permission to post notifications for my site, but didn&amp;rsquo;t realize by default that permission expires (I was using Brave, it might be different for other browsers).&lt;/p&gt;
&lt;p&gt;Gave it permission again with &amp;ldquo;forever&amp;rdquo; as the setting this time and banners worked. All was good for about an hour, until I noticed pushes still vanished whenever the browser wasn&amp;rsquo;t running. As it turns out, the library holds a closed browser&amp;rsquo;s message for only 60 seconds by default.&lt;/p&gt;
&lt;p&gt;The fix is one option:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-elixir" data-lang="elixir"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;send_notification(payload, message, &lt;span style="color:#e6db74"&gt;ttl&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;86_400&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I set the send notification ttl to a day. That should, depending on the user&amp;rsquo;s preference, maintain the message across closing the browser for instance.&lt;/p&gt;
&lt;p&gt;I hope this feature is useful, if not it&amp;rsquo;s opt in anyway. As all notifications should be.&lt;/p&gt;</content:encoded></item><item><title>The page that rebuilds itself</title><link>https://jva.lol/weblog/the-page-that-rebuilds-itself/</link><pubDate>Mon, 13 Jul 2026 11:45:00 -0600</pubDate><guid>https://jva.lol/weblog/the-page-that-rebuilds-itself/</guid><description>In which the deploy habit stops being the bottleneck</description><content:encoded>&lt;p&gt;&lt;a href="https://jva.lol/weblog/your-site-can-keep-the-comments/"&gt;Last time&lt;/a&gt;, I added a feature so my blog can print its comments into the page at build time — plain JSON fetched while &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt; (how I build this blog) runs, rendered as paragraphs with no extra JS or any other dependency. The result is that the conversation only gets updated when you deploy. Which is fine if you push daily, and less fine when a good reply lands on Tuesday and your next deploy is Saturday.&lt;/p&gt;
&lt;p&gt;Now that is more robust.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/the-page-that-rebuilds-itself/construction-timelapse.mp4" aria-label="A timelapse of a Chicago block rebuilding itself under a red tower crane"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;The page rebuilds itself. (This is a dramatization.)&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="the-mechanic"&gt;
The mechanic
&lt;a class="anchor" href="#the-mechanic"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Most static hosts already have the missing piece. Netlify, Vercel, and Cloudflare Pages for instance all offer &lt;em&gt;build hooks&lt;/em&gt; — they hand you a URL, and anything that POSTs to it triggers a rebuild.&lt;/p&gt;
&lt;p&gt;So I added a field to &lt;a href="https://popsicleboat.com"&gt;PopsicleBoat&lt;/a&gt; in account settings: your build hook. When a reply lands on any thread you created the hook gets called if you have it set. A couple of minutes later, your site has rebuilt itself, and the new reply is sitting on your page.&lt;/p&gt;
&lt;h2 id="the-loop-end-to-end"&gt;
The loop, end to end
&lt;a class="anchor" href="#the-loop-end-to-end"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Someone replies to a thread.&lt;/li&gt;
&lt;li&gt;A little debouncing, it waits about two minutes for the conversation to settle, then POSTs the hook.&lt;/li&gt;
&lt;li&gt;The host rebuilds. Your build fetches the thread&amp;rsquo;s &lt;code&gt;/replies.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The page now carries the new conversation — permanent, indexable, in the HTML.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At no point does anything run in a reader&amp;rsquo;s browser.&lt;/p&gt;
&lt;h2 id="this-page-is-the-demo"&gt;
This page is the demo
&lt;a class="anchor" href="#this-page-is-the-demo"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;This post has a companion thread, and my build hook is wired. Reply to it, and the page you&amp;rsquo;re reading will quietly rebuild and print your words below.&lt;/p&gt;
&lt;p&gt;If you run a blog (or any site with a need or desire for comments) and want this arrangement the whole thing is documented at &lt;a href="https://www.popsicleboat.com/for-bloggers"&gt;popsicleboat.com/for-bloggers&lt;/a&gt;. One link on your site, one URL in your settings, nothing to uninstall.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m pretty proud of it, it&amp;rsquo;s working like magic for this blog. At least to my eyes.&lt;/p&gt;</content:encoded></item><item><title>Putting the boat on a diet</title><link>https://jva.lol/weblog/putting-the-boat-on-a-diet/</link><pubDate>Sun, 12 Jul 2026 19:45:00 -0600</pubDate><guid>https://jva.lol/weblog/putting-the-boat-on-a-diet/</guid><description>In which 843 kilobytes become 468, and the biggest weight isn’t the JavaScript</description><content:encoded>&lt;p&gt;A fundamental premise for popsicleboat is no ads, no tracking, no scripts riding along on your site if you host your comments there. Also, it should be as lightweight as possible without sacrificing features. It occurred to me to check what happens when I use it for comments (a main feature) on this, my site.&lt;/p&gt;
&lt;p&gt;I measured a logged-out thread page. &lt;strong&gt;843 KB&lt;/strong&gt;. For what? So I dug in.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/putting-the-boat-on-a-diet/night-cranes.mp4" aria-label="Container cranes working a berthed ship under floodlights at night"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Offloading 375 kilobytes. (It took a non negligible amount of effort)&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="the-ledger"&gt;
The ledger
&lt;a class="anchor" href="#the-ledger"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Bytes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;325 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Images&lt;/td&gt;
&lt;td&gt;276 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSS&lt;/td&gt;
&lt;td&gt;229 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML&lt;/td&gt;
&lt;td&gt;13 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="cut-one-the-call-system-nobody-logged-out-can-use"&gt;
Cut one: the call system nobody logged-out can use
&lt;a class="anchor" href="#cut-one-the-call-system-nobody-logged-out-can-use"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;A third of the JavaScript was the WebRTC video-calling machinery, so signaling, peer connections, reconnect logic, the call dock, etc. All of it shipped to readers who can&amp;rsquo;t place a call, because calling requires an account.&lt;/p&gt;
&lt;p&gt;The fix was a webpack dynamic import: the entire call system moved into a chunk that only loads when the page carries a signed-in signal.&lt;/p&gt;
&lt;h2 id="cut-two-a-40-pixel-logo-served-as-a-giant-png"&gt;
Cut two: a 40-pixel logo served as a giant PNG
&lt;a class="anchor" href="#cut-two-a-40-pixel-logo-served-as-a-giant-png"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The header logo is an ankh about 40 pixels tall. It was being served as a 923×1352 PNG, twice, a light variant and a dark one. That&amp;rsquo;s 244 KB for a tiny glyph. One ImageMagick command took it to 9 KB. I&amp;rsquo;d been busy tuning the JavaScript I found interesting while the real weight was three files I hadn&amp;rsquo;t looked at since the beginning.&lt;/p&gt;
&lt;h2 id="the-ledger-after"&gt;
The ledger, after
&lt;a class="anchor" href="#the-ledger-after"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Stored&lt;/th&gt;
&lt;th&gt;On the wire&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;213 KB&lt;/td&gt;
&lt;td&gt;65 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSS&lt;/td&gt;
&lt;td&gt;217 KB&lt;/td&gt;
&lt;td&gt;39 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Images&lt;/td&gt;
&lt;td&gt;24 KB&lt;/td&gt;
&lt;td&gt;13 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML&lt;/td&gt;
&lt;td&gt;13 KB&lt;/td&gt;
&lt;td&gt;13 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;468 KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~130 KB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A Phoenix LiveView social app with a video-calling system and live chatting, invisible until you sign in, now costs a reader less transfer than most sites spend on web fonts.&lt;/p&gt;
&lt;p&gt;The details of untangling the JS are a little boring, so if you&amp;rsquo;re reading this know I deliberately spare you those. This is just a summary of what I found and how it is better now. I don&amp;rsquo;t want anyone to feel obligated to anything, but I want everyone to feel free to enjoy without bloat.&lt;/p&gt;</content:encoded></item><item><title>Your site can keep the comments</title><link>https://jva.lol/weblog/your-site-can-keep-the-comments/</link><pubDate>Sun, 12 Jul 2026 19:30:00 -0600</pubDate><guid>https://jva.lol/weblog/your-site-can-keep-the-comments/</guid><description>In which the comment section learns to come home</description><content:encoded>&lt;p&gt;&lt;a href="https://jva.lol/weblog/popsicle-boat-as-a-comment-section/"&gt;The last post about this&lt;/a&gt; describes the arrangement. For instance, this blog has no comment system of its own. Posts here with a comment section (optional for each post, not sitewide) link to a thread on &lt;a href="https://popsicleboat.com"&gt;PopsicleBoat&lt;/a&gt;. There&amp;rsquo;s just one anchor tag, no JavaScript or third-party library loaded in the reader&amp;rsquo;s browser.&lt;/p&gt;
&lt;h2 id="build-time-not-run-time"&gt;
Build time, not run time
&lt;a class="anchor" href="#build-time-not-run-time"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Every thread on the boat now publishes its public replies as plain JSON. It&amp;rsquo;s stored as the thread&amp;rsquo;s address plus &lt;code&gt;/replies.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;thread&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;The panel that closed itself&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;https://www.popsicleboat.com/c/blogging/posts/175&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;reply_count&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;replies&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;author&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;jake&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;body_html&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;p&amp;gt;Test&amp;lt;/p&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;posted_at&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2026-07-12T23:53:45Z&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;https://www.popsicleboat.com/c/blogging/posts/175#reply-176&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A static site fetches that while it builds and prints the conversation into the page as ordinary HTML. This blog&amp;rsquo;s &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt; template does it in about ten lines:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go-html-template" data-lang="go-html-template"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;try&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;resources&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;.GetRemote&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;printf&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;%s/replies.json&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;.Params.popsicleboat&lt;/span&gt;&lt;span style="color:#f92672"&gt;))&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;and&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;not&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;.Err&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;.Value&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$replies&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;.Value.Content&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;transform&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;.Unmarshal&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$replies&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;.replies&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;article&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;boat-reply&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style="color:#f92672"&gt;strong&lt;/span&gt;&amp;gt;&lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;.author&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;strong&lt;/span&gt;&amp;gt; · &amp;lt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;.url&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&amp;gt;&lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dateFormat&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;January 2, 2006&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;time&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;.posted_at&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;a&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;.body_html&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;safeHTML&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;article&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="what-this-actually-changes"&gt;
What this actually changes
&lt;a class="anchor" href="#what-this-actually-changes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Reading happens at home. Your blog is where the conversation is read. PopsicleBoat is where it happens. Readers who want to say something click through to PopsicleBoat. You keep full moderation control there without running any comment infrastructure yourself.&lt;/p&gt;
&lt;p&gt;Your site owns all the data. Every build, your site writes its own copy of every conversation. If popsicleboat just died for some reason, the comments on your site would still be right there in your HTML.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/your-site-can-keep-the-comments/cat-filing-books.mp4" aria-label="Played in reverse, a cat descends a bookshelf while the books leap neatly back into place"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Filing your comments. I mean, it&amp;#39;s not actually a cat… but that would be _awesome_&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Fresh replies appear on your next build. Static sites rebuild all the time; the conversation is always as up to date as your deploy habit, and the live thread is one click away.&lt;/p&gt;
&lt;p&gt;The comments come home, you have nothing to maintain. No annoyances, no ads, no cookies, no banners.&lt;/p&gt;</content:encoded></item><item><title>The panel that closed itself</title><link>https://jva.lol/weblog/the-panel-that-closed-itself/</link><pubDate>Sat, 11 Jul 2026 01:00:00 -0600</pubDate><guid>https://jva.lol/weblog/the-panel-that-closed-itself/</guid><description>In which a disclosure panel shuts every time someone types a letter</description><content:encoded>&lt;p&gt;I made it so posts can live in multiple spaces: An &amp;ldquo;Also show in&amp;rdquo; panel of checkboxes lets it appear in others. A lot of checkboxes is a lot of form, so that added complexity.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-heex" data-lang="heex"&gt;&amp;lt;details class=&amp;#34;post-form__also-interests&amp;#34;&amp;gt;
&amp;lt;summary&amp;gt;&amp;lt;%= t(&amp;#34;Also show in&amp;#34;) %&amp;gt;&amp;lt;/summary&amp;gt;
&amp;lt;div class=&amp;#34;post-form__also-interests-options&amp;#34;&amp;gt;
&amp;lt;%= for interest &amp;lt;- @also_interest_options do %&amp;gt;
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I found the bug while using the picker myself making the discussion thread for the &lt;a href="https://jva.lol/weblog/popsicle-boat-as-a-comment-section/"&gt;previous post here&lt;/a&gt;. Open the panel, check a box, and the panel snaps shut. Open it again, check another box, shut again. Collapsed, it gives no sign anything is selected at all. This was a problem.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/the-panel-that-closed-itself/flytrap-snap.mp4" aria-label="A Venus flytrap snapping shut the moment it is touched"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;I, uh, swallowed a bug? Geez I&amp;#39;m corny.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="the-bug"&gt;
The bug
&lt;a class="anchor" href="#the-bug"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The last panel bug on this blog was &lt;a href="https://jva.lol/weblog/the-panel-that-hid-itself/"&gt;a race&lt;/a&gt; — three timers and a duplicate event, reproducible twice in many runs. This one is the opposite: perfectly deterministic, wrong every single time, and visible the moment you know where to look.&lt;/p&gt;
&lt;p&gt;So reproducible it was (relatively) easy to write a smoke test for it.&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; element&amp;rsquo;s &lt;code&gt;open&lt;/code&gt; attribute is written by the browser when the user clicks the summary. The server never hears about it. Meanwhile the composer is a LiveView form with live validation — every keystroke and every checkbox change makes a round trip, the server re-renders, and the patcher re-syncs the DOM to the server&amp;rsquo;s HTML. The server&amp;rsquo;s HTML has no &lt;code&gt;open&lt;/code&gt; attribute, so the patcher removes it. Typing a single letter in the title field also closed the panel.&lt;/p&gt;
&lt;h2 id="the-fix"&gt;
The fix
&lt;a class="anchor" href="#the-fix"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Give the boolean to the server.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-heex" data-lang="heex"&gt;&amp;lt;button type=&amp;#34;button&amp;#34; phx-click=&amp;#34;toggle_also_interests&amp;#34;
aria-expanded={to_string(@also_picker_open?)}&amp;gt;
&amp;lt;%= t(&amp;#34;Also show in&amp;#34;) %&amp;gt;
&amp;lt;%= if names != [] do %&amp;gt;
&amp;lt;span&amp;gt;&amp;lt;%= Enum.join(names, &amp;#34;, &amp;#34;) %&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;% end %&amp;gt;
&amp;lt;/button&amp;gt;
&amp;lt;div hidden={!@also_picker_open?}&amp;gt;
... the checkboxes ...
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The checkbox list is hidden when collapsed, not conditionally rendered. Inputs that leave the DOM leave the form, and a reader who collapses the panel before submitting doesn&amp;rsquo;t silently lose their picks.&lt;/p&gt;
&lt;p&gt;Bug fixed, time for a beer.&lt;/p&gt;</content:encoded></item><item><title>PopsicleBoat as a comment section</title><link>https://jva.lol/weblog/popsicle-boat-as-a-comment-section/</link><pubDate>Fri, 10 Jul 2026 10:00:00 -0600</pubDate><guid>https://jva.lol/weblog/popsicle-boat-as-a-comment-section/</guid><description>In which a blog gets discussions with no ads and no trackers, one link per post</description><content:encoded>&lt;p&gt;The usual ways to put comments on a blog: a third-party widget, a self-hosted comment server, or silence. I can respect the choice for silence. Self-hosting means running a spam-fighting service forever. And a third-party widget means bloat which adds weight to the loading of your site.&lt;/p&gt;
&lt;p&gt;This blog does a fourth thing, and any blog can use what it uses.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/weblog/popsicle-boat-as-a-comment-section/coip-can-phones_hu_c51ef408f95fd17a.jpg" class="flavor"
width="480" height="355" loading="lazy" decoding="async" alt="Two tin cans wired as phones, one ending in a USB plug and the other in a headphone jack" /&gt;&lt;span class="flavor-caption"&gt;Remember this game? Loads of modern options to play like this these days, PopsicleBoat has one too. (It was fun then, it&amp;#39;s still fun!)&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="the-pattern"&gt;
The pattern
&lt;a class="anchor" href="#the-pattern"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;A post that wants a discussion gets a thread on &lt;a href="https://popsicleboat.com"&gt;PopsicleBoat&lt;/a&gt;, and the post links to it. That&amp;rsquo;s the entire integration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://www.popsicleboat.com/c/programming/posts/168&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Discuss this post on PopsicleBoat →
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="what-the-readers-browser-sees"&gt;
What the reader&amp;rsquo;s browser sees
&lt;a class="anchor" href="#what-the-readers-browser-sees"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Nothing. A link is inert. There is no script, no iframe, no cookie, nothing for a content blocker to block, no consent banner. The blog page stays exactly as private as it was.&lt;/p&gt;
&lt;p&gt;Following the link lands on a public thread: reading requires no account, replying takes a free one. PopsicleBoat itself carries no ads and loads no third-party scripts.&lt;/p&gt;
&lt;h2 id="steps-for-any-blog-on-any-stack"&gt;
Steps, for any blog on any stack
&lt;a class="anchor" href="#steps-for-any-blog-on-any-stack"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Make an account at popsicleboat.com.&lt;/li&gt;
&lt;li&gt;Find a space that fits your post&amp;rsquo;s topic, or propose one.&lt;/li&gt;
&lt;li&gt;Post there about your article.&lt;/li&gt;
&lt;li&gt;Copy the thread&amp;rsquo;s URL and link it from your article.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Repeat per post. Moderation is already whatever you can do with your own posts.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d rather skip the setup, &lt;a href="https://www.popsicleboat.com/for-bloggers"&gt;popsicleboat.com/for-bloggers&lt;/a&gt; is the short version: send your blog&amp;rsquo;s address and you get a space for it the same day.&lt;/p&gt;
&lt;h2 id="why-a-link-and-not-a-widget"&gt;
Why a link and not a widget
&lt;a class="anchor" href="#why-a-link-and-not-a-widget"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I tried the widget version. I had an embedded iframe mirroring the thread onto the blog and removed it. Replies written for a community read strangely when syndicated somewhere else, and an embed is one more thing a reader&amp;rsquo;s browser has to trust.&lt;/p&gt;
&lt;p&gt;The simple link I have now asks nothing.&lt;/p&gt;
&lt;h2 id="a-nicety-for-static-sites"&gt;
A nicety for static sites
&lt;a class="anchor" href="#a-nicety-for-static-sites"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Threads are posts, and posts sometimes get deleted. So the build checks. It fetches each linked thread and only prints the link if the thread is still there. Delete a thread and the link just disappears, no dead end for a reader.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go-html-template" data-lang="go-html-template"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;.Params.popsicleboat&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;try&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;resources&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;.GetRemote&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;.&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;not&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;.Err&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;p&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;boat-discuss&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$.Params.popsicleboat&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&amp;gt;Discuss this post on PopsicleBoat &amp;amp;rarr;&amp;lt;/&lt;span style="color:#f92672"&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;{{&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt; &lt;span style="color:#75715e"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s the whole system. No ad network, no analytics script, and the conversation happens somewhere built for conversations. No anchor tag for tracking anyone.&lt;/p&gt;
&lt;p&gt;I hope you find it useful, again it&amp;rsquo;s all in the spirit of getting back an internet that is simple. No bloat. Just communication.&lt;/p&gt;</content:encoded></item><item><title>What's new</title><link>https://jva.lol/weblog/whats-new-aboard/</link><pubDate>Fri, 10 Jul 2026 00:45:00 -0600</pubDate><guid>https://jva.lol/weblog/whats-new-aboard/</guid><description>Added some new features: formatting, search, feeds, and notifications when someone replies</description><content:encoded>&lt;p&gt;Everything works the way it did before — these are additions, nothing you need to relearn.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/whats-new-aboard/peacock.mp4" aria-label="A peacock unfurling its tail into a full fan"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Plain texted can now be prettified with markdown syntax. Prettified makes the internet full of text a bit more pleasant to read and write, wouldn&amp;#39;t you agree?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your words can dress up now.&lt;/strong&gt; Posts, replies, and messages understand simple formatting: **bold**, *italic*, `code`, lists, quotes. Paste a link and it turns clickable on its own. There&amp;rsquo;s a small &amp;ldquo;Formatting tips&amp;rdquo; note under every writing box if you want the cheat sheet, and a &lt;strong&gt;Preview&lt;/strong&gt; button right next to it that shows exactly how your words will land before you post them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You can search.&lt;/strong&gt; The box at the top of the sidebar finds posts, replies, and spaces — anything you could browse to, findable in a few keystrokes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You&amp;rsquo;ll know when someone replies.&lt;/strong&gt; Your inbox has a new &amp;ldquo;Replies to you&amp;rdquo; section, and the inbox badge lights up when something&amp;rsquo;s waiting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You can follow with RSS.&lt;/strong&gt; Every space now has an RSS feed, and the whole site has one at &lt;a href="https://popsicleboat.com/feed.xml"&gt;popsicleboat.com/feed.xml&lt;/a&gt;. If you use a feed reader, paste any PopsicleBoat page into it and the feed shows up on its own. It&amp;rsquo;s a nice way to share a space with a friend who isn&amp;rsquo;t ready to sign up. They can follow along from their reader until they want to say something.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the batch.&lt;/p&gt;</content:encoded></item><item><title>The panel that hid itself</title><link>https://jva.lol/weblog/the-panel-that-hid-itself/</link><pubDate>Tue, 07 Jul 2026 18:00:00 -0600</pubDate><guid>https://jva.lol/weblog/the-panel-that-hid-itself/</guid><description>In which a video call connects perfectly and its panel hides anyway</description><content:encoded>&lt;p&gt;PopsicleBoat ha&lt;span class="ln" data-n="6"&gt;s&lt;/span&gt; video calling. One person clicks call, the other gets a little toast notification, and they answer or they don&amp;rsquo;t (or they miss it entirely). If they answer, WebRTC does its thing through NAT, with a STUN server and a TURN server, one of each for now. I&amp;rsquo;ll add more if I ever need to.&lt;/p&gt;
&lt;p&gt;Most of that lived in one file, app.js, which had gotten to 6,371 lines. This is about a bug in there and how long it took me to find it.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/the-panel-that-hid-itself/octopus-blending.mp4" aria-label="An octopus nearly indistinguishable from the algae around it, one eye keeping watch"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;Bugs have a way of hiding in plain sight. I guess the other thing is they&amp;#39;re often multifaceted, so an octopus hiding felt appropriate.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="the-bug"&gt;
The bug
&lt;a class="anchor" href="#the-bug"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve got a browser test that runs before I deploy. It opens two real browsers, starts a call from one, and answers it from the other. Twice, out of a lot of runs (like… hundreds), it failed in a weird way. The call connected fine, video going both ways, everything working, except the call panel was hidden. A working call with no interface. Not every time, not even often. Just twice.&lt;/p&gt;
&lt;p&gt;An intermittent bug in code that&amp;rsquo;s juggling timers, WebSockets, WebRTC callbacks, and a DOM patcher. That&amp;rsquo;s a race, pretty much guaranteed.&lt;/p&gt;
&lt;h2 id="finding-it"&gt;
Finding it
&lt;a class="anchor" href="#finding-it"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;You can&amp;rsquo;t really put a breakpoint on &amp;ldquo;sometimes.&amp;rdquo; Something was setting &lt;code&gt;hidden&lt;/code&gt; on the panel after the answer, and there were a few things that could&amp;rsquo;ve done it: my own show/hide helpers, the retry logic around the ring, and LiveView&amp;rsquo;s &lt;a href="https://github.com/patrick-steele-idem/morphdom"&gt;morphdom&lt;/a&gt; patcher, which quietly re-syncs the DOM back to whatever the server rendered.&lt;/p&gt;
&lt;p&gt;That last one doesn&amp;rsquo;t show up when you just read the code, so it&amp;rsquo;s easy to forget it&amp;rsquo;s even there.&lt;/p&gt;
&lt;p&gt;So I added some logging. It wraps every place I legitimately change the panel&amp;rsquo;s visibility, and separately watches for the panel changing from anywhere at all. Every time the visibility changes, it logs who did it. If something changed and there&amp;rsquo;s no matching entry from my own code, that&amp;rsquo;s an outside write, which basically means morphdom. I also tagged each panel with a serial number so I could tell a panel that got patched apart from one that got swapped out entirely. The log just piles up on a window global and waits for the bug to happen again.&lt;/p&gt;
&lt;p&gt;I figured it was morphdom. A patcher whose whole job is rewriting attributes to match the server is exactly the kind of thing that hides a panel, and honestly I added the logging mostly to catch it. Turned out it was innocent. Its writes were all re-syncs to the right state. The writes that actually broke things had my name on them. The call was coming from my own code.&lt;/p&gt;
&lt;h2 id="the-race"&gt;
The race
&lt;a class="anchor" href="#the-race"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Three steps, and the ends are about six seconds apart.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A ring event comes in and kicks off a prepare loop for the panel, a retry that runs for up to six seconds making sure the incoming-call UI is ready.&lt;/li&gt;
&lt;li&gt;The user answers. That clears the ring alert and shows the in-call panel. Good so far.&lt;/li&gt;
&lt;li&gt;A duplicate of the ring event shows up late (these aren&amp;rsquo;t guaranteed to be unique) and its handler re-remembers the ring alert before it gets to the check for whether the call was already answered. That wakes up a prepare tick still pending from step 1, which does exactly what it was told to: hides the panel and marks it &lt;code&gt;incoming&lt;/code&gt;. A state sync later puts the call back to &lt;code&gt;in_call&lt;/code&gt;, but nothing ever tells the panel to show again.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Everything here worked correctly. The retry loop retried like it should. The duplicate handler did catch the duplicate, just one line too late. The state sync synced the state, but the panel&amp;rsquo;s visibility wasn&amp;rsquo;t part of the state it was syncing. Nothing was broken on its own. The bug only existed in the order it all ran.&lt;/p&gt;
&lt;h2 id="the-fix"&gt;
The fix
&lt;a class="anchor" href="#the-fix"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Two guards, either one of which would&amp;rsquo;ve been enough by itself. The prepare tick now skips any panel that&amp;rsquo;s already accepted, answering, or in a call. And the duplicate-ring handler bails out before re-remembering the alert if the call&amp;rsquo;s already been answered. I pinned both with regression tests that grep the source, since the bug was an ordering between lines, not a wrong output I could assert on.&lt;/p&gt;
&lt;h2 id="the-file"&gt;
The file
&lt;a class="anchor" href="#the-file"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The 6,371 lines were really the other half of the problem. A race like this hides easy in a file where the signaling, the media, the DOM, and the timers are all sharing one scope. app.js is down to 2,156 lines now. The call stuff moved out into thirty smaller modules. The main piece is a state machine for the call lifecycle, a plain reducer, &lt;code&gt;transition(state, event) -&amp;gt; { state, actions }&lt;/code&gt;, with no DOM, no peer connection, no timers in it. It replaced about seven booleans I&amp;rsquo;d been keeping in sync by hand. And there&amp;rsquo;s one rule for duplicates now: every call has a key, and remote events with the wrong key just get ignored, which took the place of all the per-message dedup flags. The side effects come back as a list of named actions for the caller to run, so the whole lifecycle, including the kind of ordering that caused this, is something I can actually unit test now.&lt;/p&gt;
&lt;p&gt;This was a hell of a journey, deeply hidden bug inside a huge JS file that I had to pull apart and split up before I could identify where things were going wrong. I got it now though, web calling works. I&amp;rsquo;m testing it daily, and it&amp;rsquo;s a lot of work but fixing things is so much fun I can&amp;rsquo;t resist. (I might need my head examined lol)&lt;/p&gt;</content:encoded></item><item><title>PopsicleBoat</title><link>https://jva.lol/weblog/popsicle-boat/</link><pubDate>Sun, 05 Jul 2026 18:30:00 -0600</pubDate><guid>https://jva.lol/weblog/popsicle-boat/</guid><description>In which I finally write about the social web project I’ve been quietly building since 2019</description><content:encoded>&lt;p&gt;If you&amp;rsquo;ve looked at the front page of this site lately, you may have noticed a little card pointing at &lt;a href="https://popsicleboat.com"&gt;popsicleboat.com&lt;/a&gt;. I&amp;rsquo;ve been building PopsicleBoat and have never actually written about it here. Time to fix that.&lt;/p&gt;
&lt;h2 id="what-it-is"&gt;
What it is
&lt;a class="anchor" href="#what-it-is"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;PopsicleBoat is a small social web project. The short version I keep coming back to: &lt;strong&gt;low-friction posting, real conversation, and keeping personal spaces on the internet playful.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/weblog/popsicle-boat/fishing-boats-harbor_hu_7a4fe7fb7c940a97.jpg" class="flavor" srcset="https://jva.lol/weblog/popsicle-boat/fishing-boats-harbor_hu_7a4fe7fb7c940a97.jpg 480w, https://jva.lol/weblog/popsicle-boat/fishing-boats-harbor_hu_b1306dcf4998a93d.jpg 800w" sizes="min(100vw, 352px)"
width="480" height="320" loading="lazy" decoding="async" alt="A harbor of small fishing boats painted pink, green, and navy" /&gt;&lt;span class="flavor-caption"&gt;Dock whatever boat you want here. But if a spot is taken, you&amp;#39;ll have to find a different one.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Instead of one giant feed, PopsicleBoat is organized around spaces, each a shared place where people can post work, ask questions, share notes, and keep up with what others are making. A few things I care about in how those spaces behave:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spaces are open to browse, so you can get a feel for a place before joining in.&lt;/li&gt;
&lt;li&gt;Following a space keeps it close at hand and makes it easy to return to active discussions.&lt;/li&gt;
&lt;li&gt;Anyone can propose a new space, or just follow the ones that fit what they care about.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Around that core there are the things you&amp;rsquo;d hope for from a small social site: profiles, replies and likes, private messages, friend discovery, and invitations for bringing people onboard.&lt;/p&gt;
&lt;h2 id="why-bother-building-a-social-network-in-this-day-and-age"&gt;
Why bother building a social network in this day and age
&lt;a class="anchor" href="#why-bother-building-a-social-network-in-this-day-and-age"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The big platforms optimize for scale, and scale has a way of making everything feel the same. I wanted something closer to the small-forum internet I grew up with, where a space could have its own personality and posting something didn&amp;rsquo;t feel like a performance. I also wanted it to feel modern, so there&amp;rsquo;s (to my eye) a smooth design, with both light and dark modes, text and video chat, and a lot more.&lt;/p&gt;
&lt;h2 id="how-its-built"&gt;
How it&amp;rsquo;s built
&lt;a class="anchor" href="#how-its-built"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Under the hood it&amp;rsquo;s a DIY special.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Elixir and Phoenix&lt;/strong&gt;, with LiveView for the interactive surfaces (feeds, replies, likes, uploads) and plain controller-rendered pages for everything that doesn&amp;rsquo;t need to be clever.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Postgres&lt;/strong&gt; underneath.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fly.io&lt;/strong&gt; for hosting, with deploys gated behind an embarrassingly large pile of predeploy checks and browser smoke tests.&lt;/li&gt;
&lt;li&gt;Internationalization from early on.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Crypto</title><link>https://jva.lol/haikulog/crypto/</link><pubDate>Thu, 20 May 2021 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/crypto/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;Crypto is funny&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a perfect solution&lt;/p&gt;
&lt;p&gt;To patience and shame&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" src="https://jva.lol/haikulog/crypto/giphy.mp4" aria-label="Beer"&gt;&lt;/video&gt;&lt;/p&gt;</content:encoded></item><item><title>Pony Express</title><link>https://jva.lol/weblog/pony-express/</link><pubDate>Mon, 17 May 2021 19:10:13 -0600</pubDate><guid>https://jva.lol/weblog/pony-express/</guid><description>In which I describe our trip along the Pony Express route</description><content:encoded>&lt;h1 id="our-pony-express-adventure"&gt;
Our Pony Express Adventure &lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;
&lt;a class="anchor" href="#our-pony-express-adventure"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;This weekend we sort of stumbled on some incredible things. The idea was to visit &lt;a href="https://en.wikipedia.org/wiki/Topaz_Mountain"&gt;Topaz Mountain&lt;/a&gt;, do some digging and hopefully find some topaz (we did), and camp for the night before moving on to the &lt;a href="https://en.wikipedia.org/wiki/Deep_Creek_Mountains"&gt;Deep Creek mountain range&lt;/a&gt; to see some of the most dramatic mountains in the west desert (12,000 feet! The highest peak in Utah, King&amp;rsquo;s Peak, is only a little higher at 13,500). From there we would drive up to Wendover, and then home.&lt;/p&gt;
&lt;div class="book-columns flex flex-wrap"&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/weblog/pony-express/IMG_2317_hu_355efb0e9eb3c9d8.jpg"
width="480" height="360" loading="lazy" decoding="async" alt="The Lobst3r" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/weblog/pony-express/IMG_2318_hu_8e6aafae1022d466.jpg"
width="480" height="162" loading="lazy" decoding="async" alt="Topaz Mountain" /&gt;
&lt;img src="https://jva.lol/weblog/pony-express/IMG_2319_hu_11b27e2d02eb48e.jpg"
width="480" height="146" loading="lazy" decoding="async" alt="A random mine" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Well, along the way we ended up exploring the &lt;a href="https://en.wikipedia.org/wiki/Fish_Springs_National_Wildlife_Refuge"&gt;Fish Springs National Wildlife Refuge&lt;/a&gt;. We intended to stop by this place on the way through, but neither of us expected what we found. This place is like some kind of heaven. It&amp;rsquo;s unreal. First of all, the area is simply massive. We thought it would be some large kind of oasis, but it actually takes an area that looks comparable to the entire Salt Lake valley. It&amp;rsquo;s just huge. And it&amp;rsquo;s teeming with avian life. This was May, of course, so it may seem different at other times of the year but for us it was almost otherworldly. In fact, at one point we talked about how it would be to encounter an earth like planet untouched by human kind- and how this must be what that would be like. Of course, we were driving through it violating the peace as humans do. But there was a very real and tangible sense that given the chance for an idyllic existence, life might look something like what we saw there.&lt;/p&gt;
&lt;p&gt;As amazing as the wildlife refuge was, the best part of the trip was still to come.&lt;/p&gt;
&lt;p&gt;We decided that after crossing the desert to get to the refuge we had used more gas than we would like. This led to some discussion about what would happen if we ran out of gas in the middle of the Nevada desert, and some quick estimates around the likelihood of finding a gas station along the way. We decided to scrap the Deep Creek mountains, and follow the Pony Express route east. So, we left the wildlife refuge (sad face).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/weblog/pony-express/IMG_2324_hu_10b09bf10b255196.jpg"
width="480" height="360" loading="lazy" decoding="async" alt="Miaoru on an old watering trough" /&gt;&lt;/p&gt;
&lt;p&gt;The first Pony Express marker we found was at Black Rock. It&amp;rsquo;s basically a black rock in the desert. We noticed a significant amount of animal pellets, and traced them to a pile of dirt with the signature marks of some mammalian subterranean creatures. We kept moving.&lt;/p&gt;
&lt;p&gt;The rest of the drive was both indescribably beautiful and featureless in the way that the fade of a cloudless sunset from blue to crimson is. Well, not entirely featureless. (I&amp;rsquo;m not going to talk about the &lt;a href="https://geology.utah.gov/popular/places-to-go/rock-mineral-collecting-sites/the-rockhounder-dugway-geode-beds-juab-county/"&gt;Dugway Geode Beds&lt;/a&gt;. It was cool, but there&amp;rsquo;s not much else to say. Either you&amp;rsquo;re into geodes or you aren&amp;rsquo;t.)&lt;/p&gt;
&lt;p&gt;We were coming up on the Pony express marker number 86 when we saw a large herd of horses. &amp;ldquo;That&amp;rsquo;s cool,&amp;rdquo; we thought. We got closer. There was no fence guarding this dirt road. There was no ranch here. In fact, for hundreds of miles as far as we knew all of this beautiful land was public. These were &lt;em&gt;wild horses&lt;/em&gt;. I had never seen wild horses before, and I certainly didn&amp;rsquo;t have any expectation of seeing them on this particular trip. Here we were, with a handful of inviolate majestic beasts nearly an arms reach away as we pulled up in my Jeep and these animals weren&amp;rsquo;t so much as bothered to take notice of us. (no, I didn&amp;rsquo;t take any pictures and no I&amp;rsquo;m not sad about that.)&lt;/p&gt;
&lt;div class="book-columns flex flex-wrap"&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/weblog/pony-express/IMG_2328_hu_5327f3ef04fa264e.jpg"
width="480" height="360" loading="lazy" decoding="async" alt="Restored Pony Express stop" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/weblog/pony-express/IMG_2329_hu_92daaececf29ccaf.jpg"
width="480" height="368" loading="lazy" decoding="async" alt="Just a view" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We contrasted that experience with one later when we came upon some horses kept behind a gate at the residence of one retired Air Force vet who appeared to have in his collection several rusty children&amp;rsquo;s swingsets, old tractors, trucks, cars, RVs, clutter, odds and ends, bits and pieces, oddments, miscellany, scrap, and waste. Those dopey horses stared at us as though concerned we might set up off one of the many booby traps their owner probably had devised for the unforgivable sin of having come within spitting distance.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m sure I exaggerate. But the residences one finds in Vernon, Utah are nothing if not unique.&lt;/p&gt;
&lt;p&gt;I digress. Let me finish describing the trip. We found an old dog cemetery, the last indication a lonely childless woman known as &amp;ldquo;Aunt Libby&amp;rdquo; lived in the area. That&amp;rsquo;s how the plaque described her, anyway. Nearby we decided to make camp so we built a fire, cooked dinner, and began to enjoy the beauty of the dark clouds framing the incredible wilderness of Juab county. The dark clouds kept getting darker. &amp;ldquo;Hmm,&amp;rdquo; we thought. It began to rain and thunder. We packed up our things and drove the rest of the way home, stopping only briefly to release our own water in the torrent of nature&amp;rsquo;s.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;This probably makes sense in the travelog, but it was just a two day trip and I&amp;rsquo;d like to keep the travelog focused on more global adventures.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content:encoded></item><item><title>2020</title><link>https://jva.lol/haikulog/2020/</link><pubDate>Thu, 06 May 2021 19:47:37 -0600</pubDate><guid>https://jva.lol/haikulog/2020/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;Twenty twenty sucked&lt;/p&gt;
&lt;p&gt;Twenty twenty one so far,&lt;/p&gt;
&lt;p&gt;does not suck as bad&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" src="https://jva.lol/haikulog/2020/giphy.mp4" aria-label="2020"&gt;&lt;/video&gt;&lt;/p&gt;</content:encoded></item><item><title>Chess and Incompleteness</title><link>https://jva.lol/weblog/chess_and_incompleteness/</link><pubDate>Fri, 05 Feb 2021 16:55:05 -0700</pubDate><guid>https://jva.lol/weblog/chess_and_incompleteness/</guid><description>In which I pretend to understand Kurt Gödel</description><content:encoded>&lt;h1 id="chess-and-logic"&gt;
Chess and Logic
&lt;a class="anchor" href="#chess-and-logic"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Chess and Logic, huh?&lt;/p&gt;
&lt;p&gt;The&lt;span class="ln" data-n="5"&gt;r&lt;/span&gt;e&amp;rsquo;s something fundamental linking them, and I&amp;rsquo;m not talking about using logic to beat a game of chess. The rules of chess are similar to the axioms of a logical system. This got me thinking, can we demonstrate Kurt Gödel&amp;rsquo;s incompleteness theorem in chess?&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re not familiar (and it&amp;rsquo;s a large and difficult territory should you decide to venture there), the incompleteness theorem says that &amp;ldquo;logic systems can describe true statements that can not be derived using that system&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I decided I wanted to try, so let&amp;rsquo;s get to it!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/weblog/chess_and_incompleteness/chess-pieces-pile_hu_458202e7d5cf4eb5.jpg" class="flavor" srcset="https://jva.lol/weblog/chess_and_incompleteness/chess-pieces-pile_hu_458202e7d5cf4eb5.jpg 480w, https://jva.lol/weblog/chess_and_incompleteness/chess-pieces-pile_hu_fcc101f2d28e0286.jpg 800w" sizes="min(100vw, 352px)"
width="480" height="320" loading="lazy" decoding="async" alt="A jumbled pile of wooden chess pieces" /&gt;&lt;span class="flavor-caption"&gt;The rules are clear to anyone who knows them, but can you derive them from the axioms of how the pieces move? (hint: No)&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="on-completeness-and-consistency"&gt;
On Completeness and Consistency
&lt;a class="anchor" href="#on-completeness-and-consistency"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Completeness and consistency are at the heart of the incompleteness theorem, which concludes there can not be an axiomatic system of logic that is both complete (the system can derive every statement that is true) and consistent (the system can derive false statements).&lt;/p&gt;
&lt;p&gt;Or rather, by fixing consistent in place we&amp;rsquo;d say &amp;ldquo;Any consistent formal logic is incomplete&amp;rdquo;. Meaning, broadly, if you have a set of logical rules there will be statements of that logic that are true but that you can&amp;rsquo;t get to using only those rules.&lt;/p&gt;
&lt;p&gt;We fix consistent because consistency is a necessity in logic, completeness is just a nice to have. If I offer you a system in which I can prove 1 + 1 = 2, you might be with me so far. But if I follow up with a proof that 1 + 1 also equals 3, it&amp;rsquo;s over before we even start looking into completeness.&lt;/p&gt;
&lt;h2 id="chess"&gt;
Chess
&lt;a class="anchor" href="#chess"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I think Chess is like a system of logic, so let&amp;rsquo;s play with it a little. There are rules. We can exhaustively enumerate those rules (but we won&amp;rsquo;t, we&amp;rsquo;ll just give some examples).&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s focus on pawns.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pawns can move ahead by one or two squares on their first move.&lt;/li&gt;
&lt;li&gt;On any move after their first, and except when attacking, pawns can only move ahead by one square.&lt;/li&gt;
&lt;li&gt;Attacking (consuming) an enemy piece is only allowed through moving diagonally forward by one square.&lt;/li&gt;
&lt;li&gt;An attack is allowed if the opposing pawn has just exercised its right in its first move to move two squares instead of one and your pawn would otherwise normally be able to attack if the opposing pawn had only moved ahead one square instead of two. (This is the only example of an attack in chess where an opposing piece can be consumed by moving to a square it does not occupy. It is a rule that surprises new chess players and leads to accusations of cheating, but it is a real rule and it is called En Passant- French for &amp;ldquo;in passing&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;Finally, if a pawn reaches the opposite side of the board it can be turned into any piece (usually a queen) except the king.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now you can see why I am not going to attempt to list all the rules of all the pieces, it would be very time consuming. And we can all agree there are in fact rules of chess laid out elsewhere. The point isn&amp;rsquo;t what those rules are, it&amp;rsquo;s what we can do with them.&lt;/p&gt;
&lt;p&gt;Experienced chess players will likely agree a game of chess can be a fascinating expression of decisions. Indeed, observing some of the games of the grandmasters like Magnus Carlsen can put your jaw on the floor. They&amp;rsquo;re like works of art, beautiful landscapes or orchestral symphonies in their own way.&lt;/p&gt;
&lt;p&gt;These rules are analogous to the rules of oh, let&amp;rsquo;s take algebra. There&amp;rsquo;s addition, subtraction, multiplication, and division. There are rules about associativity, commutativity, etc.&lt;/p&gt;
&lt;p&gt;So if we can agree that the rules of chess are analogous to an axiomatic logical system what can we do with that? Can we demonstrate the incompleteness theorem in chess?&lt;/p&gt;
&lt;p&gt;I think we can. I think it might not even be that hard. We can at least try. All we have to do is wrap our heads around completeness and consistency in the rules of chess. But before we do that, let&amp;rsquo;s discuss the chess analogue of true and false statements in logic.&lt;/p&gt;
&lt;h2 id="valid-chessboard-configurations"&gt;
Valid Chessboard Configurations
&lt;a class="anchor" href="#valid-chessboard-configurations"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;What is a valid board configuration? One that doesn&amp;rsquo;t violate any of the rules? Given a random chess board with pieces in various positions it can be hard to tell if that state was achieved by starting with neat rows of pieces in their legal starting position and by following the rules, or if they were just chaotically and randomly placed there. Furthermore, there&amp;rsquo;s not a good way to say a given board is in violation of any of the rules if the rules primarily concern themselves with &lt;em&gt;transitions&lt;/em&gt; between board states. That is, the rules are mostly about moves. But luckily for us, there are rules we can use to immediately detect an invalid board configuration, such as that each player should not have more than one king. A pawn can not become a king by reaching the end of the board. So you could easily tell a board had been arrived at illegally if there were more than two kings on it.&lt;/p&gt;
&lt;h2 id="completeness-in-chess"&gt;
Completeness in Chess
&lt;a class="anchor" href="#completeness-in-chess"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Completeness in a logic system means that every truthful expression can be derived using the logical system. What does completeness in chess mean? Logic concerns itself with truth, chess concerns itself with winning chess. That is to say achieving checkmate. Could completeness in chess mean that every checkmate can be derived using the rules of chess? That sounds vaguely promising. We can probably be more general, though. Let&amp;rsquo;s try &lt;em&gt;completeness in chess means every valid board configuration can be derived using the rules.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="consistency-in-chess"&gt;
Consistency in Chess
&lt;a class="anchor" href="#consistency-in-chess"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Consistency in a logic system means that no false expressions can be derived using the logical system. What does consistency in chess mean? I&amp;rsquo;d say it means something like &amp;ldquo;you can&amp;rsquo;t get to an invalid board state by playing by the rules&amp;rdquo;. That sounds promising. &lt;em&gt;Chess is a consistent system if by following the rules you don&amp;rsquo;t end up with a board configuration that is illegal.&lt;/em&gt; It is consistent if by following the rules you never end up with more than 2 kings on the board.&lt;/p&gt;
&lt;p&gt;Similar to how we can derive the fundamental theorem of algebra, we can play a game of chess and end in a valid configuration of the board (and also checkmate).&lt;/p&gt;
&lt;p&gt;We can also play a game of chess and walk away from it having followed all the rules but before anyone achieves checkmate. We don&amp;rsquo;t even have to call it a draw, we can just mutually agree to walk away and pretend it never happened. The configuration of the board at that point is still legally derived, even if somewhat uninteresting compared to a game that concluded in a checkmate.&lt;/p&gt;
&lt;p&gt;This is similar to a mathematical proof which stops before reaching an interesting statement. You have followed all the rules to an unsatisfying end. You let us all down. You should be ashamed. Why have you done this?&lt;/p&gt;
&lt;h2 id="is-chess-complete"&gt;
Is Chess Complete?
&lt;a class="anchor" href="#is-chess-complete"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;A critical element of the incompleteness theorem is self reference, or Hofstadter&amp;rsquo;s &lt;em&gt;strange loops&lt;/em&gt;. Kurt Gödel derived a statement in a logic system that said of itself &amp;ldquo;I am not derivable&amp;rdquo;. But it was just derived! If the statement was true, then there is a true statement that cannot be derived (ignoring the fact we clearly just derived it) by the system therefore the system cannot be complete. If the statement was false, then there is a false statement derived by the system, therefore the system could not be consistent.&lt;/p&gt;
&lt;p&gt;Kurt Gödel &lt;em&gt;proved&lt;/em&gt; in a formal logical system something &lt;em&gt;about&lt;/em&gt; formal logical systems &lt;em&gt;involving proofs&lt;/em&gt;. This is meta, and indeed his proof was meta too. He used a formal logical system to make a statement &lt;em&gt;about&lt;/em&gt; the formal logical system which was &lt;em&gt;inconsistent with itself&lt;/em&gt; while being a &lt;em&gt;totally valid&lt;/em&gt; expression of the system.&lt;/p&gt;
&lt;p&gt;This would be like arriving at a checkmate in chess after only following the rules in which a paradoxical statement about chess was expressed. That is to say, where each of the pieces had a word printed on them and when played a certain way, the outcome is simultaneously a valid checkmate but also the words on the pieces spell out &amp;ldquo;I am a board configuration that can not be arrived at by following the rules of chess&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="paradox-time"&gt;
Paradox time
&lt;a class="anchor" href="#paradox-time"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;If that sentence is true, then the game we just legally played was actually arrived at illegally (even if we&amp;rsquo;re doubly sure we followed the rules). This game of chess says that there are valid board configurations in chess that can not be arrived at legally, and therefore chess is incomplete.&lt;/p&gt;
&lt;p&gt;If that sentence is false, then we just played a legal game that resulted in a statement about chess that is not true and therefore chess is inconsistent.&lt;/p&gt;
&lt;p&gt;Chess can therefore not be complete if it is consistent, and it can not be consistent if it is complete.&lt;/p&gt;
&lt;p&gt;In order to verify this, are there valid configurations of chess boards that can not be achieved by following the rules? Certainly. Put all 32 normal starting pieces in the lower half of the board, alternating in color. There is no way to get into that state following the rules, but nothing about that state is in violation of any rules and is therefore valid.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;
Conclusion
&lt;a class="anchor" href="#conclusion"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The incompleteness theorem is a brilliant and agile attack on formal logical systems and it brought numerous prominent mathematicians of the period to their knees, in particular Bertrand Russell and his efforts in producing the Principia Mathematica which is probably for the best since it takes hundreds of pages of dense symbols to arrive at the conclusion that 1 + 1 = 2.&lt;/p&gt;
&lt;p&gt;Chess is not unlike a formalized logic. It has rules, and those rules can be used to carry the weight of ideas. Including ideas &lt;em&gt;about&lt;/em&gt; those rules.&lt;/p&gt;
&lt;p&gt;This post was in part inspired by &lt;a href="https://stopa.io/post/269"&gt;this post&lt;/a&gt; which goes much deeper, provides more history and more details while taking the angle of actually implementing Gödel&amp;rsquo;s arithmetic in Lisp.&lt;/p&gt;</content:encoded></item><item><title>Movie</title><link>https://jva.lol/haikulog/movie/</link><pubDate>Tue, 12 May 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/movie/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;Watching a movie&lt;/p&gt;
&lt;p&gt;Without popcorn is not good&lt;/p&gt;
&lt;p&gt;It is very bad&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/movie/3o7rc0qU6m5hneMsuc.gif" alt="Movie" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Chris Bacon</title><link>https://jva.lol/haikulog/chris-bacon/</link><pubDate>Wed, 15 Apr 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/chris-bacon/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;We can talk about&lt;/p&gt;
&lt;p&gt;The haikus Chris bacon sir&lt;/p&gt;
&lt;p&gt;Any time you wish&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/chris-bacon/RyFJnOMPBr13G.gif" alt="Chris Bacon" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Singing</title><link>https://jva.lol/haikulog/singing/</link><pubDate>Mon, 30 Mar 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/singing/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;Someone is singing&lt;/p&gt;
&lt;p&gt;In the middle of the night&lt;/p&gt;
&lt;p&gt;Outside my window&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/singing/143qWPF33HtSTK.gif" alt="&amp;ndash;Singing&amp;ndash;" /&gt;&lt;/p&gt;</content:encoded></item><item><title>How I (used to) post to this blog using iOS Shortcuts and Pythonista</title><link>https://jva.lol/weblog/how-i-post-to-this-blog-using-ios-shortcuts-and-pythonista/</link><pubDate>Thu, 26 Mar 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/weblog/how-i-post-to-this-blog-using-ios-shortcuts-and-pythonista/</guid><description>In which I describe the formerly automatized process of posting to my blog</description><content:encoded>&lt;p&gt;EDIT: This blog is now hosted using Hugo, not Jekyll. I have to find a way to migrate what I&amp;rsquo;ve described here.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve had this blog for many years, and basically never posted anything. I wanted to become better about that, so I&amp;rsquo;ve been writing more haikus and trying to write up some of my home projects. My blog uses &lt;a href="https://jekyllrb.com"&gt;Jekyll&lt;/a&gt; and is hosted on &lt;a href="https://pages.github.com"&gt;Github Pages&lt;/a&gt; which already makes it pretty easy to write content but I wanted to see if I could make it even easier. I started with a &amp;ldquo;create new haiku&amp;rdquo; shortcut. This way anytime I have an idea for a haiku it doesn&amp;rsquo;t matter where I am, as long as I have an internet connection on my phone I can post a new one easily.&lt;/p&gt;
&lt;p&gt;So, I began playing with iOS Shortcuts. I wanted a button on my phone that would let me write and post to my blog without needing anything else. The solution I came up with uses a bit of Python in &lt;a href="https://omz-software.com/pythonista/"&gt;Pythonista&lt;/a&gt; for some formatting, as well as &lt;a href="https://workingcopyapp.com"&gt;Working Copy&lt;/a&gt; for the git actions.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" class="flavor" src="https://jva.lol/weblog/how-i-post-to-this-blog-using-ios-shortcuts-and-pythonista/books-domino.mp4" aria-label="A spiral of books toppling like dominoes through a library"&gt;&lt;/video&gt;&lt;span class="flavor-caption"&gt;An iOS Shortcut, automation visualized.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately, the only way to share an iOS shortcut is to share it directly. I wanted to export and paste a JSON payload here or something so others could edit and import easily, but it looks like the only way is to share a public link to it. So, here&amp;rsquo;s my &lt;a href="https://www.icloud.com/shortcuts/7d86a57504eb47098bc7d1290e3239d6"&gt;shortcut&lt;/a&gt; for writing and posting a haiku. With a little editing it should be easy enough to change if you wanted to rework it to post to your own blog. It assumes you have the Working Copy app I linked above, as well as a Pythonista script.&lt;/p&gt;
&lt;p&gt;Here are the actions it performs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pull the latest changes from your blog repo&lt;/li&gt;
&lt;li&gt;Ask for the name of the Haiku&lt;/li&gt;
&lt;li&gt;Executes a search in &lt;a href="https://giphy.com"&gt;Giphy&lt;/a&gt; for the given title and lets you choose your favorite gif&lt;/li&gt;
&lt;li&gt;Stages the chosen gif in &lt;code&gt;/assets&lt;/code&gt; in your repo&lt;/li&gt;
&lt;li&gt;Asks for the content of the Haiku. Adding an empty line between each line of content renders the content on new lines. I haven&amp;rsquo;t figured this part out yet, but if you don&amp;rsquo;t do this the whole haiku ends up on one line.&lt;/li&gt;
&lt;li&gt;It then sends the input to the Pythonista script to format it as Jekyll front matter&lt;/li&gt;
&lt;li&gt;It takes the resulting formatted content and stages it as a new file in your repo&lt;/li&gt;
&lt;li&gt;It commits the changes to your repo and pushes to remote&lt;/li&gt;
&lt;li&gt;It then texts my girlfriend to let her know there&amp;rsquo;s a new haiku (I haven&amp;rsquo;t tested this with other people, but I expect that unless you have her number it won&amp;rsquo;t work for you)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So now the only piece missing is the Pythonista script. Here it is:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;from webbrowser import open
from datetime import date
from urllib.parse import quote, unquote
import sys
import x_callback_url
title=sys.argv[1]
body=sys.argv[2]
gif=quote(sys.argv[3])
haiku=&amp;#39;&amp;#39;&amp;#39;---
layout: haiku
category: Haikus
title: &amp;#39;&amp;#39;&amp;#39; + title + &amp;#39;&amp;#39;&amp;#39;
---
&amp;#39;&amp;#39;&amp;#39; + body + &amp;#39;&amp;#39;&amp;#39;
![--&amp;#39;&amp;#39;&amp;#39; + title + &amp;#39;&amp;#39;&amp;#39;--](\{\{ site.url \}\}/assets/&amp;#39;&amp;#39;&amp;#39; + gif + &amp;#39;&amp;#39;&amp;#39;.gif)&amp;#39;&amp;#39;&amp;#39;
x_success = sys.argv[-1] # shortcuts-production://x-callback-url/ic-success/&amp;lt;UUID&amp;gt;
x_cancel = x_success.replace(&amp;#39;ic-success&amp;#39;, &amp;#39;ic-cancel&amp;#39;)
x_error = x_success.replace(&amp;#39;ic-success&amp;#39;, &amp;#39;ic-error&amp;#39;)
x_success += &amp;#39;?x-source=Pythonista3&amp;#39;
x_success += &amp;#39;&amp;amp;result=&amp;#39; + quote(haiku)
x_success += &amp;#39;&amp;amp;datetime=&amp;#39; + quote(str(date.today().strftime(&amp;#39;%Y-%m-%d&amp;#39;)))
open(x_success)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I&amp;rsquo;ve been having fun with this, I&amp;rsquo;ve also made a version that will make a full blog post like this one but haven&amp;rsquo;t used it much since writing long form on an iOS device is not that convenient for me. Anyway, if you&amp;rsquo;re reading this feel free to play with my shortcut and python script! I&amp;rsquo;d love to hear about any projects you use them for!&lt;/p&gt;</content:encoded></item><item><title>Earthquakes</title><link>https://jva.lol/haikulog/earthquakes/</link><pubDate>Thu, 26 Mar 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/earthquakes/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;The earth shakes at times&lt;/p&gt;
&lt;p&gt;It is most unwelcome here&lt;/p&gt;
&lt;p&gt;Among us earthlings&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/earthquakes/exrSCIegLFnPy.gif" alt="Earthquakes" /&gt;&lt;/p&gt;</content:encoded></item><item><title>GPG &amp; YubiKey &amp; You</title><link>https://jva.lol/weblog/gpg-yubikey-you/</link><pubDate>Sat, 14 Mar 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/weblog/gpg-yubikey-you/</guid><description>In which I attempt to do interesting things with my YubiKey</description><content:encoded>&lt;p&gt;I&amp;rsquo;ve recently taken on the task of setting up my YubiKeys for usag&lt;span class="ln" data-n="4"&gt;e&lt;/span&gt; beyond 2 factor auth. Something I learned was that OpenPGP smartcards (which include YubiKeys) have slots for three separate keys: Signature, Encryption, and Authentication.&lt;/p&gt;
&lt;p&gt;My first goal is to sign git commits with it. Because I am a man of negligible importance, this is in fact NOT an exercise in security. I&amp;rsquo;m taking more of a hobbyist approach. If security was of a more significant concern in my life, I would probably generate my keys in a live booted and air gapped &lt;a href="https://tails.boum.org"&gt;Tails&lt;/a&gt; environment.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/weblog/gpg-yubikey-you/yubikey-sketches_hu_74ab80f27d13ebcd.jpg" class="flavor" srcset="https://jva.lol/weblog/gpg-yubikey-you/yubikey-sketches_hu_74ab80f27d13ebcd.jpg 480w, https://jva.lol/weblog/gpg-yubikey-you/yubikey-sketches_hu_b1c58a848e67ef2.jpg 800w" sizes="min(100vw, 352px)"
width="480" height="270" loading="lazy" decoding="async" alt="A YubiKey resting on graph paper covered in hand-drawn circuit diagrams" /&gt;&lt;span class="flavor-caption"&gt;Fun hobby, or serious security step.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;When I started going down this route I had only in the first place acquired my YubiKey to simplify 2 factor authorization, a flow that I have found myself increasingly spending time due to work and the fact I turn it on everywhere that supports it. I think I was vaguely aware they could be used for more. Regardless, I started by playing around with signing. One of the first things I became aware of was that these things have PIN codes. Never needed them for 2FA, but for managing GPG keys you do. The default user PIN (which is used for signing, among other things) is &lt;code&gt;123456&lt;/code&gt; and the default admin PIN (used for modifying certain card attributes) is &lt;code&gt;12345678&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re following along, I&amp;rsquo;m assuming you have a YubiKey and a recent version of GnuPG.&lt;/p&gt;
&lt;h2 id="configure-your-yubikey"&gt;
Configure your YubiKey
&lt;a class="anchor" href="#configure-your-yubikey"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;To change the PIN (and configure things like your name, language, etc) run &lt;code&gt;gpg --card-edit&lt;/code&gt; with your key plugged in. You should see information about your key. Type &lt;code&gt;admin&lt;/code&gt; and &lt;code&gt;help&lt;/code&gt; to enable and list the available commands. Use &lt;code&gt;passwd&lt;/code&gt; to change the user PIN code.&lt;/p&gt;
&lt;h2 id="a-little-about-gpg-keys"&gt;
A little about GPG keys
&lt;a class="anchor" href="#a-little-about-gpg-keys"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;GPG keys have capabilities: Sign, Certify, and Encrypt. When you generate a GPG public / private keypair, by default you get a primary pub/priv key and a sub pub/priv key. The primary key can Sign and Certify. The subkey can Encrypt. The reason for this default is that Certify is all powerful. It really is your identity. Delegating powers to other keys signed by it is a good way to reduce your security footprint. If someone steals your encrypt key, all you have to do is revoke it, create a new one, and Certify it with your unstolen primary key. If someone steals your primary private key, well they&amp;rsquo;ve just stolen the ability to revoke your other keys or make new keys as you. So keep it extra safe.&lt;/p&gt;
&lt;h2 id="create-a-gpg-key"&gt;
Create a GPG key
&lt;a class="anchor" href="#create-a-gpg-key"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s time to generate your GPG key. &lt;code&gt;gpg --expert --full-gen-key&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select &lt;code&gt;RSA and RSA(default)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Key size: depending on the version of your key
&lt;ul&gt;
&lt;li&gt;YubiKey NEO - 2048&lt;/li&gt;
&lt;li&gt;YubiKey 4 / 5 - 4096&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Do it again for the subkey&lt;/li&gt;
&lt;li&gt;Pick an expiration date&lt;/li&gt;
&lt;li&gt;Enter your name (must be more than 5 characters)&lt;/li&gt;
&lt;li&gt;Enter your email&lt;/li&gt;
&lt;li&gt;Enter an optional comment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note the ID of the key generated. For fun, let&amp;rsquo;s look at what we&amp;rsquo;ve got so far. Run &lt;code&gt;gpg --edit-key &amp;lt;KEY ID&amp;gt;&lt;/code&gt;. You should see something like&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Secret key is available.
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2021-03-12
sec rsa4096/98973C978ECA988D
created: 2020-03-14 expires: never usage: SC
trust: ultimate validity: ultimate
ssb rsa4096/015D68EE1E7AC274
created: 2020-03-14 expires: never usage: E
[ultimate] (1). m3ta4a (testing) &amp;lt;email@address.org&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The usage of the first key is marked as &lt;code&gt;SC&lt;/code&gt;. The second is &lt;code&gt;E&lt;/code&gt;. That means the primary key can sign and certify, while the subkey can encrypt.&lt;/p&gt;
&lt;p&gt;If you have an existing key, you could use it to sign this new one to maintain a chain of custody: &lt;code&gt;gpg -u &amp;lt;your_old_keyid&amp;gt; --sign-key &amp;lt;longid&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;While we&amp;rsquo;re here, let&amp;rsquo;s add separate authentication and signing keys to prepare to fill the slots on the YubiKey.&lt;/p&gt;
&lt;h3 id="authentication-key"&gt;
Authentication Key
&lt;a class="anchor" href="#authentication-key"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re still at the gpg prompt &lt;code&gt;gpg&amp;gt;&lt;/code&gt; from the last command, exit out with Ctrl-C or &lt;code&gt;quit&lt;/code&gt; and enter &lt;code&gt;gpg --expert --edit-key &amp;lt;KEY ID&amp;gt;&lt;/code&gt;. Notice the extra flag for expert. Now enter the command &lt;code&gt;addkey&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pick RSA.&lt;/li&gt;
&lt;li&gt;Toggle capabilities until only authentication is enabled. You should need to enter each option once: &lt;code&gt;S, E, A&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;Q&lt;/code&gt; to finish&lt;/li&gt;
&lt;li&gt;Pick the key size&lt;/li&gt;
&lt;li&gt;Pick the expiration (good idea to keep it the same as your master key)&lt;/li&gt;
&lt;li&gt;Follow the rest of the prompts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="signing-key"&gt;
Signing Key
&lt;a class="anchor" href="#signing-key"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;The steps are the same as for the authentication key, only you should only have to deselect Encrypt when picking the key capabilities since by default Signing and Encryption are selected.
If you &lt;code&gt;quit&lt;/code&gt; out of here now, make sure to save or you&amp;rsquo;ll lose the keys you just made.&lt;/p&gt;
&lt;h2 id="backup-your-keys"&gt;
Backup your keys
&lt;a class="anchor" href="#backup-your-keys"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s a good idea to keep a backup somewhere safe.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gpg --armor --output privkey.sec --export-secret-key &amp;lt;longid&amp;gt;
gpg --armor --output subkeys.sec --export-secret-subkeys &amp;lt;longid&amp;gt;
gpg --armor --output pubkey.asc --export &amp;lt;longid&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="import-key-to-yubikey"&gt;
Import key to YubiKey
&lt;a class="anchor" href="#import-key-to-yubikey"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Make sure the YubiKey is plugged into your computer. Edit the key again, if you aren&amp;rsquo;t already &lt;code&gt;gpg --edit-key &amp;lt;KEY ID&amp;gt;&lt;/code&gt;. Enter the command &lt;code&gt;toggle&lt;/code&gt; followed by &lt;code&gt;keytocard&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enter &lt;code&gt;y&lt;/code&gt; to move the primary key&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;1&lt;/code&gt;. This moves the signature subkey to the signature slot of the YubiKey.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enter &lt;code&gt;key 1&lt;/code&gt; (which now should select the encryption key) followed by &lt;code&gt;keytocard&lt;/code&gt;. Select &lt;code&gt;2&lt;/code&gt;. This moves the encryption key to the encryption slot.&lt;/p&gt;
&lt;p&gt;Enter &lt;code&gt;key 1&lt;/code&gt; again and then &lt;code&gt;key 2&lt;/code&gt;. &lt;code&gt;keytocard&lt;/code&gt; and &lt;code&gt;3&lt;/code&gt;. This does the same but for the authentication key.&lt;/p&gt;
&lt;p&gt;Now &lt;code&gt;quit&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; for save.&lt;/p&gt;
&lt;p&gt;Now your secret keys are on your YubiKey and can be used for their intended purpose when it&amp;rsquo;s connected.&lt;/p&gt;
&lt;h2 id="configure-git-for-commit-signing"&gt;
Configure Git for commit signing
&lt;a class="anchor" href="#configure-git-for-commit-signing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Configure git for GPG signing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git config --global commit.gpgsign true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git config --global user.signingkey &amp;lt;KEY ID&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And let&amp;rsquo;s restart the GPG agent: &lt;code&gt;gpg-connect-agent reloadagent&lt;/code&gt;. Get out of there with &lt;code&gt;/bye&lt;/code&gt;. Now when you make a commit, git will require the key to be present. If it&amp;rsquo;s not, the commit will fail. If you want to make a signed commit and see what it looks like in the log, the command for that is &lt;code&gt;git log --show-signature&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gpg: Signature made Sat Mar 14 03:30:27 2020 MDT
gpg: using RSA key 05FFE31C369D8F25CFFF2167FDF8E68C5B840388
gpg: Good signature from &amp;#34;m3ta4a &amp;lt;jakeva@gmail.com&amp;gt;&amp;#34; [ultimate]
Author: m3ta4a 🎩 &amp;lt;jakeva@gmail.com&amp;gt;
Date: Sat Mar 14 03:27:35 2020 -0600
Add YubiKey Post
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configure-github-for-the-verified-stamp"&gt;
Configure Github for the &amp;lsquo;Verified&amp;rsquo; stamp
&lt;a class="anchor" href="#configure-github-for-the-verified-stamp"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;gpg --armor --export &amp;lt;KEY ID&amp;gt; | pbcopy&lt;/code&gt; and take it to &lt;a href="https://github.com/settings/gpg/new"&gt;add as a new GPG key on Github&lt;/a&gt;. If you forget this stamp, your commits will still show as signed but &amp;lsquo;Unverified&amp;rsquo;.&lt;/p&gt;
&lt;h2 id="etc"&gt;
Etc
&lt;a class="anchor" href="#etc"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Something interesting I noticed is that the gpg-agent caches the key. I removed the key from my computer before making another commit and it still got signed. It looks like this is set in &lt;code&gt;~/.gnupg/gpg-agent.conf&lt;/code&gt; so just a heads up.&lt;/p&gt;</content:encoded></item><item><title>Wasting time</title><link>https://jva.lol/haikulog/wasting-time/</link><pubDate>Thu, 12 Mar 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/wasting-time/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;I like wasting time&lt;/p&gt;
&lt;p&gt;And I like wasting your time&lt;/p&gt;
&lt;p&gt;I did it again&lt;/p&gt;
&lt;p&gt;&lt;video autoplay loop muted playsinline preload="metadata" src="https://jva.lol/haikulog/wasting-time/cKnxiph10lNCP3DCnv.mp4" aria-label="&amp;ndash;Wasting time&amp;ndash;"&gt;&lt;/video&gt;&lt;/p&gt;</content:encoded></item><item><title>Virus</title><link>https://jva.lol/haikulog/virus/</link><pubDate>Thu, 12 Mar 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/virus/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;Is it a virus&lt;/p&gt;
&lt;p&gt;If it doesn’t go viral&lt;/p&gt;
&lt;p&gt;And other questions&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/virus/QtXF6x3sfisPm.gif" alt="&amp;ndash;Virus&amp;ndash;" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Food</title><link>https://jva.lol/haikulog/food/</link><pubDate>Thu, 12 Mar 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/food/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;My girlfriend makes food&lt;/p&gt;
&lt;p&gt;She learned this art in China&lt;/p&gt;
&lt;p&gt;It tastes like Chinese&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/food/jKaFXbKyZFja0.gif" alt="Food" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Blogs</title><link>https://jva.lol/haikulog/blogs/</link><pubDate>Thu, 12 Mar 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/blogs/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;Blogs have to be good&lt;/p&gt;
&lt;p&gt;If you want people to read&lt;/p&gt;
&lt;p&gt;People don’t read mine&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/blogs/kTEqpBl5W9X2w.gif" alt="Blogs" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Haiku</title><link>https://jva.lol/haikulog/haiku/</link><pubDate>Wed, 11 Mar 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/haiku/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;This is a haiku&lt;/p&gt;
&lt;p&gt;It checks all of the boxes&lt;/p&gt;
&lt;p&gt;And now it is done&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/haiku/VzfYdUDFIsoot2jLbx.gif" alt="Haiku" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Beer</title><link>https://jva.lol/haikulog/beer/</link><pubDate>Thu, 05 Mar 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/beer/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;Beer is very good&lt;/p&gt;
&lt;p&gt;I drink it often for fun&lt;/p&gt;
&lt;p&gt;Including right now&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/beer/zrj0yPfw3kGTS.gif" alt="Beer" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Richard</title><link>https://jva.lol/haikulog/richard/</link><pubDate>Wed, 04 Mar 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/richard/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;Richard has nice breath&lt;/p&gt;
&lt;p&gt;I wish he could write good code&lt;/p&gt;
&lt;p&gt;But alas he can’t&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/richard/LRerEvcrQZwpYpvcJE.gif" alt="Richard" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Typos from old books</title><link>https://jva.lol/haikulog/typos-from-old-books/</link><pubDate>Tue, 03 Mar 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/typos-from-old-books/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;A piecture is just&lt;/p&gt;
&lt;p&gt;A pie chart of types of pie&lt;/p&gt;
&lt;p&gt;In Antarctica&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/typos-from-old-books/ghCZxkkgKIc6qOLOu8.gif" alt="&amp;ndash;Typos from old books&amp;ndash;" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Ramen</title><link>https://jva.lol/haikulog/ramen/</link><pubDate>Mon, 02 Mar 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/ramen/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;Ramen is so good&lt;/p&gt;
&lt;p&gt;It has noodles, pork, and stuff&lt;/p&gt;
&lt;p&gt;To stuff in my face&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/ramen/ZFuPxYpT4qYOWnDAno.gif" alt="Ramen" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Raspberry Pi BTC Node</title><link>https://jva.lol/weblog/raspberry-pi-btc-node/</link><pubDate>Sun, 01 Mar 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/weblog/raspberry-pi-btc-node/</guid><description>In which I attempt nobly to put a raspberry pi to good use</description><content:encoded>&lt;h2 id="time-to-put-one-of-my-spare-raspberry-pis-to-work"&gt;
Time to put one of my spare Raspberry Pis to work
&lt;a class="anchor" href="#time-to-put-one-of-my-spare-raspberry-pis-to-work"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I woke up this morning and thought, &amp;lsquo;Hey why not get a full BTC node running on one of those Pis you got laying around?&amp;rsquo; So that&amp;rsquo;s what I&amp;rsquo;m doing today.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/weblog/raspberry-pi-btc-node/raspberry-node_hu_75743040fed5e170.jpg" class="flavor" srcset="https://jva.lol/weblog/raspberry-pi-btc-node/raspberry-node_hu_75743040fed5e170.jpg 480w, https://jva.lol/weblog/raspberry-pi-btc-node/raspberry-node_hu_a20ffebb08cc57e6.jpg 800w" sizes="min(100vw, 352px)"
width="480" height="719" loading="lazy" decoding="async" alt="A bowl of blueberries with one raspberry front and center" /&gt;&lt;span class="flavor-caption"&gt;The raspberry node. This one&amp;#39;s edible though.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="basics"&gt;
Basics
&lt;a class="anchor" href="#basics"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;This assumes something like &lt;a href="https://www.raspberrypi.com/software/operating-systems/"&gt;Raspbian Lite&lt;/a&gt; (now called Raspberry Pi OS Lite) is already installed and SSH access configured. For Wifi, I use these &lt;a href="https://www.amazon.com/gp/product/B003MTTJOY"&gt;Edimax USB chips&lt;/a&gt;. Configuring them is not too difficult. It &lt;span class="ln" data-n="3"&gt;b&lt;/span&gt;oils down a simple config in &lt;code&gt;/etc/network/interfaces/&lt;/code&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;auto lo
iface lo inet loopback
iface eth0 inet dhcp
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid &amp;#34;**YOUR_WIFI**&amp;#34;
wpa-psk &amp;#34;**YOUR_PASSWORD**&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I&amp;rsquo;m going to install to the 32 GB SD mini card I used for the OS, which means I&amp;rsquo;m not planning on storing all the blocks. And since flash is less resilient than a HDD, I&amp;rsquo;m going to disable SWAP.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo swapoff --all&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="installing-the-bitcoin-client"&gt;
Installing the Bitcoin client
&lt;a class="anchor" href="#installing-the-bitcoin-client"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Go to &lt;a href="https://github.com/bitcoin/bitcoin/releases"&gt;https://github.com/bitcoin/bitcoin/releases&lt;/a&gt; and make not of the newest stable release. For me it&amp;rsquo;s currently 0.19.0.1. So, with that:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd ~
git clone -b v0.19.0.1 https://github/com/bitcoin/bitcoin.git
cd bitcoin
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I&amp;rsquo;m going to install it without a wallet, since I only want a node.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;./autogen.sh
./configure CXXFLAGS=&amp;#34;--param ggc-min-expand=1 --param ggc-min-heapsize=32768&amp;#34; --enable-cxx --without-gui --disable-shared --with-pic --disable-tests --disable-bench --enable-upnp-default --disable-wallet
make # This will take a long time, best run in tmux or screen, and grab a beer
sudo make install
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configure"&gt;
Configure
&lt;a class="anchor" href="#configure"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;For this, I want a bitcoin user.
&lt;code&gt;sudo adduser bitcoin&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now switch to the new user
&lt;code&gt;sudo su - bitcoin&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And create the app data directory
&lt;code&gt;mkdir ~/.bitcoin&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Add the following to &lt;code&gt;~/.bitcoin/bitcoin.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# makes client run in background
daemon=1
# is required by Fail2Ban described below
logips=1
# magic RBP optimisations
maxconnections=40
maxuploadtarget=5000
# Run without SWAP
dbcache=100
maxorphantx=10
maxmempool=50
upnp=1
prune=550 # Only keep the last two days of blocks if like me you are running off a small SD card
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Return to the &lt;code&gt;pi&lt;/code&gt; user
&lt;code&gt;exit&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now create the systemd service to launch the bitcoin client daemon
&lt;code&gt;sudo vim /etc/systemd/system/bitcoind.service&lt;/code&gt;
and give it the following&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[Unit]
Description=Bitcoin daemon
After=network.target
[Service]
ExecStart=/usr/local/bin/bitcoind -conf=/home/bitcoin/.bitcoin/bitcoin.conf -pid=/home/bitcoin/.bitcoin/bitcoind.pid
# Creates /run/bitcoind owned by bitcoin
RuntimeDirectory=bitcoind
User=bitcoin
Type=forking
PIDFile=/home/bitcoin/.bitcoin/bitcoind.pid
Restart=on-failure
# Hardening measures
####################
# Provide a private /tmp and /var/tmp.
PrivateTmp=true
# Mount /usr, /boot/ and /etc read-only for the process.
ProtectSystem=full
# Disallow the process and all of its children to gain
# new privileges through execve().
NoNewPrivileges=true
# Use a new /dev namespace only populated with API pseudo devices
# such as /dev/null, /dev/zero and /dev/random.
PrivateDevices=true
# Deny the creation of writable and executable memory mappings.
MemoryDenyWriteExecute=true
[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Make sure the new service starts on boot
&lt;code&gt;sudo systemctl enable bitcoind&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="security"&gt;
Security
&lt;a class="anchor" href="#security"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Uncomplicated firewall
&lt;code&gt;sudo apt install ufw&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Allow limited ssh
&lt;code&gt;sudo ufw limit ssh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Allow for main net bitcoin traffic
&lt;code&gt;sudo ufw allow 8333 comment &amp;quot;Bitcoin mainnet&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Enable the firewall
&lt;code&gt;sudo ufw enable&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Preview the enforced rules
&lt;code&gt;sudo ufw status verbose&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Install Fail2ban
&lt;code&gt;sudo apt install fail2ban&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;See the active jails - for now it will only be sshd
&lt;code&gt;sudo fail2ban-client status&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Start the bitcoin client
&lt;code&gt;sudo systemctl start bitcoind&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It will take a few minutes to start, but if you want to monitor its progress switch back to the bitcoin user and enter
&lt;code&gt;tail -n 100 -f ~/.bitcoin/debug.log&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You will need to figure out how to forward port 8333 to your new btc node depending on your router.&lt;/p&gt;
&lt;p&gt;Check it&amp;rsquo;s accessible from the outside world with
&lt;code&gt;curl -sL https://bitnodes.earn.com/api/v1/nodes/me-8333/ | jq&lt;/code&gt;&lt;/p&gt;</content:encoded></item><item><title>Building my own NAS</title><link>https://jva.lol/weblog/diy-nas/</link><pubDate>Sun, 23 Feb 2020 00:00:00 +0000</pubDate><guid>https://jva.lol/weblog/diy-nas/</guid><description>In which I Build a Network Attached Storage from scratch</description><content:encoded>&lt;h2 id="first-a-little-background"&gt;
First a little background
&lt;a class="anchor" href="#first-a-little-background"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I had a coupl&lt;span class="ln" data-n="1"&gt;e&lt;/span&gt; old NAS storage solutions I pulled out of, well, &lt;span class="ln" data-n="2"&gt;m&lt;/span&gt;y storage unit a while back. Tried to set them up in my office and found them to be really difficult to use, but the data on them is still good. So I pulled the disks out and decided to look into upgrading to something newer. After some research, I concluded the existing out-of-the-box solutions available are overpriced for what they offer. I decided I wanted more control over the parts to reduce cost, as well as having more freedom in setting up the server software so I looked into building my own.
/
&lt;img src="https://jva.lol/weblog/diy-nas/egg-carton-bays_hu_fcf750c029657cdb.jpg" class="flavor" srcset="https://jva.lol/weblog/diy-nas/egg-carton-bays_hu_fcf750c029657cdb.jpg 480w, https://jva.lol/weblog/diy-nas/egg-carton-bays_hu_3ff52998aa6a9579.jpg 800w" sizes="min(100vw, 352px)"
width="480" height="720" loading="lazy" decoding="async" alt="Rows of white eggs in a cardboard carton" /&gt;&lt;span class="flavor-caption"&gt;Twelve bays. 24 TBs. Why you may ask? To which I answer &amp;#39;Why Not?&amp;#39;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="parts"&gt;
Parts
&lt;a class="anchor" href="#parts"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I used &lt;a href="https://pcpartpicker.com"&gt;PC Partpicker&lt;/a&gt; to help me narrow down what I was looking for. I went in blind hoping I&amp;rsquo;d find a tower suitable for what I wanted, and I think I found the perfect one. Everything else was selected to fit it.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pcpartpicker.com/product/yTdqqs/fractal-design-case-fdcanode804blw"&gt;Fractal Design Node 804 MicroATX Mid Tower Case&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;This is particularly recommended for a NAS build. Both on Amazon and Newegg, reviews were a bit mixed but for a little over $100 I decided I could handle a few imperfections. Right now I have 7 3.5&amp;quot; drives ranging from 1 to 4 TB, and 1 2.5&amp;quot; SSD I want to use as the boot disk. Between disk bay utilization and cooling options, this tower promises some pretty interesting flexibility. In their own words, it has a &amp;ldquo;Unique hard drive mounting system, fitting up to 8 x 3.5&amp;rdquo;, 4 x 2.5&amp;quot; or up to 10 x 3.5&amp;quot;, 2 x 2.5&amp;quot; drives HDD/SSD&amp;quot; all inside a 13.5 x 12 x 15.3in package. That&amp;rsquo;s 12 slots for hard drives! That should fit my needs perfectly with plenty of room for future upgrades and fit nicely under my desk.&lt;/td&gt;
&lt;td&gt;$109.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pcpartpicker.com/product/RkJtt6/amd-ryzen-3-2200g-35ghz-quad-core-processor-yd2200c5fbbox"&gt;AMD Ryzen 3 2200G 3.5 GHz Quad-Core Processor&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;At first I was just interested in picking up a 2 core CPU since I intend on doing nothing with this machine except serving up files to my home network. I&amp;rsquo;m the only user, so I don&amp;rsquo;t need much CPU. However, I found it tricky to pair up a 2 core CPU with a motherboard so I just picked a reasonable quad core. It might be a little over kill, but that&amp;rsquo;s ok.&lt;/td&gt;
&lt;td&gt;$107.68&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I had more trouble finding the right motherboard. I ordered a cheap one early on, forgetting to check how many SATA slots it had. What I ordered was the &lt;a href="https://pcpartpicker.com/product/RD97YJ/asrock-b450m-hdv-r40-micro-atx-am4-motherboard-b450m-hdv-r40"&gt;ASRock B450M-HDV R4.0 Micro ATX AM4 Motherboard&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;which comes with 4 SATA 6 Gb/s slots. That won&amp;rsquo;t be enough, but for the price, I can slap some extra slots in with the…&lt;/td&gt;
&lt;td&gt;$69.97&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.amazon.com/dp/B07S8CB398/"&gt;Ziyituod SATA3.0 Card&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6 SATA 6 Gb/s PCIe controller. Problem solved.&lt;/td&gt;
&lt;td&gt;$39.95&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.amazon.com/dp/B019FRDFU0"&gt;Crucial 4GB Single DDR4&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Like I don&amp;rsquo;t need much processing power, I don&amp;rsquo;t need much ram. Two sticks of 4 GB DDR4 should do it.&lt;/td&gt;
&lt;td&gt;$39.98&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.amazon.com/dp/B01KVNCEIG"&gt;be Quiet! Pure Rock Slim - CPU Cooler&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A concern I had was how loud this thing was going to be. I picked a CPU cooler that promises it gets no louder than 25 Db. The fans that come with the tower might be a different story, but I can worry about those later if it&amp;rsquo;s an issue. Anyway, this thing is pretty cheap too.&lt;/td&gt;
&lt;td&gt;$33.28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.newegg.com/evga-supernova-850-g2-220-g2-0850-xr-850w/p/N82E16817438018?Item=N82E16817438018"&gt;EVGA SuperNOVA 800W&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;And the final piece is the power supply. Need enough power for up to ten drives, so here we are.&lt;/td&gt;
&lt;td&gt;$159.99&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This brings the total to a little over $500. By comparison you can get an &lt;a href="https://www.amazon.com/Synology-Bay-Diskstation-Diskless-DS1819/dp/B07KMKDW42/"&gt;8 bay NAS by Synology&lt;/a&gt; for $931.&lt;/p&gt;
&lt;h2 id="now-i-wait"&gt;
Now I wait
&lt;a class="anchor" href="#now-i-wait"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I haven&amp;rsquo;t got all the parts yet, but I&amp;rsquo;ll post an update when I get it built and have a chance to play with it. I expect there will be some tradeoffs, like the interior will probably be a bit cramped and hard to work with. Maybe it will get a little hot or loud with the four fans. But I&amp;rsquo;m excited, I didn&amp;rsquo;t think I&amp;rsquo;d be able to find a solution that would fit 10 drives in around a square foot of floor space. At less than $500, for me it&amp;rsquo;s a no brainer.&lt;/p&gt;
&lt;h2 id="and-whats-next"&gt;
And what&amp;rsquo;s next?
&lt;a class="anchor" href="#and-whats-next"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Of course, I&amp;rsquo;m already thinking down the road. Right now I only have a little over 12 TBs of hard drives ready to put to use (consisting mostly of Bluray backups and music), but at $485 for a &lt;a href="https://www.amazon.com/Seagate-IronWolf-16TB-Internal-Drive/dp/B07SGGWYC1"&gt;16 TB Drive&lt;/a&gt; I am imagining a world where I spend a small fortune for a +13x increase and while I&amp;rsquo;ll probably never need it, it is pretty fun to imagine.&lt;/p&gt;
&lt;h2 id="small-update"&gt;
Small Update
&lt;a class="anchor" href="#small-update"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Ok so I bought two of the 16 TB drives intending to get a simple mirror up. Funny story, I snapped the plastic on the sata connector of one of them trying to fit it into the case. It is pretty tight in there. Anyway, I bought a third to replace it. But by the time it arrived I decided it was worth trying to salvage the broken one. The pins were still there and I had the broken off plastic piece, so I sort of put it back together delicately and slid it all back in. It worked! The system connected to the drive and now I&amp;rsquo;ve got a healthy 32 TB Raid Z1 pool running in my FreeNAS!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m working now on setting up torrenting over OpenVPN among other things. I&amp;rsquo;ll write some of that up in separate blog posts.&lt;/p&gt;</content:encoded></item><item><title>New York, and Home</title><link>https://jva.lol/travelog/world-trip-2018/new-york-and-home/</link><pubDate>Thu, 15 Nov 2018 00:00:00 +0000</pubDate><guid>https://jva.lol/travelog/world-trip-2018/new-york-and-home/</guid><description> New York # I had about a 6 hour layover in JFK. Didn’t take many pictures. But I ate a lot of seafood and drank a lot of beer.
Home # Back in Salt Lake, I celebrated by singing karaoke and showing people my shoes (for some reason.)</description><content:encoded>&lt;h2 id="new-york"&gt;
New York
&lt;a class="anchor" href="#new-york"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I had about a 6 hour layover in JFK. Didn&amp;rsquo;t take many pictures. But I ate a lot of seafood and drank a lot of beer.&lt;/p&gt;
&lt;h2 id="home"&gt;
Home
&lt;a class="anchor" href="#home"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Back in Salt Lake, I celebrated by singing karaoke and showing people my shoes (for some reason.)&lt;/p&gt;
&lt;div class="book-columns flex flex-wrap"&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/new-york-and-home/1CEA0175-7267-41A6-A79F-5C4B5DCB3CB8_hu_2905296976215574.jpg"
width="480" height="853" loading="lazy" decoding="async" alt="Looking down at brown sneakers and jeans on a worn wooden bar floor, another pair of grey shoes and chair legs at the edges" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/new-york-and-home/IMG_0808_hu_585cec050afe8d84.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/new-york-and-home/IMG_0808_hu_86e6de3ada630186.jpeg 480w, https://jva.lol/travelog/world-trip-2018/new-york-and-home/IMG_0808_hu_585cec050afe8d84.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Several friends&amp;rsquo; sneakered feet gathered in a loose circle on a scuffed wooden floor under dim red bar light" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/new-york-and-home/IMG_0814_hu_9e07b5c90932f066.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/new-york-and-home/IMG_0814_hu_256ea068dbf0e527.jpeg 480w, https://jva.lol/travelog/world-trip-2018/new-york-and-home/IMG_0814_hu_9e07b5c90932f066.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Hand holds up a half-smoked cigar with long grey ash at night, a white SUV and street lights blurred behind" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/new-york-and-home/IMG_0815_hu_6ff06638b9956443.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/new-york-and-home/IMG_0815_hu_9ca77f4b157cb8fd.jpeg 480w, https://jva.lol/travelog/world-trip-2018/new-york-and-home/IMG_0815_hu_6ff06638b9956443.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Cigar with ashed tip held up at night beside a blue parking kiosk, storefront sign and parked cars out of focus across the street" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/new-york-and-home/IMG_0829.JPG"
width="231" height="308" loading="lazy" decoding="async" alt="Two men share a laugh at an outdoor night event, one holding a microphone beside a Coors Light-wrapped column" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Of Particular note is how only a few days after I got home, I met an amazing Chinese woman and we began dating seriously shortly after that. Weird how the world works, isn&amp;rsquo;t it?&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/new-york-and-home/IMG_0821_hu_8461ca1877d50dd8.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/new-york-and-home/IMG_0821_hu_158d846cfd2ecaab.jpeg 480w, https://jva.lol/travelog/world-trip-2018/new-york-and-home/IMG_0821_hu_a089a8410708833d.jpeg 800w, https://jva.lol/travelog/world-trip-2018/new-york-and-home/IMG_0821_hu_8461ca1877d50dd8.jpeg 1200w, https://jva.lol/travelog/world-trip-2018/new-york-and-home/IMG_0821_hu_248e5a574d66c29c.jpeg 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Man and woman in skates pose at the rail of an outdoor ice rink at night, trees wrapped in colorful holiday lights behind them" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Dublin, Ireland</title><link>https://jva.lol/travelog/world-trip-2018/ireland/</link><pubDate>Tue, 13 Nov 2018 00:00:00 +0000</pubDate><guid>https://jva.lol/travelog/world-trip-2018/ireland/</guid><description> Dublin # You best believe I made a stop in the city where I started my 6 week backpacking trip in 2016. Dublin! Another favorite. I wish I could live dozens of lives so I could truly soak in the beauty, history, and culture of every city on this trip. Not least of all, Dublin.
I stayed in an historic hotel that, with its winding halls and unpredictable layout, reminded me of “House of Leaves”. Fortunately, I didn’t get trapped.</description><content:encoded>&lt;h2 id="dublin"&gt;
Dublin
&lt;a class="anchor" href="#dublin"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;You best believe I made a stop in the city where I started my 6 week backpacking trip in 2016. Dublin! Another favorite. I wish I could live dozens of lives so I could truly soak in the beauty, history, and culture of every city on this trip. Not least of all, Dublin.&lt;/p&gt;
&lt;p&gt;I stayed in an historic hotel that, with its winding halls and unpredictable layout, reminded me of &amp;ldquo;House of Leaves&amp;rdquo;. Fortunately, I didn&amp;rsquo;t get trapped.&lt;/p&gt;
&lt;p&gt;Since I missed it in 2016 by about a couple hundred yards (facepalm), I made a more deliberate effort to seek out and visit the Quaternion plaque on Brougham (Broom) Bridge.&lt;/p&gt;
&lt;p&gt;It says&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Here as he walked by on the 16th of October 1843 Sir William Rowan Hamilton in a flash of genius discovered the fundamental formula for quaternion multiplication
i2 = j2 = k2 = ijk = −1
&amp;amp; cut it on a stone of this bridge.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="book-columns flex flex-wrap"&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0763_hu_4c0d4af0e5cbb749.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0763_hu_dc7f24b4fe596159.jpeg 480w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0763_hu_4c0d4af0e5cbb749.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="A columned stone church with a tall clock spire in Ireland, a yellow-green ambulance parked at its railings" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0765_hu_f8efc6f3001d01b.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0765_hu_9298650462768d94.jpeg 480w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0765_hu_f8efc6f3001d01b.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Shoppers and schoolgirls in uniform on a Dublin shopping street under a lit &amp;ldquo;Welcome to Dublin One&amp;rdquo; bow sign" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0767_hu_e1427723c774b50a.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0767_hu_57d3a578b9549102.jpeg 480w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0767_hu_e1427723c774b50a.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="The Parnell Monument obelisk with its bronze statue and gold harp rises over a Dublin street corner under grey skies" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0769_hu_de6ed12d87ed7d13.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0769_hu_8b136a63c82b1604.jpeg 480w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0769_hu_de6ed12d87ed7d13.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Stone Gothic church in Dublin with a scaffolded clock-tower spire, a white van passing on the street below at dusk" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0776_hu_75c1ef8b14da4d0e.JPG" srcset="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0776_hu_2e0abbb766989994.JPG 480w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0776_hu_75c1ef8b14da4d0e.JPG 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="800" loading="lazy" decoding="async" alt="Empty Dublin street corner at night, a lit deli storefront and streetlights glowing over wet pavement" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0778_hu_552a6b26166f4757.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0778_hu_85ead9f1e2e135c0.jpeg 480w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0778_hu_90b1409cd59ec47e.jpeg 800w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0778_hu_552a6b26166f4757.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Canal lock with a small weir beside a lane in Dublin, brick houses on the far bank and a walker on the path" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0780_hu_4a798c748d0a2eb9.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0780_hu_1ce65780f1b65021.jpeg 480w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0780_hu_4a798c748d0a2eb9.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Paved canal towpath stretching toward a low sunset, hedges on the left and water with a green fence on the right" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0781_hu_58ce590c53722543.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0781_hu_dfdf398d0644a3d0.jpeg 480w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0781_hu_58ce590c53722543.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Sunset light reflecting gold on a reedy canal in Ireland, grassy bank in front and dark clouds overhead" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0782_hu_95b049d4da354f46.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0782_hu_b94842c911b1ea5d.jpeg 480w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0782_hu_908a999a71119f75.jpeg 800w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0782_hu_95b049d4da354f46.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Stone arch bridge over a Dublin canal beside a modern rail bridge, with a towpath curving underneath on a grey day" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0787_hu_8e75319f75bc5cb9.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0787_hu_c577e83e466dab18.jpeg 480w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0787_hu_1408d10fe623a32a.jpeg 800w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0787_hu_8e75319f75bc5cb9.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Graffiti-marked Broom Bridge arching over the Royal Canal in Dublin, a stone plaque set into the wall by the towpath" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0789.JPG"
width="324" height="324" loading="lazy" decoding="async" alt="Stone plaque on Broom Bridge, Dublin, marking where William Rowan Hamilton carved his quaternion formula in 1843" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0790.JPG"
width="324" height="324" loading="lazy" decoding="async" alt="Curly-haired man taking a smiling selfie in front of Broom Bridge and the canal in Dublin" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0794_hu_7a5991870a4bf476.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0794_hu_c71ba20f039c1b71.jpeg 480w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0794_hu_7a5991870a4bf476.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Long reflecting pool of the Garden of Remembrance in Dublin, benches along both sides and the Irish flag flying beyond" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0796_hu_582ecdfa63bd3b26.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0796_hu_96a9e3227dcbf1de.jpeg 480w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0796_hu_582ecdfa63bd3b26.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Children of Lir bronze sculpture of falling figures and rising swans above a leaf-strewn pool, Irish tricolor overhead" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0804_hu_50ebc015b1c02869.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/ireland/IMG_0804_hu_7a0e412badcf8924.jpeg 480w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0804_hu_fcce09983f4977ef.jpeg 800w, https://jva.lol/travelog/world-trip-2018/ireland/IMG_0804_hu_50ebc015b1c02869.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Old-fashioned hotel sitting room with green velvet couches, red armchairs, a marble fireplace, and patterned red carpet" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</content:encoded></item><item><title>Istanbul, Turkey</title><link>https://jva.lol/travelog/world-trip-2018/turkey/</link><pubDate>Sun, 11 Nov 2018 00:00:00 +0000</pubDate><guid>https://jva.lol/travelog/world-trip-2018/turkey/</guid><description> Istanbul # Our last stop before all going our separate ways was in Istanbul. Highlight of that visit for me was the Hagia Sophia, once the tallest structure in the world and certainly one of the oldest still standing. There is a lot of history, including that it wasn’t officially called Istanbul until 1930. But I’ll let you google for the history. I’m just here to brag with photographic evidence that I’ve been there (although in this case it appears I don’t actually make an appearance in my own photos).</description><content:encoded>&lt;h2 id="istanbul"&gt;
Istanbul
&lt;a class="anchor" href="#istanbul"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Our last stop before all going our separate ways was in Istanbul. Highlight of that visit for me was the Hagia Sophia, once the tallest structure in the world and certainly one of the oldest still standing. There is a lot of history, including that it wasn&amp;rsquo;t officially called Istanbul until 1930. But I&amp;rsquo;ll let you google for the history. I&amp;rsquo;m just here to brag with photographic evidence that I&amp;rsquo;ve been there (although in this case it appears I don&amp;rsquo;t actually make an appearance in my own photos).&lt;/p&gt;
&lt;p&gt;One of my other favorite parts of Istanbul was the lounge at the Ataturk airport. Free food and drinks for as long as you need to wait for your flight. Only thing is… &lt;em&gt;it doesn&amp;rsquo;t seem like any one checks your ticket once you&amp;rsquo;re in&lt;/em&gt;. So if you ever need to hide for a long while…&lt;/p&gt;
&lt;div class="book-columns flex flex-wrap"&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0821_hu_3f6ac22500050f3b.JPG" srcset="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0821_hu_b7b34cc7888f4fcc.JPG 480w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0821_hu_a2b8fb6f2e7eb3de.JPG 800w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0821_hu_3f6ac22500050f3b.JPG 1200w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0821_hu_dc4827e73e467549.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Doormen in suits chat outside an ivy-draped yellow Ottoman-style hotel on a cobbled Istanbul street, cafe signs down the block" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0823_hu_648034e420597164.JPG" srcset="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0823_hu_d1359c04142072a3.JPG 480w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0823_hu_d200b1d429e2752d.JPG 800w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0823_hu_648034e420597164.JPG 1200w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0823_hu_a534777c6dfbcc56.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Dome and minarets of Hagia Sophia in Istanbul rise above green trees under a clear blue sky" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0824_hu_77a53e8ce97d947f.JPG" srcset="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0824_hu_f9b32fec56db1f5f.JPG 480w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0824_hu_f8b094390f72cea7.JPG 800w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0824_hu_77a53e8ce97d947f.JPG 1200w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0824_hu_8662bd999f755a39.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Bazaar stalls in Istanbul selling scarves, kaftans, magnets, and dolls under autumn trees, a Turkish flag hanging out front" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0828_hu_fc434bf424821a21.JPG" srcset="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0828_hu_3d23459fd6f9c398.JPG 480w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0828_hu_744697c5aabec38b.JPG 800w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0828_hu_fc434bf424821a21.JPG 1200w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0828_hu_b19bfebb757b0e5a.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Looking up at a slender stone minaret and the pink buttressed walls of Hagia Sophia against blue sky" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0836_hu_8267fe099d1c40ca.JPG" srcset="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0836_hu_92ac5dcac1069857.JPG 480w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0836_hu_863a33bf63f99b26.JPG 800w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0836_hu_8267fe099d1c40ca.JPG 1200w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0836_hu_6c3d322451d2ca75.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Tourists stroll before the Imperial Gate of Topkapi Palace in Istanbul, its marble arch topped with gold Arabic calligraphy" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0857_hu_bb9055a995c0bf35.JPG" srcset="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0857_hu_9e5f3a89eca89121.JPG 480w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0857_hu_324d5e016e9d8927.JPG 800w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0857_hu_bb9055a995c0bf35.JPG 1200w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0857_hu_758e88b5b45fa0f7.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Inside Hagia Sophia, giant round calligraphy medallions hang beneath the faded painted dome and arched gallery windows" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0869_hu_baa2288eacb4d11.JPG" srcset="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0869_hu_ff14656302c183ce.JPG 480w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0869_hu_4cbb6a99e7191aa4.JPG 800w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0869_hu_baa2288eacb4d11.JPG 1200w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0869_hu_b0180c508fa9f989.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Large bronze bell engraved with crosses and leaf garlands sits on a stone floor against a rough brick wall" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0883_hu_2c476d07cadbf6aa.JPG" srcset="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0883_hu_93c70c2112de5599.JPG 480w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0883_hu_77b939e299f5c2b3.JPG 800w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0883_hu_2c476d07cadbf6aa.JPG 1200w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0883_hu_200bee36f2f5036d.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Two pointed minarets and the pink domed bulk of Hagia Sophia in Istanbul against a deep blue sky" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0911_hu_b3042a1649c69984.JPG" srcset="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0911_hu_dc59e2bd2f410bb7.JPG 480w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0911_hu_6a315650eb1618a3.JPG 800w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0911_hu_b3042a1649c69984.JPG 1200w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0911_hu_ef36b2ab3c79f56d.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Ferries cross the choppy blue Bosphorus in Istanbul, hillside neighborhoods and a suspension bridge along the far shore" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0917_hu_85407b7beafc39a7.JPG" srcset="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0917_hu_1f93c18b913ab5ed.JPG 480w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0917_hu_a07108402db6d3ff.JPG 800w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0917_hu_85407b7beafc39a7.JPG 1200w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0917_hu_afef0c3983c5bbef.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Ornate white Dolmabahce Mosque and its twin minarets on the Bosphorus shore, ferries passing and a high-rise tower behind" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0922_hu_a07f6876fb827bab.JPG" srcset="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0922_hu_ab1411d0bd4cc40a.JPG 480w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0922_hu_f9040ecdf64b4eb1.JPG 800w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0922_hu_a07f6876fb827bab.JPG 1200w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0922_hu_79fde66cb0d1c5db.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="White motor yacht speeds past the ornate Ortakoy Mosque on the Bosphorus, the Bosphorus Bridge deck overhead at right" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0934_hu_a1a5477f9e2eb8b7.JPG" srcset="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0934_hu_ab586a594a9d647d.JPG 480w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0934_hu_67180543c7baaccc.JPG 800w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0934_hu_a1a5477f9e2eb8b7.JPG 1200w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0934_hu_6f34273d03483489.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Stone facade of Beylerbeyi Palace looms on the Bosphorus waterfront beneath a suspension bridge under dark clouds" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0936_hu_27d1dc2a65212745.JPG" srcset="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0936_hu_f245cd273d74bf7e.JPG 480w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0936_hu_10b034058b04baea.JPG 800w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0936_hu_27d1dc2a65212745.JPG 1200w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0936_hu_4ca3281598a3b80d.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Arched windows and carved columns of Beylerbeyi Palace stretch along the Bosphorus seawall, a palm tree at one corner" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0952_hu_452d2c80bd0e3010.JPG" srcset="https://jva.lol/travelog/world-trip-2018/turkey/DSC_0952_hu_a9343ebc1d16455a.JPG 480w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0952_hu_80c8d02f99139118.JPG 800w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0952_hu_452d2c80bd0e3010.JPG 1200w, https://jva.lol/travelog/world-trip-2018/turkey/DSC_0952_hu_5dca5973d6746a88.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Istanbul skyline silhouetted from the water, mosque domes and minarets rising over ferries and sun-sparkled waves" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/IMG_0723_hu_e497fec4b9122641.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/turkey/IMG_0723_hu_1e34d536da36469d.jpeg 480w, https://jva.lol/travelog/world-trip-2018/turkey/IMG_0723_hu_7503c825b298e052.jpeg 800w, https://jva.lol/travelog/world-trip-2018/turkey/IMG_0723_hu_e497fec4b9122641.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Looking up into Hagia Sophia&amp;rsquo;s gold central dome ringed with arched windows, mosaic angels and scaffolding below" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/IMG_0724_hu_c68e61966ba7ee75.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/turkey/IMG_0724_hu_1c0d2eab13eed898.jpeg 480w, https://jva.lol/travelog/world-trip-2018/turkey/IMG_0724_hu_14831fd3c140f080.jpeg 800w, https://jva.lol/travelog/world-trip-2018/turkey/IMG_0724_hu_c68e61966ba7ee75.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Visitors wander the marble floor of Hagia Sophia beneath glowing chandeliers, calligraphy medallions, and stained glass" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/IMG_0726_hu_1ebe4e18f4690c08.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/turkey/IMG_0726_hu_48586720e6edecaf.jpeg 480w, https://jva.lol/travelog/world-trip-2018/turkey/IMG_0726_hu_1ebe4e18f4690c08.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Crowds beneath Hagia Sophia&amp;rsquo;s stacked golden domes, with a Madonna and Child mosaic in the apse and tall scaffolding at left" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/IMG_0730_hu_f52fcee080f95b4f.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/turkey/IMG_0730_hu_f88619b4256e18ab.jpeg 480w, https://jva.lol/travelog/world-trip-2018/turkey/IMG_0730_hu_f52fcee080f95b4f.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Hagia Sophia&amp;rsquo;s painted domes and stained-glass windows above the marble mihrab, brass chandeliers hanging in the foreground" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/turkey/IMG_0731_hu_b091b1e820d27bca.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/turkey/IMG_0731_hu_c0dbf76ed90952e4.jpeg 480w, https://jva.lol/travelog/world-trip-2018/turkey/IMG_0731_hu_bee6dccd9f4b94f7.jpeg 800w, https://jva.lol/travelog/world-trip-2018/turkey/IMG_0731_hu_b091b1e820d27bca.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Older man rests in a green leather chair beside luggage in an airport lounge, pool table and round bookshelf wall behind him" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</content:encoded></item><item><title>Kathmandu, Nepal and The Himalayas / Everest</title><link>https://jva.lol/travelog/world-trip-2018/nepal/</link><pubDate>Sun, 04 Nov 2018 00:00:00 +0000</pubDate><guid>https://jva.lol/travelog/world-trip-2018/nepal/</guid><description> Kathmandu #</description><content:encoded>&lt;h2 id="kathmandu"&gt;
Kathmandu
&lt;a class="anchor" href="#kathmandu"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;div class="book-columns flex flex-wrap"&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0764_hu_216aa8b555795e2.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0764_hu_28bb04bd13c03ed3.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0764_hu_e75fe60e7e274d36.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0764_hu_216aa8b555795e2.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0764_hu_6b310bbe97d561a.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Orange and blue bird-of-paradise flower blooming beside a walkway in Nepal, dense green leaves behind" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0765_hu_a4708425a5015084.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0765_hu_6e7508f1ac346d85.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0765_hu_8dbab3645f4474df.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0765_hu_a4708425a5015084.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0765_hu_fe93b4c8098bfe35.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Weathered stone deity statues ringed by pots of yellow marigolds on brick terraces in a Kathmandu garden" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0767_hu_69872acfe03e976a.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0767_hu_f096efc299135ca4.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0767_hu_f5e73f727c7e107c.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0767_hu_69872acfe03e976a.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0767_hu_619842515852266.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Copper basin on a tiled floor filled with orange marigold petals and five floating red gerbera blossoms" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0771_hu_8bc4efe552ec1c91.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0771_hu_bf5cc3d10d9d6a6b.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0771_hu_ed968ea847f98cbd.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0771_hu_8bc4efe552ec1c91.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0771_hu_c61545a57fb1aedf.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Boudhanath Stupa&amp;rsquo;s painted Buddha eyes and prayer flags rise behind a pigeon-covered temple roof in Kathmandu" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0773_hu_90fd57abdd1ffd68.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0773_hu_b75cfcaeb2479ac6.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0773_hu_a463ea904a9db424.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0773_hu_90fd57abdd1ffd68.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0773_hu_c455e5a2ee155ec8.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Sunny square at Boudha in Kathmandu, shoppers strolling past ornate brick guesthouses while pigeons carpet the pavement" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0776_hu_f72711f44a9faf3a.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0776_hu_9f72caeab841754e.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0776_hu_4664183c6da2d6c6.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0776_hu_f72711f44a9faf3a.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0776_hu_229f65c5321933e2.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Storefronts and a monastery building with golden dharma wheel ring the pigeon-filled plaza around Boudhanath in Kathmandu" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0779_hu_f3842c31aaf08101.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0779_hu_6bdd86bc1bc95cbf.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0779_hu_43aff4b05e18c7b6.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0779_hu_f3842c31aaf08101.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0779_hu_20d8b3623976bad0.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Hundreds of pigeons crowding a brick plaza in Kathmandu as a child runs among them, coffee shop and stores behind" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0783_hu_9865cde7769a7334.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0783_hu_f8b8d90aaee2b556.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0783_hu_1bb84fcebcf7e45b.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0783_hu_9865cde7769a7334.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0783_hu_272b32133d9ed313.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Dense flock of pigeons covering the brick square outside clothing shops in Kathmandu, a few shoppers at the edges" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0788_hu_3b98936f4451aca5.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0788_hu_8f022a896a43b81e.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0788_hu_e2c836ec7e78cb4e.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0788_hu_3b98936f4451aca5.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0788_hu_bda57e04dfcbc2ed.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Strings of prayer flags fan out over a white wall lined with prayer wheels at Boudhanath in Kathmandu, visitors walking by" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0793_hu_e96bac546ddae09e.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0793_hu_1b1fc2e1d891d2a3.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0793_hu_22dc1906164a1e34.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0793_hu_e96bac546ddae09e.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0793_hu_5ca306fa711a6be8.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Kathmandu curio shop display of carved tusks, bead strands, an amber slab, and small animal figurines behind glass" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0794_hu_533b0e2d02209a3a.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0794_hu_7b3cc4fd34ff0923.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0794_hu_29090a5d18b9826e.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0794_hu_533b0e2d02209a3a.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0794_hu_faca0b2add4d680c.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Kathmandu shop crammed with stacked brass singing bowls and large hanging gongs in every size" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0797_hu_d9475dbd37b6424.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0797_hu_4b432a56d4f8349f.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0797_hu_7db3928b01431c20.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0797_hu_d9475dbd37b6424.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0797_hu_76a9896d36eecf6b.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Colored-powder rangoli of a goddess in pink robes laid out on the ground in Nepal, oil lamps set along the border" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0800_hu_759c81b42c80b599.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0800_hu_e0bd30ce69d842d7.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0800_hu_1a917223fdd0371a.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0800_hu_759c81b42c80b599.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0800_hu_7bb8147db1d7c6a6.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Bronze temple bells hung in red stone frames on a white shrine wall in Nepal, marigold garlands draped around them" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0804_hu_2bad73f97a56a906.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0804_hu_c0c5055f3eafa93c.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0804_hu_bc4a7845d9602dd1.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0804_hu_2bad73f97a56a906.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0804_hu_4d9098dcbfd478b0.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Looking up at Boudhanath Stupa&amp;rsquo;s gilded spire and painted eyes, prayer flags radiating out and pigeons dotting the dome" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0810_hu_1261bfe945296d6f.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0810_hu_71e5f5c738efaf27.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0810_hu_afaba0de6ef8d823.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0810_hu_1261bfe945296d6f.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0810_hu_f064c3e70e1fdfb8.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Painted statues of riders on white elephants flank the entrance to Boudhanath in Kathmandu as visitors walk between them" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0813_hu_b07d3616866df8f8.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0813_hu_80e947f873483d4c.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0813_hu_84677935e888d5f.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0813_hu_b07d3616866df8f8.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0813_hu_64e7213b754c6d2e.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="People sitting under a huge engraved silver bell hanging from an ornate golden arch near Boudhanath in Kathmandu" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0814_hu_327f187f78cfec34.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0814_hu_530bea957f1669ed.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0814_hu_344c6e786630c042.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0814_hu_327f187f78cfec34.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0814_hu_7552a2625882ffc2.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Pigeons blanket a temple roof and the white terraces of Boudhanath Stupa in Kathmandu, elephant statues guarding the steps" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="himalayas--everest"&gt;
Himalayas / Everest
&lt;a class="anchor" href="#himalayas--everest"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;We didn&amp;rsquo;t make it to the summit, we didn&amp;rsquo;t even try. We chartered a helicopter to near base camp. Including the flight into Lukla airport, considered by many to be the most dangerous in the world.&lt;/p&gt;
&lt;div class="book-columns flex flex-wrap"&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0434_hu_46c34a8069da3399.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0434_hu_16c07d4bcb8e0f77.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0434_hu_dbcd73e7aabf7e09.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0434_hu_46c34a8069da3399.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0434_hu_e2628ddff15903e0.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Snow plume streaming off the summit of Mount Everest against a deep blue sky, jagged ridges below" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0547_hu_ef73b6eae1264c44.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0547_hu_d743e53a7e390714.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0547_hu_73e09628de9a894.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0547_hu_ef73b6eae1264c44.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0547_hu_9675d0ad6f4d6af0.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Stone-walled trekking lodge with a small wind turbine in a frosty Himalayan village in Nepal, hillside looming behind" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0562_hu_e4ad75f94139356a.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0562_hu_f63736d76549fb6f.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0562_hu_45febe8c68e942c0.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0562_hu_e4ad75f94139356a.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0562_hu_bb5f3ada9f8783d2.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Herder driving black yaks across brown scrubland in Nepal, snow-streaked Himalayan peaks towering behind" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0567_hu_9f275569322f1910.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0567_hu_56e9b85e113667c5.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0567_hu_14a91fa213d11fce.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0567_hu_9f275569322f1910.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0567_hu_e0d990aaee732af3.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Two bundled-up trekkers on rocky ground in Nepal, one photographing a glacier spilling down the mountainside" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0600_hu_3bbb676e03a080d2.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0600_hu_c96d0bca4332a602.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0600_hu_54768e228e83eb2a.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0600_hu_3bbb676e03a080d2.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0600_hu_baa051f2f405a342.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Glossy black crow mid-stride on a sunlit stone ledge in Nepal, stone wall and wooden railing blurred behind" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0637_hu_4d7222c2efff28c4.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0637_hu_55ec8661938c9c4.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0637_hu_b196d0f3155869c.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0637_hu_4d7222c2efff28c4.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0637_hu_afce1559a8cab105.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Snow-capped pyramid of Ama Dablam rising above brown ridgelines under a clear blue Himalayan sky" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0643_hu_fecc6fba7558ecdd.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0643_hu_da467ae434374baa.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0643_hu_4939d593dd252ccf.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0643_hu_fecc6fba7558ecdd.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0643_hu_cdea0917e7e81550.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Two black pack yaks with saddles and blankets grazing on a dry, sunlit hillside in Nepal" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0753_hu_120ae56016f8b65c.JPG" srcset="https://jva.lol/travelog/world-trip-2018/nepal/DSC_0753_hu_2dd87a97059ed1d4.JPG 480w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0753_hu_55745f6a68e7fc72.JPG 800w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0753_hu_120ae56016f8b65c.JPG 1200w, https://jva.lol/travelog/world-trip-2018/nepal/DSC_0753_hu_54279f238b4654f8.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Group of trekkers gathered beside a white and blue helicopter on a concrete pad in Nepal, doors open before boarding" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0613_hu_11cbda0695262d0c.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0613_hu_e58b55604bd3f483.jpeg 480w, https://jva.lol/travelog/world-trip-2018/nepal/IMG_0613_hu_5e6bd5f216e6870b.jpeg 800w, https://jva.lol/travelog/world-trip-2018/nepal/IMG_0613_hu_11cbda0695262d0c.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Workers in safety vests loading a helicopter on a gravel pad at Lukla, Nepal, steep forested mountains all around" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0615_hu_838ffa88e5012968.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0615_hu_21715be2f7fd18da.jpeg 480w, https://jva.lol/travelog/world-trip-2018/nepal/IMG_0615_hu_86d7ef55c64be385.jpeg 800w, https://jva.lol/travelog/world-trip-2018/nepal/IMG_0615_hu_838ffa88e5012968.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Dawn rays fanning over a dark Himalayan ridge above stone lodges and stacked supplies in Lukla, Nepal" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0624_hu_38c8675863a27248.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0624_hu_8c3514a078728cc8.jpeg 480w, https://jva.lol/travelog/world-trip-2018/nepal/IMG_0624_hu_cb3b2037a2c6240e.jpeg 800w, https://jva.lol/travelog/world-trip-2018/nepal/IMG_0624_hu_38c8675863a27248.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Crews in orange vests staging cargo beside a red helicopter at dawn in Lukla, Nepal, mountains looming in half-light" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0638_hu_242881abc5d9593e.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0638_hu_977d0d6a058e0279.jpeg 480w, https://jva.lol/travelog/world-trip-2018/nepal/IMG_0638_hu_4c7b43c30c8f1d55.jpeg 800w, https://jva.lol/travelog/world-trip-2018/nepal/IMG_0638_hu_242881abc5d9593e.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Helicopter resting on a stone landing circle in a high Himalayan valley in Nepal, rugged snow-patched peaks behind" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0647_hu_7364b0ae25af80ec.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0647_hu_d47d1c2a8cf8141d.jpeg 480w, https://jva.lol/travelog/world-trip-2018/nepal/IMG_0647_hu_a56ed1d437b1ff19.jpeg 800w, https://jva.lol/travelog/world-trip-2018/nepal/IMG_0647_hu_7364b0ae25af80ec.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Wide scrub-covered valley in Nepal&amp;rsquo;s Khumbu with a small yak train in the distance beneath snow-capped peaks" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0662_hu_ac2fba8a93f960c8.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0662_hu_e515a4cc8df16cd8.jpeg 480w, https://jva.lol/travelog/world-trip-2018/nepal/IMG_0662_hu_ac2fba8a93f960c8.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Smiling man in a ball cap and puffy jacket with Everest, Lhotse, and Ama Dablam rising behind him in Nepal" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0687_hu_9ae3d48a049e5543.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0687_hu_f793394502ed1011.jpeg 480w, https://jva.lol/travelog/world-trip-2018/nepal/IMG_0687_hu_9ae3d48a049e5543.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Man in a black down jacket standing at a stone wall in Nepal, pine trees and snowy Himalayan peaks behind him" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0698_hu_ff67a7a5f72fecf2.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0698_hu_a4959c4bc73e4dfa.jpeg 480w, https://jva.lol/travelog/world-trip-2018/nepal/IMG_0698_hu_ff67a7a5f72fecf2.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Steep Himalayan valley in Nepal with forested ridges receding into haze, dry golden brush on the slope in the foreground" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0705.JPG"
width="288" height="384" loading="lazy" decoding="async" alt="Two men in winter jackets and hats stand on a barren Himalayan slope under deep blue sky, a snowy peak rising behind them" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0706_hu_51db4fe99f4aca2.JPG"
width="480" height="640" loading="lazy" decoding="async" alt="Two men in down jackets pose on rocky high-altitude ground in Nepal, a helicopter parked behind them below snowy peaks" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0711_hu_d8627cd3abb2699b.JPG"
width="480" height="640" loading="lazy" decoding="async" alt="Two smiling men in hats and puffy jackets stand arm in arm before massive snow-covered Himalayan peaks near Everest" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/nepal/IMG_0714_hu_841550c8f7566d18.JPG"
width="480" height="480" loading="lazy" decoding="async" alt="Workers in safety vests carry supplies past a helicopter on a gravel helipad in a Nepali mountain village at dusk" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</content:encoded></item><item><title>Chengdu (Sichuan Province)</title><link>https://jva.lol/travelog/world-trip-2018/china/chengdu/</link><pubDate>Sun, 04 Nov 2018 00:00:00 +0000</pubDate><guid>https://jva.lol/travelog/world-trip-2018/china/chengdu/</guid><description> Chengdu # Chengdu felt a little more less overwhelming. Still a much larger city than most people in the United States would be used to, but we stayed in an area of the city that could have been mistaken for Chicago, except with everything written in Chinese. And everyone around is Chinese. And they eat crab eggs and fish heads.
The highlight, aside from encountering “Hot Pot” for the first time was visiting the national Panda zoo!</description><content:encoded>&lt;h2 id="chengdu"&gt;
Chengdu
&lt;a class="anchor" href="#chengdu"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Chengdu felt a little more less overwhelming. Still a much larger city than most people in the United States would be used to, but we stayed in an area of the city that could have been mistaken for Chicago, except with everything written in Chinese. And everyone around is Chinese. And they eat crab eggs and fish heads.&lt;/p&gt;
&lt;p&gt;The highlight, aside from encountering &amp;ldquo;Hot Pot&amp;rdquo; for the first time was visiting the national Panda zoo!&lt;/p&gt;
&lt;div class="book-columns flex flex-wrap"&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0183_hu_8983fa9659e64cc7.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0183_hu_9b317983f5f3d8d2.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0183_hu_8983fa9659e64cc7.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Peacock with a brilliant blue neck and trailing tail feathers stands on grass between tree trunks in Chengdu" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0185_hu_e40c69b7fcbb5152.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0185_hu_7bc06e3a06d6e0dc.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0185_hu_e40c69b7fcbb5152.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Visitors in winter coats walk a paved path under arching bamboo groves in Chengdu, China" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0187_hu_44de3484f6bdfca.JPG"
width="480" height="853" loading="lazy" decoding="async" alt="A giant panda curls up on grass beside a rock wall in a Chengdu enclosure, China" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0196_hu_d99c2bf318c3c8a4.JPG"
width="480" height="853" loading="lazy" decoding="async" alt="A giant panda walks across a leaf-strewn lawn beside a log fence in Chengdu, China" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0201_hu_95e6b4cb9e5c48d3.JPG"
width="480" height="853" loading="lazy" decoding="async" alt="A giant panda lies on its back among green undergrowth, chewing a bamboo shoot, in Chengdu, China" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0206_hu_549d6f026be91579.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0206_hu_9b75c722a7802068.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0206_hu_549d6f026be91579.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="A giant panda sits upright on leaf litter, paws outstretched, surrounded by greenery in Chengdu, China" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0207_hu_9693a62ae5378f83.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0207_hu_221f43dd9338bbef.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0207_hu_9693a62ae5378f83.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="A giant panda reclines on the forest floor with a foreleg tucked across its chest, in Chengdu, China" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0220_hu_e8e2c108f98e46ca.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0220_hu_6f22a81ee895cc10.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0220_hu_e8e2c108f98e46ca.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="A school group of children with backpacks gathers on a paved plaza while adults direct them, Chengdu, China" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0361_hu_d7713d3a4546b1b7.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0361_hu_c40fd3aa51eb769f.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0361_hu_d7713d3a4546b1b7.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="A red panda perches on log beams beside a squash hung from a rope in a Chengdu enclosure, China" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0579_hu_e0ce6ae3bfffe449.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0579_hu_bcfb95d52ce2a611.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0579_hu_e0ce6ae3bfffe449.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="An empty paved path curves through a tunnel of tall bamboo arching overhead in Chengdu, China" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0581_hu_b70997d7a44a7c48.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0581_hu_1b70197b1ec217e5.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0581_hu_60e8e77c5e092e4e.jpeg 800w, https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0581_hu_b70997d7a44a7c48.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="A cyclist passes giant panda topiaries and yellow flowerbeds in front of a building under construction, Chengdu, China" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0583_hu_b8f15de98742deba.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0583_hu_da283138b37ae8d0.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0583_hu_b8f15de98742deba.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Hundreds of orange and teal share bikes packed along a city sidewalk below shop signs in Chengdu, China" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0584_hu_cb6865e40e331783.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0584_hu_d40810d6398d2f6c.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0584_hu_cb6865e40e331783.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Glass towers rise above a domed shopping podium with a Starbucks at street level in Chengdu, China" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0585_hu_61b619252d1a2843.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0585_hu_a4d1ccc9f68fd5d1.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/chengdu/IMG_0585_hu_61b619252d1a2843.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="A whole cooked crab on a white plate with prawns and a mussel shell behind it, Chengdu, China" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</content:encoded></item><item><title>Beijing</title><link>https://jva.lol/travelog/world-trip-2018/china/beijing/</link><pubDate>Sun, 04 Nov 2018 00:00:00 +0000</pubDate><guid>https://jva.lol/travelog/world-trip-2018/china/beijing/</guid><description> Beijing # Beijing is huge. I mean… just huge. There’s really no other way to put it. Everywhere you go, everything is overwhelming. From the size of the buildings to the number of people. It was here that I ate a roasted tarantula on a $500 dare from my brother. I should mention my dad at one first. So I knew it was safe.</description><content:encoded>&lt;h2 id="beijing"&gt;
Beijing
&lt;a class="anchor" href="#beijing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Beijing is huge. I mean… just huge. There&amp;rsquo;s really no other way to put it. Everywhere you go, everything is overwhelming. From the size of the buildings to the number of people. It was here that I ate a roasted tarantula on a $500 dare from my brother. I should mention my dad at one first. So I knew it was safe.&lt;/p&gt;
&lt;div class="book-columns flex flex-wrap"&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0290_hu_73f92d536b27e630.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0290_hu_7cc25c717125bcdb.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0290_hu_2688a6d35229347.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0290_hu_73f92d536b27e630.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0290_hu_52b8e659f2737227.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="The Great Wall snakes along a ridge below craggy mountains near Beijing, a red pavilion tower in the foreground" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0293_hu_ba36e1cebb0c3541.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0293_hu_c0435bc37523db5.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0293_hu_59ae1fb54f6cfc08.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0293_hu_ba36e1cebb0c3541.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0293_hu_d45e10ee68369299.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Aerial view of the Juyong Pass fortress and pavilions, the Great Wall climbing the mountainsides beyond" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0299_hu_5850bd01df18157a.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0299_hu_2c9c32d32c6c11bb.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0299_hu_89e746c0112f4077.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0299_hu_5850bd01df18157a.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0299_hu_117a6324cac6aa55.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Stepped section of the Great Wall climbs a scrubby hillside toward a watchtower with a pagoda-roofed gate tower at left" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0309_hu_a96b0c3ee53629d4.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0309_hu_f7a1dcfb9a9787eb.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0309_hu_da33414e6826521.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0309_hu_a96b0c3ee53629d4.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0309_hu_70cd81f12866833b.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Visitors climb a steep stretch of the Great Wall, a watchtower and valley parking area far below" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0319_hu_b051cdee5ba5a8e0.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0319_hu_177f92f475230ade.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0319_hu_8e9bae5f63ccd012.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0319_hu_b051cdee5ba5a8e0.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0319_hu_e1ff66b1f6a85068.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Curving battlements and steps of the Great Wall lead past a tiled-roof watchtower above hazy ridges" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0320_hu_280ad7ae36e06ddf.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0320_hu_bfa2753054454da8.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0320_hu_640dd66f01c121e5.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0320_hu_280ad7ae36e06ddf.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0320_hu_94199f6abd4187f4.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Double-roofed watchtower on the Great Wall overlooking a deep valley with a winding river and road" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0325_hu_6b16908291821b22.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0325_hu_9c71cf970dbddfb8.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0325_hu_ca2dda61101cb44c.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0325_hu_6b16908291821b22.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0325_hu_70d3e96151cd87a7.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Hikers dot a steep ridge of the Great Wall above a carved white marker stone with Chinese characters" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0371_hu_3ac6f1f11e2a9c93.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0371_hu_275825622fed555c.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0371_hu_b8216f84eeef34d.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0371_hu_3ac6f1f11e2a9c93.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0371_hu_a57281439045130e.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="The Zhengyangmen gate tower rises over a Beijing boulevard as a car passes gold-colored railings" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0349_hu_df797e9a916aa3bc.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0349_hu_5194dbbe2b94963b.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0349_hu_caeeced9d3159e9.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0349_hu_df797e9a916aa3bc.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0349_hu_f4dffc6ea551db74.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Hazy layers of mountain ridges fade into gray sky beyond dark treetops and Great Wall battlements" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0374_hu_cf4530c0ef93b73f.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0374_hu_cd76e259131741a2.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0374_hu_34cf7ae373293be9.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0374_hu_cf4530c0ef93b73f.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0374_hu_fe4a02d168779422.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Crowds queue on Tiananmen Square near the Monument to the People&amp;rsquo;s Heroes and the Great Hall of the People" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0388_hu_da37c10ed9031a4f.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0388_hu_175f2077fb1e8f35.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0388_hu_326172586869d467.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0388_hu_da37c10ed9031a4f.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0388_hu_9412652d89feab1f.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Tour groups gather in a vast stone courtyard of the Forbidden City ringed by red halls with golden roofs" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0390_hu_48dcda27493cfed7.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0390_hu_107bd5e8c9008507.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0390_hu_81b8f78b187d0450.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0390_hu_48dcda27493cfed7.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0390_hu_b7fb85e4d445f4d1.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="The Hall of Supreme Harmony in the Forbidden City atop tiers of carved white marble balustrades" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0400_hu_2336de273fe1e6c1.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0400_hu_21fcf492185e092b.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0400_hu_867e343af0eb4193.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0400_hu_2336de273fe1e6c1.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0400_hu_54b165803a09b048.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Crowds of visitors stream toward a golden-roofed palace hall in the Forbidden City" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0413_hu_6491525926cc6fcc.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0413_hu_1ad7685261408e2f.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0413_hu_514ef3b95733ed1d.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0413_hu_6491525926cc6fcc.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0413_hu_5fb8d97d5559610c.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Weathered, hole-pocked scholar rocks beside a carved marble stairway in the Forbidden City&amp;rsquo;s garden" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0414_hu_a53ee846ed00046c.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0414_hu_c60784fc6cb79a60.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0414_hu_fe4f17bce437b745.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0414_hu_a53ee846ed00046c.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0414_hu_37b940ed25c053dc.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Silhouetted visitors exit a massive studded palace gate framing the hilltop pavilion of Jingshan Park" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0418_hu_dea9052555885a03.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0418_hu_e63982c6105de1ab.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0418_hu_10b0a4ce5637fc72.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0418_hu_dea9052555885a03.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0418_hu_bc7abd1c24f9a87d.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="The Forbidden City&amp;rsquo;s north gate tower with tiered golden roofs seen across its stone-walled moat" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0431_hu_bdc0c8b4073cdaa2.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0431_hu_d3d005960630a6f2.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0431_hu_ede950c84e423f1.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0431_hu_bdc0c8b4073cdaa2.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/DSC_0431_hu_4b5af915087b6cd9.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Ornate blue-and-gold archway with dragon panels spanning the entrance to Wangfujing snack street in Beijing" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0131_hu_5d0378a93197a33b.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0131_hu_35dc42877cf0324f.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0131_hu_5d0378a93197a33b.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Four men pose on a brick terrace at the Ming Tombs, a golden-roofed hall rising behind autumn trees" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0138_hu_92c46fbaebecc0a4.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0138_hu_ae30f511f2e64d2c.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0138_hu_92c46fbaebecc0a4.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Man walks a cobbled path past a painted gateway toward the red Soul Tower at the Ming Tombs" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0141_hu_8ad620e8444d6e3b.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0141_hu_2c3e96f0f2b574ba.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0141_hu_8ad620e8444d6e3b.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Skewers of fried scorpions stand upright in wooden buckets at a Beijing street-food stall" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0155_hu_e2babea97e5a6be6.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0155_hu_11a48ae3f28680e4.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0155_hu_a181a5bcf0afb980.jpeg 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0155_hu_e2babea97e5a6be6.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Shoppers stroll the Wangfujing pedestrian street at dusk beneath lit signs and yellow ginkgo trees" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0161_hu_dab0fd80387df515.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0161_hu_4bda4d44d3fd83a.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0161_hu_e6ffceb5ba49c0ee.jpeg 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0161_hu_dab0fd80387df515.jpeg 1200w, https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0161_hu_8477223c6ac2644.jpeg 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="401" loading="lazy" decoding="async" alt="Panorama of the Forbidden City&amp;rsquo;s red Meridian Gate wings, a man checking his phone in the paved plaza" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0171_hu_fb9ace79fb6aac0e.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0171_hu_fb2040cf95273afd.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0171_hu_93a6346a97b4d012.jpeg 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0171_hu_fb9ace79fb6aac0e.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Busy food court crowded with diners at white tables under an open industrial ceiling in Beijing" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0174_hu_8988359beaafb9da.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0174_hu_c1c0a6aeb926a10.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0174_hu_1bb2d615a992a9c6.jpeg 800w, https://jva.lol/travelog/world-trip-2018/china/beijing/IMG_0174_hu_8988359beaafb9da.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Indoor hotel pool with lotus-topped stone columns, a tiered fountain, and palm trees under warm lights" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</content:encoded></item><item><title>Shanghai / Suzhou</title><link>https://jva.lol/travelog/world-trip-2018/china/shanghai/</link><pubDate>Thu, 01 Nov 2018 00:00:00 +0000</pubDate><guid>https://jva.lol/travelog/world-trip-2018/china/shanghai/</guid><description> Shanghai and Suzhou # Shanghai is, of course, amazing. We also took some time to visit a small (for the chinese) nearby town called Suzhou. Incredible beauty and history.</description><content:encoded>&lt;h2 id="shanghai-and-suzhou"&gt;
Shanghai and Suzhou
&lt;a class="anchor" href="#shanghai-and-suzhou"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Shanghai is, of course, amazing. We also took some time to visit a small (for the chinese) nearby town called Suzhou. Incredible beauty and history.&lt;/p&gt;
&lt;div class="book-columns flex flex-wrap"&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0009_hu_bdb821ac1f77b848.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0009_hu_a15e1e6c2269e843.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0009_hu_4b073dd1433cff89.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0009_hu_bdb821ac1f77b848.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0009_hu_fde5e861aa099360.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="An ornate carved grey stone gateway with a Chinese inscribed plaque and figure reliefs, Shanghai, China" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0011_hu_3ad1d647f508159e.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0011_hu_c34d8bc9353dac99.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0011_hu_4fd5a085fb25a227.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0011_hu_3ad1d647f508159e.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0011_hu_dc9d62b225edcc38.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="A tiled roof and carved stone gateway with an inscribed plaque, framed by dark pillars, Shanghai, China" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0014_hu_e1ebad0a75667f06.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0014_hu_d850e7e8f972d729.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0014_hu_7440dc3911026719.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0014_hu_e1ebad0a75667f06.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0014_hu_5f2ff7aed2688c0f.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Visitors gather in a tiled pavilion above a rockery in a classical Chinese garden, its roof reflected in a lily-covered pond" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0022_hu_603290318e3c6cbc.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0022_hu_390425ee72effa65.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0022_hu_5b4eeea893e4f693.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0022_hu_603290318e3c6cbc.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0022_hu_971ee022f8285a53.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="A red-leafed maple grows out of a limestone rockery beside a whitewashed garden wall with a latticed window in Shanghai" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0024_hu_bf87d277492f3cea.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0024_hu_cd40350a93195236.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0024_hu_f0cb9c93d81d2775.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0024_hu_bf87d277492f3cea.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0024_hu_c4ddc8ff8322ef28.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="A stacked scholar&amp;rsquo;s rock full of holes and mossy ledges stands against a weather-stained white garden wall in Shanghai" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0036_hu_761022efc8cbddfd.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0036_hu_125745697d461662.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0036_hu_8e7784c620ea3ed6.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0036_hu_761022efc8cbddfd.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0036_hu_60ce59768024923f.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="A man sits grinning in a carved wooden chair while a woman laughs beside him, surrounded by scroll paintings in a Shanghai art shop" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0050_hu_1e32dd34ec8ef5f5.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0050_hu_c676d8ebf219570a.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0050_hu_8df7e7e2da9773a1.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0050_hu_1e32dd34ec8ef5f5.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0050_hu_61cbc4e5f85be86.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="A round silk embroidery of a water town, with tiled houses, an arched stone bridge and two boats, displayed on a stand for sale" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0062_hu_5b81f6447411f926.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0062_hu_2c349658f611fa7a.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0062_hu_89c9ee0f2673493c.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0062_hu_5b81f6447411f926.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0062_hu_4723be9875f59c62.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="A visitor with a red drawstring bag stands in a circular moon gate, looking out at tourists climbing a garden rockery in Shanghai" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0067_hu_13efc2dcb00c7b73.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0067_hu_6face74a0348c240.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0067_hu_f55fdc89311e594.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0067_hu_13efc2dcb00c7b73.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0067_hu_5f376136aaad4470.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="A woman with a red umbrella walks a mossy rock ledge along a green garden pond, tiled roofs and autumn trees behind her" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0069_hu_e56795eb227227b4.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0069_hu_5f076dc86bda417b.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0069_hu_c0eecba2cc8c2551.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0069_hu_e56795eb227227b4.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0069_hu_9b7cb1a75b558288.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="A man in a grey jacket stands on a garden path beside a hollow tree trunk and bamboo fence, tiled pavilions across the pond" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0074_hu_68dbb632fde40f4a.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0074_hu_709837297f108302.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0074_hu_24ca1c8a99b9e06b.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0074_hu_68dbb632fde40f4a.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0074_hu_44e0e9f36c5cbae2.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Tourists stand under the sweeping upturned tiled roof of a garden pavilion, with covered walkways and pines around it" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0075_hu_7e0a4013485a22d2.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0075_hu_d906db942d5c6aa7.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0075_hu_adc9b9c59ddb6681.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0075_hu_7e0a4013485a22d2.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0075_hu_589e021f86414ced.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="An old pine leans horizontally over a bamboo garden fence, its flat canopy spread wide as visitors walk past a white wall" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0076_hu_807a828b61e4d11.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0076_hu_1b5efec3a9e2144d.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0076_hu_bd66cab412e54d15.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0076_hu_807a828b61e4d11.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0076_hu_44c6cd857808d00c.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Three people stand talking in a Chinese garden courtyard beneath a split old tree trunk, with tiled roofs and pines behind them" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0085_hu_6c33f604cd86bb8f.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0085_hu_9548df3a414e23e3.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0085_hu_ab2b7120a45ad8af.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0085_hu_6c33f604cd86bb8f.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0085_hu_afb9f69b7e69b200.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="A mantel clock, blue-and-white vase and green stone sit below a latticed window looking onto bamboo, flanked by calligraphy scrolls" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0097_hu_5dd68edb0d514005.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0097_hu_ad2c4e31dfb5e78b.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0097_hu_263ff668a1efc18c.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0097_hu_5dd68edb0d514005.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0097_hu_d9979318c7cb1942.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Three visitors stand at the foot of a garden rockery under curving tiled roofs and a grey sky in Shanghai" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0099_hu_6985cdea1773c71c.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0099_hu_2edf32021c690da0.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0099_hu_6112fa104105e2b5.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0099_hu_6985cdea1773c71c.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0099_hu_fbe07df1db517a00.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Two women taking phone photos stand on a mossy rock ledge above a still green pond, reflected below a white garden wall" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0147_hu_7cedc77d8928a197.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0147_hu_eb6a05d4cb7a969d.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0147_hu_80fd868d7570f7ab.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0147_hu_7cedc77d8928a197.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0147_hu_50e4470cec4e1199.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="A woman in a dark jacket sorts white silkworm cocoons at a workbench in a silk factory, green baskets beside her" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0170_hu_616fc99f77e377b5.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0170_hu_1f8d51b9df774bc2.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0170_hu_b40eedb73cf6f597.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0170_hu_616fc99f77e377b5.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0170_hu_daabd5b57f4d4800.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Visitors on a stone arch bridge below an ivy-covered city wall and tiered wooden gate tower in China" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0190_hu_d2f9ac616c468e09.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0190_hu_efd0489808d8717d.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0190_hu_c6ea21e8106874ec.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0190_hu_d2f9ac616c468e09.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0190_hu_9007f141fcf40528.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="People crossing a stone arch bridge over a canal beside tiled-roof wooden houses in a Chinese water town" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0198_hu_d19d95e5330ab750.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0198_hu_51b9876f1d691256.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0198_hu_411cf83c86f82a9d.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0198_hu_d19d95e5330ab750.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0198_hu_39aa576059f342bd.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Carved grey stone gateway with an inscribed plaque and upswept tiled roof, seen from a dark courtyard in China" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0208_hu_95573ce3770fb0fe.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0208_hu_885be89f4dc0e165.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0208_hu_5e043ef4778ed023.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0208_hu_95573ce3770fb0fe.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0208_hu_a7f21f2d5bfddb28.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="View from a boat of a stone arch bridge crowded with people, red lanterns hanging along the canal in China" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0213_hu_b0d6c6241e757045.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0213_hu_dc33e0445930418a.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0213_hu_54885e4fc046d3bf.JPG 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0213_hu_b0d6c6241e757045.JPG 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/DSC_0213_hu_12220f9bdeb08918.JPG 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="800" loading="lazy" decoding="async" alt="Blue-canopied wooden boats moored on a canal below a stone arch bridge and whitewashed houses in China" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0087_hu_8a8dea6631792f60.JPG" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0087_hu_eabe56dd45f683a0.JPG 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0087_hu_8a8dea6631792f60.JPG 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Shanghai at night from high above, the lit Oriental Pearl Tower among skyscrapers along the Huangpu River" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0090_hu_21c7df29149de1bd.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0090_hu_47063054d387eb44.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0090_hu_21c7df29149de1bd.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Looking up at night at the Jin Mao Tower and the twisting Shanghai Tower lit red along its edge" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0093_hu_58d1212f1f733738.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0093_hu_c648dff88d263ba5.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0093_hu_58d1212f1f733738.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="The Shanghai World Financial Center at night, its wedge-shaped tower and trapezoid opening seen from street level" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0096_hu_52c6bc4ea87d10bc.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0096_hu_ed751ddaea72560a.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0096_hu_63857b711f13f739.jpeg 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0096_hu_52c6bc4ea87d10bc.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Hazy daytime view over Shanghai from a high window, office towers crowding a bend in the Huangpu River" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0101_hu_8c1d186e7b8a33e3.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0101_hu_faa3b0756456105c.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0101_hu_1131bb75b8f6197e.jpeg 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0101_hu_8c1d186e7b8a33e3.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Classical Chinese garden in the rain: a tiled pavilion and white walls above a green pond with lily pads" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0118_hu_7b112147138dff84.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0118_hu_c0753b8ef68b1c5b.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0118_hu_a812db92693c81a1.jpeg 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0118_hu_7b112147138dff84.jpeg 1200w, https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0118_hu_b23a8e1cb21279c0.jpeg 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="333" loading="lazy" decoding="async" alt="Panorama from a bridge over a wide canal in China, a man in an orange cap on the steps and a gate tower beyond" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0131_hu_ed66141ae332f231.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0131_hu_cfa505c1eb4835df.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0131_hu_27bfeabad8929ae3.jpeg 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0131_hu_ed66141ae332f231.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Three Shanghai skyscrapers seen from below against grey cloud: the World Financial Center, Jin Mao and Shanghai Tower" /&gt;
&lt;img src="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0132_hu_a00cd25abce0674.jpeg" srcset="https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0132_hu_77a3666060710284.jpeg 480w, https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0132_hu_4d021942acc4035f.jpeg 800w, https://jva.lol/travelog/world-trip-2018/china/shanghai/IMG_0132_hu_a00cd25abce0674.jpeg 1200w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Beds of red, pink and white flowers beside a wide Shanghai road, office towers rising behind trees under blue sky" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</content:encoded></item><item><title>Denver</title><link>https://jva.lol/haikulog/denver/</link><pubDate>Thu, 17 Aug 2017 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/denver/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;I am in Denver&lt;/p&gt;
&lt;p&gt;It is just like Salt Lake City&lt;/p&gt;
&lt;p&gt;Except, like, bigger&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/denver/Denver_hu_2416369bd2bd8bbf.jpg" srcset="https://jva.lol/haikulog/denver/Denver_hu_cc82fa74dc7106c4.jpg 480w, https://jva.lol/haikulog/denver/Denver_hu_ac37fa95738e76c.jpg 800w, https://jva.lol/haikulog/denver/Denver_hu_2416369bd2bd8bbf.jpg 1200w, https://jva.lol/haikulog/denver/Denver_hu_3643c8e5fd4eeae3.jpg 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="536" loading="lazy" decoding="async" alt="Denver" /&gt;&lt;/p&gt;</content:encoded></item><item><title>In defense of the new MacBook Pro touchbar</title><link>https://jva.lol/haikulog/in-defense-of-the-touchbar/</link><pubDate>Tue, 15 Aug 2017 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/in-defense-of-the-touchbar/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;It is a fun way&lt;/p&gt;
&lt;p&gt;To do things you did before&lt;/p&gt;
&lt;p&gt;Why not something new?&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/in-defense-of-the-touchbar/touchbar_hu_92648164b88dbc2d.jpg" srcset="https://jva.lol/haikulog/in-defense-of-the-touchbar/touchbar_hu_5f5ce524d81a52f3.jpg 480w, https://jva.lol/haikulog/in-defense-of-the-touchbar/touchbar_hu_92648164b88dbc2d.jpg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="450" loading="lazy" decoding="async" alt="In defense of the new MacBook Pro touchbar" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Waking up</title><link>https://jva.lol/haikulog/waking-up/</link><pubDate>Sat, 14 Feb 2015 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/waking-up/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;Nope, nope, nope, nope, nope&lt;/p&gt;
&lt;p&gt;Nope, nope, nope, nope, nope, nope, nope&lt;/p&gt;
&lt;p&gt;Nope, nope, nope, nope, nope&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/waking-up/waking-up.png"
width="400" height="385" loading="lazy" decoding="async" alt="&amp;ndash;Waking up&amp;ndash;" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Getting out of bed</title><link>https://jva.lol/haikulog/getting-out-of-bed/</link><pubDate>Sat, 14 Feb 2015 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/getting-out-of-bed/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;No no no no no&lt;/p&gt;
&lt;p&gt;No no no no no no no&lt;/p&gt;
&lt;p&gt;No no no no no&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/getting-out-of-bed/fetal-bed_hu_8796c4f87128da29.jpg"
width="480" height="309" loading="lazy" decoding="async" alt="Bed" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Space-time</title><link>https://jva.lol/haikulog/space-time/</link><pubDate>Fri, 03 May 2013 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/space-time/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;Time and space are one&lt;/p&gt;
&lt;p&gt;So it is all relative&lt;/p&gt;
&lt;p&gt;Please pardon the pun&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/space-time/space-time_hu_b5c58b5603c09e84.jpg"
width="480" height="240" loading="lazy" decoding="async" alt="&amp;ndash;&amp;ldquo;Space-time&amp;rdquo;&amp;ndash;" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Evening</title><link>https://jva.lol/haikulog/evening/</link><pubDate>Mon, 22 Apr 2013 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/evening/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;In the evening&lt;/p&gt;
&lt;p&gt;I am joined by Page and Plant&lt;/p&gt;
&lt;p&gt;but do not ascend&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/evening/evening_hu_8d1501f5f7f1c696.jpg" srcset="https://jva.lol/haikulog/evening/evening_hu_2135d7d4db70caa7.jpg 480w, https://jva.lol/haikulog/evening/evening_hu_dc5e9d0571d918da.jpg 800w, https://jva.lol/haikulog/evening/evening_hu_8d1501f5f7f1c696.jpg 1200w, https://jva.lol/haikulog/evening/evening_hu_38c5388b0b14167b.jpg 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="750" loading="lazy" decoding="async" alt="&amp;ldquo;Evening&amp;rdquo;" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Chairs</title><link>https://jva.lol/haikulog/chairs/</link><pubDate>Sun, 14 Apr 2013 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/chairs/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;Made of good hard wood&lt;/p&gt;
&lt;p&gt;Sitting straight is important&lt;/p&gt;
&lt;p&gt;If you like your spine&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/chairs/chair.jpg"
width="414" height="600" loading="lazy" decoding="async" alt="&amp;ldquo;Chairs&amp;rdquo;" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Breakfast</title><link>https://jva.lol/haikulog/breakfast/</link><pubDate>Sun, 14 Apr 2013 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/breakfast/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;The first and best meal&lt;/p&gt;
&lt;p&gt;Forget brunch, breakfast is good&lt;/p&gt;
&lt;p&gt;enough to eat twice&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/breakfast/breakfast_hu_9ada59f5c3fa6fbd.jpg"
width="480" height="320" loading="lazy" decoding="async" alt="Breakfast" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Music</title><link>https://jva.lol/haikulog/music/</link><pubDate>Sat, 13 Apr 2013 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/music/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;Listen to music&lt;/p&gt;
&lt;p&gt;From Mozart to the Beatles&lt;/p&gt;
&lt;p&gt;Feel infinity&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/music/music_hu_ff512776766c4d05.jpg" srcset="https://jva.lol/haikulog/music/music_hu_bee8ac6d2332cccb.jpg 480w, https://jva.lol/haikulog/music/music_hu_cf1e737761310ff2.jpg 800w, https://jva.lol/haikulog/music/music_hu_ff512776766c4d05.jpg 1200w, https://jva.lol/haikulog/music/music_hu_b486a3e1d42b4862.jpg 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="900" loading="lazy" decoding="async" alt="Music" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Bubbles</title><link>https://jva.lol/haikulog/bubbles/</link><pubDate>Sat, 13 Apr 2013 00:00:00 +0000</pubDate><guid>https://jva.lol/haikulog/bubbles/</guid><description>Top Secret</description><content:encoded>&lt;p&gt;Bubbles down the drain&lt;/p&gt;
&lt;p&gt;Remind me I am one too&lt;/p&gt;
&lt;p&gt;One day I will pop&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jva.lol/haikulog/bubbles/bubbles_hu_a93f31168354b422.jpg" srcset="https://jva.lol/haikulog/bubbles/bubbles_hu_ac48c1c306ca49ba.jpg 480w, https://jva.lol/haikulog/bubbles/bubbles_hu_2adee919a40a9dd6.jpg 800w, https://jva.lol/haikulog/bubbles/bubbles_hu_a93f31168354b422.jpg 1200w, https://jva.lol/haikulog/bubbles/bubbles_hu_597e4553ed2fd0f0.jpg 1600w" sizes="(max-width: 768px) 100vw, 1000px"
width="1200" height="901" loading="lazy" decoding="async" alt="Bubbles" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Ferry to France</title><link>https://jva.lol/travelog/europe-2016/ireland/ferry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jva.lol/travelog/europe-2016/ireland/ferry/</guid><description> Europe Part 1.2 - Ferry to France # Ferry #</description><content:encoded>&lt;h1 id="europe-part-12---ferry-to-france"&gt;
Europe Part 1.2 - Ferry to France
&lt;a class="anchor" href="#europe-part-12---ferry-to-france"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="ferry"&gt;
Ferry
&lt;a class="anchor" href="#ferry"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4690_hu_bc27d7b4dad2d2e2.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4690_hu_cdac2a5d9da691e4.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4690_hu_bc27d7b4dad2d2e2.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="600" loading="lazy" decoding="async" alt="The Irish Ferries ship Ulysses docked beside the terminal building at Dublin Port under a clear blue sky" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4692_hu_e938022dc96491ae.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4692_hu_6cef30a8daa32ce3.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4692_hu_e938022dc96491ae.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="178" loading="lazy" decoding="async" alt="Panorama from a ferry&amp;rsquo;s top deck leaving Dublin Port, with docks, cranes, and sunlit sea stretching to the horizon" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4693_hu_eeba9d9c19cf1af2.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4693_hu_554cbb0d1f9f4c59.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4693_hu_eeba9d9c19cf1af2.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="213" loading="lazy" decoding="async" alt="Dublin Bay from a ferry deck, the twin striped Poolbeg chimneys and port cranes low on the horizon" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4695_hu_73380bfc7417abdb.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4695_hu_e27c2dae46c64414.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4695_hu_73380bfc7417abdb.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="600" loading="lazy" decoding="async" alt="Man with a blue backpack takes a selfie beside a modern arched footbridge in a sunny harbor town" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4705_hu_4686dab6ff7eed2e.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4705_hu_59abe301afcedc40.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4705_hu_4686dab6ff7eed2e.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Selfie at a ferry railing with a gray navy warship moored across the harbor under an overcast sky" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4712_hu_17b7b85dfb27c6ee.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4712_hu_db1b2ef509e286f6.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4712_hu_17b7b85dfb27c6ee.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="259" loading="lazy" decoding="async" alt="Ferry stern deck with sun loungers as the ship leaves Portsmouth harbor, the Spinnaker Tower on the skyline" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4719_hu_aff4925df273e12f.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4719_hu_53f2cae4eb45fd5a.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4719_hu_aff4925df273e12f.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="600" loading="lazy" decoding="async" alt="Man in a navy rain jacket and shorts stands on a ferry&amp;rsquo;s blue upper deck under heavy gray clouds" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4734_hu_c7fcc2dad977e64a.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4734_hu_7c2b31f3121df674.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4734_hu_c7fcc2dad977e64a.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="600" loading="lazy" decoding="async" alt="Passengers at a ferry deck railing watch a long sandy beach and low coastline pass under storm clouds" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4735_hu_8d3171b79204fb3.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4735_hu_fd2d3807c9545a73.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4735_hu_8d3171b79204fb3.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Two soldiers in camouflage with rifles stand guard beside a stone planter at a ferry-port checkpoint, seen from a vehicle" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4723_hu_3bdd2bd6c10ffb2e.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4723_hu_d98a9e5f6c619bc.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4723_hu_3bdd2bd6c10ffb2e.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="600" loading="lazy" decoding="async" alt="Smiling man in a navy jacket with a backpack holds a drink on a ferry deck, low coastline behind him" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4726_hu_b4607b4aceca8579.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4726_hu_d9ed7b0b388c9582.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/ferry/IMG_4726_hu_b4607b4aceca8579.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="600" loading="lazy" decoding="async" alt="Man with a backpack grins while holding a pint of beer at a ferry railing under dark clouds at sea" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Belgium</title><link>https://jva.lol/travelog/europe-2016/belgium/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jva.lol/travelog/europe-2016/belgium/</guid><description> Europe Part 3 - Belgium # Brussels # I was only in Belgium for one night, but I had a lot of fun. I stayed in Brussels. It’s a beautiful city, of course. Birthplace of Audrey Hepburn, location of an escape room I nearly had a chance to try and escape from except for the drunk northern irish couple I met and hung with until the girl puked everywhere and gave me 50 euros for some reason. Ah. Belgium.</description><content:encoded>&lt;h1 id="europe-part-3---belgium"&gt;
Europe Part 3 - Belgium
&lt;a class="anchor" href="#europe-part-3---belgium"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="brussels"&gt;
Brussels
&lt;a class="anchor" href="#brussels"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I was only in Belgium for one night, but I had a lot of fun. I stayed in Brussels. It&amp;rsquo;s a beautiful city, of course. Birthplace of Audrey Hepburn, location of an escape room I nearly had a chance to try and escape from except for the drunk northern irish couple I met and hung with until the girl puked everywhere and gave me 50 euros for some reason. Ah. Belgium.&lt;/p&gt;
&lt;div class="book-columns flex flex-wrap"&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/europe-2016/belgium/IMG_5057.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Massive ornate stone courthouse with a scaffolded gold dome rising over a Brussels boulevard with tram tracks" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/belgium/IMG_5059.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Selfie of a bearded man on a wide Brussels plaza, a tall white war memorial column rising behind him" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/belgium/IMG_5067.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="Close selfie of a smiling bearded man holding up a bottle of Hoegaarden beer under a partly cloudy Belgian sky" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/belgium/IMG_5077.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="Gothic church facade in Brussels with pointed spires and a carved arched portal, a woman walking past on the sidewalk" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/belgium/IMG_5079.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="A man photographs a small formal garden in Brussels with trimmed hedges, flower beds, and shade trees" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/belgium/IMG_5080.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Gothic church with a slender spire beside a Brussels square ringed by columns topped with green statues" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/belgium/IMG_5082.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Neoclassical columned church with a bell tower on a Brussels square, an equestrian statue standing in front" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/europe-2016/belgium/IMG_5087.jpeg"
width="300" height="101" loading="lazy" decoding="async" alt="Panorama of a long ornate palace facade across a cobbled Brussels plaza, a black limousine parked in the foreground" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/belgium/IMG_5092.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="A hand holds a sugar-crusted Belgian waffle in a paper wrapper above cobblestones and tram tracks" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/belgium/IMG_5093.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Long fountain pool with rows of small water jets along a Brussels street, people strolling past old buildings" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/belgium/IMG_5095.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Apartment bedroom in Belgium with a wicker bed, wall tapestry, bookshelf, and a desk by a bright window" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/belgium/IMG_5098.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Stone Gothic church with a dark rounded bell tower under a deep blue Brussels sky, a tall street lamp beside it" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/belgium/IMG_5099.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="Stuffed pita topped with diced tomatoes in a basket, four ramekins of sauces on a tray at an outdoor table in Belgium" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/belgium/IMG_5104.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="Brass plaque on a brick facade in Brussels marking the 1929 birthplace of actress Audrey Hepburn" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</content:encoded></item><item><title>The Louvre</title><link>https://jva.lol/travelog/europe-2016/france/paris/louvre/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jva.lol/travelog/europe-2016/france/paris/louvre/</guid><description> Europe Part 2.2.1 - The Louvre, Paris, France # The Louvre #</description><content:encoded>&lt;h1 id="europe-part-221---the-louvre-paris-france"&gt;
Europe Part 2.2.1 - The Louvre, Paris, France
&lt;a class="anchor" href="#europe-part-221---the-louvre-paris-france"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="the-louvre"&gt;
The Louvre
&lt;a class="anchor" href="#the-louvre"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;div class="book-columns flex flex-wrap"&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_4806.jpeg"
width="300" height="73" loading="lazy" decoding="async" alt="Panorama of the Louvre courtyard, visitors crossing the plaza around the glass pyramids" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_4811.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Selfie of a bearded man wearing a blue backpack in the Louvre courtyard, glass pyramid and palace wings behind" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_4817.jpeg"
width="300" height="85" loading="lazy" decoding="async" alt="Panorama of the nearly empty Louvre courtyard with ornate lampposts and the glass pyramid at left" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_4826.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="The Luxor obelisk and a large Ferris wheel at Place de la Concorde against dramatic grey clouds" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_4908.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Crowds and tour buses outside the courtyard facade of the Palais Royal in Paris on an overcast day" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_4950.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="The Mona Lisa in its gilded frame on a plain wall at the Louvre" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_4955.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="The Winged Victory of Samothrace atop its ship-prow pedestal at the Louvre, visitors gathered below" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_4963.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="Gilt-framed painting at the Louvre of a young woman with a faint halo floating in dark water" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_4964.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Visitors stand before a wall-sized painting of a cavalry battle scene in a red-walled Louvre gallery" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_4969.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Bronze relief of a reclining stag with tall antlers mounted along a stone staircase in the Louvre" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_4970.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Visitors wander a long columned sculpture hall at the Louvre lined with white marble statues" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_4980.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="Opulent dining room in the Louvre&amp;rsquo;s Napoleon III apartments, crystal chandeliers over a long set table" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_4989.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="White marble sculpture group of intertwined figures on a pedestal in a skylit Louvre gallery" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_4991.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="Tall cobalt-blue porcelain urn with ornate gilt handles and garlands beside a Louvre window" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_4999.jpeg"
width="300" height="300" loading="lazy" decoding="async" alt="Ancient Egyptian stone stela carved with three standing deities and rows of hieroglyphs at the Louvre" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_5021.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="Visitors fill a vaulted Louvre gallery of classical marble statues lit by tall windows" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_5032.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="The inverted glass pyramid hanging above shoppers in the underground mall beneath the Louvre" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_5036.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Ornate stone facade of the Louvre&amp;rsquo;s Cour Carree courtyard under blue sky with scattered clouds" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/paris/louvre/IMG_5043.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Traffic and a motorcyclist pass Place de la Concorde, with its obelisk and a Ferris wheel beyond" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</content:encoded></item><item><title>Howth</title><link>https://jva.lol/travelog/europe-2016/ireland/howth/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jva.lol/travelog/europe-2016/ireland/howth/</guid><description> Europe Part 1.2 - Howth, Ireland # Howth #</description><content:encoded>&lt;h1 id="europe-part-12---howth-ireland"&gt;
Europe Part 1.2 - Howth, Ireland
&lt;a class="anchor" href="#europe-part-12---howth-ireland"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="howth"&gt;
Howth
&lt;a class="anchor" href="#howth"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/europe-2016/ireland/howth/IMG_4675_hu_1a81de5ef8ac2f9d.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/howth/IMG_4675_hu_58540c3d8556cc18.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/howth/IMG_4675_hu_1a81de5ef8ac2f9d.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="600" loading="lazy" decoding="async" alt="Selfie on the Howth cliff walk, a dirt path winding along green headlands dotted with purple heather" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/howth/IMG_4674_hu_ed59cbcba3b8c667.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/howth/IMG_4674_hu_e844ffe1b4dd1ecd.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/howth/IMG_4674_hu_ed59cbcba3b8c667.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="600" loading="lazy" decoding="async" alt="View from the Howth cliff path over the harbor, marina, and a small offshore island under an evening sky" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/howth/IMG_4678_hu_13c403e8ef24bd68.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/howth/IMG_4678_hu_ebecf8765426350.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/howth/IMG_4678_hu_13c403e8ef24bd68.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="600" loading="lazy" decoding="async" alt="Dirt cliff path at Howth curving above the sea at dusk, a distant island under blue-gray clouds" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/howth/IMG_4648_hu_f71e38362e348454.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/howth/IMG_4648_hu_2fcdd0f6ed913852.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/howth/IMG_4648_hu_f71e38362e348454.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="800" loading="lazy" decoding="async" alt="Close selfie on the rocky shore at Howth, with a headland of green cliffs and houses across the gray bay" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Dublin</title><link>https://jva.lol/travelog/europe-2016/ireland/dublin/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jva.lol/travelog/europe-2016/ireland/dublin/</guid><description> Europe Part 1.1 - Dublin, Ireland # Dublin #</description><content:encoded>&lt;h1 id="europe-part-11---dublin-ireland"&gt;
Europe Part 1.1 - Dublin, Ireland
&lt;a class="anchor" href="#europe-part-11---dublin-ireland"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="dublin"&gt;
Dublin
&lt;a class="anchor" href="#dublin"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4569_hu_1d0fdd7986f3bb3c.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4569_hu_ccb2dbefff03a1fa.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4569_hu_1d0fdd7986f3bb3c.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="800" loading="lazy" decoding="async" alt="Selfie of a bearded man outside the arched Guinness Storehouse gate in Dublin as a cyclist passes" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4565_hu_e8da5a550a18aed.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4565_hu_e9420fb31b8cf533.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4565_hu_e8da5a550a18aed.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="600" loading="lazy" decoding="async" alt="The River Liffey in Dublin sparkling under cloudy skies, an arched stone bridge and quayside traffic ahead" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4583_hu_c8aa5865b281a4ad.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4583_hu_17ffdbb6d7f4f41f.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4583_hu_c8aa5865b281a4ad.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Canal lock gates on a tree-lined stretch of canal in Dublin under heavy grey clouds, a swan on the water" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4628_hu_fec93e8cb343e16c.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4628_hu_d32ec98e45c8af70.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4628_hu_fec93e8cb343e16c.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="800" loading="lazy" decoding="async" alt="Three friends lean in smiling for a selfie in a dim Dublin bar with a glowing backlit bar behind them" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4597_hu_225e7d7cb45393ff.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4597_hu_91ae7bce92b09534.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4597_hu_225e7d7cb45393ff.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="The stone Campanile bell tower at Trinity College Dublin, students strolling past campus signs below" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4601_hu_1330eb183f02458d.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4601_hu_ccc479171ce469a5.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4601_hu_1330eb183f02458d.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="600" loading="lazy" decoding="async" alt="People rest along the long grey stone facade of Trinity College&amp;rsquo;s Old Library beside a green lawn in Dublin" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4603_hu_ca962d6a55b67958.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4603_hu_d81c4dee8926aa9f.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4603_hu_ca962d6a55b67958.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="178" loading="lazy" decoding="async" alt="Panorama of a cobbled Dublin college square with a stone campanile, classical buildings, and people strolling under cloudy skies" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4616_hu_68bc20f0fb5a641.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4616_hu_ce828c9947e897dd.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4616_hu_68bc20f0fb5a641.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Bright red storefront of the Queen of Tarts bakery in Dublin, decorated with hanging flower baskets and award plaques" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4578_hu_90f3110877e52ea6.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4578_hu_f39438ae8fed7656.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4578_hu_90f3110877e52ea6.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Selfie of a bearded man with his arm around a bronze statue of a tousle-haired man in Dublin" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4596_hu_a3e48238a72a9e06.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4596_hu_813b34068dee7220.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4596_hu_a3e48238a72a9e06.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Pedestrians walk the cobbled path toward the Campanile at Trinity College Dublin, one in a jacket covered in world flags" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4608_hu_d11a356579487080.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4608_hu_801724da1725d882.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4608_hu_d11a356579487080.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Christ Church Cathedral&amp;rsquo;s stone tower rises over a Dublin street as pedestrians and a cyclist pass the crossing" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4612_hu_1766588b2f5b5966.jpeg" srcset="https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4612_hu_e7a278681c8356bd.jpeg 480w, https://jva.lol/travelog/europe-2016/ireland/dublin/IMG_4612_hu_1766588b2f5b5966.jpeg 800w" sizes="(max-width: 768px) 100vw, 1000px"
width="800" height="1066" loading="lazy" decoding="async" alt="Visitors walk beneath hanging flower baskets into the stone entrance of the Brazen Head pub in Dublin" /&gt;&lt;/p&gt;</content:encoded></item><item><title>Caen</title><link>https://jva.lol/travelog/europe-2016/france/caen/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jva.lol/travelog/europe-2016/france/caen/</guid><description> Europe Part 2.1 - Caen, France # Caen #</description><content:encoded>&lt;h1 id="europe-part-21---caen-france"&gt;
Europe Part 2.1 - Caen, France
&lt;a class="anchor" href="#europe-part-21---caen-france"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="caen"&gt;
Caen
&lt;a class="anchor" href="#caen"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;div class="book-columns flex flex-wrap"&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/europe-2016/france/caen/IMG_4775.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="Silver regional train cars painted with green and maroon stars in a rail yard, CAEN lettered on a water tank behind" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/caen/IMG_4736.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="Dimly lit stone-walled bar in Caen with rows of vodka bottles, crossed swords, and lanterns glowing orange" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/caen/IMG_4738.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="Empty rain-slicked pedestrian shopping street in Caen at night, streetlights reflecting off the wet cobblestones" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/caen/IMG_4741.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Gothic church with a tall pointed spire under heavy gray clouds in Caen, cars passing on the street below" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/caen/IMG_4743.jpeg"
width="300" height="67" loading="lazy" decoding="async" alt="Panorama of a grassy park and paths under an overcast sky in Caen, old stone ramparts and row houses in the distance" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/caen/IMG_4746.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="Weathered medieval stone church with a square tower and partly ruined nave under gray skies in Caen" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="flex-even markdown-inner"&gt;
&lt;p&gt;&lt;img src="https://jva.lol/travelog/europe-2016/france/caen/IMG_4749.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Selfie of a bearded man on a rainy street in Caen, the spires of a large abbey complex rising behind him" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/caen/IMG_4750.jpeg"
width="300" height="225" loading="lazy" decoding="async" alt="Neoclassical columned building in Caen behind orange construction barriers on a wet overcast street" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/caen/IMG_4751.jpeg"
width="300" height="69" loading="lazy" decoding="async" alt="Panorama of a wide gravel esplanade with flagpoles between long stone buildings under a gray sky in Caen" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/caen/IMG_4758.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="Bronze statue on a stone pedestal among flower planters on a rain-wet square in Caen, a domed church behind" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/caen/IMG_4764.jpeg"
width="300" height="400" loading="lazy" decoding="async" alt="Close selfie of a bearded man on a wet street in Caen, the stone wall of a Gothic church rising beside him" /&gt;
&lt;img src="https://jva.lol/travelog/europe-2016/france/caen/IMG_4767.jpeg"
width="300" height="83" loading="lazy" decoding="async" alt="Panorama from stone ramparts over the rooftops and church spires of Caen under an overcast sky" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</content:encoded></item></channel></rss>