Changelog

Unreleased

Features

  • Add a export_json_resume management 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 new get_structured_data facts API. Exports include a meta.django_resume extension 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_resume management 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 restores meta.django_resume.plugin_data by default when importing a django-resume round-trip export. Imported meta.django_resume.preserved_extensions are 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 a portable only option 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 resumed renderer. Rendering uses a portable JSON Resume projection with django-resume’s private meta.django_resume envelope 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_SCRIPTS for 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 resumed and 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 now GET-only and returns HTTP 405 for non-GET requests; previously it had no method restriction

Features

  • Add a just docs-serve shortcut with a configurable port for building and serving the Sphinx documentation locally

  • Let installed apps register their own resume pages: django_resume now autodiscovers a resume_pages module 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 modifying django_resume or adding a migration. The bundled example project demonstrates this with an editable PortfolioPage at /<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_title to be listed and can override is_visible for state-dependent links; the page_nav template 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) and nav_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 a capabilities tuple and a page sets section_names = by_capability("portfolio") to include every matching plugin (match="any" by default, or match="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 plain theme when a resume’s active theme does not ship a page template, instead of raising TemplateDoesNotExist. The fallback is coherent – the page frame and its section fragments both render through plain – 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.metadata entry points (the django_resume.pages group), in addition to installed apps’ resume_pages modules. A package that is not in INSTALLED_APPS can ship a page (a ResumePage subclass 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 ResumePage page 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 loc workflow with repo-area summaries for src, tests, and other tracked code

  • Make bare just print an overview of the available recipes instead of running check by default

  • Add a just serve-example shortcut for starting the bundled example Django project

  • Redirect 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_resume to INSTALLED_APPS and do not need django-htmx for the built-in editing views

  • Add nh3 as a runtime dependency to sanitize rendered markdown HTML before plugin output is marked safe

  • Block 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_data field to avoid lost updates across concurrent edits

  • Generate CV access tokens with the secrets module instead of the non-cryptographic random PRNG

  • Remove 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 setting Referrer-Policy: no-referrer on token-protected CV responses

  • Use 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.