| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .. | ||
| DEPLOYMENT.md | ||
| example1-dark.png | ||
| example1-light.png | ||
| README.md | ||
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 andProfilePage/PersonJSON-LD.SITE_URLfromme.json(environment fallback) supplies canonical, social image, schema and sitemap URLs. No hostname is inferred from untrusted request headers./robots.txtallows crawling and advertises/sitemap.xmlwhenSITE_URLis configured./sitemap.xmllists the canonical page; withoutSITE_URLit returns503rather than advertising a fictional domain./llms.txtprovides 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-previewpreviews the print composition and returnsnoindex, 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
- Review supported Node LTS and Alpine branches. Update
.nvmrc, engines, Docker and CI together; test the intended runtime. - Review
npm outdatedand dependency release notes. Upgrade deliberately, refresh the lockfile, runnpm audit, lint, tests and browser/PDF checks. minimatchis overridden to patched v11 because current development tools otherwise retain a vulnerable v10 dependency. Revisit this override when upstream requirements catch up.- 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. - Bump
package.jsonand the lockfile, Compose default tag and release documentation together. Release tags must match the package version. - 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.