<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://nathankoerschner.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://nathankoerschner.com/" rel="alternate" type="text/html" /><updated>2026-03-03T20:55:54+00:00</updated><id>https://nathankoerschner.com/feed.xml</id><title type="html">Nathan’s Blog</title><subtitle>Thoughts on life &amp; technology</subtitle><author><name>Nathan Koerschner</name></author><entry><title type="html">nicequestions.com</title><link href="https://nathankoerschner.com/2026/02/09/nicequestions.html" rel="alternate" type="text/html" title="nicequestions.com" /><published>2026-02-09T00:00:00+00:00</published><updated>2026-02-09T00:00:00+00:00</updated><id>https://nathankoerschner.com/2026/02/09/nicequestions</id><content type="html" xml:base="https://nathankoerschner.com/2026/02/09/nicequestions.html"><![CDATA[<p><img src="/assets/images/nicequestions-screenshot.png" alt="The nicequestions.com homepage showing a masonry grid of beautiful photographs, each paired with a thoughtful question" style="width: 100%; border-radius: 8px; margin-bottom: 20px;" /></p>
<p style="font-size: 0.85em; color: #666; margin-top: -15px; margin-bottom: 30px;">The homepage: a masonry grid of community-submitted questions paired with curated photography</p>

<p><a href="https://nicequestions.com">nicequestions.com</a> is a community-driven site where anyone can submit a thoughtful question. Each question gets paired with a photograph and displayed in a browsable masonry grid. Questions are organized into categories like “For Crossroads,” “For Loved Ones,” “Making Friends,” “Big Questions,” “For A Gathering,” and “Meet Yourself.”</p>

<p>I built it over a weekend in January 2026 using Next.js, Firebase, and a couple of external APIs.</p>

<h2 id="the-llm-gate">The LLM Gate</h2>

<p>The core moderation challenge: how do you let anyone submit a question while keeping the quality bar high, without manual review?</p>

<p>The answer is an LLM gate. Every submission gets sent to OpenAI’s GPT-4o-mini before it touches the database. The model checks whether the submission is actually a question (rejecting statements, commands, and gibberish), screens for harmful content, and filters spam. It’s deliberately permissive—the goal is to keep the door open for creative and unexpected questions while catching the obvious junk.</p>

<p>When a question passes, the model also cleans up grammar and punctuation and assigns it to one of the six categories. The whole validation, cleanup, and categorization happens in a single API call with structured JSON output at a low temperature for consistency.</p>

<h2 id="where-the-images-come-from">Where the Images Come From</h2>

<p>Each accepted question gets paired with a random photograph pulled from a curated Unsplash collection of film-style photography (2300+ photos). The images aren’t hotlinked—they’re downloaded as buffers and uploaded to Firebase Storage. This means the site doesn’t depend on Unsplash’s CDN at runtime, and the images persist even if the original Unsplash photos are removed.</p>

<p>The app also tracks each photo’s Unsplash ID in the database to prevent the same image from appearing twice.</p>

<h2 id="the-database">The Database</h2>

<p>There’s no traditional database here—everything lives in Firestore. Each question is a document with the question text, its assigned category, the Firebase Storage image URL, the Unsplash photo ID, and a timestamp. A separate config document tracks daily submission limits (200 attempts and 200 accepted questions per day) as a simple abuse prevention measure.</p>

<h2 id="stack">Stack</h2>

<ul>
  <li><strong>Next.js</strong> (App Router) on <strong>Vercel</strong></li>
  <li><strong>Firebase</strong> (Firestore + Storage)</li>
  <li><strong>OpenAI</strong> GPT-4o-mini for question validation</li>
  <li><strong>Unsplash API</strong> for sourcing images</li>
  <li><strong>Tailwind CSS</strong> for styling</li>
</ul>

<p>The whole thing is anonymous—no user accounts, no authentication. Just a text box, an AI gatekeeper, and a growing collection of questions worth asking.</p>

<h2 id="building-with-openclaw">Building with OpenClaw</h2>

<p>During this project I was trying out OpenClaw, and it was quite amazing to use the app on my phone and send text messages to have the app debugged.</p>]]></content><author><name>Nathan Koerschner</name></author><category term="Other" /><summary type="html"><![CDATA[The homepage: a masonry grid of community-submitted questions paired with curated photography]]></summary></entry><entry><title type="html">Create What You Consume</title><link href="https://nathankoerschner.com/2025/11/26/create-what-you-consume.html" rel="alternate" type="text/html" title="Create What You Consume" /><published>2025-11-26T00:00:00+00:00</published><updated>2025-11-26T00:00:00+00:00</updated><id>https://nathankoerschner.com/2025/11/26/create-what-you-consume</id><content type="html" xml:base="https://nathankoerschner.com/2025/11/26/create-what-you-consume.html"><![CDATA[<p>A simple idea is to produce what you enjoy consuming. I don’t have a big theory behind it. It just feels like a way to keep things in balance.</p>

