Skip to main content

QTI Package Maker

Converts question banks into portable LMS packages and standalone teaching formats, so instructors can move assessments between Blackboard, Canvas, and Moodle without rebuilding questions or losing embedded images.

Write the bank once. Deliver it wherever students need it. One source can become an LMS import, a readable review copy, a printable exam source, or a self-grading web quiz.

One bank, many destinations

Destination What you get Best for Image handling
Canvas and LibreTexts ADAPT QTI 1.2 ZIP Course imports Packaged in the ZIP
Blackboard Learn and Ultra QTI 2.1 or pool ZIP Course and pool imports Packaged in the ZIP
Any modern browser One self-contained HTML file Practice and review Inlined in the HTML
Moodle, print, and text workflows Aiken, exam YAML, and readable text Reuse outside QTI Referenced or described

Blackboard image imports are backed by real Learn and Ultra sandbox probes. Canvas package structure and image references pass automated checks, but live Canvas image rendering remains unverified because the public Free for Teacher sandbox was discontinued. See docs/ENGINES.md for the complete compatibility matrix and exact limitations.

See the bank teach itself

Ungraded self-test question with an embedded bar chart, three choices, and a Check Answer button

Multiple choice question graded as correct, showing the embedded figure and the green CORRECT feedback pill

The first image shows the ready-to-answer state; the second shows the same item after a correct response. The same question bank that produces an LMS package can also produce this portable quiz: no server, account, or external image folder required.

Why instructors use it

  • Move questions among Blackboard, Canvas, Moodle, and LibreTexts ADAPT workflows.
  • Preserve embedded PNG, JPEG, and GIF figures in packaged LMS exports.
  • Cover seven assessment types, from multiple choice to matching and ordered lists.
  • Review content as readable text before importing it into a course.
  • Publish a self-contained HTML practice quiz with instant grading.
  • Use the command line for conversions or the Python API for generated question banks.

Quick start

Requires Python 3.10 or newer; tested with Python 3.12.

python3 -m pip install qti-package-maker
printf 'MC\tWhat color is a clear sky?\tblue\tcorrect\tgreen\tincorrect\n' > bbq-demo-questions.txt
bbq_converter.py -i bbq-demo-questions.txt -1 -r -s

This converts one Blackboard question-upload row into three useful artifacts:

  • qti12-demo.zip: a Canvas QTI 1.2 import package.
  • human-demo.html: a readable review copy.
  • selftest-demo.html: a self-contained, self-grading quiz.

Input rows are tab-delimited, and input filenames follow bbq-<name>-questions.txt. The complete installation paths, including virtual environments and PyPI, are in docs/INSTALL.md.

Choose an output

Select one or more outputs in the same conversion:

bbq_converter.py -i bbq-demo-questions.txt \
	-f canvas_qti_v1_2 -f blackboard_qti_v2_1 -f html_selftest

Use -a to select every CLI output or bbq_converter.py -h to see the available shortcuts. Some specialized engines are API-only; docs/USAGE.md covers the full CLI and Python API, while docs/FORMATS.md defines inputs and outputs.

Use it from Python

Build a mixed question bank directly when the source is generated rather than stored in a text file:

from qti_package_maker import package_interface

bank = package_interface.QTIPackageInterface("bio101", allow_mixed=True)
bank.add_item("MC", ("What color is a clear sky?", ["blue", "green"], "blue"))
bank.add_item("MA", ("Which are primes?", ["2", "3", "4"], ["2", "3"]))
bank.save_package("canvas_qti_v1_2", "bio101.zip")

The result is a Canvas-ready QTI ZIP built through the same engine used by the command-line workflow.

Documentation

Start here:

Go deeper:

Project status

The project is beta software. Runtime modules require Python 3.10 or newer, while the development and test environment targets Python 3.12. Blackboard Learn and Ultra image paths have live-import evidence; Canvas image packaging follows the QTI structure and passes local integrity tests, but still needs verification in an institutional Canvas sandbox.

License

Code is licensed under the GNU Lesser General Public License v3. See LICENSE.LGPL_v3.

Author and support

Created by Neil Voss. Follow the work on Bluesky, YouTube, or GitHub.

Support continued development through Patreon, PayPal, Bitcoin, or Dash.

Metadata

Release files for qti-package-maker 26.7.14

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for qti-package-maker 26.7.14
File Size Uploaded Provenance Actions
qti_package_maker-26.7.14.tar.gz 209.9 kB Without provenance Details for qti_package_maker-26.7.14.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for qti-package-maker 26.7.14
File Interpreter ABI Platform Actions
qti_package_maker-26.7.14-py3-none-any.whl Python 3 none any Details for qti_package_maker-26.7.14-py3-none-any.whl

Total release size: 433.1 kB

Release files / qti_package_maker-26.7.14.tar.gz

Download URL qti_package_maker-26.7.14.tar.gz
Size 209.9 kB
Tags Source
SHA-256 checksum
How to use checksums
879bd67a6b23663ddcf602cc69f00a1387327e6015453b00c0083c95685428b3
BLAKE2b-256 checksum
How to use checksums
40ef4294c02c5a37a8d7807a6ac20a00560f2cde4222ebb121b56e67b1fe4101
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.13

Release files / qti_package_maker-26.7.14-py3-none-any.whl

Download URL qti_package_maker-26.7.14-py3-none-any.whl
Size 223.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2e3375afa66125ff6d65defedced9f6e8ede55c3cd471a0a94672bad5338edbd
BLAKE2b-256 checksum
How to use checksums
6080c03832a7c8bb5fd83c6b18e9e985f38917dcdc8a09167a37f670a3dda200
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.13

Security for qti-package-maker 26.7.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page