<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: SharpHaw</title>
    <description>The latest articles on DEV Community by SharpHaw (@sharphaw).</description>
    <link>https://dev.to/sharphaw</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4092541%2Fc8e37560-cff7-48e7-a84b-631364843a64.png</url>
      <title>DEV Community: SharpHaw</title>
      <link>https://dev.to/sharphaw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sharphaw"/>
    <language>en</language>
    <item>
      <title>We replaced a 12-tool client stack with one workspace we built. Here's the row we couldn't.</title>
      <dc:creator>SharpHaw</dc:creator>
      <pubDate>Mon, 31 Aug 2026 13:00:25 +0000</pubDate>
      <link>https://dev.to/sharphaw/we-replaced-a-12-tool-client-stack-with-one-workspace-we-built-heres-the-row-we-couldnt-pg3</link>
      <guid>https://dev.to/sharphaw/we-replaced-a-12-tool-client-stack-with-one-workspace-we-built-heres-the-row-we-couldnt-pg3</guid>
      <description>&lt;p&gt;Ask a small agency how the monthly client update gets made and you'll hear a version of the same answer: someone stitches four or five tools into a document. A Trello board, a Drive folder, a GA4 view, a Semrush export, a Figma file. Ask the client what they make of that document and you get the other answer, verbatim from a small-business forum: &lt;em&gt;"I don't even know what they do for $225 a month."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I run SharpHaw, a small agency in Lisbon, and I'm the engineer who built SharpOS, the workspace we run every client engagement in. This is our first post on DEV, so it does the introductions: what SharpHaw is, what SharpOS replaced, how it's put together, and the one row on our replacement ledger we couldn't replace. Later posts take one surface at a time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; we stopped stitching tools into reports and built the workspace the work itself happens in. The client reads the same screen we work on.&lt;/p&gt;

&lt;h2&gt;
  
  
  What SharpHaw is, in one paragraph
&lt;/h2&gt;

&lt;p&gt;SharpHaw is a growth subscription for owner-operated European businesses: a conversion-first website, Meta and Google ads, a content engine and AI automations, run by one senior engineer on a weekly shipping cadence for a fixed monthly fee, with no annual contract. Before starting it I was a Senior Software Engineer inside large companies, working on products used by thousands of businesses across Europe, and I still run the engineering myself. We work with founders across 19 European countries, in English and, when it helps, in Portuguese.&lt;/p&gt;

&lt;p&gt;The promise under all of that is short. The work is visible without asking. SharpOS is how we keep it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack a client engagement normally runs on
&lt;/h2&gt;

&lt;p&gt;An engagement like ours would normally run across a dozen tools, and the client holds a login to maybe two of them. This is the replacement ledger from our features page. Each row names two familiar products so you can place it; the row is the point, the brands are anchors.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Old stack&lt;/th&gt;
&lt;th&gt;SharpOS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;01&lt;/td&gt;
&lt;td&gt;Notion, Confluence&lt;/td&gt;
&lt;td&gt;Pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;02&lt;/td&gt;
&lt;td&gt;Trello, Asana&lt;/td&gt;
&lt;td&gt;Boards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;03&lt;/td&gt;
&lt;td&gt;Salesforce, HubSpot&lt;/td&gt;
&lt;td&gt;Customers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;04&lt;/td&gt;
&lt;td&gt;Google Forms, Typeform&lt;/td&gt;
&lt;td&gt;Forms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;05&lt;/td&gt;
&lt;td&gt;Semrush, Lighthouse&lt;/td&gt;
&lt;td&gt;Audits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;06&lt;/td&gt;
&lt;td&gt;Google Drive, Dropbox&lt;/td&gt;
&lt;td&gt;Media Center&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;07&lt;/td&gt;
&lt;td&gt;Figma, Canva&lt;/td&gt;
&lt;td&gt;Studio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;08&lt;/td&gt;
&lt;td&gt;A brand guidelines PDF&lt;/td&gt;
&lt;td&gt;Brand Kit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;09&lt;/td&gt;
&lt;td&gt;Zapier, n8n&lt;/td&gt;
&lt;td&gt;Automations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Intercom, Zendesk&lt;/td&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Linktree, Bio.link&lt;/td&gt;
&lt;td&gt;Spotlight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Google Calendar, Google Sheets, Cal.com, Resend, WhatsApp, Facebook, ElevenLabs, OpenAI, OpenRouter&lt;/td&gt;
&lt;td&gt;Integrations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Looker, Google Analytics&lt;/td&gt;
&lt;td&gt;Analytics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Asking for an update, then waiting on the reply&lt;/td&gt;
&lt;td&gt;Live work, all the time&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Twelve of those rows replace something. Row 12 replaces nothing — I'll come back to it. Row 14 is the reason the other thirteen exist.&lt;/p&gt;

&lt;p&gt;Cost was never the argument. Each tool is "only" thirty or fifty euros a seat until you multiply it out, sure, and a founder who benchmarks a subscription against hiring a marketer doesn't blink at it either way. What makes them blink is paying for months and being unable to point at what changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we didn't buy a client portal
&lt;/h2&gt;

&lt;p&gt;The obvious move is to keep the tools and buy a portal: a branded login where the client sees dashboards, files and a status list. We looked at that and walked away, for a reason that has nothing to do with feature lists.&lt;/p&gt;

&lt;p&gt;A portal is where the work gets copied to. A workspace is where it gets done.&lt;/p&gt;

