GREG · The Operator

The Application Is the Engine. The Interface Is Whatever You Want It to Be.

· 5 min

I built a CRM with no UI. Not "minimal UI." No UI. No templates directory, no React, no HTML anywhere in the source. Then I handed it to Claude Code and talked to it in English. That's the whole demo. The rest is why it matters.

I put a video up on LinkedIn walking through this live. If you'd rather watch than read, go find it there. If you'd rather read — here's the version with the parts I couldn't fit in three minutes of talking.

What "headless" actually means

A traditional application bundles three things together: the data, the business logic that operates on it, and the user interface that lets a human poke at it. The three are intertwined. The application is the experience of using it.

A headless application keeps the first two and throws away the third.

Data and logic live behind a well-defined API — HTTP, documented via OpenAPI. Anything that speaks the API can drive the application: a browser, a phone, a Slack bot, a voice agent, an automation script, an AI agent. The application doesn't know and doesn't care which one showed up.

The UI is no longer the product. The API is the product.

The demo

I wrote a tiny CRM in Python. FastAPI server, SQLite database, OpenAPI spec at /docs. Five resources — Accounts, Contacts, Opportunities, Notes, Tasks. Twenty-six endpoints. Standard Salesforce-shaped relationships. No authentication, localhost only. The CRM is not the point. What happens when you talk to it is the point.

The CRM starts empty. I open Claude Code and start typing natural language.

"Add Acme Corp as an account, with Jane Doe and Bob Smith as contacts there." Claude Code reads the OpenAPI spec, translates that into a POST to /accounts and two POSTs to /contacts, and summarizes the response back in prose. The CRM has no idea Claude Code exists.

"Add a $50k opportunity called Annual License Renewal, currently in proposal stage." POST to /opportunities.

"Log a note on the renewal: met at SaaStr, Jane wants ROI deck by Friday." POST to /notes.

"What does my pipeline look like?" GET to /pipeline.

"Show me everything we have on Acme." Five GETs — account, contacts, opportunities, notes, tasks — all stitched together and summarized in one paragraph.

"Mark that task done and move the opportunity to closed-won." Two PATCHes. Done.

Every prompt becomes HTTP. Every response becomes prose. The CRM never renders a single pixel. Claude Code is the interface — one possible interface — and the CRM doesn't know or care.

Why this matters more than it looks

There are four things I wanted people to see when I built the demo.

The CRM has no UI. Open the source. Scroll through it. There's no templates/ directory, no static assets, no HTML. Just route handlers and a database. That's the entire product.

The API is the contract. Visit /docs. That OpenAPI page is the only user-facing surface the application has. It is the contract between the body and any head that wants to connect.

Claude Code is one possible head. It reads the spec, translates natural language into HTTP calls, and summarizes responses back as prose. The CRM has no idea Claude Code is in the loop.

Heads are interchangeable. Swap Claude Code for a Slack bot, a mobile app, a voice agent, a fleet of curl scripts. The body never changes. The only thing that changes is the experience of using it.

This is exactly the pitch Salesforce is making

I wrote about Salesforce's Headless 360 play a couple weeks ago. Their argument is the same one this demo proves at small scale: the value of a CRM is not in the screens. It's in the data model, the workflow engine, the integrations, the audit trail, the automation. All of that lives behind APIs. Lightning is just one of many possible heads.

The difference between a demo on localhost and what Salesforce is doing at enterprise scale is roughly a hundred billion dollars of revenue model complexity. But the principle is identical. The body is stable, audited, authoritative. The head is whatever experience your users need this quarter. Web. Mobile. Voice. Agent. Replace the head without touching the body.

Every enterprise platform — Salesforce, ServiceNow, Microsoft, SAP — is arriving at the same conclusion from different directions. The UI layer is no longer the moat. The data model and the API surface are the moat. The screens are a commodity that agents are about to commoditize further.

The part nobody says out loud

If the head is interchangeable, the skill of building heads loses pricing power.

Twenty years of enterprise tech taught me that the money follows the bottleneck. Today the bottleneck is the body — the data, the logic, the governance. The head is increasingly something an AI agent can generate, operate, or replace entirely.

That's not a threat to people who build bodies. It's a massive threat to people whose entire value proposition is building heads. And it's an opportunity for anyone who understands the difference.

The demo is thirty lines of Python and an AI agent talking to it. The lesson is worth more than the code.

Transmission timestamp: 10:22:41 AM