WESTERN AUSTRALIA
OLNA & NAPLAN PRACTICE
EFFECTIVE 29 JUL 2026

◂◂ POLICIES

SECURITY POLICY

The technical and organisational controls protecting student data in both Trainers, how we respond to incidents, and — stated plainly — where our current limitations lie.

VERSION 1.0 EFFECTIVE 29 JULY 2026 NEXT REVIEW 29 JANUARY 2027 CYCLE 6‑MONTHLY

1 Purpose and scope

This policy describes how r2 Education protects the confidentiality, integrity and availability of information in the OLNA Trainer and the NAPLAN Trainer. It is published so schools and education authorities can assess us without having to send a questionnaire first.

In scope: both Trainers, the homepage, the two databases, the server functions, hosting and CDN, the AI provider integration, the source repositories and deployment pipelines, and the operator's own practices.

Out of scope: school‑owned devices, networks, identity systems and premises. Endpoint security, network filtering and supervision of students remain the school's responsibility.

AN HONEST FRAMING

r2 Education is a small Australian operation, not a large vendor with a security team. This policy describes controls that genuinely exist and claims no certifications we do not hold. Section 19 lists our limitations without varnish. A school is better served by an accurate picture than an impressive one.

2 Posture at a glance

ControlStatusDetail
Passwords as one‑way hashes (bcrypt)IN PLACE§6.2
TLS/HTTPS on all trafficIN PLACE§8.1
Encryption at restIN PLACE§8.2
Databases closed to public access by defaultIN PLACE§7.1
Server‑side identity bindingIN PLACE§7.2
Role and class‑level access scopingIN PLACE§7.3
Separate databases per TrainerIN PLACE§5.1
Brute‑force rate limiting on sign‑inIN PLACE§6.3
Sign‑in audit logIN PLACE§14.1
Secrets held outside source codeIN PLACE§12
Automated point‑in‑time backupsIN PLACE§15
Version control and reviewed deploymentIN PLACE§13
AI fair‑use caps and output validationIN PLACE§10
Documented 72‑hour breach notificationIN PLACE§16
HTTP security response headersPARTIALComplete except OLNA — §9.1, §19.3
Origin‑restricted API access (CORS)PARTIAL§19.4
Patch managementPARTIAL§19.5
Continuous automated monitoringPARTIAL§14.2, §19.7
Australian data residencyNOT IN PLACE§11.1, §19.1
Multi‑factor authentication for staffNOT IN PLACE§19.2
Independent penetration testNOT YET§19.6
ISO 27001 / IRAP / SOC 2NOT HELD§20.2

3 Governance and accountability

r2 Education is run by a single principal, accountable for every security decision and the contact point for every security and privacy matter. There is no separate security team and this policy does not pretend otherwise.

SECURITY CONTACT
ACKNOWLEDGEMENT
1 business day
CRITICAL INCIDENTS
Immediate, 24/7

Personnel

4 Data classification

TierIncludesHandling
SensitiveAdjustment settings, teacher notes, password hashes, sign‑in logs with IP addresses, and OLNA stored writing submissions.Server access only. Never returned to a client that does not need it. Excluded from leaderboards and every shared view. Schools instructed to keep health and welfare information out of free‑text fields.
ConfidentialStudent and teacher accounts, question attempts, results, session history, class membership.Visible only to the student concerned, their class teachers and school administrators. Enforced server‑side.
InternalAI usage and cost metering, aggregate statistics, infrastructure logs.No question content, answers or writing. Operator access only.

The full inventory of what is held, and what is deliberately not, is in sections 4 and 5 of the Privacy Policy.

5 Architecture

Both Trainers have three tiers, with one deliberate security property: the browser never talks to the database.

  1. Browser — a static web application holding no database credentials. It cannot issue a database query; everything goes through tier 2.
  2. Server functions — small server‑side functions that are the only path to data. Each independently verifies the caller's signed token, decides what that caller is entitled to, and returns only that.
  3. Database — managed PostgreSQL, every table closed to anonymous and public access. Only the server functions, holding a privileged key that never leaves the server environment, can read or write.
WHY THIS MATTERS

A common failure in education apps is a browser that queries the database directly, where a modified client can ask for records it should not see. That is structurally impossible here: there is no database credential in the browser to abuse, and no table readable without one.

5.1 The Trainers are separated

The OLNA Trainer and the NAPLAN Trainer run on entirely separate databases, with separate credentials, separate server functions and separate hosting projects. A compromise of one does not reach the other, and a school using only one Trainer has data in only one system.

6 Authentication

6.1 No self‑registration

There is no public sign‑up on either Trainer. Every account is created by a teacher or administrator, so the attack surface of an open registration flow — automated account creation, enumeration, spam — does not exist.

6.2 Password storage