&lt;p&gt;Every portal I've watched decays the same way. The real board lives in whatever the team likes, the portal gets updated when someone remembers, and within a quarter the client is emailing for an update again because the portal is three weeks stale. The r/DigitalMarketing thread asking &lt;em&gt;"Is everyone stitching 3–5 tools every week/month?"&lt;/em&gt; is the same failure seen from the agency's chair. Visibility that somebody has to remember to produce is a chore, and chores get skipped. You can hold that off with discipline for a while; we wanted it held off by structure.&lt;/p&gt;

&lt;p&gt;So the design constraint for SharpOS was blunt: the agency does its work inside it or the whole thing is theatre. Our editorial playbook is a page tree in Pages. The weekly queue for every engagement is a board. When I move a card from Review to Approved, the client sees the card move. There is no second copy to keep in sync, because there is no second place.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it's built
&lt;/h2&gt;

&lt;p&gt;The parts a developer would ask about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The organisation is the tenant boundary.&lt;/strong&gt; Each client is an &lt;code&gt;Organization&lt;/code&gt;. Every query and mutation scopes to the requesting user's org, membership is verified server-side, and data never crosses orgs in either direction. Inside an org there are four roles (owner, manager, editor, viewer), and every piece of content is either &lt;code&gt;client&lt;/code&gt;, which every member can see, or &lt;code&gt;internal&lt;/code&gt;, which only platform admins can see or toggle. Even an owner can't flip it. A child is never more permissive than its parent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feature flags are enforced on both sides.&lt;/strong&gt; Platform admins switch the 23 surfaces on or off per organisation. Hiding a nav item is not enforcement, so every backend access path checks the flag itself, and a disabled feature stays rejected server-side even when a UI entry point leaks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One operation registry feeds humans and machines.&lt;/strong&gt; Core operations are defined once as &lt;code&gt;IntegrationOperation&lt;/code&gt; contracts; the REST API under &lt;code&gt;/integrations/v1&lt;/code&gt; and the MCP server are sibling adapters over the same definitions. As of this week that's 201 canonical operations and 125 MCP semantic tools, with 100% of the operations reachable from both sides. Scopes are fail-closed. The registry is an exhaustive &lt;code&gt;Record&lt;/code&gt;, so adding an operation without a scope entry is a compile error, and an operation missing from the registry at runtime is a 403 rather than a pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The stack.&lt;/strong&gt; Next.js 16 and React 19 in front; Convex for the database, functions, storage, realtime and HTTP; Better Auth with its organisation plugin for identity; BlockNote for the editor, with Convex's ProseMirror sync and presence components underneath so two people can type in the same brief; Tailwind v4 and shadcn/ui; Bun workspaces, Turborepo, Biome, Vitest and Playwright. It runs in the browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The size of it.&lt;/strong&gt; 23 flagged surfaces, 49 feature docs, about five months since the first commit, a bit over two thousand commits, one engineer. Read that as a consequence of the architecture above, and as a warning: it's also the bill I get to at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where each service lands
&lt;/h2&gt;

&lt;p&gt;The agency sells four things. Each one has a home in the workspace, which is how the client can tell the service is happening.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conversion-First Websites.&lt;/strong&gt; Audits hold the site checks and track each finding to done, instead of a PDF that vanishes after a week. Forms collect the enquiries the site produces. Analytics shows what moved. The brief for every change is a page; the change itself is a card.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ads Management.&lt;/strong&gt; Ads reads the organisation's own Meta account through a read-only grant (campaign-level spend, delivery, conversions, ROAS), so nobody has to log into Ads Manager to see where the money went. Customers keeps the leads next to the spend that produced them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Automations.&lt;/strong&gt; Automations is a canvas of triggers and actions over everything in the hub (boards, forms, customers, inbound webhooks, schedules), with every run recorded and replayable. Integrations connects the accounts the automations act through. Support is a chat widget on the client's site, answered from the organisation's own knowledge base. And because REST and MCP sit on the same registry as the UI, an agent operates the org the way a person does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Engine.&lt;/strong&gt; The playbook lives in Pages, each channel has its own board, Studio renders visuals from templates, Brand Kit holds the colours and type, Media Center holds the files, Spotlight is the link-in-bio. This article is a card on the Dev.to board; once it's approved it goes out through the organisation's connected DEV account.
## The row we couldn't replace, and what we gave up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Row 12. SharpOS doesn't replace Google Calendar, Sheets, Cal.com, Resend, WhatsApp, Facebook, ElevenLabs, OpenAI or OpenRouter. It connects to them. The client keeps paying for those accounts, and any all-in-one that tells you otherwise is being vague about where the world's data actually lives.&lt;/p&gt;

&lt;p&gt;There's a second cost, and it's the one I'd want to hear about from anyone who built instead of bought. Every surface in the ledger is shallower than the tool it stands in for. Studio is not Figma. Automations connects around fifteen providers, not thousands. Audits will not out-crawl a dedicated SEO suite. The bet is that, for a client engagement, one place the client will read and an agent can operate beats depth in twelve places they'd never open. I think the bet is right. I also know it's mine to maintain for as long as SharpHaw exists — that is the real price of building.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;This is part one of a series that takes the ledger a row at a time: how Boards became a database with a kanban on top, how a Studio frame becomes a PNG an agent can publish, why Support has no human handover, and what an MCP surface over 201 operations looks like in an agent's hands. The ledger with the logos lives at &lt;a href="https://sharphaw.digital/features" rel="noopener noreferrer"&gt;sharphaw.digital/features&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One question for the people who've been here: if you consolidated your stack, or looked hard at it and refused, which was the row you couldn't replace?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>architecture</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
