Sawit Dev is a pnpm and Turborepo monorepo for a personal portfolio, browser-first developer tools, and the shared packages that support them.
The public portfolio and project showcase. It contains the home, about, projects, and contact experiences and is deployed as a static site to GitHub Pages.
See apps/web/README.md.
A browser-first tools application with a unified DNS Checker and WHOIS / RDAP Lookup. It is structured for future deployment to Vercel or another static-friendly platform.
See apps/tools/README.md.
Shared UI primitives, hooks, utilities, fonts, and global styles used by both applications.
Shared DNS and RDAP catalogs and types. Browser-specific clients remain in the consuming application so this package stays framework-independent.
See packages/networking/README.md.
.
├── apps/
│ ├── web/
│ │ ├── app/
│ │ ├── components/
│ │ ├── hooks/
│ │ ├── lib/
│ │ └── public/
│ └── tools/
│ ├── app/
│ ├── components/
│ ├── hooks/
│ ├── lib/
│ └── public/
├── packages/
│ ├── networking/
│ │ └── src/{dns,rdap}/
│ └── ui/
│ └── src/{components,hooks,lib,styles}/
├── package.json
├── pnpm-workspace.yaml
├── turbo.json
├── LICENSE
└── README.md
Routes are thin orchestrators. Feature UI is split into feature folders, application behavior belongs in app-local hooks and libraries, and reusable cross-app concerns belong in packages.
- Node.js 20 or newer
- pnpm 10.33.4 or newer
Install dependencies:
pnpm installRun all development tasks:
pnpm devRun one application:
pnpm --filter web dev
pnpm --filter tools devBuild and type-check the workspace:
pnpm build
pnpm typecheckRun the end-to-end suite:
pnpm test:e2eapps/web produces a static GitHub Pages build and creates a 404.html SPA fallback. apps/tools produces a static React Router build and is designed to be deployable independently, including on Vercel.
Original project code is licensed under the MIT License. See LICENSE. Individual workspace applications and packages include a copy of the same license for local clarity. Third-party dependencies, generated assets, and external API data remain subject to their respective licenses and terms.