<p>This post exists because I’m trying to follow that advice myself. I often consume a lot of content like this.</p>

<p>If you’re reading this, you probably do too. So think about whether creating a bit more and consuming a bit less might bring things into better balance.</p>]]></content><author><name>Nathan Koerschner</name></author><category term="Other" /><summary type="html"><![CDATA[A simple idea is to produce what you enjoy consuming. I don’t have a big theory behind it. It just feels like a way to keep things in balance.]]></summary></entry><entry><title type="html">Notes Are for Action</title><link href="https://nathankoerschner.com/2025/11/26/notes-are-for-action.html" rel="alternate" type="text/html" title="Notes Are for Action" /><published>2025-11-26T00:00:00+00:00</published><updated>2025-11-26T00:00:00+00:00</updated><id>https://nathankoerschner.com/2025/11/26/notes-are-for-action</id><content type="html" xml:base="https://nathankoerschner.com/2025/11/26/notes-are-for-action.html"><![CDATA[<p>Status: jotting this down quickly so I can clear it off my plate (to refine later)</p>

<p>I’ve come to see notes as useful only when they lead to action. I used to enjoy capturing thoughts and storing them in notebooks or apps, but now I avoid that.</p>

<p>In practice, this means keeping a small “queue” of notes—on paper or digitally—that each support some action. It forces me to either do something with them or remove them.</p>]]></content><author><name>Nathan Koerschner</name></author><category term="Other" /><summary type="html"><![CDATA[Status: jotting this down quickly so I can clear it off my plate (to refine later)]]></summary></entry><entry><title type="html">Re-wrap Ideas</title><link href="https://nathankoerschner.com/2025/11/26/rewrap-ideas.html" rel="alternate" type="text/html" title="Re-wrap Ideas" /><published>2025-11-26T00:00:00+00:00</published><updated>2025-11-26T00:00:00+00:00</updated><id>https://nathankoerschner.com/2025/11/26/rewrap-ideas</id><content type="html" xml:base="https://nathankoerschner.com/2025/11/26/rewrap-ideas.html"><![CDATA[<p>I once saw someone say to convey ideas rather than quote them. If you understand something, it becomes yours—you can share it in your own terms.</p>

<p>What’s the real value in tracing an idea’s lineage? It feels secondary to the idea itself. Context is like explaining the history of a technology when people mostly care about the technology. Those who want the background are engaging at a different layer.</p>

<p>If readers are anything like me, they prefer fewer links. Articles overloaded with them often point to pages whose main substance is already expressed by the surrounding sentence.</p>

<p>I’ve long felt pulled toward some grand system for storing ideas. Some people capture excerpts obsessively; that makes sense if you care about catalogs of words, but if you care about ideas, excerpts lose too much. I think I’ve settled on this: if an idea is worth keeping, it’s worth re-wrapping in your own form. Make the idea your own.</p>]]></content><author><name>Nathan Koerschner</name></author><category term="Other" /><summary type="html"><![CDATA[I once saw someone say to convey ideas rather than quote them. If you understand something, it becomes yours—you can share it in your own terms.]]></summary></entry><entry><title type="html">Setting up a Blog</title><link href="https://nathankoerschner.com/2025/11/01/setting-up-a-blog.html" rel="alternate" type="text/html" title="Setting up a Blog" /><published>2025-11-01T00:00:00+00:00</published><updated>2025-11-01T00:00:00+00:00</updated><id>https://nathankoerschner.com/2025/11/01/setting-up-a-blog</id><content type="html" xml:base="https://nathankoerschner.com/2025/11/01/setting-up-a-blog.html"><![CDATA[<p>Today (in the past 10 minutes) I setup this blog. I’ve been wanting to have a bit more of an outlet for various tidbits I think others would find helpful.
Back in 2019-2021 I would use Twitter for that, but have since deleted my account. In looking to start back up with something like that, I realized I might as well just create a website. The beauty of this is there are no rules!
I used to think of blogging as an activity which required planning, composition, and focused, serious blogging time. My approach here is going to be more in the vein of tweeting than writing essays.</p>