Passwords are stored only as bcrypt hashes with a per‑password salt. Plaintext is never written to a database or a log, and cannot be recovered by us or by anyone holding a copy of the database. A forgotten password is reset by a teacher, not recovered.

6.3 Brute‑force protection

Every sign‑in attempt, successful or failed, is recorded with username, role, source IP, timestamp and outcome. Over a rolling 15‑minute window:

The per‑IP limit is deliberately generous because a whole class typically shares one school IP through network address translation, and a tighter limit would lock out a classroom. The per‑username limit is the control that actually stops password guessing.

Failures return a single generic message that does not reveal whether the username exists, and internal error detail never reaches the browser.

6.4 Sessions

Schools should tell students to sign out on shared devices — a token left on a classroom machine stays valid until it expires. See §19.2.

7 Authorisation and access control

7.1 Deny by default at the database

Every table has row‑level security enabled with no permissive policies — in PostgreSQL that denies access to every role except the privileged service role. No table is readable by an anonymous or public client, and there is no way around the server functions.

DATABASE VIEWS

Where a view shapes data for a report, it is created with invoker security so it inherits the caller's permissions rather than its definer's. A view that silently bypasses row‑level security is a well‑known way to leak data out of an otherwise locked‑down schema, and we check for it specifically.

7.2 Identity comes from the token, never the request

This is the single most important control in both Trainers. When a student records an answer, flags a question, submits writing or asks for their results, the student identifier is taken from the verified token on the server and any identifier in the request body is ignored. A modified client cannot read or write another student's records by changing an ID.

Where a request refers to a child object — an answer belonging to a particular practice test, say — the server checks that object belongs to the calling student before accepting the write.

7.3 Role scoping

RoleServer‑enforced scope
StudentTheir own records only. Cannot enumerate, view or change any other account.
Class teacherOnly students in their explicitly assigned class groups, resolved server‑side on every request.
School administratorAll students and teachers at the school, plus account management.

Scoping happens in the server function, not the interface. Hiding a button is not access control; removing the data from the response is.

7.4 Minimal responses

Responses carry only the fields the caller needs. The leaderboard, for instance, returns display names and aggregate accuracy only — deliberately excluding usernames, account identifiers, teacher notes, adjustment settings and individual answers, so a feature every student can see cannot become a data leak.

7.5 Privileged key handling

Each database's service key lives in its server function environment. It is never sent to a browser, never built into the application bundle, and never committed to source control.

8 Encryption

8.1 In transit

All traffic — browser to site, browser to server functions, server functions to database, server functions to the AI provider — uses HTTPS with TLS 1.2 or higher. HTTP is redirected to HTTPS by the hosting platform, and certificates are issued and renewed automatically.

8.2 At rest

Both databases and their backups are encrypted at rest by the platform using AES‑256, with keys managed by the underlying cloud provider. Static site files contain no personal information.

8.3 Application layer

Passwords carry the additional one‑way bcrypt protection in §6.2, so they stay unusable even to someone with full database access.

9 Application security controls

RiskControl
SQL injectionAll database access goes through a parameterised client library. No query is built by concatenating user input.
Broken object‑level authorisationIdentifiers come from the verified token, and ownership of child objects is checked server‑side before any write (§7.2).
Cross‑site scriptingAll user‑supplied and model‑generated text is HTML‑escaped before insertion into the page.
Oversized or malformed inputServer functions whitelist the fields they accept and truncate every text field to a fixed maximum before storage. Unexpected fields are discarded.
Information disclosure in errorsAuthentication failures return a generic message; internal error detail is not returned to the browser.
Resource exhaustion / cost abusePer‑account daily caps on every AI endpoint (§10.2) plus sign‑in rate limiting (§6.3).
Dependency riskA deliberately small footprint — a database client, a password hashing library and a token library, each pinned to a specific version (§13.3).
Malicious file uploadNot applicable. Neither Trainer accepts file uploads of any kind.

9.1 HTTP response headers

Security response headers are configured per hosting project, and are currently uneven across the three:

PropertyStatusHeaders sent
r2education.com.au
(homepage)
COMPLETEContent‑Security‑Policy, Strict‑Transport‑Security, X‑Frame‑Options, X‑Content‑Type‑Options, Referrer‑Policy, Permissions‑Policy, Cross‑Origin‑Opener‑Policy.
NAPLAN TrainerCOMPLETEContent‑Security‑Policy, Strict‑Transport‑Security, X‑Frame‑Options, X‑Content‑Type‑Options, Referrer‑Policy, Permissions‑Policy, Cross‑Origin‑Opener‑Policy.
OLNA TrainerPARTIALX‑Content‑Type‑Options, X‑Frame‑Options, Referrer‑Policy. No CSP, HSTS or Permissions‑Policy yet.

Bringing the OLNA Trainer up to the same configuration is a small change to a static header file and is our next scheduled security task (§19.3). These headers are defence in depth: the controls in §7 do not depend on them.

