Welcome to my digital home. π
This is where I share what I've learned, showcase what I've built, give back to the open-source community with tools worth using, and write about performance, design systems, and the craft of engineering β everything worth sharing as I grow and learn.
Not a static rΓ©sumΓ© β a living one. Every commit is CI-gated, every touched file hits 100% coverage, and the whole thing ships to production on green. What you see is how I work.
It is organized as a pnpm workspace monorepo: the website is one app among its own shared tooling packages and backend workers.
SEO is handled in-house:
@soroush.tech/vite-plugin-sitemapemitssitemap.xmlfrom the prerendered HTML (skippingnoindexpages).- a static
robots.txtships fromapps/web/public/at build time. - meta-tags are injected for each page.
- Node 25 β pinned in
.nvmrc(nvm use). - pnpm 10.13.1 β pinned via the
packageManagerfield.
pnpm install # installs every workspace (also runs the setup below)
pnpm prepare # set up all you need β git hooks + per-workspace local env
pnpm dev # starts the web app dev serverpnpm prepare runs husky and then each workspace's setup (pnpm -r run setup):
it bootstraps .env.local from their default.env It runs automatically
on pnpm install; re-run it any time with pnpm prepare (or pnpm run setup).
- .github/workflows/README.md β CI/CD pipeline explained with Mermaid diagrams.
- apps/web/README.md β the website: structure, scripts, testing.
- packages/README.md β workspace packages.
- workers/README.md β backend.
- Pre-commit β a husky hook runs lint, format, and tests before each commit.
- Lint β
pnpm lintuses--max-warnings 0; any warning fails. - Coverage β touched files reach 100%, and every
packages/*package is held at 100% as a hard threshold. - Matrices β unit/component tests run on Linux Β· Windows Β· macOS, and e2e runs against Chromium Β· Firefox Β· WebKit (3 Γ 3).
- Visual regression β Storybook publishes to Chromatic on every PR (live demo).
- Deploy β CI success on
maintriggers the CD workflow, which builds with production env and deploys to GitHub Pages.
Full pipeline detail β with Mermaid diagrams of every workflow β lives in
.github/workflows/README.md and the
app README.
soroush.tech/
βββ apps/
β βββ web/ # The website itself β React 19 + Vike (SSG/SSR)
βββ packages/ # Shared, framework-agnostic tooling (@soroush.tech/*)
β βββ eslint-config
β βββ vite-plugin-watch
β βββ vite-plugin-sitemap
β βββ vite-plugin-msw-server
βββ workers/ # Backend deployables (Cloudflare Workers) β WIP
| Workspace | What it is | Details |
|---|---|---|
apps/web |
The production website β pages, design system, sections, hooks, tests. | apps/web/README.md |
packages/* |
Internal @soroush.tech/* tooling extracted from the app β Vite plugins and the shared ESLint base. Nice-to-have, consumed as TypeScript source via workspace:*. |
packages/README.md |
workers/* |
Backend deployables (APIs, edge functions). Empty for now. | workers/README.md |
Globs live in pnpm-workspace.yaml (apps/*,
packages/*, workers/*).
| Area | Choice | Why |
|---|---|---|
| Quality | SonarQube + CodeRabbit | Static analysis for bugs, smells, and security, plus AI-assisted code review on every PR. |
| Framework | React 19 (Isomorphic, SSG, SSR) | Pre-render every route to static HTML for speed and SEO, while keeping React's component model. |
| Build | Vite 8 | Fast dev server and an extensible plugin pipeline β the same pipeline our own plugins plug into. |
| UI docs | Storybook + Chromatic | Component catalogue with visual-regression review on every PR. |
| Monorepo | pnpm workspaces | Cheap internal packages with workspace:* links and no publish step for internal use. |
| Packaging | tsdown | Builds publishable packages (ESM/CJS + types) without the deprecated config that breaks under TS 6. |
| Lint & format | ESLint 10 + Prettier + husky | --max-warnings 0 and a pre-commit gate keep the tree always-green. |
| Styling | @emotion/styled |
Token-driven, prop-based styling with a typed design system rather than ad-hoc CSS. |
| Data | TanStack Query | Declarative server-state with caching. |
| Forms | TanStack Form + zod | Headless, type-safe form state and schema-validated (used by the contact form). |
| Backend | Hono on Cloudflare Workers | Type-safe edge API with OpenAPI docs (@hono/swagger-ui), backed by D1 and deployed via Wrangler. |
| Testing | Vitest + Playwright + MSW | Unit/component in Vitest, cross-browser e2e in Playwright, network mocked deterministically with MSW. |
Masoud Soroush
Email: masoud@soroush.tech
Website: soroush.tech
This project is a personal space to experiment, write, and share ideas. Contributions and feedback are welcome if you find something useful or inspiring.