0.1 — draft for legal reviewNo effective date

Privacy Policy

How MyCodePad collects, uses, shares and protects personal data, and the rights you have over it.

This policy explains what personal data MyCodePad collects, why, who it is shared with, how long it is kept and what you can do about it. It is written to be read, not to be skimmed past.

Everything stated here as fact was checked against how the platform is actually built. Where a question has not been answered yet — a retention period, a provider location, a legal determination — it is marked in amber rather than filled in with something plausible.

1.Who operates MyCodePad and how to contact us

MyCodePad is an online coding platform for students, teachers, tutors and schools. It is operated by To be confirmed: registered legal name of the MyCodePad operator, a Sole trader registered in England and Wales under company number Not applicable — MyCodePad is operated by a sole trader, who has no Companies House registration.

For the personal data described in this policy, the operator is the controller except where a school is the controller — see section 2.

Contacting MyCodePad about personal data

Operator:
To be confirmed: registered legal name of the MyCodePad operator
Postal address:
To be confirmed: registered or trading postal address
Privacy enquiries:
To be confirmed: privacy and data protection contact address
Security and breaches:
To be confirmed: security and breach notification contact address
Data Protection Officer:
To be confirmed: whether a Data Protection Officer has been appointed, and their contact details

Our registration with the Information Commissioner's Office is To be confirmed: ICO data protection fee registration number. Where the operator is established outside the UK, our Article 27 representative is To be confirmed: UK or EU representative, if the operator is established outside the UK.

2.What this policy covers, and who is the controller

This policy covers the MyCodePad website, the browser-based Python IDE and HTML editor, accounts, classes, assignments, saved work, school administration and paid subscriptions.

Who is legally responsible for a given piece of processing depends on who decided it should happen, and that is not the same answer for every feature. Two situations arise.

  1. MyCodePad is the controller. For running and securing the platform itself — creating accounts, authenticating sign-ins, taking payments for individual subscriptions, sending service emails and protecting the service from abuse — the operator decides why and how the data is processed.
  2. A school is the controller.Where a school uses MyCodePad for its pupils, the school decides that its pupils will use the platform, which classes exist, what work is set and who may see it. For that processing MyCodePad acts as a processor on the school's instructions, and the terms in our School Data Processing Agreement apply. Pupils and parents should also read their school's own privacy notice.

This allocation needs legal confirmation

The split above reflects how the product works, but controller and processor roles are determined by the facts of each processing activity, not by what a policy asserts. Where a teacher signs up independently rather than through a school, the position is different again. This allocation requires specialist review before it is relied upon in a school contract.

3.Information you give us when you register

Creating a MyCodePad account requires a name, an email address and a password. You also choose whether the account is for a student or a teacher.

That is the whole of registration. We do not ask for a date of birth, a postal address, a phone number, a school email domain or a photograph. Profile pictures are chosen from a fixed catalogue of illustrated avatars, so no image is ever uploaded and no picture of you is stored.

Afterwards you may add or change a display name and an avatar, and students and teachers may join a class or a school by entering a code. Joining is how your account becomes linked to a teacher or a school; we never infer a school from your email address.

No age is collected today

Because registration asks for no age information, we cannot currently tell whether somebody signing up independently is a child. The minimum age for a self-registered account is 13. A child under 13 must be given an account by their school rather than registering themselves, and how age is established is an outstanding decision. See section 16.

4.Account, sign-in and session information

Your password is stored only as a cryptographic hash. Nobody at MyCodePad can read it, and we will never ask you for it.

When you sign in we create a session record containing a session token, its expiry time, and the IP address and browser user-agent of the device the session was created from. These exist so that you stay signed in and so that unusual access can be investigated.

Requesting a password reset creates a short-lived token that expires after one hour. Completing a reset signs out every other session on the account, because a forgotten password may be a compromised one. Changing your password from the account area does the same.

Email addresses are not currently verified, which means an account can be created against an address its owner does not control. We are treating this as a gap rather than a feature.

