Personal portfolio site for Elmar Beckmann, deployed at https://elmar.dev. It is a static single-page site: one Angular 22 standalone component, no routing, no state management, no backend.
- Nx 24 workspace with two projects: the app
elmardotdevand the Cypress e2e projectelmardotdev-e2e.libs/is empty. - Run every task through
nx. The workspace has noangular.json, so thengCLI fails. Thetest,lintande2etargets are inferred by the plugins innx.json;buildandserveare inapps/elmardotdev/project.json. - Scripts for common tasks are in
package.json. - The build writes the site to
dist/apps/elmardotdev/browser.
- The whole site is
apps/elmardotdev/src/app/app.component.{ts,html,scss}. SEO metadata and the JSON-LD structured data are inapps/elmardotdev/src/index.html. - Visible content and the metadata in
index.htmldescribe the same facts (role, employer, client, social links). When one changes, update the other. - The build prerenders
/to static HTML (outputMode: "static", server entrymain.server.ts, hydration inmain.ts). There is no server runtime. - Change detection uses Zone.js (
provideZoneChangeDetection()inmain.ts, Zone.js test setup intest-setup.ts). - There is no CSS framework. The reset is in
styles.scss. Google Fonts loads from a CDN inindex.html.
- All styles are in
apps/elmardotdev/src/app/app.component.scss, with the shared SCSS variables at the top. - The template uses generic class names (
content-card,skill-item). Visual styling goes in the stylesheet, not in the template. - The only web font is Geist, loaded from Google Fonts in
index.html.
- Selector prefix
elmardotdev: kebab-case for components, camelCase for directives. ESLint enforces this. - Use built-in control flow (
@if,@forwithtrack) in templates and keep logic in the component class. - Group imports: Angular and third-party, then workspace, then relative, with a blank line between groups.
- Jest 30 renamed the path filter: run one spec with
nx test elmardotdev --testPathPatterns=app.component.spec.ts. - Run one e2e spec with
nx e2e elmardotdev-e2e --spec=src/e2e/app.cy.ts. - If Cypress fails with
bad option: --no-sandbox, the shell hasELECTRON_RUN_AS_NODE=1set. Run it withenv -u ELECTRON_RUN_AS_NODE. npm run format:checkcompares againstmain. Usenx format:check --allto check every file.
- Vercel deploys the GitHub repo
elmarbeckmann/elmar.dev:maingoes to production, every other branch gets a preview URL per commit. vercel.jsonsets the build command and the output folder. If the build output path changes, updatevercel.json, or the deployment serves a 404.
- Update with
nx migrate latest, thennpm installandnx migrate --run-migrations. - TypeScript stays within the range that
@angular/compiler-cliaccepts as a peer dependency, even when a newer TypeScript is out.