<p><em>I set this up using <a href="https://chadbaldwin.net/2021/03/14/how-to-build-a-sql-blog.html">this very convenient guide</a>.</em>
<em>To see the Github repo for this blog, visit <a href="https://github.com/nathankoerschner/nathankoerschner.github.io/">https://github.com/nathankoerschner/nathankoerschner.github.io/</a></em></p>]]></content><author><name>Nathan Koerschner</name></author><category term="Other" /><summary type="html"><![CDATA[Today (in the past 10 minutes) I setup this blog. I’ve been wanting to have a bit more of an outlet for various tidbits I think others would find helpful. Back in 2019-2021 I would use Twitter for that, but have since deleted my account. In looking to start back up with something like that, I realized I might as well just create a website. The beauty of this is there are no rules! I used to think of blogging as an activity which required planning, composition, and focused, serious blogging time. My approach here is going to be more in the vein of tweeting than writing essays.]]></summary></entry><entry><title type="html">མིང་ཚིག་བཟོ་སྒྲིག་གཉེན་ཆས། (Tibetan Notes App)</title><link href="https://nathankoerschner.com/2024/04/27/tibetan-notes-app.html" rel="alternate" type="text/html" title="མིང་ཚིག་བཟོ་སྒྲིག་གཉེན་ཆས། (Tibetan Notes App)" /><published>2024-04-27T00:00:00+00:00</published><updated>2024-04-27T00:00:00+00:00</updated><id>https://nathankoerschner.com/2024/04/27/tibetan-notes-app</id><content type="html" xml:base="https://nathankoerschner.com/2024/04/27/tibetan-notes-app.html"><![CDATA[<p>A React-Native app for the collection of Tibetan terms. Solves the problem of Tibetan alphabetical sort, which is not correctly implemented in most operating systems. Built at the request of His Holiness the Drikung Kyabgön with collaborators for design and Tibetan translation.</p>

<p><a href="https://github.com/nathankoerschner/tibetan-notes-app">View on GitHub</a></p>

<h3 id="support">Support</h3>

<p>If you need support, please contact me via email.</p>

<p><strong>Privacy policy:</strong> No data of any kind is collected, shared, or stored.</p>]]></content><author><name>Nathan Koerschner</name></author><category term="Other" /><summary type="html"><![CDATA[A React-Native app for the collection of Tibetan terms. Solves the problem of Tibetan alphabetical sort, which is not correctly implemented in most operating systems. Built at the request of His Holiness the Drikung Kyabgön with collaborators for design and Tibetan translation.]]></summary></entry><entry><title type="html">Red Fox Analytics: Rebuilding a Data Company’s Infrastructure from the Ground Up</title><link href="https://nathankoerschner.com/2024/03/01/red-fox-analytics.html" rel="alternate" type="text/html" title="Red Fox Analytics: Rebuilding a Data Company’s Infrastructure from the Ground Up" /><published>2024-03-01T00:00:00+00:00</published><updated>2024-03-01T00:00:00+00:00</updated><id>https://nathankoerschner.com/2024/03/01/red-fox-analytics</id><content type="html" xml:base="https://nathankoerschner.com/2024/03/01/red-fox-analytics.html"><![CDATA[<p><img src="/assets/images/red-fox-team.jpeg" alt="The Red Fox Analytics team: Matt Mohorn (CTO), Chris Mauzé (CEO), Nathan Koerschner, and Amer Tadmori (COO)" style="width: 100%; max-width: 600px; border-radius: 8px; margin-bottom: 20px;" /></p>
<p style="font-size: 0.85em; color: #666; margin-top: -15px; margin-bottom: 30px;">Left to right: Matt Mohorn (CTO), Chris Mauzé (Founder &amp; CEO), myself, and Amer Tadmori (COO)</p>

<p>When I joined Red Fox Analytics in 2022, the company had just crossed $1M in revenue, but the data infrastructure behind the product was held together with duct tape. The same logical pipelines existed in multiple places across GUI-based tools like Alteryx, Talend, and Tableau Prep, with no single source of truth and no scalable way to make changes. My job was to consolidate everything into code without breaking anything for live clients.</p>

<p>The catch: I had almost no SQL experience and zero exposure to dbt, the framework we’d chosen for the transformation layer. So before I could rebuild anything, I had to teach myself—learning SQL and dbt in real time while simultaneously keeping the existing pipelines running for clients who couldn’t afford a single day of broken data.</p>

<p>That meant every day was a balancing act: maintaining and debugging the legacy GUI workflows to keep reports flowing on time, while carving out space to design the system that would replace them.</p>

<h2 id="owning-the-full-elt-stack">Owning the Full ELT Stack</h2>

<p>As I dug into the problem, I realized that rebuilding the transformation layer alone wouldn’t be enough. The fragmentation ran through every stage of the pipeline, and to actually fix this, I’d need to own the full ELT stack.</p>

<p><strong>Extract:</strong> Extraction was handled by an offshore team pulling data from manual portals. I trained them on standardized workflows using bash scripts to invoke pipelines consistently.</p>

<p><strong>Load:</strong> I built a Python-based ingestion engine driven by JSON spec files, where each pipeline had its own configuration that defined how files were validated, parsed, and loaded.</p>

