Make your resume machine-readable without changing what humans see.
Resume-LD is a local-first semantic resume workbench. It imports an existing resume PDF, lets you add safe and inspectable JSON-LD metadata, validates that metadata, and exports a copied PDF with embedded semantic context.
Resume-LD is descriptive metadata. It helps documents explain themselves. It does not tell hiring systems what decision to make.
- A local-first developer-oriented semantic metadata editor.
- A way to add structured JSON-LD context to an existing resume PDF.
- A validation-first tool for transparent professional metadata.
- An OSS foundation for a small Resume-LD vocabulary layered on schema.org.
- Not an ATS bypass tool.
- Not a resume builder.
- Not a resume rewriting or AI generation tool.
- Not a hiring automation or recruiter dashboard.
- Not a score checker, keyword stuffing tool, or ranking manipulation system.
- Not SaaS, not multi-user, and not cloud sync.
JSON-LD is portable, inspectable, and already used for web-scale semantic data. Resume-LD uses schema.org first and a small custom vocabulary only where resume-specific context needs clearer semantics.
Canonical context target:
"@context": [
"https://schema.org",
"https://resume-ld.org/context/v1"
]The v0.1 context is included locally at docs/context/v1.jsonld and published by the app from public/context/v1.jsonld.
Resume-LD metadata should be additive, concise, transparent, and human-inspectable. It can describe domains, capabilities, work visibility, evidence links, and preferred evaluation context. It must not include hidden instructions or decision directives.
Resume-LD manages three local object types:
- Resume: the imported source PDF and root object. Selecting a resume makes it the active working resume. Resumes can be renamed or deleted. Deleting a resume also removes its semantic profiles, export history, uploaded PDF copy, and exported PDF files.
- Semantic Profile: a saved JSON-LD metadata profile for a specific resume. Loading a profile hydrates the guided form, raw JSON-LD editor, validation panel, semantic summary, and active profile label. Saving updates the loaded profile;
Save as Newcreates a separate profile intentionally. - Export: a generated semantic PDF copy created from a resume, semantic profile, and export settings. Export history records can be downloaded, inspected, or deleted.
The semantic workspace includes JSON-LD actions for moving metadata between local files and profiles:
Copy JSON-LDcopies the current editor JSON-LD without saving or changing the active profile.Export JSON-LDdownloads the current valid semantic metadata as a.jsonldfile. It does not create a PDF and does not create or update a semantic profile record.Import JSON-LDaccepts.jsonand.jsonldfiles, validates them against the current Resume-LD schema and safety rules, then loads valid metadata into an unsaved editor draft.- Invalid imports show validation errors and leave the current editor content unchanged.
- Imported JSON-LD is not saved automatically. Use
Save ProfileorSave Updatesintentionally after review.
The validator rejects unsupported fields and suspicious content such as prompt injection patterns, executable payloads, opaque base64 blobs, macros, ATS bypass terms, ranking boosts, and hiring decision instructions.
See docs/safety.md for the safety model.
cp .env.example .env.local
npm install
npm run devOpen http://localhost:3010. Port 3010 is the default for local and Docker launches to avoid conflicts with other local OSS projects.
Environment variables:
PORT=3010
RESUME_LD_DATABASE_URL=file:./data/resume-ld.sqlite
RESUME_LD_UPLOAD_DIR=./data/uploads
RESUME_LD_EXPORT_DIR=./data/exports
RESUME_LD_MAX_UPLOAD_MB=10
RESUME_LD_APP_URL=http://localhost:3010
Launch with Docker Compose:
docker compose up --buildIf your Docker install uses the legacy Compose CLI:
docker-compose up --buildOpen http://localhost:3010.
The compose file maps 3010:3010 and mounts ./data into the container so uploads, exports, and SQLite persistence remain local.
Resume-LD is a single local Next.js application with explicit server-side modules for storage, validation, PDF export, and SQLite persistence. The browser talks only to local API routes. The app stores imported PDFs under data/uploads, exported copies under data/exports, and metadata records in data/resume-ld.sqlite. Semantic profiles are stored in SQLite with their validation reports; exports are history records backed by local PDF files.
See docs/architecture.md for the architecture diagram, object lifecycle rules, and data flow.
app/ Next.js App Router UI and API routes
components/ Workbench UI and local shadcn-style primitives
lib/db/ SQLite and Drizzle schema/client
lib/resume-ld/schema/ Strict v0.1 JSON-LD schema
lib/resume-ld/validation/ Validation report generation
lib/resume-ld/safety/ Safety scanning rules
lib/resume-ld/pdf/ PDF embed and inspect behavior
lib/resume-ld/storage/ Local file and path safety helpers
docs/ Architecture, schema, safety, context, and examples
examples/ Example Resume-LD documents
Required fields:
@context@type = PersonnameresumeLDVersionmetadataPurpose
Allowed metadata purposes:
semantic-contextaccessibility-contextprofessional-context
See docs/schema.md for full field and validation details.
v0.1 embeds JSON-LD using pdf-lib file attachment support, PDF document metadata, and an inspectable Resume-LD marker appended to the exported PDF copy. This keeps local inspection deterministic.
This is not yet claimed as standards-compliant XMP support. Improved PDF/XMP support remains a future roadmap item.
Resume-LD is licensed under the Apache License, Version 2.0.
Copyright 2026-2030 Gregory Kulp