Skip to content
atarashi
Documentation menu

TypeScript REST API

Express + PostgreSQL + Drizzle + JWT + Docker, in strict TypeScript.

atarashi new my-app --preset backend-ts

What you get

Files

34 files, 21.4 KB before node_modules.

my-app/
├── .github/
│   └── workflows/
│       └── ci.yml
├── src/
│   ├── config/
│   │   └── env.ts
│   ├── db/
│   │   ├── client.ts
│   │   ├── index.ts
│   │   └── schema.ts
│   ├── lib/
│   │   ├── async-handler.ts
│   │   ├── http-error.ts
│   │   ├── http.ts
│   │   ├── jwt.ts
│   │   ├── logger.ts
│   │   └── password.ts
│   ├── middlewares/
│   │   ├── auth.ts
│   │   └── error-handler.ts
│   ├── routes/
│   │   └── index.ts
│   ├── app.ts
│   └── index.ts
├── tests/
│   └── health.test.ts
├── .dockerignore
├── .editorconfig
├── .env.example
├── .gitignore
├── .prettierignore
├── .prettierrc.json
├── Dockerfile
├── LICENSE
├── README.md
├── atarashi.json
├── docker-compose.yml
├── drizzle.config.ts
├── eslint.config.mjs
├── package.json
├── pnpm-workspace.yaml
├── tsconfig.json
└── vitest.config.ts

Dependencies

  • bcryptjs@^3.0.2
  • cookie-parser@^1.4.7
  • cors@^2.8.5
  • dotenv@^17.4.2
  • drizzle-orm@^0.44.6
  • express@^4.21.2
  • express-rate-limit@^7.5.1
  • helmet@^8.1.0
  • jsonwebtoken@^9.0.2
  • pg@^8.16.3
  • pino@^9.13.1
  • pino-http@^10.5.0
  • zod@^3.25.76

Development only:

  • @eslint/js@^9.37.0
  • @types/bcryptjs@^3.0.0
  • @types/cookie-parser@^1.4.9
  • @types/cors@^2.8.19
  • @types/express@^4.17.23
  • @types/jsonwebtoken@^9.0.10
  • @types/node@^22.19.0
  • @types/pg@^8.15.5
  • @types/supertest@^6.0.3
  • @vitest/coverage-v8@^3.2.4
  • drizzle-kit@^0.31.5
  • eslint@^9.37.0
  • eslint-config-prettier@^10.1.8
  • pino-pretty@^13.1.2
  • prettier@^3.6.2
  • supertest@^7.1.4
  • tsx@^4.20.6
  • typescript@^5.9.3
  • typescript-eslint@^8.45.0
  • vitest@^3.2.4

After generating

  1. Start the dev server: pnpm run dev
  2. Copy .env.example to .env and fill in the blanks
  3. Start PostgreSQL: pnpm run db:up
  4. Set DATABASE_URL in .env
  5. Create the tables: pnpm run db:push
  6. Browse the data: pnpm run db:studio
  7. Check the API: curl http://localhost:3000/health
  8. Generate a signing key: openssl rand -hex 32
  9. Put it in .env as JWT_SECRET
  10. Build the image: docker build -t my-app .
  11. Bring the stack up: pnpm run compose:up
  12. Lint the project: pnpm run lint
  13. Run the tests: pnpm run test
  14. Tests read the same environment as the app, so export your .env before running them
  15. Push a branch and open a pull request to see CI run
  16. Fill in the blank values in .env.example and copy it to .env

Change it

A preset is a starting point, not a cage. Add to it, drop from it, or eject:

atarashi new my-app --preset backend-ts --add obs/pino
atarashi new my-app --preset backend-ts --remove lint/biome --add lint/eslint-prettier
atarashi add auth/jwt   # later, inside the generated project

Part of the atarashi documentation, written and maintained by Gautam Suthar.