Upgrade an unsupported Open edX release

Upgrading an unsupported Open edX site means moving it to the latest named release, which is the only supported one, through the Tutor steps and data migrations that apply to your version. This page covers what changes, the upgrade path, preparation, sequence, testing, rollback and the effort drivers.

On this page

Why an Open edX upgrade from an older release cannot wait

The only supported Open edX release is the latest named release, which is Verawood, published on 30 July 2026, so a site still running Redwood, Sumac or Teak has to be moved to Verawood through a supported path. Open edX states that it cannot support more than one release at a time, which means there is no extended window in which an older named release keeps receiving the same support. For an operator, this turns the upgrade from a routine maintenance item into a dated dependency, because fixes for the older release should not be expected from the project. Your team should first confirm which release the production LMS and Studio actually run, since a Tutor-based deployment may carry plugins, custom images or fork commits pinned to that release.

The target should not be chosen in isolation. Willow is listed for December 2026 and Xylon for June 2027, so a site that lands on Verawood will face another named release within months. If your upgrade starts after Willow is published, a Verawood landing may need its own follow-on upgrade soon after. Ask the platform team to map the route from your current release to Verawood and then to Willow and Xylon, and to record which stops are required and which are optional. Whether any intermediate release must be installed in order is a question that the release notes and Tutor documentation for your version answer, so this page does not assume a specific chain of stops.

Confirm the intermediate releases from the Open edX release notes and the Tutor documentation for your current version before you commit to a calendar. Check the notes for each named release between your starting point and Verawood, read the breaking-change and migration sections, and note which Tutor major version each one requires. A route that skips a required stop tends to surface as failed database migrations or broken custom images late in the window, which is the most expensive place to find it. Record the results in a written upgrade plan that lists the stops, their order and the owner of each decision, and ask for that route to be stated in any written scope before anyone commits to dates.

Waiting also raises the cost of each later step. Custom XBlocks, theme and frontend work, identity provider configuration and any Aspects analytics pipeline depend on the release they were built against, so every quarter on an older release adds more code to review. Start the inventory now: list the plugins, forked repositories, Docker images, SSO settings and data stores in your deployment, and identify which of them are maintained upstream and which are maintained by your own team. This inventory sets the scope for the rest of the page and shows which decisions need an owner before the build starts.

What changes between an older release and Verawood

This table compares what changes between an older Open edX release and Verawood, the current named release published on 30 July 2026, and what each change means for an unsupported site. Read the Verawood additions as feature and course checks, and the development requirements as host and image checks. Breaking changes and deprecations differ for every release on the upgrade path, so take them from each release's notes and check them line by line.

ChangeImpactAction needed
Studio sidebarAuthors see a changed navigation, so custom Studio menu links or theme overrides may breakReview custom Studio links and theme styles in a test course before rollout
Redesigned instructor dashboardInstructors see a different layout, and custom dashboard templates or plugins may not renderInventory dashboard customizations and test them with an instructor account
AI Extensions Framework, tagging and taxonomy, frontend plugin slotsNew capabilities that need a decision on enablement, configuration and data impactConfirm defaults and data effects in the Verawood notes, then decide which features to enable
LTI Advantage Complete certificationChanges the LTI compatibility position of the platform, which affects connected toolsTest each LTI tool your site uses against the target release
Python 3.12 (development requirement)Custom images and plugin dependencies pinned to an older Python runtime may fail to build or runCheck Python versions in Dockerfiles and plugin requirements, then rebuild all images
MySQL 8.0 and MongoDB 7.x (development requirements)Database server versions below these levels may not match the target releaseCompare running versions with the target requirements and plan database upgrades with tested backups
Memcached and shared Django cacheMulti-node deployments need one shared cache, and per-node caches cause inconsistent behaviorConfirm the cache backend (Redis or Memcached) is set on every LMS and CMS node and is reachable from all of them
Identity provider and analytics components (only if used)Third-party auth providers and Aspects components carry their own version and configuration changesCheck each provider (OAuth2, SAML 2.0, Shibboleth, LTI, CAS) and Aspects (ClickHouse, Ralph or Vector, Superset) against the target notes; skip if unused
Breaking changes and deprecations per releaseEach release on the upgrade path adds its own removals and behavior changesRead every intermediate release's notes line by line and record each item against your customizations