5.The code, projects and files you create

Everything you write in a MyCodePad editor is saved to your account: the contents of each file, its name, which editor it belongs to and which folder it sits in.

Your work is private to you by default. The people who can see a pupil's files are the pupil themselves and the teacher who owns the class the file belongs to — plus, for a school account, that school's administrators through the school dashboard. Other students never see each other's work.

When a teacher marks or corrects your work

A teacher can mark a file as done, leave comments on it and, if they choose, edit the code directly. A correction is never silent: the file records which teacher made it, their name, when it happened and which lines changed, and your own version from immediately before the correction is kept so your work cannot be destroyed. You can reply to a comment with one of a small set of reactions, including asking for more help.

Running code

Python runs inside your own browser using the Pyodide runtime, in a sandboxed worker. Your program and anything it prints are not sent to us in order to run. HTML previews render in a sandboxed frame that cannot reach the rest of the page, its cookies or your session. The runtime itself is downloaded from the public jsDelivr CDN, which sees your browser's IP address as part of that download.

Publishing a file as a link

You can publish one of your files as a public link. Anyone holding that link can read that file without an account. Share pages are excluded from search engines, but the link itself does not expire and cannot be password protected, so it should be treated as public once given out. You can revoke a link at any time, which disables every copy of it.

6.Class, school and teaching records

Teaching requires knowing who is in which class. We record enrolments, the teacher who owns each class, school membership with its role, and which invite code a member redeemed.

A school membership carries a role — student, teacher or school administrator — and a status. Removing somebody from a school marks their membership as removed rather than erasing it, so the record of who was in the school when remains accurate. Leaving a school is therefore not the same thing as deleting data.

Teachers additionally generate:

  • A private library of reusable files and folders, with task instructions, topic, difficulty, year group and learning objective.
  • Worked solutions attached to tasks. These are teacher-only and are never included in any response sent to a student.
  • Daily starter quizzes for a class, and the resulting pupil answers, scores, totals, the frozen record of a pupil's first attempt, and the times each starter was opened and submitted.

7.Subscriptions, billing and payments

Payments are processed by Stripe. Card numbers and other payment credentials are entered with Stripe directly and never reach MyCodePad's servers or database.

When you start a subscription we pass your billing email address to Stripe Checkout. In return we store, against your account or your school: the plan, its status, the billing interval, Stripe's customer, subscription and price identifiers, the end of the current billing period and whether a cancellation is scheduled. We also record the identifier of each Stripe event we have processed, so a retried notification cannot apply the same billing change twice.

Where a school or a teacher pays for your access, no card is requested from you at all and there is nothing on your account to bill.

8.Support, diagnostics and security logs

If you contact us for support we hold your message and the address you sent it from for as long as it takes to deal with it and to handle any follow-up.

For security, failed attempts to use a class join code are recorded against both the account that tried and the IP address it came from, so that a code — which anybody holding it can use — cannot be found by guessing. Successful joins are not recorded this way.

Application errors are logged by our hosting provider as part of running the service. Email delivery failures are logged without the recipient address or the message content outside of local development.

Outstanding

The failed-attempt log stores IP addresses and is not currently pruned by any scheduled job. Its retention period is To be confirmed: retention period for security logs, including failed join-code attempts, and a routine to enforce it still has to be built.

9.Summary of the personal data we hold

The table below is generated from the actual database schema, so it can be checked against the product rather than taken on trust.

