Thank you for helping improve QUILL.
QUILL is a screen-reader-first Windows writing environment. Contributions should preserve that core direction: practical keyboard workflows, stable editing, accessible defaults, and clear user control.
docs/QUILL-PRD.md (the single source of truth), and the
architecture overview below.CODE_OF_CONDUCT.md.GOVERNANCE.md.QUILL is a layered desktop application with strict boundaries that
exist to preserve accessibility behavior and testability. The canonical,
detailed specification lives in docs/QUILL-PRD.md; this
section is the short version contributors need day to day.
quill/core — pure domain logic:
documents, command registry, settings, keymap, recent files, history,
metrics, and storage primitives. No wx imports and no
direct UI ownership; strict-typed and gated in CI.quill/io — format readers/writers and
detection. The contract is read(path) -> Document,
optional write(doc, path), optional
outline(doc); also strict-typed.quill/ui — wxPython shell, editor
surface, menus, status bar, dialogs, and command palette. UI composes
core + io and owns widget lifecycle (gradual
typing).quill/platform/windows —
Windows-specific bridges (screen-reader announcements, DPAPI secrets,
shell integration, single-instance, TTS).quill/plugins — plugin-facing API
surfaces and manifest model.quill/tools — internal CLIs and gates
(a11y audit, diagnostics, characterization and registry checks).A user action enters through quill/ui/main_frame.py
(MainFrame), dispatches to
core.commands.CommandRegistry, reads/writes a
core.document.Document, persists through io or
core.storage, and surfaces the outcome through status
updates and platform.windows.sr_announce.announce.
core and io never import wx;
keep wx confined to quill/ui and
quill/platform/windows.ui does not perform raw persistence; it calls
core helpers (settings, keymap, recent) and io
for document I/O.core.storage.write_json_atomic (temp file +
os.replace), with schema validation and
.bak/recovery.wx.CallAfter/wx.CallLater.core.events.CancelToken is the shared cancellation
primitive; long-running tasks accept and check it at safe
boundaries.pip install -e ".[ui,dev]"python -m quillmain.quill/core: no wx importsquill/ui: UI behavior and dialogsquill/io: format readers/writersquill/platform/windows: Windows-specific
integrationRun these before opening a pull request:
ruff check .ruff format --check .mypy quill\core quill\iopytest tests/unit/ tests/stability/ -q --ignore=tests/unit/core/test_net_tls.py --ignore=tests/unit/core/test_thesaurus.pypython scripts/check_docs_artifacts.pyType-checking is intentionally scoped to
quill\core and quill\io. These layers
are strict-typed and gated in CI. Do not run an unscoped whole-tree
mypy scan: quill\ui is excluded (gradual
typing) in pyproject.toml, so a whole-tree run is both
slower and noisier without adding signal. Always use the scoped command
above.
To catch formatting, lint, and undefined-name problems on changed files before they reach CI, install the hooks once:
pip install pre-commit
pre-commit installThe hooks run ruff format, ruff check, and
an undefined-name check on the files you are committing. Commits that
fail are blocked locally.
If your change updates docs/*.md, regenerate matching
artifacts:
pandoc docs\\<name>.md -f gfm -t html5 -s -o docs\\<name>.htmlpandoc docs\\<name>.md -f gfm -t epub3 -o docs\\<name>.epubA strong PR includes:
Please avoid mixing unrelated refactors with feature or bug-fix work.
Quillins are small, sandboxed extensions that add commands, snippets, menus, and hotkeys to QUILL. Contributing one has its own dedicated path:
docs/quillins.md: a hands-on,
build-it-from-scratch walkthrough (Layer 1 snippet → Layer 2 handler →
lint → test → submit).docs/quillins.md: the process,
directory layout, review criteria, and acceptance checklist.docs/quillins.md: the code of
conduct for Quillin code (accessibility, capability honesty, no
silent network, security). Every submission attests to it.python -m quill.tools.quillin_lint <dir> --strict
must be green; the Quillin Verify CI gate runs it on every
submission.manifest.json),
then open a PR with the Quillin submission PR
template.Quill is built on open-source foundations and integrates best practices from the accessibility community:
AccessibleApps — Christopher Toth and contributors (https://github.com/accessibleapps/) contribute several libraries that are essential to Quill's accessibility and cross-platform reliability:
app_updater (MIT) — cross-platform incremental update
delivery and automatic installer bootstrapper. Vendored at
quill/_vendor/autoupdate/.smart_list (MIT) — accessible, model-based list view
for large outlines and datasets.accessible_output2 (MIT) — optional fallback for speech
and braille output when Prism is unavailable.html_to_text (MIT) — converts HTML from clipboard
pastes to clean, structured plain text. Used in
quill/ui/html_paste_cleaner.py.app_elements, platform_utils,
keyboard_handler — small cross-platform utilities for
dialogs, clipboard, and hotkeys.Full license text is reproduced in
THIRD_PARTY_NOTICES.md.
liblouis 3.38.0 (https://github.com/liblouis/liblouis,
LGPL-2.1-or-later) — open-source braille translation and
back-translation library that powers the QUILL Braille Pack. Provides
UEB Grade 1 and Grade 2, Standard American English, and dozens of
international language tables through its lou_translate
runtime. The Braille Pack is an optional installer component; liblouis
is only present when it is selected. Full license text is shipped
alongside the pack as COPYING and
COPYING.LESSER.
Prism (NVIDIA) — modern screen-reader backend for announcements and accessibility bridging.
Contributors who integrate third-party libraries from AccessibleApps or other open-source projects should document the license, purpose, and API contract in the relevant module docstring, and update this section when adding a new external dependency.
Help -> Report a Bug.Do not open public issues for vulnerabilities. Follow
SECURITY.md for private reporting.
Before opening a PR, quickly sanity-check security posture:
Localization contributors should follow:
docs/translating.mdThe following people have contributed code, tests, accessibility feedback, or documentation to QUILL. Thank you.
Releases are cut from main. Hotfixes may use short-lived
release/x.y.z branches when needed.
Before tagging a release:
ruff check .pytest -qpython scripts/check_docs_artifacts.py.github/workflows/windows-release.yml)Release notes are prepared in rel.md at the repo root
and converted to rel.html and rel.epub by
Pandoc. CHANGELOG.md carries the same content in
abbreviated form. All three files should be updated and committed before
tagging.
Versioning follows semantic intent for user-visible behavior:
main is branch-protected with required checks and
pull-request reviews. Admin bypass remains enabled for emergency direct
commits; these must be followed by a post-merge explanation and
follow-up remediation if needed.
By contributing, you agree that your contributions are licensed under the repository's MIT license.