How the supported upgrade path steps through Tutor versions

A site on Redwood, Sumac or Teak usually cannot move straight to the latest named release. Open edX supports only the latest named release at any time, so the upgrade has to pass through Tutor major versions in order, with each step bringing the platform, configuration and data forward to the next point the Tutor project supports. Before any work starts, the team should accept that the upgrade is a sequence of supported stops, not a single version change, and that the number of stops depends on the starting release. Planning the sequence first keeps the rest of the project honest about scope, testing and rollback.

The step list is built from the starting point forward. Record the Tutor version and Open edX release the site runs today, then read the Tutor documentation and the Open edX release notes for each major version between that starting point and the target Verawood release. For every step, note the Tutor version to install, the configuration keys added, renamed or removed, plugin versions that must match, and whether custom Docker images need a rebuild. Confirm the exact order against the official documentation for your own starting release. Do not reconstruct it from memory, from an old runbook or from a forum post, because those sources often skip a stop.

Each step ends only when a defined set of checks passes. Start with a verified backup taken immediately before the step, and confirm the Tutor upgrade command completes without errors. Then confirm that Studio and the LMS load, that a test course opens in Studio and previews for a learner, and that learner sign-in works through the configured identity provider. Check that background tasks and outgoing email run, that the database reports no pending migrations, and that custom XBlocks and themes render. Write the results in the runbook, along with the backup identifier, before starting the next major version. A failed check stops the sequence until it is resolved or rolled back.

Ask any partner to show the full step list for your starting release, the check set for each step, and the rollback method for each one. Confirm who signs off each checkpoint on your side, and who decides whether to roll back. Request a written estimate for the sequence, since the number of steps and the effort per step depend on your plugins, customizations and data volume, and no duration should be assumed until that estimate exists. Each step also needs a staging rehearsal and a backup retained until the final production checkpoint passes.

What to prepare before the first upgrade step

Four items need to be in place before the first Tutor upgrade step. Each one protects a different part of the work: the data you can restore, the code you must rebuild, the place where you rehearse each step and the decisions that govern production changes. Work through them in order, because the test environment depends on the inventory and the change plan depends on rehearsal results.

Verified backup of data and storage

Take a full backup of the relational databases, the media uploads and the object storage bucket that holds course assets, then restore it into a separate environment and sign in as a learner and as an author. A backup that has never been restored is only an assumption about recovery. Record when the backup finished, the file counts or checksums, and who ran the restore. Confirm that the backup covers the storage location your Tutor configuration uses today, since bucket names and paths are often set in overrides that the original backup script never read.

Inventory of customizations

List every component that differs from a standard Open edX build: custom XBlocks, third-party and in-house plugins, themes, forks of edx-platform, custom Docker images and configuration overrides in your Tutor settings and environment files. For each item, record the upstream source, the commit or version in use, the owner and whether the change is still needed. Forks and custom images usually carry the most upgrade work, because each one must be rebased or rebuilt against every intermediate release. Any item you cannot trace to a source or an owner is a risk to resolve before the first step.

Test environment from production data

Build a staging environment on separate infrastructure from a recent copy of production data, with the same Tutor version, plugins, images and overrides as production at the starting point. Run every upgrade step there before production, and keep the timing and error output so you can compare them later. Mask or replace learner personal data according to your privacy policy before the copy is made, and restrict access to the copy as you would production. Agree the refresh point with the data owner so that test results map to a known production state.

Written change plan and freeze window

