create-base-starter-app
v1.0.4
Published
This document explains:
Readme
Next.js Starter — Complete Setup Guide
This document explains:
- What we built
- Why we built it
- Architecture decisions
- npm package setup
- CLI generator setup
- Publishing process
- Best practices
Goal
Create a starter system where teams can run:
npx create-base-starter-app og-appand instantly get:
- Next.js
- TypeScript
- SCSS Modules
- Atomic Design
- Shared architecture
- Typed setup
- Service layer
- Husky
- Lefthook
- Folder structure
- Reusable components
- Documentation
Final Architecture
We created TWO applications.
1. CLI APPLICATION
This is the npm package.
base-starter/Purpose:
- Published to npm
- Generates projects
- Copies template
- Initializes setup
2. GENERATED NEXTJS APPLICATION
This lives inside:
templates/nextjsPurpose:
- Real project starter
- Copied into user project
- Frontend architecture
Final Folder Structure
base-starter/
├── dist/
├── src/
├── templates/
│ └── nextjs/
├── package.json
├── tsconfig.json
├── README.mdCLI Architecture
src/index.ts
Main CLI entrypoint.
#!/usr/bin/env nodePurpose:
- Ask project name
- Copy template
- Initialize project
Why dist Exists
We use:
tsupto compile TypeScript.
Flow:
src/index.ts
↓
tsup build
↓
dist/index.jsnpm runs:
dist/index.jsNOT TypeScript directly.
Why src Should NOT Be Published
src/ is development source code only.
Users only need:
dist/So we added:
"files": [
"dist",
"README.md"
]This prevents unnecessary files from being published.
Next.js Template Setup
Inside:
templates/nextjswe created architecture.
Enterprise Folder Structure
templates/nextjs/
├── app
├── assets
├── components
├── constants
├── hooks
├── schemas
├── services
├── shared
├── store
├── styles
├── tests
├── types
├── utilsAtomic Design
We used:
components/
├── atoms
├── molecules
├── organisms
├── templatesBenefits:
- Reusability
- Scalability
- Better UI consistency
Shared Architecture
We removed feature-based nesting and used shared architecture instead.
Example:
services/
hooks/
utils/
types/Benefits:
- Easier onboarding
- Better discoverability
- Enterprise scalability
SCSS Setup
Each component contains:
Button/
├── Button.tsx
├── Button.types.ts
├── Button.module.scss
├── README.md
├── index.tsBenefits:
- Typed props
- Scoped styles
- Self-documenting components
TypeScript Setup
Enabled:
"strict": trueAvoided:
anyUsed:
- interfaces
- reusable types
- typed services
Service Layer Pattern
API logic isolated inside:
services/Example:
export const getUsers = async () => {
return apiClient.get('/users');
};Benefits:
- Reusable APIs
- Better testing
- Clean UI components
Husky Setup
Purpose:
- Git hooks
Installed:
npm install husky --save-devInitialized:
npx husky initExample hook:
npm run lintLefthook Setup
Purpose:
- Faster git hooks
Installed:
npm install lefthook --save-devConfigured:
pre-commit:
parallel: true
commands:
lint:
run: npm run lintnpm Package Setup
package.json
Important fields:
{
"bin": {
"create-base-starter-app": "./dist/index.js"
}
}This creates executable CLI.
Build Setup
Used:
tsupBuild command:
"build": "tsup src/index.ts --format esm,cjs --dts && cp -R templates dist/templates"Purpose:
- Build CLI
- Copy templates into dist
Why Templates Must Be Copied
Initially we got error:
ENOENT templates/nextjsbecause published package did not include templates.
Fix:
cp -R templates dist/templatesNow templates publish correctly.
npm Publish Issues We Solved
1. Husky Not Found
Problem:
husky: command not foundCause:
- prepare script ran before install
Fix:
"prepare": "husky || true"2. SCSS @use Error
Problem:
@use rules must be written before any other rulesFix:
Move all:
@useto TOP of file.
3. TypeScript DTS Errors
Problem:
baseUrl deprecated
moduleResolution deprecatedFix:
Updated tsconfig:
"moduleResolution": "Bundler",
"ignoreDeprecations": "6.0"4. npm 2FA Publish Error
Problem:
403 ForbiddenCause:
npm required token publishing.
Fix:
Created:
- Granular Access Token
- Bypass 2FA enabled
Configured:
npm config set //registry.npmjs.org/:_authToken TOKEN5. Same Version Publish Error
Problem:
You cannot publish over previously published versionsFix:
npm version patchHow Publishing Works
Step 1
Build package:
npm run buildStep 2
Verify package:
npm packStep 3
Publish:
npm publish --access publicFinal Usage
Users can now run:
npx create-base-starter-app my-appand instantly get enterprise setup.
Enterprise Benefits
Faster onboarding
New developers start immediately.
Consistent architecture
All teams follow same structure.
Reusable components
Shared design system.
Better scalability
Large applications stay maintainable.
Strong typing
Reduced runtime bugs.
Recommended Future Improvements
- TurboRepo
- Storybook
- Playwright
- Docker
- GitHub Actions
- Kubernetes configs
- Component generators
- CLI flags
- Monorepo support
- Environment generators
Recommended Commands
Local Development
npm run devBuild Package
npm run buildPublish
npm publish --access publicTest Package Locally
npm linkthen:
npx create-base-starter-app my-appFinal Notes
This setup is designed for:
- Enterprise frontend teams
- Large scale applications
- Shared engineering standards
- Long-term maintainability
- Rapid project initialization
Maintained By
Starter Frontend Architecture Team