Categories of personal data held by MyCodePad
CategoryWhat it containsWhere it lives
Account identityName, email address, role (student or teacher), account type, chosen avatar key, first-login and onboarding flags, the last editor opened, and created/updated timestamps.user table
Authentication credentialsA hashed password, managed by Better Auth. Password reset tokens with expiry times. MyCodePad never stores a password in a form it can read.account.password, verification tables
Session recordsA session token, its expiry, and the IP address and browser user-agent recorded when the session was created.session table
Code and project workThe contents of every file a user writes, its name, language and folder, the pupil's version from immediately before any teacher correction, and marking status.code_file, student_folder tables
Teacher feedback and correctionsComments left on a pupil's file with the teacher's name, the pupil's reaction to each comment and when they gave it, and an attributed record of any line a teacher edited directly.file_comment, code_file.teacherEditedBy* columns
Tasks and lesson materialTeacher-authored task instructions, topic, difficulty, year group and learning objective, plus worked solutions that are never served to a student.file_task, library_file, library_folder tables
Starter quiz activityA pupil's answers, score and total for each daily starter, the frozen record of their first attempt, when they opened it and when they submitted.daily_starter_response, daily_starter_open tables
Class and school membershipWhich classes a pupil is enrolled in, which teacher owns each class, school membership with its role and active/removed status, and which invite code a member redeemed.enrollment, class, school_member, invite_code tables
AI help activityA record of each request to unlock AI error help, tied to the pupil, the file and a signature of the error, with the time the hint becomes available.ai_help_unlock table
Subscription and billingPlan, status, billing interval, Stripe customer and subscription identifiers, the price identifier, the current period end and whether a cancellation is scheduled. Card details are handled by Stripe and never reach MyCodePad.subscription, school_subscription, stripe_event tables; lib/checkout.ts
Security logsFailed class join-code attempts, recorded against both the user and the raw IP address they came from, so a guessing attack can be throttled.join_attempt table; app/actions/classes.ts
Public share linksWhere a file has been published as a link, the random token, who owns the file and whether the link has been revoked. Anyone holding a live token can read that file without an account.file_share table; app/s/[token]

10.Why we process your data, and our lawful basis

UK GDPR requires a lawful basis for every purpose. The purposes below are the ones the product actually serves; the basis assigned to each is a legal determination that has not yet been confirmed by an adviser.

Processing purposes and their lawful basis
PurposeData usedProposed lawful basis
Creating and running your accountName, email address, password hash, roleContract — necessary to provide the account you asked for. For a pupil using a school account, the school's own basis applies instead.
Keeping you signed in and securing the accountSession token, expiry, IP address, user-agentLegitimate interests — keeping accounts secure, including children's accounts.
Storing and displaying the work you createFile contents, names, folders, marking statusContract, or the school's instructions where the school is the controller.
Teaching, marking and feedbackEnrolments, comments, corrections, starter answers and scoresPerformance of a task in the public interest, or the school's instructions. This is the determination most in need of review.
Taking payment for a subscriptionBilling email, Stripe identifiers, plan and statusContract.
Sending service emails (welcome, password reset)Name, email addressContract, and legitimate interests for security notices.
AI error help and task generationThe code and error text in the file concerned; a teacher's topic and objectiveLegitimate interests, subject to the teacher control described in section 18.
Protecting the service from abuseFailed join attempts with account and IP addressLegitimate interests — protecting pupils and class data from unauthorised access.
Meeting legal and tax obligationsBilling and transaction recordsLegal obligation.

Requires legal review

Lawful bases are not interchangeable and cannot be swapped after the fact. Each row above must be confirmed before this policy is published — particularly the basis for processing children's data in a school context, where the choice between public task, legitimate interests and the school's own instructions has real consequences for the rights available to pupils.

Where we rely on legitimate interests, you have the right to object. Where we ever rely on consent, it will be asked for separately and specifically, and you will be able to withdraw it as easily as you gave it. Accepting our Terms of Service is not consent to any processing of personal data.

11.Who we share data with

We do not sell personal data, we do not share it with advertisers and there is no advertising, marketing or behavioural tracking technology anywhere in the product.

Data is shared only in these situations:

  • With your teacher and your school.A pupil's work, marking status, comments and starter results are visible to the teacher who owns their class, and to administrators of the school that pupil belongs to.
  • With service providers. The companies listed in the next section process data on our behalf and under contract.
  • With anyone you give a link to. Only where you have deliberately published a file as a public link.
  • Where the law requires it,or to establish, exercise or defend legal claims, or to protect someone's vital interests.
  • In a business transfer, if the service were ever sold or reorganised. You would be told before your data became subject to a different privacy policy.

