myResume2/docs
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Blade34242 45a3cddf06
All checks were successful
Node CI / lint (push) Successful in 1m29s
Refresh resume design, Node lifecycle, PDF export and SEO
2026-11-07 07:38:03 +07:00
..
DEPLOYMENT.md Refresh resume design, Node lifecycle, PDF export and SEO 2026-11-07 07:38:03 +07:00
example1-dark.png Release 4.1.1: UI refresh, themes, examples, docs 2025-12-01 15:01:14 +07:00
example1-light.png Release 4.1.1: UI refresh, themes, examples, docs 2025-12-01 15:01:14 +07:00
README.md Refresh resume design, Node lifecycle, PDF export and SEO 2026-11-07 07:38:03 +07:00

Application and maintenance guide

The app renders a JSON résumé with Node.js 26 LTS, Express 5 and EJS 7. The order of the existing sections and the JSON data model are preserved. Screen styling, PDF download and native printing share the same content.

Local development

nvm install
nvm use
npm ci
npm test
npm run lint
npm start

The default port is 5555. .nvmrc, package.json, Docker and CI target Node 26. Run npm ci when dependency inputs change; commit package-lock.json with package updates.

Configuration

Setting Meaning
PORT HTTP port, default 5555
example / EXAMPLE First-run example 1 or 2; lowercase takes precedence
SITE_URL Fallback public HTTP(S) origin when me.json has no SITE_URL entry
APP_VERSION Compose image tag, default 5.1.0
HOST_PORT Compose host port, default 8000
RESUME_EXAMPLE Compose first-run example, default 1

Place personal content in public/ress/mountedRess/me.json. Existing content is never overwritten by first-run seeding. Changes to the JSON are read on the next request. picture, name, header and about are required strings. links, workexperiences, menus, educations and interests are required arrays. Optional fields include projects, testimonials, enableTestimonials, mail, phone, calendly, language (BCP 47, default en) and custom theme colors.

Use language: "de" for German content. A link may set sameAs: true only if it is a verified profile identifying the résumé owner; generic platform URLs and project links should not set it.

Dynamic public URL

Add SITE_URL to your existing public/ress/mountedRess/me.json (keep all résumé fields):

{
  "SITE_URL": "https://resume.example.com"
}

The file is reread on every profile/crawler request. Updates take effect on the next request without restarting Node or rebuilding/restarting Docker. Reload an open page to see its new metadata. The file is stored in the existing persistent volume. Prefer saving via atomic file replacement to avoid a partially written JSON file during requests.

me.json takes precedence over the environment. A missing key falls back to the environment variable; an explicit empty string disables canonical URLs and the sitemap. Use an absolute HTTP(S) origin without a subpath. Malformed JSON or an invalid URL returns 503 on the profile and crawler endpoints until corrected; /health and static assets remain available. The field is optional; existing résumés keep working.

Search and AI discovery

  • / returns complete server-rendered content, a descriptive title, summary, author metadata, Open Graph/Twitter tags and ProfilePage/Person JSON-LD.
  • SITE_URL from me.json (environment fallback) supplies canonical, social image, schema and sitemap URLs. No hostname is inferred from untrusted request headers.
  • /robots.txt allows crawling and advertises /sitemap.xml when SITE_URL is configured.
  • /sitemap.xml lists the canonical page; without SITE_URL it returns 503 rather than advertising a fictional domain.
  • /llms.txt provides a plain-text résumé summary from the same public JSON. It is an optional discovery aid, not a guarantee that AI systems will read or cite the profile.
  • /?pdf-preview previews the print composition and returns noindex, nofollow.

Structured data reflects visible content. No inferred credentials, invented achievements or testimonial aggregate ratings are emitted. Discovery and rankings depend on crawlability and the published content. After deployment, verify the canonical URL and submit the sitemap in the relevant search consoles.

PDF and print

All Download PDF buttons use the same browser-only exporter. It creates an isolated A4-width document, waits for styles, fonts and images, then downloads a paginated PDF. Theme and phone viewport do not alter the export. Résumé content is not sent to an external PDF service. The download is rasterized; native Print / Save as PDF produces selectable text.

The Print button and browser print shortcut use public/css/print.css, with white paper, readable typography, contact information, all enabled résumé sections and no screen controls. Sections flow onto fresh pages when needed. Cards avoid page breaks when they fit; unusually long cards may need to span pages. Page count follows content length. Browser headers/footers and background graphics remain settings of the print dialog.

Verification

npm test checks rendering of both examples, structured-data escaping, canonical configuration, crawler endpoints, preview noindex and invalid résumé validation. Run browser checks after changes to the template, styles or PDF library: light/dark, desktop/mobile, actual PDF download and native print, including all testimonial cards.

Maintenance lifecycle

  1. Review supported Node LTS and Alpine branches. Update .nvmrc, engines, Docker and CI together; test the intended runtime.
  2. Review npm outdated and dependency release notes. Upgrade deliberately, refresh the lockfile, run npm audit, lint, tests and browser/PDF checks.
  3. minimatch is overridden to patched v11 because current development tools otherwise retain a vulnerable v10 dependency. Revisit this override when upstream requirements catch up.
  4. Build with docker build --pull -t my-resume2:5.1.0 .. Check /health, rendering and non-root behavior using both examples and persistent mounted content.
  5. Bump package.json and the lockfile, Compose default tag and release documentation together. Release tags must match the package version.
  6. Deploy a versioned image built from the Forgejo release, preserving resume_data. Retain the previous release/image for rollback. Do not prune images until the replacement is verified.

Forgejo CI and release packaging run lint and integration tests. GitHub checks build Docker without registry publication. No Docker Hub secret is required. Logging rotates logs/out.log at 10 MiB with three compressed backups. The HTTP server supports graceful shutdown and exposes /health.