<p><strong>Transform:</strong> I designed a multi-tenant dbt architecture that served all clients from a single codebase, and wrote custom dbt macros encoding the business analytical logic specific to our CPG clients—sales velocity metrics, time period aggregation calculations, and inventory management metrics that had previously lived as scattered, manual calculations across the GUI tools.</p>

<h2 id="scaling-without-additional-engineering-hires">Scaling Without Additional Engineering Hires</h2>

<p>I built the platform to handle per-tenant customizations, so each client could tailor their data models to their specific needs without forking the shared codebase. A key part of this architecture was designing the customization layer to be accessible to non-engineers. I trained the nontechnical team in basic SQL so they could create and update atomic merchant customizations themselves, removing me as a bottleneck and scaling the team’s capacity without additional engineering hires.</p>

<p>I paired this with a custom orchestration layer on Google Cloud and managed the data warehouse migration from Snowflake to BigQuery as part of the broader overhaul.</p>

<h2 id="results">Results</h2>

<p>We eliminated reliance on Alteryx, Talend, and Tableau Prep, and reduced pipeline changes from hours of manual cross-tool work to a single code commit.</p>

<p>Once the core infrastructure was stable, I helped the CEO evaluate and select a CTO, then partnered with him to build the application layer that surfaced this data through an embedded BI tool for clients.</p>

<h2 id="acquisition">Acquisition</h2>

<p>In March 2024, <a href="https://www.daasity.com/post/daasity-acquires-red-fox-analytics">Daasity Inc. acquired Red Fox Analytics</a>, specifically to integrate the retail CPG data infrastructure and analytical logic I’d helped build into their broader platform.</p>]]></content><author><name>Nathan Koerschner</name></author><category term="Other" /><summary type="html"><![CDATA[Left to right: Matt Mohorn (CTO), Chris Mauzé (Founder &amp; CEO), myself, and Amer Tadmori (COO)]]></summary></entry><entry><title type="html">Things 3 to Anki</title><link href="https://nathankoerschner.com/2022/09/21/things3-to-anki.html" rel="alternate" type="text/html" title="Things 3 to Anki" /><published>2022-09-21T00:00:00+00:00</published><updated>2022-09-21T00:00:00+00:00</updated><id>https://nathankoerschner.com/2022/09/21/things3-to-anki</id><content type="html" xml:base="https://nathankoerschner.com/2022/09/21/things3-to-anki.html"><![CDATA[<p>A tool to export differentiated Things 3 ‘tasks’ as Anki flashcards. Includes smart “clozeing” (no need to type each “c1::”, only need to wrap fields in double brackets).</p>

<p><a href="https://github.com/nathankoerschner/things3toanki">View on GitHub</a></p>]]></content><author><name>Nathan Koerschner</name></author><category term="Other" /><summary type="html"><![CDATA[A tool to export differentiated Things 3 ‘tasks’ as Anki flashcards. Includes smart “clozeing” (no need to type each “c1::”, only need to wrap fields in double brackets).]]></summary></entry><entry><title type="html">Things to CSV</title><link href="https://nathankoerschner.com/2022/04/11/things-to-csv.html" rel="alternate" type="text/html" title="Things to CSV" /><published>2022-04-11T00:00:00+00:00</published><updated>2022-04-11T00:00:00+00:00</updated><id>https://nathankoerschner.com/2022/04/11/things-to-csv</id><content type="html" xml:base="https://nathankoerschner.com/2022/04/11/things-to-csv.html"><![CDATA[<p>A Python3 tool to export your Things 3 database to a CSV, using the <a href="https://github.com/thingsapi/things.py">Things Python API</a>.</p>

<p><a href="https://github.com/nathankoerschner/things_to_csv">View on GitHub</a></p>]]></content><author><name>Nathan Koerschner</name></author><category term="Other" /><summary type="html"><![CDATA[A Python3 tool to export your Things 3 database to a CSV, using the Things Python API.]]></summary></entry><entry><title type="html">Colony Graph Scraper and ETL</title><link href="https://nathankoerschner.com/2022/02/15/colony-graph-scraper.html" rel="alternate" type="text/html" title="Colony Graph Scraper and ETL" /><published>2022-02-15T00:00:00+00:00</published><updated>2022-02-15T00:00:00+00:00</updated><id>https://nathankoerschner.com/2022/02/15/colony-graph-scraper</id><content type="html" xml:base="https://nathankoerschner.com/2022/02/15/colony-graph-scraper.html"><![CDATA[<p>A pipeline for scraping data from the Colony DAO platform and ingesting it to the chainverse graphQL database.</p>

<p><a href="https://github.com/nathankoerschner/ColonyGraphETL">View on GitHub</a></p>]]></content><author><name>Nathan Koerschner</name></author><category term="Other" /><summary type="html"><![CDATA[A pipeline for scraping data from the Colony DAO platform and ingesting it to the chainverse graphQL database.]]></summary></entry></feed>