12.Service providers and international transfers

These are every provider that receives personal data, identified by reading the application code rather than from a vendor list.

Service providers and what each one receives
ProviderWhat it doesWhat it receivesLocation
VercelApplication hosting, serverless execution and privacy-friendly page analyticsEverything processed in a request, in transit. Analytics is enabled in production only and records page views without cookies.To be confirmed: Vercel deployment region(s)
NeonManaged PostgreSQL databaseAll stored personal data listed above.To be confirmed: Neon database region
StripePayment processing and subscription billingThe billing email address passed to Checkout, plus the payment details the customer enters directly with Stripe. MyCodePad stores only Stripe's identifiers in return.To be confirmed
ResendTransactional email deliveryRecipient email address, name where the template uses it, and message content for welcome and password reset emails.To be confirmed
Vercel AI Gateway and OpenAIAI error help, task generation and starter generationFor error help, the pupil's code (up to 8,000 characters) and the error message their program produced. For task and starter generation, the teacher's topic, year group and objective. No name, email or account identifier is included in the prompt.To be confirmed
jsDelivrPublic CDN serving the Pyodide runtime that executes Python in the browserThe browser's IP address and request headers when it downloads the runtime. No account data is sent, and the code a pupil writes is executed locally in their own browser rather than uploaded.To be confirmed

Transfers out of the UK are not yet confirmed

Several of these providers are capable of processing data outside the UK. Where that happens, the safeguard relied upon is To be confirmed: transfer mechanism relied on for any processing outside the UK. The actual deployment and database regions — To be confirmed: Vercel deployment region(s) and To be confirmed: Neon database region — must be read from the live project configuration, and the processing locations of the payment, email and AI providers confirmed with each of them, before this section can state anything definite.

13.How long we keep your data

We keep personal data for as long as your account exists, and then for the periods set out below. Some of those periods have not yet been set.

What we can state from how the product behaves today:

  • A file you delete is removed from the database, and so is the public share link attached to it — a revoked or orphaned link resolves to nothing.
  • Deleting a class removes the class and its enrolments.
  • Sessions expire on their own and are revoked in bulk when you change or reset your password.
  • Password reset tokens expire one hour after they are issued.
  • Being removed from a school marks the membership as removed; it does not delete the member's account or their work.

What is still to be decided:

Retention periods still to be set
DataRetention
Account and work data after an account is closedTo be confirmed: retention period for account and work data after an account is closed
Backups, and when deletions reach themTo be confirmed: backup retention window and the point at which deletions reach backups
Billing and tax recordsTo be confirmed: retention period for billing and tax records
Security logs, including failed join attemptsTo be confirmed: retention period for security logs, including failed join-code attempts
Dormant accountsTo be confirmed: whether dormant accounts are deleted, and after how long
School data at the end of a school contractTo be confirmed: period within which school data is returned or deleted at the end of a contract

14.How we protect your data

The measures below are implemented in the product today. We have deliberately not listed anything we cannot point at in the code.

Technical and organisational security measures
MeasureWhat it means in practice
Password storagePasswords are hashed by Better Auth and never stored in readable form. Changing a password requires the current one, and succeeds only by signing every other device out.
Session invalidation on password resetCompleting a password reset revokes every existing session for that account, on the assumption that the old password may be compromised.
Server-side authorisation on every readAccess to a class, a file or a task is resolved on the server from the session, not from anything the browser sends. Hiding a control in the interface is never the only barrier.
Role escalation blocked at the database layerThe role requested at sign-up is clamped to student or teacher before the user row is created, and the account endpoints strip role changes, so school administrator cannot be self-granted.
Teacher-only fields never selected for studentsStudent-facing queries list their columns explicitly rather than returning whole rows, which is what keeps worked solutions out of a pupil's response.
Durable throttling of class join codesA join code is a bearer credential, so failed attempts are counted in the database against both the account and the IP address. The limit therefore survives cold starts and cannot be spread across serverless instances.
Webhook replay protectionStripe events are recorded by identifier once processed, so a retried webhook cannot apply the same billing change twice.
Transport security and browser hardeningHSTS, X-Content-Type-Options, Referrer-Policy and cross-origin isolation headers are set for every route. Traffic to the database and to every provider is encrypted in transit.
Sandboxed code executionPython runs in a web worker inside the pupil's own browser, and HTML previews render in a sandboxed frame that cannot reach the parent page, its cookies or the session that owns it.
Restrained loggingEmail delivery failures are logged without the recipient address or message body outside development.