Write one document that lists each upgrade step, its expected result, its rollback action and the owner of each action, with named owners for infrastructure, the Open edX platform, course content and learner communications. Set a freeze window during which no course publishing, bulk enrollment imports or configuration changes happen on production. Decide in advance who may call a rollback and which test or monitoring result triggers one. Share the plan with course teams and support staff so that learner notices match the downtime that the rehearsals actually showed.

Forum and library data migrations on the way

The forum migration moves discussion records, such as threads, responses, comments and their course associations, into the structure the target release expects. In general terms, the change concerns how records are keyed and linked to courses, so a failure can leave a thread visible but detached from its course, or drop replies. Find the steps for your starting release in the Open edX release notes, then follow each release's migration steps in the order listed.

  • Record counts: Compare threads, comments and subscriptions per course before and after the test run, against the source database.
  • Failed items: Capture every failed record with its course ID and error text, and group them so patterns are visible.
  • Time per batch: Measure throughput in test so the production run is estimated from observed batch times, not assumptions.
  • Sample review: Open a sample of threads per course in the LMS and confirm authors, replies and timestamps display correctly.
  • Your data: Confirm how many courses use discussions, whether posts reference deleted users or retired course IDs, and whether moderation or reporting depends on fields the migration changes.

Before cutover, confirm that counts reconcile and that every failed item has an owner and a documented decision.

Rebuilding custom images and rebasing forks

Rebuild the custom images after every upgrade step, and rebase each fork onto the upstream release for that step before testing anything else. Each Tutor version targets its own Open edX release, so an image built for one step can carry code or settings that the next release no longer accepts. After each step, regenerate the platform image with the Tutor version used for that step, then rebase the edx-platform fork onto the matching upstream release. Record the base commit, the Tutor version and the image digest for every rebuild. That record shows whether a failure came from your changes, from the new release or from the image build. Confirm the exact release tags and Tutor versions for each step in your upgrade plan before rebasing starts.

Move customizations out of the fork wherever Tutor allows it. Tutor's plugin and hooks system is licensed under Apache 2.0, so a plugin can add settings, environment variables, initialization jobs, extra images and patches without editing the platform source. Review each fork change and sort it into one of three groups: a change that a plugin hook can replace, a change that must stay in the fork because no hook covers it, or a change that upstream now provides and that can be dropped. Changes moved into plugins are easier to rebase because each plugin version can be pinned and tested on its own. Check the plugin documentation, or ask the plugin owner, to confirm which hooks each plugin uses in your Tutor version.

List every diff that must be ported before anyone starts porting. Generate the list from the difference between the fork's original base commit and its current head, and include Tutor plugin code, theme files, custom XBlock packages and any modified Dockerfile. For each entry, record the file or setting, the reason it exists, the owning team, the upgrade step where it was last tested, and whether it touches data models or migrations. Entries that touch migrations or stored data belong to the data migration work described elsewhere on this page, so cross-reference them instead of repeating those steps here. Review the list with each owning team, because a diff that looks cosmetic can still change behavior that users or reports depend on.

Check each rebuilt image before it moves to the test environment. Start the container, compare the installed Tutor plugin list with the list in your upgrade record, and confirm the plugin versions and enabled settings match what you expect. Then verify that the custom XBlocks and theme assets load in both the LMS and Studio, and that the build fails when a required plugin is missing. Run a smoke test with a single course and keep the results alongside the image digest. An image that starts with the wrong plugin set is harder to diagnose than one that fails the build, so make these checks a gate in the pipeline. Agree the check list and the tooling with your platform team before the first rebuild.

The upgrade sequence, with checks and rollback points

