<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Notionnext on My Little Blog</title><link>https://www.parkerchenca.com/tags/notionnext/</link><description>Recent content in Notionnext on My Little Blog</description><generator>Hugo</generator><language>en-us</language><copyright>Parker Chen</copyright><lastBuildDate>Thu, 10 Sep 2026 13:00:00 +0000</lastBuildDate><atom:link href="https://www.parkerchenca.com/tags/notionnext/index.xml" rel="self" type="application/rss+xml"/><item><title>Migrating to Hugo</title><link>https://www.parkerchenca.com/tech/migrating-to-hugo/</link><pubDate>Thu, 10 Sep 2026 13:00:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/migrating-to-hugo/</guid><description>Why NotionNext had to go, and few problems Hugo handed me on the way in.</description><content:encoded><![CDATA[<p>I moved my blog to Hugo. I&rsquo;ve had some free time in the gap between
graduating and landing a job, so I finally got around to something I&rsquo;d been
putting off for a while.</p>
<h2 id="why-migrate-at-all">Why migrate at all</h2>
<p>A few things pushed me toward it. A couple of years into the Computer
Programming and Analysis program, I&rsquo;d seen enough tools and tradeoffs that
&ldquo;run a lighter stack&rdquo; stopped being an abstract idea and turned into an
actual plan. <a href="https://github.com/notionnext-org/NotionNext">NotionNext</a> is a
good project. I&rsquo;ll get into why it stopped working for me, but it&rsquo;s more machinery than a
personal blog needs.</p>
<p>I&rsquo;d also run out of excuses not to touch it. One of my rules is: if it works, don&rsquo;t
touch it, and that&rsquo;s exactly why this sat on my todo list for so long.
But &ldquo;I don&rsquo;t fully understand web app internals yet&rdquo; was not true
for me anymore, and once that excuse is gone, all that&rsquo;s left is a task
I&rsquo;m avoiding.</p>
<p>And practically, between graduation and the next job I have more free time
than I&rsquo;ll have again for a while, so it made sense to sit with my notes and
actually figure out what I&rsquo;d learned. Getting back into regular blogging
needed a platform I&rsquo;d actually want to open.</p>
<p>I also looked at Hexo and Astro. The short version of why Hugo won is in
<a href="/tech/building-this-blog/">Building This Blog</a>: it comes down to how content
maps to URLs and how each one handles Org-mode.</p>
<p>The longer version is that this year I went through IDEA, VS Code, Neovim, and Emacs for different kinds
of work. IDEA is still my favorite for Java: its indexing and language
support make everything else feel like it&rsquo;s guessing. VS Code is the
balanced choice once you&rsquo;re off Java or working on something large; the
ecosystem covers file browsing, Markdown rendering, and even reading a PDF
without leaving the editor. And since I live in a terminal (WSL as my main
environment, so I get fzf, rg, and the Linux tooling that things like Claude
Code supported first) right now, Neovim is hard to pass up: it&rsquo;s light, fast, and
everything stays on the keyboard.</p>
<p>None of that is actually why I picked Hugo, though. I picked Hugo because I
fell for <em>Emacs</em>. It&rsquo;s the first tool that gave me what &ldquo;one unified
environment&rdquo; actually means. The Org mode is the part I like most: think of
it as Markdown crossed with a Jupyter notebook. When I want code output
sitting inside my notes instead of copy-pasted from a terminal, Org is about
the best format for that. Hugo happens to parse Org natively, so the fit was
already there before I went looking for it.</p>
<h3 id="why-not-just-stay-on-notionnext">Why not just stay on NotionNext</h3>
<p>This is the part with real evidence behind it, not just preference:</p>
<ol>
<li>
<p>It&rsquo;s a React app with a long dependency chain.</p>
</li>
<li>
<p>It&rsquo;s hard-coupled to the Notion API. A major API update once took the
whole blog down in one shot, and there was nothing I could do about it on
my end.</p>
</li>
<li>
<p>Forking is the wrong shape for this. Maintaining my own fork meant every
upstream change was a potential merge conflict and a version-bump
decision I didn&rsquo;t want to make.</p>
</li>
<li>
<p>Error rates I never got to the bottom of. Vercel&rsquo;s dashboard would
occasionally show something like this:</p>
<figure>
       <img loading="lazy" src="high-error-rate.png"
            alt="Vercel observability panel showing a 58% error rate"/> <figcaption>
               <p>Vercel&rsquo;s own dashboard, mid outage.</p>
           </figcaption>
   </figure>

</li>
<li>
<p>The deployments themselves were flaky, on top of everything else. A run
of &ldquo;Updated&rdquo; deploys failing back to back on production isn&rsquo;t something
you want in your history:</p>
<figure>
       <img loading="lazy" src="deployment-errors.png"
            alt="A string of failed Vercel deployments"/> <figcaption>
               <p>A run of production deploys failing back to back.</p>
           </figcaption>
   </figure>