We hold the following security certifications: None held. MyCodePad does not hold Cyber Essentials, ISO 27001 or any other security certification, and does not claim to. No service can be guaranteed absolutely secure, and we do not claim otherwise. If you believe an account has been compromised, contact us at To be confirmed: security and breach notification contact address.

15.Your rights over your data

Under UK data protection law you have the rights below. They are free to exercise, and we will respond within one month of receiving a request.

  • Access — a copy of the personal data we hold about you.
  • Rectification — correction of anything inaccurate. Your name and avatar can be changed yourself in your account settings.
  • Erasure — deletion of your data, where no overriding reason to keep it applies. You can ask for this from the Your data tab of your account, which also shows exactly what would happen to each kind of record before you ask.
  • Restriction — a pause on processing while a dispute about accuracy or legitimate interests is resolved.
  • Portability — the data you gave us, in a machine-readable form.
  • Objection — to processing we justify on legitimate interests.
  • Withdrawing consent — at any time, wherever we have relied on consent.

To exercise any of these, write to To be confirmed: privacy and data protection contact address. We may ask you to confirm your identity before acting, so that somebody else cannot obtain your data by asking.

If your account belongs to a school, the school is usually the controller for your school work. In that case send your request to the school and we will assist them with it; if you send it to us, we will tell you and pass it on.

What we can and cannot do today

An erasure request can be made in the product and is tracked to a decision against the one month deadline, but the deletion itself is carried out by hand — there is no self-service delete button, and we are not going to describe one. There is also no single export covering your account, classes, feedback and results, so a portability request is fulfilled manually. This section will be rewritten when that changes.

16.Closing your account, exporting and deleting data

You can download your code at any time from inside either editor, file by file or as a zip archive.

To ask for your account to be erased, use the Your data tab in your account, or write to To be confirmed: privacy and data protection contact address. Either way we record the request, give it a reference, and respond within one month. The account area shows you the reference, the date a response is due, and whether we have verified your identity yet.

What erasure actually means depends on what your account is

Deleting an account is not one action, because a single account can hold other people's personal data. A teacher's account points at classes full of pupil work; a school administrator's account may be the one the school itself was created under. We therefore treat the following as different things, and the account area shows you which one applies to you before you ask:

How an erasure request is handled for each kind of account
AccountWho decidesWhat happens to the work
Individual learnerMyCodePadYour files, folders and personal workspace are deleted with the account.
School-managed pupilYour schoolWork produced for school is the school's record as well as your personal data, so the school decides whether it is exported or deleted. We pass your request to them and do not delete it on our own initiative.
Independent teacher or tutorMyCodePadClasses are transferred to a named replacement, or closed with an export offered to each pupil, before the account is removed. Feedback you left on pupils' work is kept but has your name stripped from it.
School teacherYour schoolClasses, pupil work and lesson material belong to the school and are transferred on its instruction. A teacher leaving never deletes a classroom.
School administratorYour schoolIf your account is the one the school was created under, school ownership must be transferred to another administrator first, because otherwise removing you would delete the school, its members and its invite codes with you.

Across all of them, any public share links you have published are revoked first, before anything else happens, because that is the only step that stops your data continuing to leave the platform while the rest of the request is worked through.

What we check before acting