A LIMIT WORTH NAMING

Both Trainers are single‑file applications with inline scripts and inline event handlers, so their content security policies must allow 'unsafe-inline' for scripts and styles. That means the policy restricts where code may be loaded from — no script from a host we have not listed — but does not by itself stop an injected inline script. Neither Trainer uses eval(), so 'unsafe-eval' is withheld. The real defence against injection is the output escaping in §9, not the policy.

10 AI service controls

10.1 Data minimisation

Requests to the AI provider carry only what the task needs: for generation, a year level, topic and difficulty; for writing feedback, the response text, the prompt and the year level. No student name, username, account identifier, class or school name goes into any AI request. The provider receives student writing without knowing whose it is.

10.2 Fair‑use caps

Each account has a daily cap on each AI endpoint, calculated on the Perth calendar day — 20 writing responses per account per day, with lower caps on generation endpoints. If the cap check itself fails the request is allowed, so a database hiccup never locks a student out mid‑lesson.

10.3 Output validation

Model responses must match a strict predefined schema before display. A malformed or refused response is discarded and the failure logged rather than rendered. Generated content is HTML‑escaped like any other untrusted input.

10.4 Metering

Every AI call is logged with function, model, outcome, token counts, cost, duration and calling account — and no question content, answers or writing. It exists for cost control and abuse detection.

10.5 Model training

Our AI provider's commercial API terms state that customer inputs and outputs are not used to train its models. We have not enabled and will not enable any arrangement under which student work trains a model.

10.6 Availability

AI features are non‑essential. If the provider is unavailable, the fixed question banks, practice tests and all reporting keep working.

11 Infrastructure and sub‑processors

ProviderFunctionData receivedLocation
Supabase
(on AWS)
Managed PostgreSQL and server functions. Two separate projects, one per Trainer.All stored personal information.OLNA Singapore ap-southeast-1

NAPLAN Tokyo ap-northeast-1
AnthropicAI generation, marking and hints.Writing text, prompt, year level, topic, difficulty. No identifiers.United States
CloudflareStatic hosting (Pages), CDN, TLS, network‑layer protection.IP address and request metadata only.Global edge, including Australia
GitHubSource control and deployment pipelines.Source code only. No student data.United States
Google Fonts, jsDelivrTypefaces and one open‑source library delivered to the browser.IP address and browser type only.Global CDN

We choose providers that publish enterprise security programmes and independent audit reports — Supabase and its underlying AWS infrastructure, Cloudflare and GitHub all hold SOC 2 Type II or equivalent attestations. We will not add a sub‑processor receiving personal information without updating this policy and the Privacy Policy and giving schools 30 days' notice.

11.1 Data residency

STATED PLAINLY

Neither database is in Australia. The OLNA Trainer's is in Singapore, the NAPLAN Trainer's in Tokyo, and writing is marked in the United States.

Our database platform offers an Australian (Sydney) region. If your school or authority requires Australian residency, email hello@r2education.com.au before deploying and we will discuss migrating that Trainer's database to Sydney. AI marking would remain a United States service; a school that cannot accept that can run either Trainer with AI writing marking switched off, everything else intact.

12 Secrets management

13 Change management

13.1 Source control

All code lives in private repositories. Every change is attributable to an author and a time, giving a full audit trail of what changed and why.

13.2 Review and release

13.3 Dependencies

Third‑party libraries are pinned to specific versions rather than floating ranges, so a compromised upstream release cannot be pulled in silently. The footprint is intentionally minimal. We watch advisories for what we use and patch on the timeline in §19.5.

14 Logging and monitoring

14.1 What we log

LogContentsRetention
Sign‑in attemptsUsername, role, source IP, timestamp, success or failure.12 months
AI usageFunction, model, outcome, tokens, cost, duration, calling account. No content.24 months
Platform logsRequest and error logs from hosting and database platforms.Provider default, 7–30 days

Logs never contain passwords, tokens, secrets or writing responses.

14.2 Monitoring

We review sign‑in failure patterns for credential attacks, AI usage for anomalous volume, and platform error rates for malfunction or probing. Provider alerting notifies the principal of platform incidents.

Limitation. Monitoring is periodic and manual, not continuous and automated. There is no SIEM and no 24/7 alerting, so a slow, low‑volume intrusion could go undetected longer than it should. Stated rather than glossed over — see §19.7.

15 Backup and recovery

Because both Trainers are practice tools rather than systems of record, a school's essential records do not depend on them. We still recommend exporting class results at the end of each term.

16 Incident response and breach notification

