Skip to content

Repository files navigation

ItemBank

A free, contributory item-bank commons for Philippine teachers.

Teachers write test questions, contribute them to a shared bank, and freely draw items other teachers wrote to assemble quizzes and exams. After giving a test they submit anonymized results, and those results calibrate the items for everyone.

CONTRIBUTE items ──────┐
                       ├──► anyone withdraws freely ──► gives the test ──► SUBMITS results
IMPROVE others' items ─┘                                                          │
        ▲                                                                         │
        └──────────── every item gets better calibrated for everyone ◄────────────┘

This is free and will always be free. No payment, subscription, credit gate or paywall on any feature, for anyone. Access is unconditional — including for the teacher who never authors an item, because giving a downloaded quiz to 45 students produces the response data that calibrates every item on that paper.

The point

Teachers already share test papers in Facebook groups and Drive folders: free, instant, no signup. This will never beat them on convenience. The one thing those cannot structurally produce is calibrated statistics — an item's difficulty on a common scale, whether its distractors actually work, which competencies a class genuinely failed.

That return trip is the whole thesis. If results don't come back, this is a worse Drive folder.

What this is not

A formative and classroom assessment bank. Items are public and will leak. It is not a secure bank for entrance exams, licensure, or any high-stakes purpose, and must never be presented as one.

Status

Phases 0–10 of the build specification are complete. The automated suite runs green:

php index.php selftest
PASS — 951 checks.

That includes the Phase 9 gate — equating recovers 64 item difficulties from two separate cohorts with a worst error of 0.0112 logits against a 0.05 tolerance. If equating cannot recover ground truth, nothing downstream is trustworthy, so it is checked against fixtures with known answers rather than assumed.

Not yet built: Phase 11 — Expr_lib, grouped and parameterized items, the 100k-item search target, and the Capacitor Android wrapper.

Not yet launched. ib_frames is empty, and no item can be filed until a launch frame exists. That needs a decision, not code: which subject the first common scale covers. Two smaller decisions are open alongside it — curriculum alignment, and the permitted values of ib_items.type. See the Open section of docs/decisions.md.

Requirements

  • PHP 8.0 or newer (composer.json permits 7.4; developed and tested on 8.2)
  • MySQL or MariaDB
  • Apache with mod_rewrite, or any host honouring the shipped .htaccess
  • Composer, for two dependencies: firebase/php-jwt and mpdf/mpdf

Install

composer install --no-dev

The three config files holding secrets are not in this repository. Copy the template beside each one and fill it in:

cp application/config/config.php.example   application/config/config.php
cp application/config/jwt.php.example      application/config/jwt.php
cp application/config/database.php.example application/config/database.php

Generate the two keys those files require:

php -r "echo bin2hex(random_bytes(32)), PHP_EOL;"

JWT_lib refuses to start on a secret under 32 bytes, so a skipped step fails loudly rather than signing tokens with a predictable key.

Then create the schema. Import docs/install.sql through phpMyAdmin, or run the migrations:

php index.php migrate

install.sql ships no working administrator credential — deliberately. Generate your own hash and paste it where the file says to:

php -r "echo password_hash('your-password-here', PASSWORD_BCRYPT), PHP_EOL;"

Optional demo content lives in docs/seed-demo-data.sql. Every demo account shares one obviously disposable password; never reuse it anywhere.

Full deployment instructions, including cPanel and cron, are in docs/deployment.md.

Testing

php index.php selftest      # 951 automated checks, non-zero exit on failure
php index.php schema_check  # confirm the live schema matches the models

The suite is a CLI controller rather than PHPUnit, on purpose: these assert properties of a deployed configuration — that every route appears in the permission map, that nothing gates on contribution, that no controller escapes the response envelope — and they need to run on a shared host with no dev dependency tree. The reasoning is recorded in docs/decisions.md.

tests/fixtures/ holds the psychometric fixtures with known ground truth. The rest of tests/ is CodeIgniter 3's stock scaffolding and is not used.

Frontend checks have no runner and are done by hand from tests/manual.md.

Layout

application/controllers/   API endpoints (api/v1/*) and the app shell
application/models/        one per table, thin
application/libraries/     the real logic — auth, import, dedupe, tiers,
                           assembly, psychometrics, Rasch calibration
application/migrations/    schema history, the licence seeded structurally
assets/                    PWA frontend: ES modules, service worker, offline page
docs/                      specification-adjacent documentation and SQL
system/                    CodeIgniter 3.1.9, unmodified

AGENTS.md is the full build specification — scope, psychometrics, schema, phase plan and the anti-goals. docs/decisions.md records 139 decisions with their reasoning.

Documentation

File Covers
docs/api.md the HTTP contract and response envelope
docs/design.md interface and interaction design
docs/psychometrics.md Rasch estimation, equating, the common scale
docs/governance.md stewardship, disputes, sanctions
docs/contributor-terms.md what contributors agree to, English and Filipino
docs/deployment.md hosting, secrets, cron, backups
docs/decisions.md every design decision and why

Licence

Two licences, because they protect different things.

Code AGPL-3.0
Item content CC BY-SA 4.0

CC BY-SA means nobody can enclose the commons: a commercial review centre may download the weekly public dump and sell it, but its version must carry the same licence and credit the teachers. AGPL closes what that leaves open — without it the corpus would stay free while the platform itself was forked into a closed hosted service.

Contributions are irrevocable. Work contributed by many authors can never be relicensed, and items in circulation cannot be recalled when an account is deleted. The contributor terms say so, in English and Filipino, before anyone contributes.

See LICENSE-CONTENT.md for the full reasoning.

About

A free, contributory item-bank commons for Philippine teachers. CodeIgniter 3, with Rasch calibration onto a common scale across schools, a wiki-style revision layer, and weekly public database dumps.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages