Platform · Sage Sparrows · March to October 2026In use

SparrowOS

The operations platform a marketing agency runs on: tasks, chat, KPIs, analytics, mail and drive in one place, on the web and as a native Mac app.

My role: Sole developer, end to end: product, backend, web app, Mac app and data pipelines

~70%

more tasks shipped a month once it replaced Sheets and WhatsApp: about 30 before, 50-55 after

~15

people run their day on it across the agency

16

native Mac app releases, shipped through its own updater

49

actions the voice and typed assistant can take

01

The brief

Sage Sparrows runs marketing for D2C, real estate and EV brands with a team of about 15. The work was spread across Google Sheets and WhatsApp threads, and every brand's numbers sat in a different place: Meta, Google Ads, GA4, Shopify, Clarity.

With no in-house performance marketer, the agency needed one place to run its work and one dashboard every brand's ads could be run from. When a campaign stopped spending for days, nobody caught it. That was the kind of gap it had to close.

02

What I built

  • Tasks with a reviewer-driven stage flow: every task starts at Briefing, and after each review the reviewer picks the next stage, department and people. Work can be sent back, and Shipped (published) is separate from Done.
  • Google Calendar sync for work blocks and deadlines, and a scheduler that respects priority, deadlines and working hours.
  • Real-time chat: channels, DMs, threads, mentions, reactions, read receipts, file sharing and deep links to any message.
  • A KPI calculator with weighted department scoring, MD scores and profit sharing, with achievements computed automatically from platform data.
  • Data pipelines from Meta Ads, Google Ads, GA4, Shopify, Google Trends and Microsoft Clarity, synced daily, plus an ad engine that classifies every ad as TEST, KILL, OPTIMIZE, BREAKEVEN or SCALE.
  • Company mail, calendars and file storage on a self-hosted Stalwart server, used from inside the app.
  • Push notifications, 6-tier role-based access, Ctrl+K global search, notes with share links and a daily standup board.
  • A native SwiftUI Mac app with every page rebuilt, an encrypted local cache, and a system-wide command bar (Option+Space).
  • An MCP server so Claude can query the analytics directly.

03

How I built it

First flight on the hosting the agency already hadMarch 2026

A Fastify and MySQL backend, a React and Tailwind web app, Google sign-in with MySQL-backed sessions, and WebSockets for chat and live updates. It runs on the agency's existing cPanel host, so it shipped without new infrastructure.

Fix what the team felt first, then make the numbers rightJune and July 2026

Notifications and login refresh on iPhones and Macs came first. Then analytics became the top priority: I audited all 21 analytics pages, found 19 defects in 4 recurring classes (rates added together, snapshots summed across days, platforms storing the same metric differently, and dates bucketed in the wrong timezone), fixed every one, and folded the 21 pages into one dashboard. A Google Ads sync that had been dead for 13 months, because the API version it used was retired, came back with 25 new fields.

A native Mac app, built from scratchJuly 2026

A webview wrapper was tried and thrown out in favour of real SwiftUI. Native sign-in uses an additive, per-device token that is hashed at rest and can be revoked, so the web's cookie flow stayed untouched. Every page was rebuilt natively, including all 16 analytics dashboards, then audited line by line against the web app.

Make it hard to breakJuly and August 2026

The Mac app gained an encrypted SQLCipher cache, so a hosting hiccup shows slightly stale data instead of an error screen. GA4 turned out to be silently cutting every large report at 10,000 rows; the sync now pages through everything.

Talk to itSeptember 2026

An assistant layer, now 49 actions. The model only names an action and quotes the words; code resolves them, checks permissions, asks for confirmation and executes, with real undo. An audit before release caught 27 of the then 47 tools calling their routes wrongly. Atlas 1.0, a model I fine-tuned, runs it on each person's Mac.

Keep it healthyOctober 2026

A dependency security pass took every audit to zero, and abandoned carts from Shiprocket Checkout now land in Verte's and Alexandre Christie's sales sheets automatically.

04

What it changed

~70%

more tasks shipped a month after replacing Sheets and WhatsApp: about 30 before, 50-55 after

1 page

of analytics instead of 21 separate dashboards

9 brands

56 campaigns, about 110 assets and 120 open tasks in the system on 2 Sep 2026

>30x

the error in one average order value widget before the aggregation fixes

The team runs its work from SparrowOS instead of Sheets and WhatsApp. Management reviews every brand from one analytics page, and campaigns that are switched on but not spending now raise an alarm instead of going unnoticed for days.

Next: moving off shared hosting to a VPS, then Windows, iOS and Android clients on the same server.

05

Inside this entry

Start
something.

Based in India · IST (UTC+5:30) · Works remotely

Or write it here:

Which describes you?

Goes straight to my inbox, with the page you came from.

Your draft stays on this device until you send it. Until then I only see rough labels, like a budget range or a job search. Privacy

Prefer email? hello@smithmankar.co.in · LinkedIn