Carbonteq
Training/Backend - TypeScript

Headless Document Management System

A comprehensive backend training project that teaches clean architecture, domain-driven design, and modern TypeScript development through building a document management system

About the project

Headless API for documents, metadata, permissions, search, and short-lived downloads.

  • Storage: S3-compatible object store (minio/S3/GCS) + CDN optional.
  • Security: JWT auth, RBAC (Admin, User), pre-signed URLs, strict input validation.
  • Search: Filter by tags, metadata (key/value), filename, content-type; pagination & sort.
  • Versioning & Audit: Immutable file versions, basic audit trail (who/when/what).

Pre Requisites

  • Proficiency in TypeScript (Custom Types, Interfaces, Type Utils, Classes, Generics, etc.)
  • Proficiency in Node.js or Bun.js: Concurrency management, Event Loop, and File & Streams.
  • Basic Understanding of 12 Factor Apps
  • Functional Programming: Composition, Currying, Higher-Order Functions (HOF), Functors, and Monads

Kick-Off (Week 1)

Tasks

API Endpoints:

  • Build endpoints for uploading documents with metadata.
    • Build endpoint for managing metadata.
    • Build endpoints for managing permissions.
  • Introduce JWT-based authentication for securing endpoints.
  • Build endpoint for generating short lived download links for files.
  • Implement advanced search filters for documents using tags and metadata.

Other:

  • Cover gitflow and prepare a custom diagram in figjam. Goal is to visualize SDLC from git flow perspective
  • Create services to abstract the logic away from controllers.
  • Abstract away ORM model and create a physical store like APIs using repository pattern with interface for stores and their concrete implementation utilizing ORM models.

Expectations

  • Use Express.js or Hono for HTTP framework with traditional REST endpoints.
  • Use Drizzle ORM for database operations.
  • Use application-generated UUIDs instead of database-generated IDs.
  • Validate input using Zod schemas.
  • Implement JWT-based authentication with middleware.
  • Keep controllers thin: validate input, call services, return responses.
  • Use repository pattern for data access with interface abstractions.
  • Implement pagination with standard options and paginated responses.
  • Prefer async/await over promises and callbacks.

How to submit your work

Create a public repo on Github and push your code on it. then share the link back with the team.