Foundation packages for side projects, each independently versioned and publishable to npm.
| Package | Description | Size (gzipped) |
|---|---|---|
@arshad-shah/store-kit |
Typed Zustand factory with persistence and migrations | ~1.4 KB |
@arshad-shah/fetch-kit |
Typed fetch client with retries, schema validation, React hooks |
~2.5 KB core, ~0.8 KB hooks |
@arshad-shah/log-kit |
Structured logger with pluggable transports and perf markers | ~1.4 KB core |
@arshad-shah/config-kit |
Typed env loading from .env, process.env, and remote sources |
~1.4 KB |
Each package can be used on its own. They compose cleanly when combined - fetch-kit can take a log-kit Logger for telemetry, config-kit can take one for source-load diagnostics, but neither has a hard dependency.
Every side project hits the same plumbing in the first week: state that survives a refresh, HTTP calls that are cancellable and typed, structured logging that ships somewhere, and config validated at boot. These four packages do exactly that, with strict TypeScript, enforced bundle budgets, and 95%+ test coverage.
.
├── packages/
│ ├── internal-config/ # Shared TS, build, test, lint config (private)
│ ├── store-kit/
│ ├── fetch-kit/
│ ├── log-kit/
│ └── config-kit/
├── apps/
│ └── docs/ # Astro Starlight docs site
├── .changeset/ # Release notes
└── .github/workflows/ # CI, release, docs deploy, mutation testing
pnpm install # one-time setup
pnpm test # run all tests across packages
pnpm test:coverage # with coverage thresholds enforced
pnpm build # build every package
pnpm lint # Biome check
pnpm typecheck # tsc --noEmit across packages
pnpm size # enforce bundle size budgets
pnpm docs:dev # run the docs site locallyThe packages are shaped to stay small and focused. New features need a clear use case from real projects, not "this would be cool". Bundle budgets are not negotiable - if a feature genuinely needs bytes, the budget moves up in the same PR with a one-line justification.
Add a changeset with every PR that affects a published package:
pnpm changesetMIT © Arshad Shah