SSiddiq.in
Marketing sites, built like product

Most agencies ship. We deploy — with pipelines, tests, and someone paged when it breaks.

The gap between "it works on Chrome" and "it survives a marketing team" is process. We bring the process — CI on every push, preview URL per branch, budgets that block bad merges.

What a normal Tuesday PR looks like on our repos.

The check list below runs on every push, on the branch's own preview URL. The one red line here — a visual diff — blocks the merge until someone eyeballs the change and either approves or fixes it.

feat/pricing-tiles → main
preview-4287.dev
  • typecheck18s
  • eslint + prettier9s
  • unit tests · 214 passed31s
  • playwright · 42 passed1m 44s
  • lighthouse budget · LCP 1.4s42s
  • axe-core a11y · 0 violations12s
  • bundle-size delta · +2.4KB6s
  • visual regression · 3 diffs58s

The default stack. Boring, on purpose.

We swap layers when the problem earns it. We don't swap for novelty.

Framework
Next.js or Astro
SSR for content sites, SSG for docs. React Server Components where the payload savings are real.
Styling
Tailwind + CSS variables
Tokens live in :root, components read them. No cascade fights, no naming committees.
CMS
Sanity or Payload
Structured schemas, presentation-mode preview, editor UI that can't break the design.
Data
Postgres + Prisma
Boring, well-understood, fast enough for anything a website will throw at it.
Hosting
Vercel, Cloudflare, or your own AWS
Depends on where your traffic sits and what your team runs. We port between them without drama.
Analytics
GA4 + PostHog + a warehouse row
GA for the market, PostHog for events + funnels, warehouse for real analysis.
Monitoring
Sentry + Better Uptime + Vercel Analytics
Errors, uptime, and CWV — three inboxes we watch, so you don't.

DX that includes your editors, not just your engineers.

For engineers
  • · `pnpm dev` in under 8 seconds, HMR under 200ms
  • · One `.env.example`, one README, one architecture doc
  • · Preview URL per PR, ephemeral database per PR
  • · `pnpm check` runs the same gates CI runs
  • · Commit hooks that catch the mistakes you'd make at 6pm on Friday
For editors
  • · Presentation-mode preview — click a text on the live page, edit it in place
  • · Structured components with sensible defaults, no HTML blobs
  • · Draft, scheduled publish, and rollback on every content type
  • · Image uploads auto-compressed and derivative-generated
  • · One-hour training, recorded, indexed, kept in your workspace

Nine gates. Every deploy walks through all of them.

TypeScript strictPR
Lint (biome + eslint)PR
Unit testsPR
Playwright e2e on previewPR
Lighthouse budget (LCP < 1.8s)Merge
Accessibility (axe-core, 0 crit)Merge
Bundle-size delta (+20KB max)Merge
Visual regression on top 5 templatesMerge
Smoke test on prod after deployPost-deploy
DevEx vocabulary

Eight practices that separate a "working site" from a shippable one.

CI

Continuous Integration. Every push runs typecheck, test, lint, build. Red = merge blocked. Non-negotiable.

PR preview

Every pull request gets a unique URL with the change live. Marketing/PM review before merge, not after.

Staging

Production-shape environment with a copy of prod data. Last stop before real users.

Feature flag

Ship code dark. Turn on for 5% of users, then 50, then all. Rollback = one config change, not a redeploy.

Canary

New version served to 1–5% of traffic first. Metrics stay flat → widen. Metrics wobble → rollback.

Rollback plan

Written before deploy: which button, in which order, by whom. Rehearsed once a quarter.

Migration lockstep

Schema change ships in two deploys: additive first, code that reads new, then old removed. Zero-downtime discipline.

Observability

Logs + metrics + traces. If you can only answer 'is it up?', you don't have it — you have monitoring.

Anti-patterns

Six architecture mistakes we routinely inherit.

01
Secrets in the repo

'.env committed once' is a lifetime data breach.

Instead: Secret manager (Doppler, Vault, cloud native). CI scans on every push.
02
Drift between environments

Prod has a plugin staging doesn't. Every deploy is a coin flip.

Instead: IaC (Terraform, SST). Environments differ only in data + secrets.
03
No seed data

New dev spends day one begging for a DB dump.

Instead: Committed seed script. `bun setup` boots a working local site in <5 min.
04
God monorepo, no boundaries

Marketing code touches billing code. Every change risks everything.

Instead: Workspaces + owner files. Circular imports fail CI.
05
No rollback plan

Ship-forward-only culture. Bad deploy = midnight surgery.

Instead: Blue-green or canary. Rollback is a button, not a migration.
06
No observability

Users tell you when it's broken.

Instead: Logs + traces + Real User Monitoring. Alerts on user-visible symptoms, not CPU.

Development questions we get in kickoff.

It's what happens after the design is signed off — and it's where most agencies get quietly sloppy. No CI, no preview URLs per branch, no perf budget in the pipeline, no accessibility check on merge. We treat marketing-site development the way product teams treat product code: pipelines, tests, review, deploy.

Bring the design or the ideas. We'll bring the engineering.

First PR merged inside a week. Preview URL on day one. Everything you build is yours to keep.

Start a project

Discuss your project with Siddiq

Share your requirements and get an honest reply — with approach, timeline, and estimate — within 24 hours.

  • Personal reply from Siddiq within 24 hours
  • Honest advice — no pushy sales, no fake urgency
  • Clear next steps, timeline, and estimate

We only use your details to reply to this enquiry. Privacy.