We ask you to confirm your identity, proportionately to what is being asked — we will not demand identity documents where confirming control of your account email is enough. Where somebody asks on a child's behalf, we separately establish that they are entitled to: the product holds nothing linking a parent to a pupil, so that check is To be confirmed: how a parent or guardian's authority to act for a child is established.

Honest limits

Fulfilment is manual. No code in MyCodePad deletes an account, and most of our tables reference users by a plain identifier with no database-level link, so an automated delete would leave data behind rather than remove it. That is why each request is worked through against a written plan and recorded step by step, and why we will not promise an instant deletion.

Once an account is erased, data is retained for To be confirmed: retention period for account and work data after an account is closed, except for records we must keep by law — see section 13. Billing and tax records are the main example: we cannot delete an invoice on request. We also keep a record of the request itself, including your name and email so the record still means something after the account has gone, for To be confirmed: retention period for the erasure request record itself.

Cancelling a paid subscription is separate from closing an account: a cancelled subscription leaves the account in place on the free tier. Cancellation is handled through the Stripe billing portal linked from your billing page. Being removed from a school is separate again — it marks your membership as removed and leaves your account and your work in place.

17.Children and young people

MyCodePad is used in schools, so we expect many of our users to be children. The ICO's Age Appropriate Design Code applies to us, and the following is an honest account of where we stand against it.

What is already true of the product:

  • Registration collects the minimum we can run an account on: a name, an email address and a role.
  • Files are private by default. Nothing a pupil writes is public unless they publish it themselves.
  • There is no advertising, no marketing, no behavioural tracking and no profiling anywhere in the platform.
  • Teacher corrections to a pupil's code are always attributed, and the pupil's own prior version is preserved.
  • AI help is a teacher-controlled feature that can be switched off for a class, and is delayed so that pupils attempt problems themselves first.

What is outstanding, and which we are not going to describe as finished:

  • Age assurance. The minimum age for an independent account is 13. A child under 13 must be given an account by their school rather than registering themselves. That is our policy, but nothing in the product enforces it: we collect no date of birth and no age band, so we cannot currently identify which of our users are children, and we assume some are.
  • A child-facing privacy notice. This policy is written for an adult reader. A short, plain version for pupils is still to be written.
  • Public sharing. A published link does not expire and cannot be password protected. Whether pupils should be able to publish at all is under review.
  • A data protection impact assessment. Our DPIA status is To be confirmed: whether a DPIA has been carried out, by whom and when. No assessment has been completed, and we make no claim that one has.

If you are a parent or carer and want to know what we hold about your child, the quickest route is usually through their school, because for school work the school is the controller. You can also write to To be confirmed: privacy and data protection contact address.

18.Cookies and similar technologies

MyCodePad sets one cookie, and it exists to keep you signed in. There are no advertising cookies, no cross-site trackers and no third-party marketing tags.

Some preferences are kept in your browser's own local storage rather than sent to us. They never leave your device and we cannot read them. The complete list, taken from the code:

Cookies and browser storage set by MyCodePad
WhatTypeWhyStrictly necessary
Better Auth session cookieCookieKeeps you signed in and ties each request to your account. Without it there is no way to stay logged in.Yes
mcp:task-panel-width, mcp:task-pinnedLocal storageRemembers how wide the task panel was and whether it was pinned open.No — a preference stored on your own device
mcp:task-seenLocal storageRemembers which task versions you have already read, so an unchanged task does not reopen itself.No — a preference stored on your own device
Panel collapse stateLocal storageRemembers which editor panels you collapsed.No — a preference stored on your own device
AI hint cacheLocal storageKeeps the last AI hint for a file in your own browser so reopening the file does not spend another request.No — a preference stored on your own device
Install prompt flagLocal storageRecords that the app-install suggestion has been shown, so it is not shown repeatedly.No — a preference stored on your own device

Why there is no cookie banner

