QuillBench
Build benchmark datasets with human annotators. A config-driven annotation platform for research, by A.C. Pogaku.
Each paper keeps its own annotation data in its own
folder, a workspace, described by one quillbench_workspace.yaml file. The studio reads
that file and writes answers straight into the paper's folders, so there is nothing to
copy and the two are always in step.
~/.config/quillbench/ private studio state: registry, accounts (hashed), settings
<paper>/quillbench_workspace.yaml one paper's projects
<paper>/batches/*.csv|*.jsonl items to annotate, one file per batch
<paper>/progress/<user>__<batch>.csv answers, written by the studio
<paper>/quillbench_assignments.json who works on which batch (no secrets)
<paper>/quillbench_exports/<time>/ exports: answers.csv/.jsonl, agreement.csv, DATASHEET.md
Install
pip install quillbench
quillbench serve # this computer only: http://localhost:8560/quillbench/
quillbench serve --address 0.0.0.0 # let others on the network reach it
Python 3.10 or newer. Answers and settings stay on the machine that runs quillbench serve.
Free for academic, non-commercial use only; see LICENSE.
Getting started in the browser
Run quillbench serve and open the page. The first person to sign up becomes the admin, so do
this yourself before sharing the address. Then, with no files to edit, the admin can use
Admin → Projects to create a project, upload CSVs at any time, set label buttons or a slider, split
the items into batches and assign them. Add people under Admin → People, and follow the
work in the Progress tab.
Task types
| task | what the annotator does |
|---|---|
rating |
moves a slider on a scale (e.g. 0–1 or 1–5), optional "can't judge" |
choice |
picks one of the labels the manifest lists |
text |
writes a short answer |
verdict, gate_review, gate_calibration, item_question, item_query, item_disposition |
reviews a question + reference query + precomputed results |
adjudication |
judges a predicted query against a reference (results withheld) |
pair_semantics |
blinded A/B comparison of two queries |
Per project the manifest can set instructions, note_label, note_placeholder,
note_required_for, display (which item columns to show and how), checks
(hidden attention-check items with expected answers) and also_accept (labels
from an earlier version of the task that still count as answers).
Everyday commands
quillbench init-workspace ~/my_paper/annotation # start a new paper from a template
quillbench workspace add ~/my_paper/annotation # register it
quillbench validate # check every workspace
quillbench user add alice # asks for a password
quillbench assign alice my_paper rate_01 rate_02
quillbench status my_paper # progress per person and batch
quillbench quality my_paper # Krippendorff's alpha, Cohen's kappa, checks, time
quillbench export my_paper # anonymised answers + datasheet
quillbench backup # also runs nightly
quillbench serve # http://127.0.0.1:8560/quillbench/
(python -m quillbench … works the same without installing; pip install -e . adds the quillbench command.)
In the app: 1–9 answer, S skip, J/→ next, K/← previous, Enter saves a rating.
Useful manifest options for rating studies:
scale: {min: 0, max: 1, step: 0.05, unsure_label: "Can't judge",
marks: {0: false, 0.5: half true, 1: true}} # words along the slider
display:
- {field: statement, label: Statement} # the first text field is shown large
- {field: hourly, as: chart, chart: {kind: bar, x_label: hour, lines: [15.5, 35.5]}}
practice: true # show each item's 'expected' and 'explanation' columns after answering
For annotators: connect to a server
If someone runs QuillBench for your group, you only need the address they give you:
pip install quillbench
quillbench connect annotate.example.edu/quillbench
This checks the server, remembers it and opens the sign-in page. Next time, run
quillbench open. Sign in with the login you were given (or your university login, if the
server uses LDAP). Your answers are saved on the server, not on your computer.
Signing in with university (LDAP) accounts
QuillBench has its own accounts. A server can also accept the logins people already have,
from LDAP or Active Directory. Install the extra package and add an ldap block to
settings.yaml in the studio home:
pip install "quillbench[ldap]"
ldap:
url: ldaps://ldap.example.edu # or ldap:// with start_tls: true
user_dn: "uid={user},ou=people,dc=example,dc=edu" # Active Directory: "{user}@example.edu"
auto_create: true # first sign-in makes an annotator account; false = admins add people first
Passwords are checked by the LDAP server and never stored by QuillBench. Accounts with their
own QuillBench password keep using it. Admins still assign batches and can disable anyone in
Admin → People. Use ldaps:// or start_tls, so passwords are not sent in plain text.
Running as a service
cp deploy/quillbench.service deploy/quillbench-backup.service deploy/quillbench-backup.timer ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now quillbench quillbench-backup.timer
sudo loginctl enable-linger $USER # keep it running after logout
nginx: add deploy/nginx-quillbench.conf to the server block.
Quality measures
- Krippendorff's alpha (nominal for labels; interval or ordinal for ratings) over all items answered by two or more people; skips and "can't judge" left out. Verified against the worked example in Krippendorff (2011): 0.743 / 0.815 / 0.849.
- Cohen's kappa per pair of annotators (labels), or mean absolute difference and Pearson r (ratings).
- Check items passed per annotator, and median seconds per item (QuillBench records
updated_atandsecondsfor every answer).
Security
Passwords are stored as salted PBKDF2-SHA256 hashes in the studio home (mode 600). Sessions use an HMAC-signed cookie. Exports replace annotator ids with codes (A01, …); the code book stays in the studio home.
Origin
© 2026 A.C. Pogaku. Free for academic, non-commercial use; commercial use is not permitted. See LICENSE.
Metadata
Release files for quillbench 1.4.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| quillbench-1.4.1.tar.gz | 122.1 kB | With provenance | Details for quillbench-1.4.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| quillbench-1.4.1-py3-none-any.whl | Python 3 | none | any | Details for quillbench-1.4.1-py3-none-any.whl |
Total release size: 246.7 kB
Release files / quillbench-1.4.1.tar.gz
| Download URL | quillbench-1.4.1.tar.gz |
|---|---|
| Size | 122.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
36b9c42066273512c2f72e67078f4a02a57d784d3b7390273cd98ec8b5b9343a
|
|
BLAKE2b-256 checksum How to use checksums |
ff111a8eba2acdd01bd6e91fac5ec1f9d0a745c6ae29df56ed1c31b73a28bac1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logRelease files / quillbench-1.4.1-py3-none-any.whl
| Download URL | quillbench-1.4.1-py3-none-any.whl |
|---|---|
| Size | 124.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
15a0c5d33c6dc88817648c8532617b27580eb453b4fd0026ae8174e08cf7b341
|
|
BLAKE2b-256 checksum How to use checksums |
e86c7ba66775d6d301c1b185f927f92b0aceaeffe1077b4e81e13a42deb80832
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logSecurity for quillbench 1.4.1
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for quillbench-1.4.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logA 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.