Each step below has a check that must pass before the next one starts, and a named rollback point: the backup taken at the start, the previous image tag, or the restored production backup. The sequence keeps the current site running until the upgraded environment has passed every check.

  1. Freeze changes and take verified backups

    The operations lead freezes content changes in Studio, custom code merges and plugin version bumps for the length of the upgrade. The team takes a full backup of the databases, the object storage holding course assets and uploads, and the configuration and secrets used by the running release. A restore of that backup into a separate environment is the first check. The restored backup is the rollback point for every later step until production cutover.

  2. Build target images in a test environment

    The platform engineering team rebuilds the platform images for the target Verawood release in a test environment that mirrors production's hosting, networking and storage. Custom images are rebuilt from rebased forks, and each plugin is pinned to a version that declares compatibility with the target release. The step passes when every image builds and starts with the test configuration. The previous image tags stay in the registry, so the team can return to the running release without rebuilding it.

  3. Run each Tutor major version step with migration checks

    The upgrade engineer applies the Tutor upgrade steps in order, one major version at a time, starting from the release the site runs today and ending at Verawood. After each step, the team runs the platform migrations and the forum and library data migrations listed for that release, and records the output. A step passes when migrations complete without errors, the services start, and the database schema matches what the release expects. If a step fails, the team restores the backup from the first step or returns to the previous image tag, then corrects the configuration or migration before continuing.

  4. Run custom and plugin test suites

    The developers run the custom XBlock, theme and plugin test suites against the upgraded test environment and fix failures in the rebased code. Each plugin is checked against the target release, and any plugin without a maintained version for Verawood is flagged for replacement or removal before go-live. The step passes when the suites pass on the upgraded build and every open exception has an owner and a decision. The rollback point stays the restored backup from the first step, and failed builds return to the previous image tag.

  5. Verify learner and author paths

    The QA lead, working with course authors and a small group of learners, walks through the paths that matter most to the site: enrollment, course navigation, graded assessments, certificates, and the Studio flow for editing existing courses. Testers also confirm sign-in through each identity provider configured for the site and check the reports the organization relies on. The step passes when every path has a recorded result and no blocking defects remain open. A blocking defect sends the team back to the migration step, where the backup and previous image tag remain available.

  6. Rehearse the production cutover

    The team runs the full cutover on a copy of production data in a staging environment, recording each action, the order of service changes, and who approves each decision. The rehearsal covers the production backup restore, the migrations, the image swap, load balancer or DNS changes, and a rollback. The step passes when the rehearsal completes end to end, the rollback has been executed once, and the runbook has been corrected from what the rehearsal exposed. Production is not changed until this step passes.

  7. Cut over and monitor production

    In the approved change window, the operations team takes a final backup, enables maintenance mode, runs the migrations on production, switches to the Verawood images, and reopens access. Checks include learner sign-in, course loading, Studio saves, background task processing, and error rates in logs and monitoring, compared with the baseline recorded before the upgrade. The step closes when the monitoring period agreed in the runbook passes without a rollback trigger and the service owner signs off. Until sign-off, the final backup and the previous image tag remain the rollback points.

How to test the upgraded site and roll back if it fails

Test the upgraded site in layers, starting with automation. Run the test suites for every custom XBlock, Tutor plugin and theme against the target release, inside the rebuilt images, so that a removed import or changed base class fails in your pipeline before any learner sees it. Keep the results per component, because a failing XBlock often traces back to a dependency that needs a fork rebase before any code change in your own repository makes sense. Then confirm that the custom images start, that data migrations finish without errors in the logs, and that the LMS and Studio containers pass their health checks. These checks prove that the code loads. They do not prove that a course works end to end, which is why the next layers exist.

The second layer is a scripted set of smoke tests run by people, using named test accounts for a learner, a course team member, an instructor and a platform administrator. A learner enrolls in a published course, sees the course on the dashboard and receives the enrollment email. A course author opens Studio, edits a unit that contains a custom XBlock, publishes it and checks the outline. An instructor opens the redesigned instructor dashboard in the new release, checks enrollment counts and runs a data download. A certificate is previewed and generated for a test passing grade. Each configured identity provider, whether OAuth2, SAML, Shibboleth or LTI, is tested with a real sign-in. Confirm with your own environment which providers are enabled before the test window opens.

