Week 10/40: Deploying CatAtlas with SQLite-to-Postgres Migration and CI/CD
Objective of week 10
This weekend, I deployed my full-stack web application (CatAtlas) from local development to production. The main goal was to set up a migration approach that lets me use SQLite locally and PostgreSQL in production by switching configuration (for example via DATABASE_URL), without having to change the application code.
Tech Stack
I extended my tech stack and also test Claude Code with Opus 4.5 CLI.
Frontend: React 19, TypeScript, Vite — modern SPA with type safety
Backend: FastAPI, Python 3.11+ — REST API with auto-generated docs
Database (Local): SQLite — zero-config local development
Database (Prod): PostgreSQL — scalable production database
Backend Hosting: Railway — container hosting with managed PostgreSQL
Frontend Hosting: Vercel — edge-optimized static hosting
CI/CD: GitHub Actions — automated unit testing and linting
Learnings
I learned that a dual-database setup works well when the app can switch databases through environment variables like DATABASE_URL, because it keeps local development fast while still supporting production-grade infrastructure.
I also ran into practical SQL compatibility differences between SQLite and PostgreSQL (like placeholders, auto-increment behavior, and some types), which means you need a small abstraction or careful SQL choices. Using Platform-as-a-Service made a big difference, because Railway automatically provides values like DATABASE_URL and PORT, while Vercel handles builds and CDN delivery with minimal manual work.
Finally, I reinforced the rule that secrets should stay out of Git, so production environment variables belong in the hosting platform configuration, not in the repository.
Production Demo
Yes, finally after 10 weeks real demo with an pubic URL:
The live application is available at https://w40-week04-learninglog-api.vercel.app. The backend API documentation is published via Swagger at https://w40-week04-learninglog-api-production.up.railway.app/docs, and I also exposed a basic health endpoint at https://w40-week04-learninglog-api-production.up.railway.app/health to quickly verify the backend is running.
Next Steps
Next, I want to configure a custom domain for both the frontend and the API so the project feels more “real.” Maybe I will add authentication (OAuth or JWT) and support real image uploads using cloud storage like Cloudinary or S3 - lets see. I also want to replace the baseline analysis with real AI integration using OpenAI or Anthropic APIs, and then add monitoring (for example Sentry?! or Prometheus) plus analytics to track usage and errors. Finally, once the web app feels stable, I’d like to build a small React Native companion app on top of the same API.