
This week I laid the foundation that everything else in Project Culper will be built on top of. No features yet. Just the environment that makes building features possible without stepping on each other.
On the infrastructure side, we finalized our deployment architecture on AWS. The application will run on EKS with a single cluster (culper-cluster) serving two isolated Kubernetes namespaces: culper-production and culper-staging. External traffic enters through an Application Load Balancer with SSL termination handled by ACM, and DNS is managed through Route 53. Subdomains are locked in. The addresses projectculper.com for production and staging.projectculper.com for the integration environment.
For the CI/CD pipeline, we set up two GitHub Actions workflows. The test workflow fires on every push to any branch and runs our backend and frontend test suites automatically. The deploy workflow triggers on merges to staging or main, with a manual approval gate protecting production. Images are built and pushed to GHCR, then rolled out to the appropriate namespace via kubectl.
Locally, every team member gets an identical environment through Docker Compose and a VS Code Dev Container. One make setup gets you running. Services include FastAPI, React/Vite, the spaCy NER microservice, PostgreSQL 18 with Apache AGE, and Redis. Celery and Redis will not make an appearance until Month 4.
Month 2 starts with backend skeleton work: FastAPI routes, SQLAlchemy models, and standing up the real PostgreSQL instance.