Because nothing here is used for advertising, analytics profiling or tracking you across sites, there is nothing to ask consent for beyond what is strictly necessary to provide the service you asked for, and the remaining items store only your own interface preferences on your own device. Adding a consent banner would be decorative, and a decorative banner trains people to dismiss the real ones.

We use Vercel's page analytics in production. It is cookieless and does not build a profile of you or follow you to other sites.

One point to confirm

Whether cookieless analytics and functional browser storage fall inside the “strictly necessary” exemption in the Privacy and Electronic Communications Regulations is a judgement, and the ICO expects it to be reasoned rather than assumed. It should be confirmed as part of the legal review. If MyCodePad ever adds a tracking technology that needs consent, a real consent mechanism — with a reject option as prominent as accept, and the technology blocked until consent is given — must be built at the same time.

19.Automated decision-making, profiling and AI features

No decision with a legal or similarly significant effect on you is made by automated means, and we do not profile users.

Starter quizzes are scored automatically, and files carry a marking status. Both are shown to the pupil and to their own teacher. Nothing is inferred, ranked or predicted from them, and no access, grade or account outcome follows automatically from either.

What the AI features send, and where

Three features call a large language model through Vercel's AI Gateway, which currently routes to OpenAI:

  • Error help. Sends the code in the file you are working on, truncated to 8,000 characters, together with the error message your program produced. It is unlocked only after a delay set by your teacher, and teachers can switch it off for a class entirely. Your name, email address and account identifier are not included in the prompt.
  • Task generation. Sends the topic, difficulty, year group and learning objective a teacher typed in. No pupil data is involved.
  • Starter generation. Sends the same kind of teacher-supplied lesson metadata to produce quiz questions.

The hint you receive is cached in your own browser so that reopening a file does not spend another request.

To confirm with the provider

Whether prompts are retained by the model provider, for how long, and whether they are excluded from model training must be confirmed in writing and reflected here. Code a pupil has written is their personal data, and sending it to a third party needs that answer on the record.

20.Complaints, and the Information Commissioner's Office

If you are unhappy with how we have handled your personal data, please tell us first so that we have the chance to put it right. Our complaints process is To be confirmed: internal complaints process and escalation route.

You also have the right to complain to the UK's data protection regulator, the Information Commissioner's Office, at any time, and you do not have to come to us first.

Information Commissioner's Office

Wycliffe House, Water Lane, Wilmslow, Cheshire SK9 5AF

Helpline: 0303 123 1113

ico.org.uk/make-a-complaint

21.Version, effective date and changes to this policy

This is version 0.1 — draft for legal review. It has no effective date because it has not yet been reviewed or published.

When we change this policy we will update the version and the effective date at the top of the page. For a material change — a new purpose, a new category of recipient, or a change to a lawful basis — we will email account holders in advance where we can, and notify schools through their administrator, rather than relying on you noticing a new date.

Previous versions are available on request from To be confirmed: privacy and data protection contact address.


Pre-publication checklist

