OpenResume is a privacy-first CV and resume builder built for ordinary users: open the site, fill structured modules, preview a professional document, save locally, export a backup, and print to PDF.
The current repository contains a browser-only vanilla MVP. That MVP proved the core workflow, but it is not the long-term implementation. OpenResume is an openElement product and must become a full openElement dogfood application before feature expansion.
OpenResume should become a lightweight, trustworthy alternative to heavyweight resume platforms:
- No account required for the default experience.
- No cloud database required before v1.0.
- User data stays in the browser unless the user explicitly exports or shares it.
- The first screen is the actual editor, not a marketing landing page.
- CVs and resumes are edited through plain-language modules, not source files, JSX, Markdown, or schema objects.
- The printed PDF should be good enough for real academic and professional use.
The first stable release should support three primary users:
- Academic users preparing academic CVs for university roles.
- Teaching-focused candidates preparing teaching CVs.
- General professional users preparing compact industry resumes.
The current MVP includes:
- A static browser editor.
- A structured JSON document model.
- A left-side editor and right-side A4 preview.
- Module visibility, module ordering, item editing, item ordering, and item deletion.
- Browser-local saving with
localStorage. - JSON import/export.
- Print/PDF output.
- Playwright coverage for load, edit/save/restore, import/export, and print media behavior.
The current implementation is temporary:
- It is written as vanilla HTML/CSS/JS.
- It uses npm only for tests and local serving.
- It is not yet an openElement app.
- It should be replaced directly, not preserved as a legacy implementation.
The following are intentionally out of scope before v1.0:
- Account system.
- Cloud database.
- Multi-user collaboration.
- Server-side editing or server-side CV persistence.
- Paid plans or billing.
- React, Vue, Svelte, or another UI framework.
- Keeping a legacy vanilla app after the openElement rewrite.
- Merging OpenResume into the openElement monorepo.
OpenResume stays an independent repository under open-element, while using
openElement as its application framework.
Goal: replace the temporary vanilla implementation with an openElement app.
Required outcomes:
- Replace the repository structure with Deno, Vite, and openElement:
deno.json,vite.config.ts,app/routes,app/islands,app/components, andapp/data. - Implement the editor as an openElement island.
- Implement the print-ready preview as openElement-rendered UI.
- Preserve existing MVP behavior: structured editing, local save, JSON import/export, module management, and print/PDF.
- Remove the vanilla runtime files instead of moving them to
legacy/. - Update Cloudflare Pages instructions to build with
deno task buildand servedist. - Keep the repository independent from the openElement monorepo.
Acceptance criteria:
deno task buildpasses.deno lintpasses.deno fmt --checkpasses.- Playwright E2E passes for load, edit/save/restore, import/export, and print media behavior.
- The production build can be deployed by Cloudflare Pages from
dist.
Goal: make the product usable by non-technical users without reading documentation first.
Required outcomes:
- Replace internal language such as "section", "item", and "schema" with ordinary product language such as "module", "entry", "publication", and "reference".
- Add a first-run template chooser: Academic CV, Teaching CV, and Industry Resume.
- Add a clear edit flow for candidate details, contact details, profile, education, appointments, teaching, publications, awards, service, skills, and references.
- Add plain empty states for every module.
- Add "clear example content", "restore template", and "save now" actions.
- Add visible save state: unsaved, saved, auto-saved timestamp, and imported draft state.
- Add recovery for accidental item deletion, at minimum an undo affordance for the most recent delete.
Acceptance criteria:
- A first-time user can create a usable CV without editing JSON, Markdown, JSX, or any source file.
- Existing E2E coverage still passes.
- New E2E covers template selection and clearing sample content.
Goal: make printed output professionally usable.
Required outcomes:
- Add at least three print templates: Classic Academic, Modern Two-column, and Compact Resume.
- Support A4 and Letter page formats.
- Support basic style controls: accent color, font family, text scale, margin density, and compact mode.
- Add print-only CSS that hides all editor controls and produces stable page dimensions.
- Add print preview warnings for likely issues: visible placeholders, empty required fields, very long contact values, invalid email format, and page overflow risk.
- Ensure long academic content can flow across pages without breaking headings and entries in obviously bad places.
Acceptance criteria:
- Chrome and Edge print preview show only the CV/resume surface.
- A4 output is usable for academic CVs.
- Letter output is usable for industry resumes.
- Playwright verifies print media layout at desktop dimensions.
Goal: make user data behavior predictable while keeping the product backend-free.
Required outcomes:
- Define
.openresume.jsonas the official exported data format. - Version the data model.
- Add a migration function for older saved documents.
- Keep
localStorageas the default persistence layer. - Add a clear privacy statement in the app: data is stored in the browser by default and is not uploaded by OpenResume.
- Add import validation for malformed JSON, wrong format, unsupported future versions, and missing required fields.
- Add explicit reset flows: reset current document, reset to selected template, and import from backup.
- Add export reminders for users who have edited significantly without backing up.
Acceptance criteria:
- Importing invalid JSON never corrupts the current CV.
- Saved documents survive page reloads.
- Exported
.openresume.jsonfiles can restore an equivalent document. - E2E covers invalid import, reset, and migration from a previous version.
Goal: make OpenResume genuinely useful for academic CVs, not just generic resumes with academic labels.
Required outcomes:
- Split publications into academic categories: journal articles, book chapters, conference proceedings, reports, work in progress, and under-review manuscripts.
- Add dedicated modules for: grants and funding, teaching experience, supervision, academic service, professional memberships, invited talks, public engagement, and research methods.
- Add academic profile fields: ORCID, Google Scholar, institutional profile, research areas, languages, and right-to-work note.
- Add academic CV templates for PhD, postdoc, lecturer, and teaching-focused roles.
- Support moving academic-only modules into the sidebar or main column depending on template.
Acceptance criteria:
- A linguistics PhD can create a credible university-facing academic CV.
- A teaching-focused candidate can create a teaching CV without publication emphasis.
- A postdoc candidate can emphasize publications, methods, grants, and research pipeline.
Goal: support non-academic resumes without weakening academic CV support.
Required outcomes:
- Add Industry Resume templates.
- Add modules for skills, projects, certifications, work experience, portfolio, and selected achievements.
- Add one-page resume mode.
- Add compact bullet editing.
- Add optional academic-to-industry transformations: publications become selected writing/research outputs, teaching becomes facilitation/training, service becomes leadership or committees.
- Let users hide academic-only modules quickly when switching to an industry resume.
Acceptance criteria:
- One data model can generate both an Academic CV and an Industry Resume.
- The one-page template can produce a credible single-page resume.
- E2E covers switching templates without losing source data.
Goal: meet the baseline quality expected of a public web tool.
Required outcomes:
- Support English and Chinese UI.
- Ensure all form fields have accessible labels.
- Ensure all buttons have clear accessible names.
- Ensure keyboard users can complete the primary edit flow.
- Add visible focus states.
- Add screen-reader-friendly status updates for save, import, export, and reset.
- Avoid UI text overlap on common desktop and tablet viewports.
- Add basic accessibility checks to E2E.
Acceptance criteria:
- The main editor can be used with keyboard navigation.
- Language switching does not corrupt saved data.
- The app has no known blocking accessibility issue for core editing and printing flows.
Goal: make OpenResume feel like a finished product instead of a technical demo.
Required outcomes:
- Add a small product shell around the editor without turning the first screen into a marketing page.
- Add first-run onboarding: choose template, fill basic profile, enter editor.
- Add a print/export checklist.
- Add better error states for local storage disabled, invalid import, unsupported document version, and failed template load.
- Add in-app help for modules that are often misunderstood: profile, publications, teaching, service, and references.
- Add browser support notes.
Acceptance criteria:
- First-time, returning, and import-from-backup users all have clear flows.
- Error states explain what happened and what the user can do next.
- The app still opens directly into a usable editing experience.
Goal: freeze v1 scope and remove quality risk.
Required outcomes:
- Freeze data model v1.
- Freeze public routes and deployment shape.
- Add GitHub Actions for format, lint, build, and E2E.
- Test Chrome and Edge as primary browsers.
- Smoke test Firefox for basic editing and print media.
- Document Cloudflare Pages deployment.
- Document data privacy and backup behavior.
- Review all templates for placeholder leakage and professional quality.
Acceptance criteria:
- Two consecutive release candidate runs pass without P0 or P1 issues.
- No known data-loss issue remains.
- No known print-blocking issue remains.
- The repository can be cloned, built, tested, and deployed from documented commands.
Goal: release a stable public OpenResume at cv.openelement.org.
Required outcomes:
- The app is implemented with openElement.
- Cloudflare Pages serves the production build.
- Academic CV, Teaching CV, and Industry Resume templates are available.
- Local save, JSON backup, import restore, template switching, and print/PDF are stable.
- Data privacy is explicit and accurate.
- Documentation explains what OpenResume does and does not do.
- Tests cover core editing, persistence, import/export, print, and deployment assumptions.
Acceptance criteria:
- A user can create, save, back up, restore, and print a CV without account creation.
- A user can understand that data stays local by default.
- A maintainer can safely ship patches without breaking the core workflow.
The document model should remain structured and versioned.
Required model direction:
version: data model version.profile: candidate identity, headline, location, links, and summary.contact: editable contact rows.documents: one or more generated views, such as academic CV or industry resume.modules: reusable source content blocks.templates: print and layout selection.settings: page size, theme, density, and locale.
Versioning rules:
- v0.1 can preserve the current JSON shape if needed.
- v0.4 must define
.openresume.json. - v0.9 must freeze v1 model semantics.
- Every breaking model change must include a migration path before v1.
The editor should be optimized for ordinary users:
- Use domain language instead of implementation language.
- Keep the editor and preview visible together on desktop.
- Use a focused single-column editor on mobile and tablet.
- Treat templates as starting points, not separate products.
- Make destructive actions recoverable or clearly confirmed.
- Keep print and export actions visible.
- Never require users to open source files.
The UX should avoid:
- Raw JSON editing as a primary path.
- Markdown authoring as a primary path.
- JSX or source-code editing.
- Hidden save behavior without status feedback.
Print quality is a core product requirement.
The print system must:
- Hide all editor controls in print media.
- Support A4 and Letter.
- Avoid text clipping and obvious overlap.
- Keep section headings with nearby content where possible.
- Warn users about placeholders and empty fields before printing.
- Support academic multi-page documents and compact one-page resumes.
The product should treat browser print-to-PDF as the default export path before adding any server-side PDF generation.
Minimum gates for every release:
- Format check.
- Lint.
- Build.
- E2E for editor load.
- E2E for editing and save/restore.
- E2E for JSON import/export.
- E2E for print media.
Additional gates by maturity:
- v0.3: print template checks.
- v0.4: invalid import and migration checks.
- v0.7: accessibility checks.
- v0.9: GitHub Actions on every PR.
- v1.0: browser smoke matrix.
Deployment target:
- Repository:
open-element/OpenResume - Production domain:
cv.openelement.org - Hosting: Cloudflare Pages
Current MVP deployment can serve static files from the repository root, but the openElement rewrite changes deployment to:
- Build command:
deno task build - Output directory:
dist
Deployment requirements before v1:
- Document Cloudflare Pages settings.
- Add production smoke test after deployment.
- Keep production domain independent from
openelement.orgmain docs. - Avoid hard-coding production domain into local development.
OpenResume should stay small and disciplined before v1.
Rules:
- Keep OpenResume as an independent repository.
- Use openElement as the application framework.
- Do not introduce another UI framework.
- Do not add backend persistence before v1.
- Do not add account flows before v1.
- Treat data loss and broken print output as high-priority defects.
- Every milestone should ship with tests for persistence and print behavior.
Issue categories:
ux: ordinary-user editing improvements.template: document template and module work.print: PDF and print layout work.data: local save, import/export, and migration work.a11y: accessibility work.i18n: localization work.dogfood: openElement adoption and framework integration.deployment: Cloudflare Pages and production rollout.
OpenResume reaches v1.0 when all of the following are true:
- The implementation is an openElement application.
cv.openelement.orgis deployed from Cloudflare Pages.- Users can create Academic CV, Teaching CV, and Industry Resume documents.
- Users can save locally, export
.openresume.json, import it back, reset, and print to PDF. - The app clearly explains that data stays in the browser by default.
- The app has no known P0/P1 editing, persistence, import/export, or print defects.
- The repository has documented local development, testing, and deployment commands.
- CI runs format, lint, build, and E2E gates.
- The public product is useful without accounts, cloud storage, or server-side PDF generation.