Skip to content

Where to Go From Here

You’ve built and deployed a full-stack application. The skills you used — REST APIs, authentication, database persistence, React integration, CI/CD — are the foundation of most web development work. Here’s what to learn next and why.

SQLite is perfect for learning and solo projects, but most production applications use a client-server database like PostgreSQL (or MySQL):

  • Multiple concurrent writers (SQLite has write locks)
  • Handles large datasets efficiently
  • Required by most cloud platforms (Railway natively supports PostgreSQL)

Migration path: replace better-sqlite3 with pg (the Node.js PostgreSQL driver) or an ORM like Prisma that works with both.

Writing raw SQL by hand works, but an ORM adds:

  • Type-safe queries — TypeScript knows the shape of your data at the query level
  • Migrations — version-controlled schema changes with prisma migrate
  • Relations — queries across joined tables without writing JOIN manually

Prisma is the dominant choice in the Node.js ecosystem and works with SQLite, PostgreSQL, and MySQL.

Bulletin has no tests. Adding them:

  • Unit tests (Vitest or Jest): test pure functions and hooks in isolation
  • Integration tests: test Express routes against a real (test) database
  • End-to-end tests (Playwright): control a real browser and verify user flows

Start with integration tests for your API routes — they give you the most confidence for the least setup.

You used TypeScript throughout the course, but there’s more:

  • Generics: write functions and types that work across multiple types
  • Discriminated unions: model state machines cleanly (e.g., { status: 'loading' } | { status: 'error', message: string } | { status: 'success', data: Post[] })
  • Utility types: Partial<T>, Pick<T, K>, Omit<T, K> for building types from other types

For a real production app, explore:

TopicWhat to learn
Refresh tokensShort-lived access tokens + long-lived refresh tokens — avoid the 24-hour logout problem
File uploadsmulter for multipart form data; S3 or Cloudflare R2 for storage
Emailnodemailer for transactional email (registration confirmation, password reset)
Rate limitingYou already have it in Bulletin — learn express-rate-limit internals
Loggingpino for structured JSON logs; ship logs to a service like Logtail or Datadog
CachingRedis for caching expensive queries; node-cache for simple in-memory caching
  • SQL and Databases — relational modeling, indexes, queries, migrations, and PostgreSQL
  • Testing with Vitest and Playwright — unit, integration, and end-to-end testing for the full stack
  • Advanced TypeScript — generics, utility types, type guards, and type-level programming

Pick one “where to go from here” item that sounds interesting to you and spend 15 minutes researching it:

  1. Find the official documentation or a reputable tutorial.
  2. Identify one specific thing you’d add to Bulletin using that technology.
  3. Write it down — even a sentence. Having a concrete next project makes learning stick.
  • SQLite → PostgreSQL is the natural database upgrade path.
  • Prisma adds type-safe queries and schema migrations.
  • Testing (unit, integration, E2E) is the highest-leverage skill to add to a working app.
  • TypeScript generics and discriminated unions are worth learning after the basics.
  • The architecture you learned here — REST API + auth + frontend + deploy — applies to almost every web project.