16.1 Process

  1. Detect and triage — assess severity immediately on becoming aware.
  2. Contain — rotate affected secrets, invalidate sessions, disable the affected function or account, close the vulnerability. Containment beats investigation.
  3. Assess — what information, whose, how exposed, what harm is likely. Target 72 hours.
  4. Notify — see 16.2.
  5. Remediate — fix the root cause and verify the fix.
  6. Review — a written post‑incident review with timeline, root cause and preventive changes, provided to affected schools.

16.2 Notification commitments

WhoWhenWhat
Affected schoolWithin 72 hours of forming a reasonable belief a breach affecting its data occurredWhat happened, what information was involved, which students, what we have done, what we recommend. We notify even while assessment continues.
OAICAs soon as practicable, per the Notifiable Data Breaches schemeWhere an eligible breach is likely to cause serious harm.
Affected individualsIn coordination with the schoolThe school leads communication with students and families; we supply the factual content and support.
Education departmentOn the school's request, or where requiredWe complete departmental incident reporting and cooperate fully with any investigation.

We will not delay notifying a school while we investigate, and we will not minimise or withhold detail. A school is entitled to know promptly and completely when its students' information may have been exposed, even if our assessment is still running.

16.3 If a school suspects an incident

Email hello@r2education.com.au with "SECURITY" in the subject. We aim to acknowledge within one business day, immediately for anything reported as critical. If credentials may be compromised, deactivate the affected accounts yourself straight away — do not wait for us.

17 Retention and secure deletion

Full periods are in section 12 of the Privacy Policy. In summary:

18 Reporting a vulnerability

We welcome reports from researchers, teachers, students and anyone else. We will not pursue legal action against someone who reports a vulnerability in good faith under this section.

REPORT TO
hello@r2education.com.au
subject: SECURITY
ACKNOWLEDGED
Within 2 business days
ASSESSED
Within 10 business days

Please do

Please do not

We will keep you posted, fix confirmed issues as fast as we reasonably can, and credit you if you want credit. There is no paid bug bounty.

19 Known limitations

Every security policy should be read alongside what it does not claim. These are our current limitations, so a school can decide with its eyes open.

19.1 Data is stored offshore OPEN

Singapore for OLNA, Tokyo for NAPLAN, US for AI marking (§11.1). Where an authority requires Australian residency, a database can be migrated to the platform's Sydney region — raise it before deployment. Priority: high, on request.

19.2 No multi‑factor authentication OPEN

Sign‑in is username and password only. MFA is impractical for students, many of whom have no personal device — but a teacher or administrator account is a higher‑value target, seeing a whole class or a whole school. Optional MFA for staff accounts is on the roadmap. Until then, schools should ensure staff use strong unique passwords and change them on any suspicion. Priority: high.

19.3 OLNA Trainer security headers incomplete PARTIAL

The homepage and the NAPLAN Trainer send a full set including a content security policy; the OLNA Trainer sends three headers and no CSP (§9.1). Levelling it up is a small static‑file change and is the next scheduled security task. Note the inherent limit on both Trainers' policies described in §9.1. Priority: high, near term.

19.4 Server functions accept any origin PARTIAL

The server functions send a permissive cross‑origin policy. This does not grant access to data — every request is still authenticated and authorised server‑side, and a browser on another site cannot obtain a valid token. It does mean endpoints can be called from any origin by a client already holding a valid token. Restricting the allowed origin to our own domains is planned. Priority: medium.

19.5 Patch management is manual PARTIAL

Database and hosting platforms are managed services patched by the provider; application dependencies are updated by hand. Targets: 7 days for critical, 30 days for high, next release for medium and low. Automated dependency scanning is on the roadmap. Priority: medium.

19.6 No independent penetration test OPEN

Neither Trainer has been penetration tested by an independent third party. Security has been addressed by design (§5, §7) and by internal review, but that is not the same thing. We will commission one as the service grows and share results with schools that need them. Priority: medium.

19.7 Monitoring is periodic PARTIAL

See §14.2. No automated 24/7 alerting on anomalous access, so a slow intrusion could be detected late. Priority: medium.

19.8 Single‑operator concentration risk ACCEPTED

r2 Education is one person. That is good for access control — exactly one human can reach student data — but it means no separation of duties, no peer review of every change, and a single point of failure for incident response. Schools should weigh it. It is inherent to an operation this size, and disclosed rather than engineered away.

We will keep this section honest. Items come off only when the control genuinely exists, and new limitations get added as we find them. If something here matters to your assessment, tell us — it moves up the list.

20 Review and assurance

20.1 Review cycle

Reviewed every six months, and additionally after any security incident, significant architectural change, or change of sub‑processor. The version and date at the top always reflect the current version.

20.2 Certifications

r2 Education holds no ISO 27001, SOC 2, IRAP or other formal security certification, and will not imply otherwise. Our platform providers hold independent attestations (§11), but that is assurance over their infrastructure, not over our applications.

20.3 Supporting school assessments

Free of charge, we will:

Contact hello@r2education.com.au.