</li>
<li>
<p>React&rsquo;s CVE treadmill. Every so often there was a fresh CVE to patch that
had nothing to do with anything I&rsquo;d written:</p>
<figure>
       <img loading="lazy" src="cve-fix.png"
            alt="A commit titled &#39;Fix React Server Components CVE vulnerabilities&#39;"/> <figcaption>
               <p>A CVE patch that had nothing to do with anything I&rsquo;d written.</p>
           </figcaption>
   </figure>

</li>
</ol>
<p>None of that is exotic. It&rsquo;s just the cost of running someone else&rsquo;s React
app instead of a static site, and I&rsquo;d paid it long enough.</p>
<h2 id="how-i-migrated">How I migrated</h2>
<h3 id="getting-oriented">Getting oriented</h3>
<p>I started at Hugo&rsquo;s own site, found the themes gallery, and looked for
something that fit a personal, bilingual blog. PaperMod stood out: MIT
licensed, 13.9k GitHub stars, still getting updates, and the demo already
looked close to what I wanted without any customization.</p>
<figure>
    <img loading="lazy" src="hugo-themes.png"
         alt="Hugo&#39;s themes page showing the PaperMod theme"/> <figcaption>
            <p>PaperMod&rsquo;s listing in Hugo&rsquo;s theme gallery.</p>
        </figcaption>
</figure>

<p>From there it was the usual mix: reading the theme&rsquo;s own docs, skimming its
GitHub repo for how people actually configure it, and asking an AI assistant
questions that would&rsquo;ve otherwise cost an evening of trial and error, mostly
which config keys are current versus deprecated, and how Hugo&rsquo;s page bundles
are supposed to be laid out.</p>
<h3 id="actually-doing-it">Actually doing it</h3>
<p>The content move itself was mechanical: 45 posts pulled out of a Notion
export, cleaned up, and dropped into <code>content/</code>. The interesting part was
everything that broke after the content was in place, and none of it showed
up until I actually tried to use the feature.</p>
<h4 id="one-issue-oversized-record-failed-the-whole-deploy">One Issue: oversized record failed the whole deploy</h4>
<p>My Algolia push script truncates each post&rsquo;s content to stay under Algolia&rsquo;s
10KB per-record limit, but I&rsquo;d only truncated <code>content</code>, not <code>summary</code>. Hugo
builds an automatic summary by grabbing whole content blocks, and one post
that opened with a long block produced an 11KB summary. Algolia rejected the
record, the push script exited non-zero, and that failed the entire Vercel
build: not a partial deploy with one missing search result, a hard stop.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="s">&#34;summary&#34;</span><span class="w"> </span><span class="p">(.</span><span class="nx">Summary</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nx">plainify</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nx">truncate</span><span class="w"> </span><span class="mi">300</span><span class="w"> </span><span class="s">&#34;&#34;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nx">htmlUnescape</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nx">htmlUnescape</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><h3 id="cutting-over">Cutting over</h3>
<p>The old blog was still live on Vercel, wired to <a href="https://www.parkerchenca.com">www.parkerchenca.com</a> and
parkerchenca.com. First I paused that project.</p>
<p>Then it was straightforward: pull the domain off the old project, import the
new repo as its own Vercel project, add the environment variables, and point
the domain back at the new one. Vercel won&rsquo;t let the same domain sit on two
projects at once, so the order matters.</p>
<p>Comments were the last piece: giscus needed the repository to be public with
GitHub Discussions turned on and its own GitHub App installed before it would
actually render anything.</p>
<p>And then, boom, it was done. Simpler than I expected, and the environment
variables even came out to about half of what NotionNext needed.</p>
<h3 id="where-that-leaves-things">Where that leaves things</h3>
<p>The blog is live, search works, comments work (I think the light/dark toggle
also flips the comment widget now, but I haven&rsquo;t actually tested it in a
browser myself. If you&rsquo;ve read this far, give it a try and tell me in the
comments below ;D ).</p>
<h2 id="useful-links">Useful links</h2>
<p>Hugo:</p>
<ul>
<li><a href="https://github.com/adityatelange/hugo-PaperMod">https://github.com/adityatelange/hugo-PaperMod</a></li>
<li><a href="https://github.com/adityatelange/hugo-PaperMod/wiki">https://github.com/adityatelange/hugo-PaperMod/wiki</a></li>
</ul>
<p>My Blog:</p>
<ul>
<li><a href="https://github.com/BHChen24/MyLittleBlog-Hugo/">https://github.com/BHChen24/MyLittleBlog-Hugo/</a></li>
</ul>
]]></content:encoded></item></channel></rss>