<?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" xmlns:media="http://search.yahoo.com/mrss/">
<channel>
  <title>Andreas Sefzigs Blog</title>
  <link>https://homepage.sefzig-net.workers.dev/blog</link>
  <description>Posts from the leading edge of innovative technology.</description>
  <atom:link href="https://homepage.sefzig-net.workers.dev/blog/feed.xml" rel="self" type="application/rss+xml" />
  <item>
    <title>Images</title>
    <link>https://homepage.sefzig-net.workers.dev/blog/images</link>
    <guid isPermaLink="true">https://homepage.sefzig-net.workers.dev/blog/images</guid>
    <pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
    <description>A easy-to-use tool to generate images with customizable templates.</description>
    <content:encoded><![CDATA[<p>On popular request, I refined the app I use to generate images, so that everybody can use it, either in my Homepage or locally as a simple html file.</p>
<figure><img src="https://pub-4ca8413ab24a4756bcb3a137633f94ef.r2.dev/blog/images/images/images/illustration_content.webp" alt="A user generates an image with this app which impresses her colleagues" /></figure>
<p>Creating images with AI is fun. But once you want to generate a family of images, you invest more time into managing your prompt than into having fun.</p>
<p>With <a href="https://homepage.sefzig-net.workers.dev/app/images">Images</a>, you can use my prompt templates and customize them to your needs or create your own templates and distribute them:</p>
<p><a href="https://homepage.sefzig-net.workers.dev/app/images">Open the App</a></p>
<p>Since I am not rich (but I assume you are :D), you will have to bring your own OpenAI API Key (you can get it <a href="https://platform.openai.com/api-keys">here</a>).</p>
<blockquote><p>Entering your key into my site will not allow me to access it, as it is encrypted and decrypted by your browser. Feel free to investigate in my <a href="https://homepage.sefzig-net.workers.dev/blog/images#tba">&quot;Homepage&quot; repository</a>.</p></blockquote>]]></content:encoded>
    <media:thumbnail url="/cdn/placeholder/image.svg" />
  </item>
  <item>
    <title>Taste</title>
    <link>https://homepage.sefzig-net.workers.dev/blog/taste</link>
    <guid isPermaLink="true">https://homepage.sefzig-net.workers.dev/blog/taste</guid>
    <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
    <description>Turns out that AI does not replace the engineer&apos;s work – but taste does.</description>
    <content:encoded><![CDATA[<p>I have been thinking a lot about taste lately. Because good taste is the edge humans have, now that AI is able to perform many of the tasks engineers and product people had.</p>
<p>Taste requires the creator of something to know of other people&#39;s expectations without asking. What is a valuable information? What is visually pleasing? What matters in daily life? And most of all: How can we push boundaries without annoying others?</p>
<p>After all, taste is a protocol: It defines the boundaries of what is currently seen as valuable and aesthetic applied to daily life and to everything that can be describes as a product.</p>
<p>AIs do not have taste. They simulate taste by having seen all approaches to all challenges product people ever had, knowing all the best practices. Yet as soon as you push the boundary to the unseen or very specific, AIs fail; even worse, they drown you in options and overcorrect if not instructed well.</p>
<p>AIs can come up with valid options, but they are always annoyingly mid. I don&#39;t see this to change any time soon. So we continue to have to provide the taste. Pick the right options, push for more options, tell it to not do &quot;the right thing&quot;.</p>
<p>So AI has changed nothing with regards to taste, except that ok-ish taste (the so called &quot;AI Slop&quot;) is the new baseline. Actually, the value of good taste has never changed much, even when a taste itself has changed a lot accross centuries.</p>
<blockquote><p>You can not buy taste. <u>My grandmother</u></p></blockquote>
<p>Tba.</p>]]></content:encoded>
    <media:thumbnail url="/cdn/placeholder/image.svg" />
  </item>
  <item>
    <title>Local Agents</title>
    <link>https://homepage.sefzig-net.workers.dev/blog/local-agents</link>
    <guid isPermaLink="true">https://homepage.sefzig-net.workers.dev/blog/local-agents</guid>
    <pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate>
    <description>How to set up one or more filesystem-based AI Agents.</description>
    <content:encoded><![CDATA[<p>Here is a simple method to build your AI Agent(s).</p>
<p>I work with a family of local <a href="https://homepage.sefzig-net.workers.dev/blog/local-agents#null">Agents</a> that streamline what I do.</p>
<figure><img src="https://pub-4ca8413ab24a4756bcb3a137633f94ef.r2.dev/blog/local-agents/images/images/illustration_content.webp" alt="A local ai agent works on behalf of their user, who is relaxing while it works" /></figure>
<p>Yes, they multiply my productivity. These Agents follow a set of simple principles that reach these goals:</p>
<details><summary>Goals</summary><ul><li><p>One method that works across any use case</p></li><li><p>Isolate <a href="https://homepage.sefzig-net.workers.dev/blog/local-agents#null">domain expertise</a> in portable files</p></li><li><p>Stay <a href="https://homepage.sefzig-net.workers.dev/blog/local-agents#null">Model</a>- and <a href="https://homepage.sefzig-net.workers.dev/blog/local-agents#null">Harness</a>-agnostic</p></li><li><p>Keep <a href="https://homepage.sefzig-net.workers.dev/blog/local-agents#null">Token</a> cost at minimum</p></li><li><p>Use future compatible standards</p></li><li><p>Be ready for the next big thing</p></li></ul></details>
<p>Let us assume you have not yet built your own Agents (or are unhappy with them). Let us further assume you are a non-technical person. Then I think there are good reasons to use the method as your next step:</p>
<ul><li><p><u>Simplicity</u>: Each Agent is a folder on your computer that contains your domain expertise as single files. Each file is a self-contained program made of natural language, arranged in sub-folders that define its purpose and application.</p></li></ul>
<ul><li><p><u>Portability</u>: We don&#39;t know what the future brings, but we do know that we want to participate. So any effort you put in must result in your domain expertise being consolidated in a standardized, ready-to-transfer format.</p></li></ul>
<ul><li><p><u>Sovereignty</u>: I suppose you value technical independence. These Agents work with any Model, Provider, and Harness, including local Open Source. They even don&#39;t require the latest and greatest Models: Small and fast works best.</p></li></ul>
<ul><li><p><u>Locality</u>: With the Agents being a mere filesystem on your computer, you and you alone have control over what it knows and does. To provide your Agents to others, there are options (but the basic variant is not collaborative).</p></li></ul>
<ul><li><p><u>Extensibility</u>: Once you implemented one Agent, you can apply the same method to other use cases. The filesystem-approach allows you to link folders and files, so nothing needs to be written twice.</p></li></ul>
<p>If these benefits resonate with you, I invite you to set up your Agent(s) by following my tutorial, which will take an afternoon:</p>
<p><a href="https://homepage.sefzig-net.workers.dev/tutorial/local-agent">Tutorial: Build your Local Agent</a></p>
<p>It explains the method&#39;s conventions, walks you through all folders and files, and provides you with all instructions that implement the core behavior. Once set up, you will understand the method, your Agent, and how to refine it.</p>
<p>But before you start, please note these three restrictions:</p>
<details><summary>Prerequisites</summary><ul><li><p>You need administrative rights on your computer.</p></li><li><p>You need to have a <a href="https://homepage.sefzig-net.workers.dev/blog/local-agents#null">Harness</a> installed.</p></li><li><p>If you want your Agent to be accessible for others, you need to have <a href="https://homepage.sefzig-net.workers.dev/blog/local-agents#null">Git</a> or the means to securely deploy a <a href="https://homepage.sefzig-net.workers.dev/blog/local-agents#null">Container</a> in your private cloud (not covered here).</p></li></ul></details>
<p>I hope my method helps you enter the space of agentic AI or to refine your approach!</p>
<aside><strong>Hint:</strong><p>I like the topic and love to connect about it. Feel free to <a href="https://homepage.sefzig-net.workers.dev/contact">contact me</a> if you need help or want to talk.</p></aside>]]></content:encoded>
    <media:thumbnail url="/cdn/placeholder/image.svg" />
  </item>
  <item>
    <title>Prompts</title>
    <link>https://homepage.sefzig-net.workers.dev/blog/prompts</link>
    <guid isPermaLink="true">https://homepage.sefzig-net.workers.dev/blog/prompts</guid>
    <pubDate>Sun, 27 Sep 2026 00:00:00 GMT</pubDate>
    <description>I have started curating AI Prompts I like to use.</description>
    <content:encoded><![CDATA[<p>I would like to share some <a href="https://homepage.sefzig-net.workers.dev/prompts">AI Prompts</a> I use.</p>
<p>Since the term was coined, &quot;Prompt Design&quot; has changed a lot, as LLMs get better while harnesses provide tools and structure. What has not changed is that you want your AI to communicate in certain ways and depend on your input before burning your tokens.</p>
<figure><img src="https://pub-4ca8413ab24a4756bcb3a137633f94ef.r2.dev/blog/prompts/images/images/illustration_content.webp" alt="The prompt collection makes ai agents behave as good as well-educated kids." /></figure>
<p>I have documented the text snippets I regularly use, since ~2 years. I call those &quot;<a href="https://homepage.sefzig-net.workers.dev/blog/prompts#null">Protocols</a>&quot;.</p>
<p>Since Protocols are solely about behavior, they can be applied to any subject, from code planning to compiling grandmas recipes.</p>
<p>Two Protocols stand out in my daily usage:</p>
<ul><li><p>The <a href="https://homepage.sefzig-net.workers.dev/prompts/ask">Ask Protocol</a> makes the AI ask you questions until it knows exactly what you expect. This turns hallucinations into questions and prevents any surprises caused by gaps in your request. Actually, once you rely on that, you will keep your request free from details – if details were needed, you know the AI will ask.</p></li><li><p>The <a href="https://homepage.sefzig-net.workers.dev/prompts/next">Next Protocol</a> makes the AI turn anything into a step by step walkthrough. This prevents it from &quot;running away&quot;, leaving you with an (eventually great) solution but no clue why and how that works. Furthermore, it allows you to intervene at any time, keeping you in control.</p></li></ul>
<p>Both Protocols give you the most convenient ways to steer the conversation. To make things even more convenient, there is a <a href="https://homepage.sefzig-net.workers.dev/prompts/espanso">great way</a> to integrate your protocols in any textbox on your computer.</p>
<p><a href="https://homepage.sefzig-net.workers.dev/prompts">Open the Prompts page</a></p>
<p>Enjoy!</p>]]></content:encoded>
    <media:thumbnail url="/cdn/placeholder/image.svg" />
  </item>
  <item>
    <title>PDL in Reporting Infrastructure</title>
    <link>https://homepage.sefzig-net.workers.dev/blog/reporting</link>
    <guid isPermaLink="true">https://homepage.sefzig-net.workers.dev/blog/reporting</guid>
    <pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate>
    <description>Merging data and expertise into prompts as part of a reporting infrastructure</description>
    <content:encoded><![CDATA[<p>Automation is not a future topic in reporting, it is the present. Across financial and sustainability communication, data volumes are growing, regulatory expectations are tightening, and the pressure to produce reliable, clear, and approachable outputs is increasing.</p>
<p>AI tools promise acceleration. Many providers have responded quickly. Some have responded loudly. What I observe, however, is not simply the rise of AI. We observe an industry at an inflection point.</p>
<p>On one side are those who adopt automation deliberately — keeping the human in the loop, yet often only formally. On the other side are those who either resist automation altogether or apply it superficially, hoping that “adding AI” will create value by default.</p>
<p>AI systems generate language through statistical prediction — which means the quality of their output depends on the context they are given. So the real question is not whether to use them. It is: <strong>How do we embed AI so that actual human expertise scales?</strong></p>
<h2>The Structural Challenge</h2>
<p>Reporting today is data-intensive by design. ESG, climate, supply chain, and financial datasets are increasingly granular, interconnected, and auditable. At the same time, the final output must remain clear, coherent, and strategically aligned.</p>
<p>Large Language Models (LLMs) can help transform data into text. But they require context – and context is expensive. Common approaches attempt to solve this in three ways:</p>
<ul><li><p><strong>Context bloat:</strong> Provide as much information as possible and hope the model “figures it out.”</p></li><li><p><strong>Retrieval-based systems:</strong> Dynamically search for relevant pieces of information and feed them into the model (RAG), which is harder than assumed as datapoints constantly change.</p></li><li><p><strong>Technical prompt engineering:</strong> Build custom, programmed pipelines per use case.</p></li></ul>
<p>Each of these can work in isolation. None of them scale sustainably. The structural problem is this: There is no deterministic layer that embeds domain expertise into the transition between data and AI.</p>
<p>Without such a layer, automation either becomes unpredictable — or dependent on constant technical intervention.</p>
<h2>The Missing Layer: Structured Integration of Expertise</h2>
<p>Between raw data and AI inference, there must be a layer that:</p>
<ul><li><p>selects relevant information,</p></li><li><p>applies domain logic,</p></li><li><p>expresses knowledge in controlled natural language, and</p></li><li><p>remains readable and editable by (non-technical) experts.</p></li></ul>
<p>In other words: human judgment must become part of the infrastructure. Not as an afterthought or buried in engineering code. But structured, explicit, and intelligible.</p>
<p>Human judgment must not be an external input to the system. It must be encoded into it. And that is difficult — unless the structure itself is designed for experts.</p>
<h2>You Need a Transformation Engine</h2>
<p>To operationalize this principle, I developed PDL — Prompt Data Language.</p>
<p>PDL is a format for writing highly structured natural text. It follows the widely adopted Markdown standard, but extends it with a small but expressive set of logical elements: retrieving values, defining conditions, iterating over data.</p>
<p>The input is designed for domain experts; the output is designed for humans and LLMs alike.</p>
<p>With PDL, structured datasets and domain logic are fused into deterministic yet elegant natural language before any AI model is involved. What the model receives is not raw data, but curated, intentional context.</p>
<p>This makes the human contribution tangible and maintainable. It becomes part of the system — not an informal comment in a workflow, not a technical workaround, but an explicit layer.</p>
<h2>A Simple Example</h2>
<p>Imagine a structured dataset of products and their emissions. A PDL template could look like this: What this achieves is deceptively simple.</p>
<p>It translates structured data into consistent natural language. It embeds a clear threshold. It makes the decision logic explicit. It produces deterministic output — every time. It can be evolved easily and constantly.</p>
<p>The logic is visible. The reasoning is traceable. Any domain expert can read and refine this logic. Then the AI systems can build on it. The result is structured, auditable, and scalable.</p>
<h2>How This Works in Practice</h2>
<p>In our automation work, this layer typically sits right before AI inference happens.</p>
<p>Consider a recurring scenario: A company has not yet provided all datapoints required for a report. Each week, a checklist is needed — along with a management summary.</p>
<p>Instead of manually drafting this from scratch or feeding entire databases into an LLM, a PDL template extracts missing datapoints, applies domain logic and generates a structured briefing. This briefing is then used by an AI system to produce a coherent management summary.</p>
<p>The result is:</p>
<ul><li><p>Deterministic data selection.</p></li><li><p>Controlled natural language.</p></li><li><p>A focused AI prompt.</p></li><li><p>A faster and more reliable output.</p></li></ul>
<p>Importantly, the quality of the outcome depends on the quality of the underlying data. Structured environments like the VERSO Hubs — where ESG, climate, and supply chain data are curated systematically — provide the ideal foundation for this approach.</p>
<p>The more disciplined the data collection, the more powerful this abstraction layer becomes. Data does not merely serve compliance. It becomes a strategic asset for truly intelligent automation.</p>
<p>And because this layer remains human-readable, consultants and domain experts can continuously refine the logic and add depth without requiring engineering resources for every iteration.</p>
<h2>What This Means for You</h2>
<p>Infrastructure only matters if it creates tangible value.</p>
<p>If you work with us in services, it means both your and our expertise become scalable. Domain knowledge is no longer confined to individual documents or projects. It becomes part of a reusable, evolving structure.</p>
<p>If you are using our Hubs, structured automation increases the leverage of your data. The more consistently your information is curated, and the more human intelligance it can be merged with, the more precisely it can be transformed into actionable outputs.</p>
<p>If you are considering working with us, it means you are not investing in short-term AI experimentation. You are building a foundation that integrates automation responsibly — with human judgment embedded from the beginning.</p>
<p>Across all scenarios, the principle remains the same: AI becomes more reliable when expertise is structured — and only then can it become part of your everyday workflow.</p>
<h2>Designing the Future of Reporting</h2>
<p>The future of reporting will not be defined by who “uses AI.” It will be defined by who designs the systems around it. Automation without structure leads to noise. Manual processes without automation lead to inefficiency. The sustainable path lies in structured collaboration between humans and machines.</p>
<p>PDL is one building block in that architecture: Structured collaboration between humans and machines — transparent, traceable, and accountable.</p>
<p>The industry continues to evolve. We intend to shape that evolution in a way that keeps reporting precise, actionable, and accountable. We are committed to building infrastructure that strengthens quality rather than replacing judgment.</p>
<p>If you are curious, explore our open-source <a href="https://github.com/sefzig/PDL">PDL Repository</a> or interact with it in the <a href="https://pdl.verso.de/">PDL Playground</a>*. It is a small but tangible glimpse into how we think about the future of reporting.</p>]]></content:encoded>
    <media:thumbnail url="/cdn/placeholder/image.svg" />
  </item>
  <item>
    <title>Prompt Data Language</title>
    <link>https://homepage.sefzig-net.workers.dev/blog/pdl</link>
    <guid isPermaLink="true">https://homepage.sefzig-net.workers.dev/blog/pdl</guid>
    <pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate>
    <description>Fuse data with actual intelligence into prompts</description>
    <content:encoded><![CDATA[<p><em>Tba <a href="https://homepage.sefzig-net.workers.dev/blog">tba</a> tba.</em></p>
<p>Tba.</p>
<h2>Backlog</h2>
<details><summary>Details 1</summary><p>This is a rich expandable paragraph.</p>
<ul><li><p>A nested list item</p></li><li><p>And an <a href="https://homepage.sefzig-net.workers.dev/blog">internal link</a></p></li></ul>
<blockquote><p>A nested quote.</p></blockquote></details>
<details><summary>Details 2</summary><p>This expandable starts closed.</p></details>
<details><summary>Details 3</summary><p>This expandable starts closed.</p></details>]]></content:encoded>
    <media:thumbnail url="/cdn/placeholder/image.svg" />
  </item>
  <item>
    <title>CXWidgets</title>
    <link>https://homepage.sefzig-net.workers.dev/blog/cxwidgets</link>
    <guid isPermaLink="true">https://homepage.sefzig-net.workers.dev/blog/cxwidgets</guid>
    <pubDate>Sat, 14 Sep 2024 00:00:00 GMT</pubDate>
    <description>A library to dynamically add supportive widgets to any site.</description>
    <content:encoded><![CDATA[<p>A library to dynamically add supportive widgets to any site.</p>
<p>Tba.</p>]]></content:encoded>
    <media:thumbnail url="/cdn/placeholder/image.svg" />
  </item>
  <item>
    <title>A Homepage for Humans and Agents</title>
    <link>https://homepage.sefzig-net.workers.dev/blog/homepage</link>
    <guid isPermaLink="true">https://homepage.sefzig-net.workers.dev/blog/homepage</guid>
    <pubDate>Sat, 14 Sep 2024 00:00:00 GMT</pubDate>
    <description>My homepage is a bunch of Markdown published as an app.</description>
    <content:encoded><![CDATA[<p>Plain Markdown, a little personalization, and two Artificial Colleagues.</p>
<aside><strong>Warn:</strong><p>This Post is still in a state of AI Slop.</p></aside>
<p>My homepage is a collation of <a href="https://homepage.sefzig-net.workers.dev/docs/markdown">Markdown</a> files published as an app.</p>
<p>That is also what I like about working on it. I can write a paragraph, give a section a heading, or add a link in a text file. A few small extensions let that document become something richer: a presentation, an interactive page, or an explanation that adapts to the person reading it.</p>
<p>For example, a passage can look like this:</p>
<figure><figcaption>A little personalization</figcaption><pre><code class="language-markdown">Welcome to my Homepage.

Here you will find my writing, projects, and experiments.

[interest:AI]
    You might enjoy how I work with AI agents to build this site.
[/interest:AI]
[!interest:AI]
    Start with a topic that interests you and explore from there.
[/!interest:AI]</code></pre></figure>
<p>The two <a href="https://homepage.sefzig-net.workers.dev/docs/markdown#conditional-passages">conditions</a> select different passages according to an interest in the reader&#39;s preferences. The surrounding document stays the same. I can read the source, understand the intention, and change the wording without reconstructing a component tree in my head.</p>
<p>This is the idea I keep coming back to: <strong>plain Markdown and a lean personalization syntax can support complex user experiences that remain document-style experiences.</strong> There is still a text to read, a structure to follow, and a link to open. The application quietly supplies the behavior around them.</p>
<p>AI fits naturally into that arrangement. Agents can work with the same files I use, and readers can open Markdown and Prompt versions of the published content. Behind the scenes, two Artificial Colleagues help me develop the system and maintain its content.</p>
<h2>A document with more possibilities</h2>
<p><em>The source should stay pleasant to write, even when the result becomes more capable.</em></p>
<p>I like Markdown as a working format. It has enough structure to organize an idea, and little ceremony between having that idea and writing it down. A page can begin as a few headings and paragraphs and acquire more detail as I work on it.</p>
<p>The Homepage extends that familiar vocabulary. A link can become a button. A blockquote can become a note. A short listing can collect posts or presentations. A section can fold away an explanation that some readers want and others can skip.</p>
<figure><figcaption>Familiar text, a few extra instructions</figcaption><pre><code class="language-markdown">The content is authored in Markdown.

&gt; [Tip]
&gt; Open the Markdown link in the footer to take a closer look.

[Explore the presentations(primary-button)](/presentations)</code></pre></figure>
<p>Here, <code>[Tip]</code> selects the note treatment and <code>primary-button</code> selects the link presentation. The words remain close to the behavior they describe. I can make the intent explicit in a line of source and let the renderer take care of the details.</p>
<p>Personalization follows the same principle. Conditions wrap the passage they affect. They can surround a sentence, a heading, a list item, or a larger section. That keeps the editorial decision visible: this is the explanation I want to offer to this reader, in this part of the document.</p>
<p>There is an interesting difference between making a document responsive and making it personal. A narrower screen may need a shorter passage or a different composition. A reader who has expressed an interest may appreciate a more specific introduction. Both can be authored close to the content, while the implementation handles their different sources of context.</p>
<p>This is particularly appealing for a personal homepage. My visitors may be interested in my professional work, an experiment, a presentation, or the AI behind the site. A document can give those interests room without making everyone follow the same tour.</p>
<h3>Where the conditions are evaluated</h3>
<p><em>The syntax is compact; the runtime distinguishes the kinds of context behind it.</em></p>
<p>Cohort and preference conditions are evaluated on the server using the context available for the request. Width conditions work differently: the server can send the relevant alternatives together, and CSS selects the matching viewport variant before first paint and on resize.</p>
<p>This is personalization of presentation. Access control needs its own implementation. In particular, a viewport variant that is visually hidden may still be present in the response, and a public Markdown representation needs its own publication review.</p>
<h2>A small language for rich content</h2>
<p><em>A few well-chosen extensions can carry a surprising amount of expression.</em></p>
<p>The same approach extends beyond prose. A document can include <a href="https://homepage.sefzig-net.workers.dev/docs/media">media</a>, listings, and configured <a href="https://homepage.sefzig-net.workers.dev/docs/elements">Elements</a>. The important part for me is that these remain authoring choices I can see in the source.</p>
<p>An <a href="https://homepage.sefzig-net.workers.dev/docs/apps">app embed</a>, for instance, uses a fenced block with a small configuration:</p>
<figure><figcaption>Embedding Images</figcaption><pre><code class="language-markdown">```element embed
app: images
mode: inline
```</code></pre></figure>
<p>The <code>element</code> prefix tells the generator to interpret the block as configuration. A regular code fence remains a code example. The configured Element then uses behavior provided by the application.</p>
<p>I call these <strong>Markdown extensions</strong>. Their usefulness comes from how consistently they connect a readable instruction to an existing capability. An author can choose a treatment or configure an Element; developing a new capability means extending the generator and renderer as well.</p>
<p>The blog format itself offers a good example of this range. Headings can organize expandable sections. Code blocks can start open or closed, carry useful labels, and offer wrapping controls. Images can use different presentation sizes. Lists can express a collection of content or an interactive structure.</p>
<p>I want to use that flexibility with some restraint. The main explanation should remain easy to follow. Details can be available exactly where they become useful. A reader should be able to stay with the story, inspect a small example, or open a deeper explanation according to their interest.</p>
<p>There is a maintenance cost to every new piece of syntax. It needs a clear meaning, examples, and predictable behavior. The payoff is strongest when one extension is useful in several places and the authoring experience stays coherent.</p>
<p>For agents, those conventions serve another purpose. A request such as “add a note here” or “show this passage to readers interested in AI” has a compact representation in the file. The surrounding prose, links, and headings provide context for the change.</p>
<h2>A compiler does the translation</h2>
<p><em>Readable source becomes structured data before the application serves it.</em></p>
<p>The Homepage has a <a href="https://homepage.sefzig-net.workers.dev/docs/stack#a-compiler-does-the-work">Backend</a>, although its main job happens during generation. A Node.js program reads the authored content and prepares the data that the React application will use. The same generator can run locally and during the remote build.</p>
<p>The core content object is a <code>Content.md</code> file with YAML <a href="https://homepage.sefzig-net.workers.dev/docs/frontmatter">frontmatter</a> and a Markdown body. The frontmatter supplies metadata such as title, summary, and publication status. The body carries the text and the structures that become rendered Elements.</p>
<p>Generation connects those pieces to the larger application. It resolves content and navigation, prepares registries, and emits importable TypeScript data. It also produces the public Markdown and Prompt representations that I will return to later.</p>
<p>That translation is a useful place to be explicit. Authored source can be convenient for writing, while the runtime receives a normalized representation. A page loader can look up prepared content and pass it to a shared rendering surface.</p>
<p>It also makes a change easier to investigate. I can look at the source, the generated data, and the rendered result as separate stages. If a heading is missing, a link resolves unexpectedly, or an Element receives the wrong configuration, I have a path to follow.</p>
<p>The generator reports problems close to the content that caused them. It stages its output before replacing managed directories, reducing the chance of leaving a half-written generation behind. Generated artifacts remain outputs: lasting changes belong in their source or in the transformation that produces them.</p>
<h3>What the generator produces</h3>
<p><em>The application imports more than page bodies.</em></p>
<p>The outputs include content modules, route and navigation registries, theme data, app registration, public source files, and prepared assets. TypeScript gives the frontend a visible representation of the generated contract. Validation and type checking then check different parts of the path from authored data to application code.</p>
<p>The usefulness of that arrangement depends on the schemas and consumers being well maintained. Having the transformation in code makes those decisions available for inspection and improvement.</p>
<h2>Remix gave the application its shape</h2>
<p><em>Framework conventions make it easier to describe a change and find where it belongs.</em></p>
<p>I got to know Remix at Statista through Markus Wolf and other great colleagues. That is part of the history of this Homepage: the framework became one of the foundations I wanted to work with myself.</p>
<p>The <a href="https://homepage.sefzig-net.workers.dev/docs/stack">application stack</a> now uses React Router 7 in Framework Mode, continuing the Remix v2 lineage. The <a href="https://v2.remix.run/docs/">Remix documentation</a> points to React Router for the framework&#39;s continuing features. For me, the attraction is the application model: routes, data loading, rendering, and server behavior have established places to live.</p>
<p>I find that structure particularly friendly to AI-assisted programming. When I describe a change, there is a recognizable vocabulary for investigating it. A route module loads data. A shared surface renders it. A server helper prepares request-specific behavior. The agent can trace those responsibilities through the code.</p>
<p>In this Homepage, the ordinary page route is a small example. It resolves the path, finds the generated content, prepares a route payload, and passes that payload to <code>ViewSurface</code>. Presentation routes add covers, agendas, chapters, and slides around the same general content system.</p>
<h3>The route in four steps</h3>
<p><em>A small module connects the request to the shared presentation layer.</em></p>
<figure><figcaption>Loading a page</figcaption><pre><code class="language-text">Request path
  → generated content lookup
  → server-side preparation of the route payload
  → shared ViewSurface component</code></pre></figure>
<p>React Router&#39;s <a href="https://reactrouter.com/7.16.0/start/framework/route-module">route modules</a> provide conventions for data loading, actions, metadata, error handling, and rendering. Those conventions give the project an architectural vocabulary that is useful to both a human developer and an agent.</p>
<p>Vite makes the development loop feel immediate. I can inspect a change in the browser, adjust it, and inspect it again. Its tooling supports hot updates and React Fast Refresh; the Homepage also watches generated content and reloads when that output changes. <a href="https://v6.vite.dev/guide/features">Vite 6 features</a></p>
<p>The project runs type checking separately, along with tests and a build. That distinction matters because Vite transforms TypeScript without performing the full typecheck. The feedback loop benefits from both a quick visual result and checks that examine other kinds of mistakes.</p>
<p>Cloudflare completes the stack with a concrete production runtime. A Worker entry receives the request, supplies server environment context, and delegates to React Router&#39;s request handler. Client assets accompany the server application.</p>
<p>This combination suits the way I work with AI: clear conventions, inspectable artifacts, and a short path from a proposed change to something I can examine. That is my experience of the stack. The point I can demonstrate here is how the responsibilities fit together.</p>
<h2>Two Colleagues keep the work moving</h2>
<p><em>The system and its content each have a role dedicated to their continuing development.</em></p>
<p>I work with two Artificial Colleagues: <strong>Homepage Builder</strong> for the system and <strong>Homepage Manager</strong> for its content. They work on my behalf, with me providing direction and making the decisions about what I want to build and publish.</p>
<p>That arrangement makes the Homepage a continuing collaboration. A content task may involve shaping an explanation, organizing a page, or configuring an existing Element. A system task may involve changing the behavior that makes those authoring options possible.</p>
<table><thead><tr><th>Colleague</th><th>Primary responsibility</th></tr></thead><tbody><tr><td>Homepage Builder</td><td>Building and evolving the system</td></tr><tr><td>Homepage Manager</td><td>Creating and maintaining its content</td></tr></tbody></table>
<p>The two roles sit within my broader Platform. Their working context includes instructions, knowledge, procedures, requirements, and the artifacts produced by earlier work. A new conversation can begin from those materials and the task at hand.</p>
<p>Andrej Karpathy&#39;s post about LLM Knowledge Bases was a conceptual inspiration for this approach. His <a href="https://x.com/karpathy/status/2039805659525644595">original X post</a> and accompanying <a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f">LLM Wiki idea file</a> describe an agent maintaining a persistent, linked collection of Markdown under human direction. I developed that inspiration into the Platform and the specialized Colleagues I use here.</p>
<p>What interests me is the accumulation. A useful explanation, a clarified requirement, or a working procedure can become material for the next task. The context has a place to live, and I can inspect it alongside the work it helps produce.</p>
<p>The division between system and content gives a task somewhere to start. If I want a new passage or a different arrangement using existing features, that is editorial work. If I want a capability the authoring language cannot yet express, that becomes a requirement for the system.</p>
<p>I still need to judge the result. I decide whether an explanation sounds like me, whether a feature is worth its complexity, and whether a change is ready to publish. The Platform makes these responsibilities explicit in its working procedures and authority boundaries.</p>
<p>Persistent context needs care of its own. Instructions can become stale and requirements can drift away from code. I want the Colleagues&#39; working material to remain as understandable as the documents they help create.</p>
<h2>The reader can bring an agent too</h2>
<p><em>A page can continue into a conversation with the reader&#39;s own AI.</em></p>
<p>AI is involved in creating the Homepage, and I want it to be useful when someone reads it as well. That is the purpose of the <strong>Markdown</strong> and <strong>Prompt</strong> links in the footer.</p>
<p>The Markdown link opens a prepared representation of the page&#39;s content. The Prompt link adds context and directions through a <a href="https://homepage.sefzig-net.workers.dev/docs/prompts#templates">template</a>. Someone can take that material into their own AI tool and continue exploring the subject there.</p>
<p>The foundation is already implemented: source generation, Prompt templates, and the footer links. The broader interaction is still developing. I am interested in how a reader discovers the option, what context makes the handoff useful, and how the conversation can remain connected to the page.</p>
<p>One source can consequently support several ways of engaging with an idea. A reader can follow the visual page, explore its links, or bring its text into a conversation. I like that the content remains available for whatever kind of attention the reader wants to give it.</p>
<h3>How a Prompt gets its context</h3>
<p><em>A template combines reusable wording with information from the page.</em></p>
<figure><figcaption>A simple Prompt template</figcaption><pre><code class="language-markdown">This page is titled &quot;&lt;Title&gt;&quot;.
Its summary is: &lt;Summary&gt;

Canonical page: &lt;UrlWeb&gt;
Markdown source: &lt;UrlMarkdown&gt;

Use this content as the basis for our discussion:

&quot;&quot;&quot;
&lt;Markdown&gt;
&quot;&quot;&quot;</code></pre></figure>
<p>The generator replaces the placeholders with metadata, links, and the prepared Markdown body. Reusable profiles provide templates for different content kinds. An individual content item can use its own <code>Prompt.md</code> when it needs custom wording, following the profile-selection rules.</p>
<p>The public Markdown is prepared separately from the private authoring source. Comments are removed outside code fences, hidden sections follow the content settings, and root-relative links become public links. A small metadata header identifies the content and its source.</p>
<p>Those templates are another piece of editorial work. A good one can explain the purpose of a presentation or give context for an app. I want to develop that part through use: observe which explanations help, improve the templates, and make the handoff easier to discover.</p>
<h2>A delivery pipeline I can trust</h2>
<p><em>A local change should become a reproducible build.</em></p>
<p>I have liked Cloudflare for nearly a decade. The Homepage gives me a practical reason to keep liking it: the application, static assets, and managed media fit into a delivery environment I enjoy using.</p>
<p>The current pipeline connects a GitHub runtime repository to Cloudflare Workers Builds. Before a change reaches that remote build, the local <a href="https://homepage.sefzig-net.workers.dev/docs/deployment">deployment procedure</a> processes media, runs checks, and assembles a temporary deployment package. It reproduces the Cloudflare build against that package before pushing it.</p>
<p>One detail matters when apps enter the picture. Locally, the Homepage can work from a link to app distributions maintained elsewhere. The deployment package materializes the publishable distribution files, giving the remote build concrete inputs it can use independently of my machine.</p>
<p>Wrangler handles Cloudflare tooling, including authentication checks and uploading selected server secrets separately from the package. <a href="https://developers.cloudflare.com/workers/ci-cd/builds/">Cloudflare Workers Builds</a> performs the connected repository build and deployment; <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a> supplies the command-line interface.</p>
<p>GitHub Actions is a documented alternative runner for the build procedure. The current setup uses Workers Builds, and keeping the build sequence explicit leaves room to run it elsewhere later. <a href="https://developers.cloudflare.com/workers/ci-cd/external-cicd/github-actions/">Cloudflare&#39;s GitHub Actions integration</a></p>
<p>What I value is being able to follow the change all the way through. There is an authored input, an implementation, a set of checks, a package, and a remote build. When something goes wrong, those stages give the investigation a useful shape.</p>
<h2>Keeping it understandable</h2>
<p><em>The nicest feature is being able to keep working on it.</em></p>
<p>For me, these choices belong together. Markdown makes content approachable. A small set of extensions adds expression. Generation connects authoring to the runtime. React Router, Vite, and Cloudflare provide a recognizable application and delivery structure. The two Colleagues help me continue the work with context that can persist between tasks.</p>
<p>The design also gives me a useful question to ask of a new feature: can I explain what this adds to the document and how an author would use it? If the explanation becomes complicated, the authoring model probably needs more thought.</p>
<p>There will always be implementation detail underneath. A short marker can stand for a substantial amount of code. What I want is a coherent relationship between the two: a compact instruction in the source, a documented meaning, and behavior I can examine in the result.</p>
<p>The reader-facing AI integration is the part I especially want to develop further. Markdown and Prompt links provide a starting point. Making them feel natural and useful belongs to the same design problem as the rest of the Homepage: helping someone follow an idea without making them learn the machinery first.</p>
<p>I want to keep adding things I care about—writing, presentations, tools, experiments—and keep enjoying the process of putting them together. A bunch of Markdown gives me a surprisingly good place to start.</p>
<p>For the practical details, start with the <a href="https://homepage.sefzig-net.workers.dev/docs">documentation</a>.</p>
<h2>Acknowledgments</h2>
<p><em>Good tools arrive through good ideas and good people.</em></p>
<p>Andrej Karpathy&#39;s LLM Wiki work inspired the persistent knowledge and instruction approach behind my Platform. I learned about Remix at Statista from Markus Wolf and other great colleagues. Cloudflare has been a long-standing favorite, and its tools help make this particular project practical. I am grateful to the people building and maintaining these foundations.</p>]]></content:encoded>
    <media:thumbnail url="/cdn/placeholder/image.svg" />
  </item>
  <item>
    <title>MTAM</title>
    <link>https://homepage.sefzig-net.workers.dev/blog/mtam</link>
    <guid isPermaLink="true">https://homepage.sefzig-net.workers.dev/blog/mtam</guid>
    <pubDate>Sat, 14 Sep 2024 00:00:00 GMT</pubDate>
    <description>A library orchestrating external snippets and making tracking transparent.</description>
    <content:encoded><![CDATA[<p>This article is for a technical audience.</p>
<p>One of my favorite projects is MTAM (MarTech Agents Manager) developed with <a href="https://maiksicks.de/">Maik Sicks</a> for <a href="https://statista.com/">Statista</a>.</p>
<figure><img src="https://pub-4ca8413ab24a4756bcb3a137633f94ef.r2.dev/blog/mtam/images/images/illustration_content.webp" alt="While the website loads, tiny agents connect the product with marketing tools in the background." /></figure>
<p>MTAM is a tiny (cachable 41kb) javascript library, initialized once per page load, that loads and orchestrates javascript snippets from Martech systems such as CDPs, Analytics, or CRM.</p>
<blockquote><p>I liked this project because it takes a very basic Marketing problem by the horns and creates transparency.</p></blockquote>
<p>MTAM solves many practical challenges at once:</p>
<ul><li><p>Development</p><ul><li><p>Each agent is low-code javascript, discussable with non-tech persons.</p></li><li><p>All agents &quot;speak the same language&quot; and behave comparably.</p></li><li><p>A shared KV-store and common methods allow for simplicity.</p></li></ul></li><li><p>Product</p><ul><li><p>Decisions can be made based on data from the Marketing systems.</p></li><li><p>Integrate any tracking and recording based on CDP data.</p></li><li><p>Conduct user research based on cohorts and events.</p></li></ul></li><li><p>Marketers</p><ul><li><p>Agents are as-understandable-as-possible due to highly readable code.</p></li><li><p>Adding an url-parameter makes any pageload tell a story in the console.</p></li><li><p>The flow of data becomes easy to investigate.</p></li></ul></li><li><p>Compliance</p><ul><li><p>Data protection officers can investigate.</p></li><li><p>Concerned users can see the data flow.</p></li><li><p>Authorities can see archived data flows.</p></li></ul></li></ul>
<p><strong>Try it out</strong></p>
<ol><li><p>Click this button:</p></li></ol>
<p><a href="https://homepage.sefzig-net.workers.dev/blog/mtam?mtamDev=true">Development Mode</a></p>
<ol start="2"><li><p>Then open the Dev Tools (<code>cmd + opt + j</code>) console.</p></li><li><p>Then reload (<code>cmd + r</code>).</p></li></ol>
<p>Keep the console open to see all that is happening in Marketing.</p>
<p><strong>Use it yourself</strong></p>
<p>Feel free to use MTAM yourself!</p>
<p><a href="https://homepage.sefzig-net.workers.dev/blog/mtam#tba">Open Github Repository</a></p>
<blockquote><p>The license is MIT – free to use, even commercially, without any liability on my end.</p></blockquote>
<p><strong>Getting started</strong></p>
<p>Read the ...</p>
<p><a href="https://homepage.sefzig-net.workers.dev/docs/mtam">Technical Documentation</a></p>
<p>... or give these prompts to your AI:</p>
<details><summary>Prompt: Investigation</summary><p>Tba.</p></details>
<details><summary>Prompt: Integration</summary><p>Tba.</p></details>
<p><strong>Closing notes</strong></p>
<p>Read more in the <a href="https://homepage.sefzig-net.workers.dev/docs/mtam">Technical Documentation</a>.</p>
<p>If you have questions or need support, <a href="https://homepage.sefzig-net.workers.dev/blog/mtam#tba">let me know</a>!</p>]]></content:encoded>
    <media:thumbnail url="/cdn/placeholder/image.svg" />
  </item>
</channel>
</rss>
