<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Kelvin Clark Te</title>
  <subtitle>I help businesses optimize their processes and solve their problems — systems, ecommerce, and whatever else they can think of.</subtitle>
  <link href="https://kelvinclarkte.gitlab.io/feed.xml" rel="self" />
  <link href="https://kelvinclarkte.gitlab.io/" />
  <updated>2026-07-31T00:00:00Z</updated>
  <id>https://kelvinclarkte.gitlab.io/</id>
  <author>
    <name>Kelvin Clark Te</name>
    <email>inquiry@kelvinclarkte.com</email>
  </author>
  
    <entry>
      <title>Rebuilding this site on Eleventy</title>
      <link href="https://kelvinclarkte.gitlab.io/blog/rebuilding-this-site/" />
      <updated>2026-07-31T00:00:00Z</updated>
      <id>https://kelvinclarkte.gitlab.io/blog/rebuilding-this-site/</id>
      
        <summary>Why I moved my portfolio off Angular and onto a static site generator, and what changed.</summary>
      
      <content type="html">&lt;p&gt;This site used to be an Angular single-page app. It is now a pile of static
HTML generated by &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;, and it loads considerably
faster for it.&lt;/p&gt;
&lt;h2&gt;Why the change&lt;/h2&gt;
&lt;p&gt;The old version shipped an entire SPA framework, a router and a runtime to
render what is, in practice, four pages of mostly text. My work history lived
inside a TypeScript component as an array of objects, which meant adding a
project required touching application code and redeploying a build pipeline.&lt;/p&gt;
&lt;p&gt;For a portfolio, that trade is backwards. There is no interactivity to speak
of, no authenticated state, no data fetching. Every page can be known at build
time.&lt;/p&gt;
&lt;h2&gt;What it looks like now&lt;/h2&gt;
&lt;p&gt;The content lives in plain data files and Markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;src/
  _data/works.js      → work history
  posts/*.md          → blog posts
  _includes/          → layouts and macros
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Adding a project is now an edit to one array. Adding a blog post is dropping a
Markdown file into &lt;code&gt;src/posts/&lt;/code&gt;. The build emits static HTML with no client-side
framework at all — the only JavaScript on the page is a theme toggle and a
scroll-reveal observer, both of which degrade gracefully to nothing.&lt;/p&gt;
&lt;h2&gt;The parts worth keeping&lt;/h2&gt;
&lt;p&gt;Not everything needed replacing. The work history itself — five companies,
thirteen projects, a decade of it — carried over almost verbatim. That content
was always the point; the framework around it was incidental.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rewrite the delivery mechanism, keep the substance.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you&#39;re sitting on an SPA that renders static content, it&#39;s worth asking what
the framework is actually buying you.&lt;/p&gt;
</content>
    </entry>
  
</feed>