The data check runs against records that migrated, not just against the code. Choose a fixed set of sample courses and users before cutover, then record counts and sample values from the old site: course identifiers, enrollments per course, grades, forum threads and replies, library content, issued certificates and user accounts. Compare the same measures on the upgraded site and investigate every difference, including differences that look harmless. Ask the course team to review a sample of forum posts and library components, since they can spot content that loads but displays incorrectly. Keep the comparison as a signed record, because it is the evidence the rollback decision depends on.

Write the rollback decision rule before the cutover window, not during it. Name one decision owner, usually the service owner, and list who is consulted, such as the platform lead and the course operations lead. Set a go or no-go checkpoint and a cutoff time after which the team stops trying to fix forward. Define failure criteria in advance, for example a broken sign-in path, a failed enrollment, missing certificate records or a data count that does not reconcile. Rollback restores from the backup taken immediately before cutover, covering the LMS and Studio databases, the MongoDB store, object storage and the Tutor configuration. State whether learner activity recorded after cutover is kept, because restoring the old state discards it. Rehearse the restore on a copy of the environment first.

Keep the old release reproducible until the owner signs off the new one. Store the previous Tutor version, plugin versions, fork commit tags, image digests, environment files and lockfiles in version control, and rebuild nothing from moving branches. Leave the old environment stopped but intact, with its volumes and backups, and write down the exact commands needed to start it again. Agree in writing how long the old environment and backups are retained after sign-off, and confirm with your hosting team that storage for them is funded and monitored. A rollback that depends on an image nobody can rebuild is not a rollback plan, so test starting the old release once before the cutover.

What makes an Open edX upgrade take longer

This table lists the factors that most often change how long an unsupported Open edX upgrade takes, why each one adds work, and what to check before scoping. Read each row as a question about your own site. Effort is set by the written scope, and no default figure applies, so the checks below are the inputs a fixed-scope quote is built on.

DriverWhy it adds effortWhat to check
Custom XBlocks and pluginsEach block or plugin written against an older release may need changes to its APIs, models or templates before it runs on the target.Count each block and plugin, its owner, and whether its source is available and has tests.
Forks and divergence from upstreamPatches to edx-platform or Tutor must be rebased onto the target release, and conflicts are resolved by hand.Number of forked repositories, number of local patches, and how far each fork has moved from upstream.
Database and media store sizeLarger data sets lengthen migrations, backups, restore tests and the cutover window.Database and media store size per environment, and the measured time for a full restore.
Tutor steps between releasesEach Tutor major version between the starting release and Verawood is a separate upgrade with its own changes and data migrations.The list of intermediate versions, the breaking changes for each, and the migrations each one requires.
Identity and analytics integrationsSSO providers, LTI tools and the Aspects analytics pipeline each have configuration and data flows that must be retested after the upgrade.Which identity protocols are in use, whether Aspects is deployed, and who owns each external system.
Number of environmentsEach environment, such as development, staging and production, repeats the build, data migration and verification work.How many environments exist, how closely they match production, and the order in which they will be upgraded.
Test data and test coverageWithout representative courses, learner accounts and workflows, regressions tend to surface late, often in production.Whether course content, user accounts and automated tests exist and can run against the upgraded build.

Questions buyers ask before upgrading an Open edX site

What drives the cost of upgrading an unsupported Open edX site?

The main drivers are the number of Tutor major versions between your current release and the target, the amount of custom code you carry (XBlocks, themes, plugins and forks), the volume and condition of forum and library data, and how many environments need rebuilt images. Cost is mostly one-time: the upgrade itself, testing and cutover. Recurring costs appear only if you add a retainer for later upgrades, monitoring or support. DeployOpen works to a written, fixed scope, so the quote should list each of these drivers separately. Ask the vendor to show which items are priced in the scope and which are excluded, and confirm how your internal staff time is counted in your own budget.

How long does an Open edX upgrade from an unsupported release take?

Duration depends on the same drivers as cost: how many major versions you must step through, how much data needs migrating, how much custom code must be rebased and retested, and how many environments are involved. Your change calendar and cutover window also set the end date. No general duration applies to every site, so ask for a timeline with milestones in the written scope, not a single number. Confirm with the vendor which milestones depend on your team's inputs, such as access approvals, test feedback and sign-off, and how long each review window takes in your organization.