Every item below is marked somewhere in these documents and must be resolved before any of them is published or relied upon. They are listed here as well so the list can be worked through in one pass.

  1. 01

    Registered legal name of the MyCodePad operator

    UK GDPR Article 13 requires the identity of the controller. Only the operator knows whether MyCodePad trades as a limited company, a sole trader or a partnership.

  2. 02

    Registered or trading postal address

    Article 13 requires contact details for the controller, and schools need a service address for a signed DPA.

  3. 03

    Privacy and data protection contact address

    Data subject rights requests need a route that is actually monitored.

  4. 04

    Security and breach notification contact address

    Article 33/34 breach handling and the DPA both depend on a reachable security contact.

  5. 05

    General support contact address

    Referenced by the Terms for service and billing queries.

  6. 06

    Whether a Data Protection Officer has been appointed, and their contact details

    Article 37 requires a DPO in some cases. Processing children's data at scale makes this a decision that must be taken deliberately and recorded, not assumed either way.

  7. 07

    ICO data protection fee registration number

    Most UK controllers must pay the data protection fee and register. The number must not be invented, and registration status must be confirmed before it is claimed.

  8. 08

    UK or EU representative, if the operator is established outside the UK

    Article 27 may require a representative. Depends on where the operator is established.

  9. 09

    Governing law and jurisdiction for the Terms

    A jurisdiction clause is a commercial and legal decision, and consumer protection rules limit what can be imposed on UK consumers.

  10. 10

    Statutory cancellation / cooling-off position for individual subscriptions

    The Consumer Contracts Regulations give a 14 day right to cancel distance contracts, with specific rules where a digital service starts immediately. How this is handled must be confirmed before it is described.

  11. 11

    Refund policy beyond statutory rights

    No refund logic exists in the billing code. Any discretionary refund promise is a commercial commitment.

  12. 12

    VAT registration status and whether listed prices include VAT

    Stripe is configured with plain GBP amounts and no tax behaviour, so the published prices cannot be described as VAT-inclusive or exclusive until this is confirmed.

  13. 13

    Support response target, if any is offered

    Several plans advertise "priority support". What that means in practice is a commitment that has to be set deliberately.

  14. 14

    Internal complaints process and escalation route

    Referenced by both the Terms and the Privacy Policy, and expected by schools procuring the service.

  15. 15

    Retention period for account and work data after an account is closed

    Erasure is now requested through the account area and carried out by hand against a recorded plan, so there is a process — but no decision has been taken on how long anything is kept before that plan runs, or whether a grace period applies in which a request can be reversed.

  16. 16

    Retention period for the erasure request record itself

    Each request stores the subject's name and email so the record still means something after the account is deleted, which is what lets MyCodePad show a regulator the request was handled. That record is itself personal data and cannot be kept forever without a stated period.

  17. 17

    How a parent or guardian's authority to act for a child is established

    The request form accepts a parent or guardian as the requester, and the product holds nothing that links a parent to a pupil. The check is therefore a documented human procedure, and acting on an unverified claim would disclose or destroy a child's data on a stranger's say-so.

  18. 18

    Backup retention window and the point at which deletions reach backups

    Set by the database provider's configured plan and by operator choice, and must be read from the live Neon project rather than assumed.

  19. 19

    Retention period for billing and tax records

    UK tax law sets minimum record-keeping periods, which interact with deletion requests. The applicable period depends on the operator's legal form.

  20. 20

    Retention period for security logs, including failed join-code attempts

    Failed join attempts record raw IP addresses and are not pruned by any code in this repository.

  21. 21

    Whether dormant accounts are deleted, and after how long

    Storage limitation requires data not to be kept indefinitely without reason. No dormancy policy is implemented.

  22. 22

    Period within which school data is returned or deleted at the end of a contract

    Article 28(3)(g) requires the processor to delete or return personal data at the end of the service. The window is a contractual term.

  23. 23

    Vercel deployment region(s)

    Determines where the application runs and whether a transfer outside the UK occurs. Must be read from the live Vercel project configuration.

  24. 24

    Neon database region

    Determines where personal data is stored at rest. Must be read from the live Neon project.

  25. 25

    Transfer mechanism relied on for any processing outside the UK

    The UK Addendum to the EU SCCs, the IDTA or adequacy may apply. Which one, for which provider, is a legal determination.

  26. 26

    Deadline for notifying a school of a personal data breach

    Article 33(2) requires notification "without undue delay". A specific number of hours is a contractual promise that the operator must be able to meet.

  27. 27

    Audit and inspection arrangements offered to schools

    Article 28(3)(h) requires audits to be permitted. The practical form — questionnaire, report, on-site — is negotiated.

  28. 28

    Notice period before a new subprocessor is added

    Article 28(2) requires the controller to have an opportunity to object to changes.

  29. 29

    Whether a DPIA has been carried out, by whom and when

    Processing children's personal data at scale is likely to require a DPIA under Article 35. No assessment is recorded in this repository.

Each item corresponds to an entry in lib/legal.ts. Filling in its value replaces the marker everywhere it appears and removes this row.