<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Trevor Fernando — Writing</title><description>Notes on apps, security, and creative work.</description><link>https://trevorfernando.com/</link><language>en-us</language><atom:link href="https://trevorfernando.com/writing/rss.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Mon, 28 Sep 2026 16:39:18 GMT</lastBuildDate><item><title>First post</title><link>https://trevorfernando.com/writing/first-post</link><guid isPermaLink="true">https://trevorfernando.com/writing/first-post</guid><description>An opening note on the writing surface — what lives here, how it gets here, and the small set of conventions I&apos;m holding myself to.</description><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most of the site is finished work. The writing surface is the part that isn’t — by design.&lt;/p&gt;
&lt;p&gt;These pages collect the half-formed thoughts that don’t fit anywhere else: notes-in-progress on apps I’m building, vulnerabilities I’m reading about, the occasional film essay when something hits hard enough to write about. The voice is closer to a notebook than a journal.&lt;/p&gt;
&lt;h2 id=&quot;how-it-gets-here&quot;&gt;How it gets here&lt;/h2&gt;
&lt;p&gt;The pipeline is deliberately small. Each essay is an &lt;code&gt;.mdx&lt;/code&gt; file, validated by &lt;a href=&quot;https://zod.dev/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Zod&lt;/a&gt; against a shared schema in &lt;code&gt;src/content/config.ts&lt;/code&gt;. Authoring looks like this:&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;/_astro/ec.8ckcv.css&quot;/&gt;&lt;script type=&quot;module&quot; src=&quot;/_astro/ec.g1fg5.js&quot;&gt;&lt;/script&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; essays &lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; defineCollection&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;loader&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; glob&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; pattern&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; &lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;ec-tc-7a5a18&quot;&gt;**/*.{md,mdx}&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; base&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; &lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;ec-tc-7a5a18&quot;&gt;./src/content/essays&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; &lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;schema&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; baseFrontmatter&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;heroImage&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ec-tc-7a5a18&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;optional&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;heroImageAlt&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ec-tc-7a5a18&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;optional&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;ogImageOverride&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ec-tc-7a5a18&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;optional&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The same MDX renders here, in the &lt;a href=&quot;/writing/rss.xml&quot;&gt;RSS feed&lt;/a&gt;, and (eventually) on the throwback surface — three views of the same single source. Code blocks pick up syntax highlighting at build time; outbound links carry the right &lt;code&gt;rel&lt;/code&gt; attributes automatically; per-post Open Graph cards get rendered to PNG at build and served as static assets.&lt;/p&gt;
&lt;h2 id=&quot;what-im-holding-myself-to&quot;&gt;What I’m holding myself to&lt;/h2&gt;
&lt;p&gt;Three small rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One topic per post. If I find myself writing two posts in one, I split.&lt;/li&gt;
&lt;li&gt;No dates in titles. The frontmatter has the date; saying it twice is fluff.&lt;/li&gt;
&lt;li&gt;Outbound links earn their place. If a link doesn’t add something the prose can’t, it doesn’t go in.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s it. The rest of the surface — typography, rhythm, the voice — is doing the real work.&lt;/p&gt;</content:encoded></item><item><title>Placeholder essay one</title><link>https://trevorfernando.com/writing/example-1</link><guid isPermaLink="true">https://trevorfernando.com/writing/example-1</guid><description>Placeholder essay 1 — replace with real content before public launch. Body exercises a code block and an outbound link to keep the index/RSS/OG pipeline honest.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is a placeholder essay shipped alongside the writing surface in 006. It exists so the home-page “Recent writing” section, the writing index, and the RSS feed all flex against more than one entry from day one. Replace the body with real material before public launch.&lt;/p&gt;
&lt;p&gt;The pipeline below is the authoring shape:&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;/_astro/ec.8ckcv.css&quot;/&gt;&lt;script type=&quot;module&quot; src=&quot;/_astro/ec.g1fg5.js&quot;&gt;&lt;/script&gt;&lt;figure class=&quot;frame is-terminal&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;span class=&quot;title&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sr-only&quot;&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;ec-tc-635b6d&quot;&gt;# Add an essay&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;echo &lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;ec-tc-7a5a18&quot;&gt;---\ntitle: ...\nslug: ...\n...&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; &lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; &lt;/span&gt;&lt;span class=&quot;ec-tc-7a5a18&quot;&gt;src/content/essays/&amp;lt;slug&amp;gt;.mdx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;pnpm &lt;/span&gt;&lt;span class=&quot;ec-tc-7a5a18&quot;&gt;build&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For more on the schema, see &lt;a href=&quot;https://docs.astro.build/en/guides/content-collections/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;the Astro Content Collections docs&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Placeholder essay two</title><link>https://trevorfernando.com/writing/example-2</link><guid isPermaLink="true">https://trevorfernando.com/writing/example-2</guid><description>Placeholder essay 2 — replace with real content before public launch. Mirrors example-1&apos;s shape so cards stack consistently in the index and home-page section.</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Second placeholder essay. Same shape as the first — a paragraph, a code block, and an outbound link — so the index sort and the home-page “Recent writing” section both have something to flex against.&lt;/p&gt;
&lt;p&gt;A second snippet, in a different language to confirm Shiki picks the right grammar at build time:&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;/_astro/ec.8ckcv.css&quot;/&gt;&lt;script type=&quot;module&quot; src=&quot;/_astro/ec.g1fg5.js&quot;&gt;&lt;/script&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;ec-tc-635b6d&quot;&gt;# Plain placeholder snippet&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;def&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; hello&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; str&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; &lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; str&lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt; &lt;/span&gt;&lt;span class=&quot;ec-tc-5d5566&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;ec-tc-7a5a18&quot;&gt;&amp;quot;Hello, &lt;/span&gt;&lt;span class=&quot;ec-tc-7a5a18&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ec-tc-251f2c&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;ec-tc-7a5a18&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;ec-tc-7a5a18&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For background on the broader portfolio approach, &lt;a href=&quot;https://github.com/banannerrammers/personal-portfolio/blob/main/.specify/memory/constitution.md&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;see the constitution&lt;/a&gt;.&lt;/p&gt;</content:encoded></item></channel></rss>