What does an Open edX upgrade require from our internal team?

Your team supplies access to the cloud account, cluster or servers, a named technical owner who makes decisions on forks and plugins, and a test environment that matches production closely enough to trust results. Course authors or content owners must review migrated courses, libraries and forum data, because they know what correct looks like. Security or compliance staff approve data handling and change windows. Ask for a responsibility matrix in the scope that names each client role, the expected time commitment per role and the decisions needed before each phase starts.

Can an in-house team upgrade an unsupported Open edX site alone?

An in-house team can do this if it already runs Open edX with Tutor and has people who can work with Docker or Kubernetes, rebuild custom images, read Python and Django code for plugin changes, and manage MySQL and MongoDB backups. The edx-platform maintainers recommend running production through a service provider or with Tutor, and Tutor is the official Docker-based distribution with a plugin system. Check whether your team has completed a major Tutor upgrade before, and estimate how much roadmap work would pause. A written scope from a partner gives you a benchmark for comparing your own plan.

What should a written quote for an Open edX upgrade include?

A useful quote states the starting release and Tutor version, a list of plugins, themes, XBlocks and forks in scope, and the data migrations included. It should also cover the environments to be upgraded, the test plan and acceptance criteria, the rollback plan, the cutover approach and the client responsibilities. Look for explicit exclusions, such as content rewriting, new features or third-party service changes. Ask whether post-upgrade support is a separate retainer, and whether the scope names deliverables such as runbooks and documentation. DeployOpen agrees scope, deliverables and timelines in writing before work starts.

What happens if an Open edX upgrade fails partway through?

Failures most often occur during data migrations, plugin incompatibilities or image rebuilds, so the plan should make failure recoverable. Before cutover, take tested backups of the MySQL and MongoDB databases and of object storage, and keep the original environment running until acceptance. Define go and no-go criteria and who decides on rollback. Ask the vendor how backups are verified, how long a rollback would take in your environment, and what happens to data entered during a parallel run. No partner can promise that an upgrade will succeed on the first attempt, so the written scope should describe recovery steps clearly.

Why does an unsupported Open edX release need upgrading now?

Open edX states that the latest named release is the only supported release and that it cannot support more than one release at a time. Verawood is the current named release, published on 30 July 2026. Willow and Xylon are listed for December 2026 and June 2027, so an older site moves further from the supported line with each release. Before scoping, confirm with the vendor which target release you should aim for, since a site upgraded now may face another upgrade soon after. Ask whether the scope includes a plan for the next named release.

How DeployOpen scopes and delivers an Open edX upgrade

DeployOpen plans and delivers Open edX upgrades inside your own infrastructure, moving your site from its current release to the supported release. Engagements are fixed-scope, with scope, deliverables and timelines agreed in writing before work starts. Each step is documented so your team can see what changed and why.

How we scope

  • The written scope lists each Tutor major version step between your current release and the target.
  • We inventory custom images, plugins, XBlocks, forks and theme code that must be rebased.
  • Quotes follow from that written scope, and engagements are fixed-scope with deliverables agreed in advance.

How we build

  • Forum and library data migrations are run in a staging copy of your database before any production run.
  • Custom Tutor images are rebuilt and plugins are rebased onto the target release, with changes tracked in version control.
  • Each intermediate release is brought up and checked before the next step starts, so failures stay isolated.

How we hand over

  • Your team receives the runbook, the migration log and a record of every change to custom code.
  • Post-upgrade checks cover learner login, course authoring in Studio, grades and the forum.
  • Rollback steps and backup verification are documented before the production cutover is scheduled.

How we support

  • Ongoing support, upgrades and continuous testing are available as a retainer after handover.
  • Retainer work can include reviewing custom code against the next named release, Willow, as it approaches.
  • Open edX supports only the latest named release, so confirm the upgrade target with your team early.

Sources and further reading

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.