# Enroll a whole school in ClassGuard 1.9

There are two steps: deploy the Chrome extension to managed devices, then import the district roster. CSV import handles 1,000+ records in one operation; it does not install extensions or create Google accounts.

## 1. Prepare managed Chrome deployment

For an existing district deployment, update the extension and viewing server together to 1.9.0. The downloaded extension source can be loaded unpacked on test devices. This evaluation release has no published Chrome Web Store listing, signed CRX/update service, or automatic Google Admin connection. Your IT team must establish a supported distribution method and stable extension ID before fleet rollout.

Once that method is available, Google Admin can force-install extensions for a district organizational unit or group. In **Devices → Chrome → Apps & extensions → Users & browsers**, select the target unit/group, add or select the distributed extension, set its installation policy to **Force install**, and save. Begin with a test organizational unit and verify policies on the managed device before widening deployment. See [Google’s official force-install guide](https://support.google.com/chrome/a/answer/6306504?hl=en) for current account and platform requirements.

Configure the deployed extension origin in `CLASSGUARD_ALLOWED_ORIGINS`, use your school’s reachable HTTPS viewing server, and apply the supplied managed filtering policy as appropriate. The public ClassGuard.org page distributes the kit; it does not host student rosters or the classroom server.

## 2. Import a roster once

1. Start the school server with a private teacher key and a different private `CLASSGUARD_ADMIN_KEY`. Both must be at least 24 characters; use independently generated random keys. Set `CLASSGUARD_ROSTER_FILE` to a private persistent storage path if the default is unsuitable.
2. Open **District roster** from the teacher viewer or extension’s Screen viewing page. Connect with the school server URL and administrator key.
3. Download the CSV template. Replace its sample row with your school’s students. Required columns are `student_id` (or `email`) and `name` (or both `first_name` and `last_name`). Optional `email` and `class_group` columns support contact lookup and class membership.

```csv
student_id,name,email,class_group
S0001,Sample Student One,student1@school.invalid,Math Period 2;Science Period 3
S0002,Sample Student Two,student2@school.invalid,Math Period 2
```

4. Upload, select **Preview import**, resolve reported errors, then **Import students**. The 4 MB UTF-8 file limit and 20,000-row/student limit cover typical large roster exports. Quoted commas, escaped quotes, BOM, and CRLF are supported.
5. IDs are unique. Identical rows for one student merge class groups; conflicting identities or duplicate emails under different IDs prevent the import. Reimporting matches and updates IDs without creating duplicates; omitted students stay in the roster. Email-only records receive a stable ID derived from the email. Use stable school IDs so changed email addresses update the correct person.
6. Supply real class memberships, separating multiple groups with semicolons. Each live group must have no more than 30 students. The optional automatic grouping places students without groups in numbered sections of up to 30. These sections are administrative conveniences, not timetable integration; existing group assignments are kept for ungrouped reimports when automatic grouping is enabled. Supplied memberships replace that student’s previous groups.

The roster table searches IDs, names, emails, and groups and pages through 100 records at a time.

## 3. Distribute personal enrollment codes

Select the replacement confirmation and **Generate & download enrollment codes**. The export contains each student’s identity, groups, personal code, server address, and enrollment link. Give each student only their own row through the school’s existing learning platform or other approved channel. The app does not send email.

Code generation replaces all previous enrollment codes for future joins. Importing a new roster alone preserves existing codes. Generate a fresh export when you need codes for new students and distribute the replacement codes to existing students too. Existing live sessions continue until their normal ending.

The link uses a URL fragment to fill the browser enrollment page, and the page removes the fragment from the address bar. It does not install or open the extension automatically. Website-restricted classes require enrollment in the installed extension’s Student sharing page: enter the school server address, paste the personal code, and choose **Save enrollment** once per device/browser profile. The code is saved in extension local storage. A browser preview stores it only for that tab session. **Forget this device** clears the saved enrollment credential without releasing an active period’s website rules.

Codes are bearer credentials. Possession identifies the roster entry; this release does not verify Google sign-in, email ownership, or the physical person. Do not publish the export, share one code across students, or include it in support screenshots. The server stores only code hashes; student names, IDs, emails, and group assignments remain in its private roster file.

## 4. Teach a roster class

Teachers enter their normal teacher key, choose **Load class groups**, select their group, and start the class period with the allowed websites. Students refresh their enrolled classes and join the appropriate one. The server checks membership and binds the stored name; teachers do not approve each registered member separately. An open class still uses individual teacher approval.

Admission starts the existing screen-sharing deadline. Chrome’s picker remains required, and students become active only when the teacher viewer receives their screen. The teacher grid still shows all connected screens together. Enrollment does not remove the sharing requirement or override district/class website policies.

## Capacity and storage

A 1,200-student synthetic roster was tested through the API and the browser upload/export flow. This validates bulk enrollment, not simultaneous district-wide streaming. Live limits remain 30 students per room and 50 rooms per server. Evaluate school network, TURN services, and server resources for your actual workload.

Back up the private roster file securely. It persists across restarts and is never served by the included static server. Imports do not delete omitted students; there is no deletion UI or automatic retention expiry in this release. To reset the roster, stop the server, remove its roster file and operator backups, and restart. Do not place runtime roster files, enrollment exports, environment files, or keys in the distribution ZIP or public marketing site.
