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.
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.
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.
Phases 0–10 of the build specification are complete. The automated suite runs green:
php index.php selftestPASS — 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.
- PHP 8.0 or newer (
composer.jsonpermits 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-jwtandmpdf/mpdf
composer install --no-devThe 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.phpGenerate 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 migrateinstall.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.
php index.php selftest # 951 automated checks, non-zero exit on failure
php index.php schema_check # confirm the live schema matches the modelsThe 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.
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.
| 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 |
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.