Blog

Writing

Long-form from our team. Engineering, product, and company posts.

  • ai-agents

    Your MCP Server Shouldn't Run on a Shared API Key

    When an AI assistant changes your content through an MCP server, the first question is who did it. A shared project key cannot answer that, and it cannot be taken back from one person. Here is what we replaced it with, and the six details that mattered.

  • Engineering

    Why Your Chat Widget Ignores Your Dark Mode Toggle

    Your site has a dark mode toggle. The support widget in the corner does not care. Here is why embedded widgets get theming wrong — the OS media query, the shadow root, the remount — and what a widget needs to offer so yours does not.

  • ai-agents

    MCP Can't Upload Files. Here's How to Let AI Agents Do It Anyway

    The Model Context Protocol has no way to send a file, and the obvious workarounds either burn tokens or turn your server into a proxy. Here is the presign, upload, confirm shape we shipped, and the four details that decide whether it is safe.

  • ai-agents

    Your Streaming Chatbot Is Probably Generating Every Answer Twice

    Tool calling and streaming pull in opposite directions, and the obvious way to reconcile them makes every answer twice: once to find out it was an answer, once to show it. Here is the shape of the bug, and what streaming every round actually costs you in care.

  • saas

    Who Is Actually Talking to Your AI Support Chat?

    An anonymous chat log tells you what people asked. It cannot tell you whether your best customer has asked the same thing four times. Here is how to add identity to an AI support widget without turning it into a security hole.

  • headless-cms

    Headless CMS and SEO: What Actually Matters

    Does fetching content from an API hurt SEO? No — if you render it right. Canonicals, structured data, sitemaps, and the checklist that matters.