Changelog¶
Unreleased¶
Features¶
Add a
export_json_resumemanagement command that exports a resume to a JSON Resume v1.0.0 document, validated against a pinned copy of the upstream schema. Plugins map their data through plugin-owned JSON Resume adapters built on a newget_structured_datafacts API. Exports include ameta.django_resumeextension envelope so a django-resume import can preserve plugin data that has no portable JSON Resume field, while the portable projection remains schema-valid. Authenticated resume owners can also download the same JSON document at/<slug>/json-resume/within the installed resume URL prefix. See Getting Started.Add an
import_json_resumemanagement command that creates a fresh resume from a JSON Resume file for a caller-supplied owner and slug. The command imports portable JSON Resume sections through plugin-owned adapters and restoresmeta.django_resume.plugin_databy default when importing a django-resume round-trip export. Importedmeta.django_resume.preserved_extensionsare stored and emitted again on later exports. Unchanged imported JSON Resume documents are retained and re-exported exactly as parsed so third-party standard sections survive an import/render/export check. Import reports lossy portable mappings, rejects malformed round-trip envelopes, detects import source-path conflicts, and returns clean command errors for unreadable or invalid JSON input files. Authenticated resume owners can also import a JSON Resume file from the resume overview to create a fresh owned resume. The browser workflow accepts an uploaded JSON file or public HTTP(S) JSON URL, a unique slug, an optional name override, and aportable onlyoption for ignoring django-resume’s private round-trip envelope, then reports mapped, restored, omitted, and lossy data inline.Add owner-only JSON Resume theme support. Resume owners can browse a curated catalog of deployment-owned, pinned npm JSON Resume themes, preview a catalog theme without changing the selected theme, use a separate action to persist a selected catalog key, and open a private rendered HTML page generated through the
resumedrenderer. Rendering uses a portable JSON Resume projection with django-resume’s privatemeta.django_resumeenvelope stripped before the Node theme runs. Arbitrary npm search/install is disabled by default and remains available only behind an explicit development-discovery setting.Add
DJANGO_RESUME_JSON_RESUME_ALLOW_THEME_SCRIPTSfor deployments that trust their curated JSON Resume render themes and need browser-side theme JavaScript to run in rendered theme HTML.Clarify theme terminology in the UI and documentation: django-resume template styling is a page theme, while npm-backed JSON Resume packages are JSON Resume render themes.
Fixes¶
Keep the editable resume overview compact after adding JSON Resume theme actions by shortening the theme link and preserving inline link separators.
Show immediate pending feedback while a JSON Resume catalog theme install or opt-in dynamic theme install is running.
Normalize JSON Resume fields expected by brittle third-party themes and allow rendered themes to load same-origin media images under the response CSP.
Clarify that catalog screenshots and public registry demos are illustrative; the exact render preview is the owner-only local Preview render action for the current resume and pinned package version.
Document how to export a JSON Resume file and render static HTML outside django-resume with
resumedand a locally installed JSON Resume theme.Clarify the website-owner JSON Resume theme link.
0.3.0 - 2026-06-21¶
Behavior Changes¶
The CV page (
/<slug>/cv/) is nowGET-only and returns HTTP 405 for non-GETrequests; previously it had no method restriction
Features¶
Add a
just docs-serveshortcut with a configurable port for building and serving the Sphinx documentation locallyLet installed apps register their own resume pages:
django_resumenow autodiscovers aresume_pagesmodule from every installed app on startup, so a third-party app can add an editable, themed page (with its own route and URL name) without modifyingdjango_resumeor adding a migration. The bundled example project demonstrates this with an editablePortfolioPageat/<slug>/portfolio/. See Creating Page Plugins.Generate the per-resume page links on the resume overview from the page registry instead of hard-coding them, so every registered page (including third-party pages such as the example Portfolio page) appears in navigation automatically. Pages set
nav_titleto be listed and can overrideis_visiblefor state-dependent links; thepage_navtemplate tag renders the list anywhere.Give page navigation explicit, deterministic ordering and grouping: pages set
nav_order(lower sorts first; a stable sort keeps registration order for ties) andnav_group(a group label). The new{% page_nav_groups %}template tag renders links bucketed by group, and the resume overview uses it, so a third-party page can place itself between the built-ins without editing a template. See Creating Page Plugins.Let a page select its sections by capability in addition to by name or
"__all__": section plugins advertise acapabilitiestuple and a page setssection_names = by_capability("portfolio")to include every matching plugin (match="any"by default, ormatch="all"). The built-in content plugins are tagged, and the example Portfolio page now selects its sections by capability. See Creating Page Plugins.Fall back to the
plaintheme when a resume’s active theme does not ship a page template, instead of raisingTemplateDoesNotExist. The fallback is coherent – the page frame and its section fragments both render throughplain– and it is per template, so a theme that provides only some page templates falls back only for the missing ones.Discover resume pages from separately distributed packages via
importlib.metadataentry points (thedjango_resume.pagesgroup), in addition to installed apps’resume_pagesmodules. A package that is not inINSTALLED_APPScan ship a page (aResumePagesubclass or a registering callable) that gets a route on startup, before the URLconf freezes. See Creating Page Plugins.
Refactor¶
Serve the cover/detail, CV, and permission-denied pages through a registered
ResumePagepage registry instead of hard-coded views; URLs, URL names, and behavior are otherwise unchanged
0.2.0 - 2026-05-12¶
Breaking Changes¶
Removed the experimental database-backed plugin system
Removed the plugin CRUD views, templates, signals, and database settings tied to DB plugins
Simplified plugin generation to produce filesystem plugin artifacts instead of database rows
Reset the app migration history around this removal; existing installs should treat this as a breaking reset rather than an in-place upgrade
Features¶
Add a colorized
just locworkflow with repo-area summaries forsrc,tests, and other tracked codeMake bare
justprint an overview of the available recipes instead of runningcheckby defaultAdd a
just serve-exampleshortcut for starting the bundled example Django projectRedirect the example project’s root URL to the admin login for anonymous users and the resume list for authenticated users without changing the reusable app’s URL behavior
Add HTMX boosting to owner navigation links between the resume list, cover, CV, and editable 403 page
Document the maintainer release checklist, including version bumps, changelog rollover, validation, artifact checks, publishing, and tagging
Fixes¶
Clarify that installations add
django_resumetoINSTALLED_APPSand do not need django-htmx for the built-in editing viewsAdd
nh3as a runtime dependency to sanitize rendered markdown HTML before plugin output is marked safeBlock dangerous link protocols in rendered markdown, including percent-encoded scheme variants
Route the About plugin through the same sanitized markdown rendering path as the other text-heavy plugins
Use block-level wrappers for plain-theme rich-text fragments so sanitized headings and other block content render as valid HTML
Lock resume rows during plugin-data writes and restrict saves to the
plugin_datafield to avoid lost updates across concurrent editsGenerate CV access tokens with the
secretsmodule instead of the non-cryptographicrandomPRNGRemove leftover demo validation and stray debug prints from plugin item forms
Make plugin data removal commands update resume JSON data in a single atomic bulk operation
Reject unsafe plugin names in filesystem management commands and keep generated and deleted paths contained inside the expected plugin directories
Use prefixed admin readonly field names for plugin links to avoid method-name collisions
Keep plugin inline URLs in sync when plugins are registered or unregistered dynamically
Harden CV token access by using constant-time token comparison, expiring timestamped tokens after
DJANGO_RESUME_TOKEN_TTL, and settingReferrer-Policy: no-referreron token-protected CV responsesUse Django’s in-memory SQLite test database by default so concurrent pytest invocations do not collide on a shared file with readonly-database errors
0.1.14 - 2025-12-07¶
Fixes¶
Fixed animated underline on links breaking when text wraps to multiple lines
0.1.13 - 2025-02-16¶
Features¶
Preview images for the README.rst
Links to the sample CV and Resume in the documentation
#3 How to run the example project
0.1.12 - 2025-02-15¶
Features¶
Added some bits on how to build the documentation
Fixes¶
#4 If no token is required, the CV link is shown on the cover
need to build wheel and sdist separately (fixed documentation)
0.1.11 - 2025-01-27¶
Features¶
#2: Add some documentation * Minimal installation instructions * Changelog moved to docs and was converted to reStructuredText
#3: Context for few shot learning to write plugins from a prompt
#3: Being able to store plugins in the database
Minimal CSS to enable cross-fade view transitions on navigation via links
Fixes¶
Fixed building wheel
Fixed an styling issue with the about plugin title
0.1.10 - 2024-12-06¶
Features¶
Make the title of the about section on the CV editable
Fixes¶
Fix 2 playwright tests
0.1.9 - 2024-11-09¶
Refactor¶
Simplify some image recognition code
0.1.8 - 2024-11-09¶
Refactor¶
Move definition of the background pattern to HTML to be able to use the static template tag
Features¶
Image dimensions for cover and permission denied image
0.1.7 - 2024-11-08¶
Fixes¶
Avoid h1 -> h3
Reserve space for image to avoid layout shift
0.1.6 - 2024-11-08¶
Fixes¶
Use preload for the fonts
0.1.5 - 2024-11-08¶
Features¶
Added a new custom 403 page for the CV page when there’s no token with a mailto link to the owner of the CV to request access
Fixes¶
Some minor style fixes
Fixed the input field overflow in the project item badge editor
New e2e tests for inline editing
Use the correct fonts (inter + martian mono)
0.1.4 - 2024-11-01¶
Features¶
Theme switching is now possible
Better looking edit panel
New URL for CV + redirect to old URL
Cover letter is now a ListPlugin
Added an avatar image to the Cover
Fixes¶
Fixed image upload via the admin
0.1.3 - 2024-10-13¶
Features¶
Added a resume detail page used as a cover letter
Added add resume button to the main page / resume list
Added delete buttons to the resume list
Added a base template for the resume pages
Do not require token for CV when user is logged in
Better print styles for the CV
Scroll animate project-boxes up
Super simple markdown support for cover letter text
0.1.2 - 2024-10-11¶
Features¶
Area labels for project links without text
Project links are working now in PDF export
Global edit button for the whole CV
Refactor¶
Moved all plugin templates in folders named after the plugin
Removed dead templates
0.1.1 - 2024-10-11¶
Refactor¶
The main Person model was renamed to Resume
Features¶
Added permission checks to the Simple and List base Plugins
0.1.0 - 2024-10-10¶
Initial Release¶
The CV is kind of working. Editing via Django-Admin or inline via contenteditable=”true” is possible.