========= 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 ``//json-resume/`` within the installed resume URL prefix. See :doc:`guide/usage`. * 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 (``//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 ``//portfolio/``. See :doc:`guide/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 :doc:`guide/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 :doc:`guide/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 :doc:`guide/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.