| Two clouds, not one migration |
Moving the AWS version to GCP and calling it done tells a weaker story — "I moved my app" isn't an engineering demonstration |
Two live, working, differently-architected deployments of the same product is a stronger portfolio artifact: the same problem, solved twice, on two clouds, with the reasoning written down for each. |
| Split across Vercel + Cloud Run |
An all-in-one platform is simpler to run but hides whether real containerization skills exist |
An actual Dockerfile and a genuine service boundary between two independently-deployed pieces demonstrates real multi-cloud competence, accepting the trade-off of two platforms to monitor and occasional Cloud Run cold starts. |
| Backend kept a monolith |
Mirroring a reference microservices codebase for a single-user chatbot with one request type is over-engineering |
Knowing when not to add a gateway/model/worker split is itself worth demonstrating — over-architecting a simple problem is a real anti-pattern interviewers watch for. |
| Gemini over Bedrock, Groq, OpenAI |
Bedrock is AWS-only (breaks the GCP story); Groq and OpenAI's free tiers are trial-credit only, not a standing free tier |
Gemini keeps the cloud story coherent end-to-end on GCP and has a genuine, ongoing free tier — a multi-provider fallback layer was considered and rejected as unnecessary vendor surface at this scope. |
| Firestore over S3-blob memory |
The AWS version used S3 mainly because it was already there, not because it fits structured, frequently-read-and-updated session records |
Porting the pattern — swap the memory backend behind an interface — mattered more than porting the exact implementation; a document database is simply the better fit. |
| Local Terraform state, single environment |
Mirroring the AWS repo's remote-state-plus-three-workspaces setup solves team and multi-environment problems |
This is a single-maintainer project — that infrastructure has no problem here to solve. |
| Workload Identity Federation on both clouds |
A downloaded service-account key is the default path and easy to reach for |
Keeping a consistent "no long-lived credentials" story across both cloud versions was a deliberate, matched design goal — not a coincidence. |