Personal engineering portfolio monorepo built with Nx.
This workspace currently combines:
apps/website- Astro website for the public portfolio, localized in English and Spanishapps/server- Node composition server that mounts the Astro website and the API behind one runtimeapps/api- Express API for backend endpoints and future application servicesapps/ng-website- Angular application kept in the repo as a parallel/legacy surfaceapps/website-e2e- Playwright smoke and screenshot coverage for the Astro websiteapps/api-e2e- Jest-based API e2e coverage
The current production direction is a monolith-style deployment with modern tooling:
- Astro handles the public website
- Astro Actions + Astro DB handle the contact form workflow
- Turso backs Astro DB for contact submissions
- Express remains available for API routes under
/api apps/serveris the single Node entry point used by Docker and Railway
This keeps the repo modular inside Nx while preserving the operational feel of a single deployable app.
apps/
├── api/ Express API
├── api-e2e/ API end-to-end tests
├── ng-website/ Angular website/app surface
├── server/ Node gateway/composition server
├── website/ Astro portfolio website
└── website-e2e/ Playwright smoke and screenshot tests
- Node.js
- pnpm
Install dependencies:
pnpm installpnpm nx run website:servepnpm nx run server:servepnpm nx run api:servepnpm nx run ng-website:serveUsed for Docker and server deployments. Expects Astro DB env vars from the environment.
pnpm nx run website:build
pnpm nx run server:buildUses apps/website/.env through Nx envFile.
pnpm nx run website:build-local
pnpm nx run website:preview-localpnpm nx run ng-website:build:productionpnpm nx run website:lint
pnpm nx run ng-website:lint
pnpm nx affected -t lintpnpm nx run website:test
pnpm nx run api-e2e:e2epnpm nx run website:typecheckpnpm nx run website-e2e:screenshots
pnpm nx run website-e2e:screenshots-home
pnpm nx run website-e2e:screenshots-projects
pnpm nx run website-e2e:screenshots-contactThe contact page uses:
- Astro Actions for form handling
- Zod validation
- Astro DB for persistence
- Turso as the remote database
Relevant files:
apps/website/src/actions/index.tsapps/website/db/config.tsapps/website/src/pages/contact/index.astroapps/website/src/pages/es/contact/index.astro
For the Astro website server build and runtime:
ASTRO_DB_REMOTE_URL=https://visomi-dev-visomi-dev.aws-us-east-1.turso.io
ASTRO_DB_APP_TOKEN=<turso-token>Important:
- Astro DB bakes the remote URL into the server bundle at build time
- Docker/Railway must provide these variables during build and runtime
- local development can use
apps/website/.env
See also:
docs/turso-env.mddocs/monolith-contact-architecture.md
Current deployment direction:
main-> Docker/Railway style server deployment- GitHub Pages deployment is disabled for the Astro site because the contact workflow depends on server features
The Docker build compiles the composed Node server in apps/server, which depends on:
apps/websiteapps/api
pnpm nx show projects
pnpm nx show project website --json
pnpm nx graph
pnpm nx run-many -t build
pnpm nx affected -t build,test,lintdocs/monolith-contact-architecture.mddocs/turso-env.mddocs/redesign/projects.md
.husky/pre-commitrunspnpm nx affected -t lint- SEO/social preview images are sourced from page-specific preview assets under
apps/website/src/assets/seo/ - The repo still contains the Angular site while Astro is the public production surface