Vaulter Orono Public Schools
FIVE STAGES · ABOUT AN AFTERNOONRUNS AS THE ADMIN WHO SETS IT UPYOUR TICKS ARE SAVED IN THIS BROWSER

BEFORE YOU STARTWHAT HAS TO BE TRUE ALREADY

0

Check four things first

Five stages, about an afternoon. Everything runs as the admin who sets it up, so sign in as that account for every step.

  • Google Workspace for Education with Gemini turned on for the student organizational units you want to watch.
  • Vault licenses for those students. Vault is where Gemini activity is retained; without it, every export comes back empty.
  • A super-admin account with Vault privileges (manage matters, manage exports) and Admin SDK read. Everything runs as this account.
  • Optional: a Gemini API key from Google AI Studio for the triage step. Without it, matches are still flagged, just without an AI verdict.
Using an AI coding agent? Paste this promptClaude Code, Gemini CLI, Codex or similar

Let the agent drive. It can clone the repo, create the Sheet and its bound script with clasp, and push the code. It cannot click Google's dialogs, so it hands those to you one at a time.

PROMPT FOR YOUR AGENT
I want to set up Vaulter in my Google Workspace for Education district.
Repo: https://github.com/Orono-Public-Schools/Vaulter
Guide: https://orono-public-schools.github.io/Vaulter/setup.html

Work through the guide with me, in order:

1. Clone the repo. Read README.md and docs/setup.html before doing anything else.
2. Install clasp (npm install -g @google/clasp) and run `clasp login`. I will
   finish the browser sign-in as our super-admin and tell you when it is done.
3. In apps-script/, run `clasp create --type sheets --title "Vaulter" --rootDir src`
   to make a new Google Sheet with a bound Apps Script project, then `clasp push`
   to load the code. Give me the Sheet URL and the script URL (`clasp open`).
4. From here, tell me exactly what to do for each step only I can do, one step at
   a time, and wait for me to confirm before moving on:
   - run setupSheets in the editor and approve the permissions prompt
   - fill the Setup, App_Config, Alerts_Config and Access_List tabs
   - add GEMINI_API_KEY and later DASHBOARD_URL as script properties
   - deploy as a web app: execute as Me, access anyone within my domain
   - run installTrigger, then press Run import now in the dashboard
5. Do not edit anything under apps-script/src for my district. Configuration
   lives in the Sheet and in script properties. Never put keys or IDs in files.
6. When the first run finishes, help me read Run_Log and the dashboard, and use
   the troubleshooting table at the end of the guide if something is off.

Checklist

STAGE 1ABOUT 20 MINUTES

1

Make the Sheet and the script

The Sheet holds the data. The script bound to it is Vaulter.

Do this

  1. 1Create a new Google Sheet and name it Vaulter.
  2. 2Open the script editor: Extensions›Apps Script. A new tab opens with an empty project.
  3. 3Turn on the manifest: click the gear (Project Settings) and tick Show "appsscript.json" manifest file in editor.
  4. 4Back in the Editor, use the + beside Files to add each file from the repo's apps-script/src folder with the same name. Script for .js, HTML for .html. Paste each file's contents. Replace the manifest's contents too; it carries the OAuth scopes. Delete the default Code.gs.
Config.js Auth.js VaultImport.js Scanner.js Alerts.js Scheduler.js SheetSetup.js WebApp.js index.html Demo.html appsscript.json
Prefer the command line? npm install -g @google/clasp, clasp login, copy apps-script/.clasp.json.example to .clasp.json with your script ID from Project Settings, then clasp push from the apps-script folder. That does step 4 in one go.

Where to click

YOUR SHEET · STEP 2
VaulterFileEditViewInsertFormatDataToolsExtensionsHelp
2
ABC12345
Sheet1
APPS SCRIPT · STEPS 3 AND 4
VaulterDeploy ▾
FILES +
Code.gs
Config.js
Auth.js
VaultImport.js
Scanner.js
Alerts.js
Scheduler.js
SheetSetup.js
WebApp.js
index.html
Demo.html
appsscript.json
// Config.js — Central constants. const SPREADSHEET_ID = … const SHEETS = { VAULT_DATA: 'Vault_Data', FLAGGED: 'Flagged', … };
3 4
Callout 3 is the gear in the left rail, Project Settings. The manifest checkbox is the first option under General settings. Callout 4 is the plus beside Files.

You should see

PROJECT SETTINGS

General settings

✓Show "appsscript.json" manifest file in editor
Enable Chrome V8 runtime

IDs

Script ID1AbC…your script id…xYz
Done when the Files list shows exactly the eleven names and Code.gs is gone. Nothing in the code needs editing for your district: the script finds its own Sheet because it is bound to it.

Checklist

STAGE 2ABOUT 5 MINUTES

2

Create the tabs

One function builds every tab with its headers and default rules.

Do this

  1. 1In the editor toolbar, open the function dropdown and pick setupSheets.
  2. 2Press Run.
  3. 3A permissions prompt appears the first time. Choose your admin account, review the scopes and press Allow. It asks for Vault, Admin SDK read, Sheets, Gmail send and triggers, all on your own account.
  4. 4Switch back to the Sheet tab in your browser.

Where to click

APPS SCRIPT · STEPS 1 AND 2
Vaulter
FILES +
Config.js
Auth.js
VaultImport.js
Scanner.js
Alerts.js
Scheduler.js
SheetSetup.js
WebApp.js
DebugsetupSheets▶ Run
function setupSheets() { const ss = SpreadsheetApp.openById(SPREADSHEET_ID); setupVaultDataSheet_(ss); setupFlaggedSheet_(ss); …
Execution log
10:42:05 AMNotice Execution started
10:42:09 AMInfo All sheets initialized.
1 2
PERMISSIONS PROMPT · STEP 3
Vaulter wants to access your Google Account
This will allow Vaulter to:
See, edit, create, and delete your spreadsheetsManage your eDiscovery data (Vault)View organizational units on your domainSend email on your behalfConnect to an external serviceAllow this application to run when you are not present
CancelAllow
3

You should see

YOUR SHEET · EIGHT TABS
VaulterFileEditViewInsert🛡 Vaulter
ABC1CategoryKeywords (comma-separated)Severity2Self-Harmhow to kill myself,i want to die,…Critical3Sexual Contentnude photos,send nudes,…High4Violencehow to make a bomb,school shooting,…High5Drugshow to get weed,drug dealer,…Medium
Vault_DataFlaggedAlerts_ConfigApp_ConfigSetupRun_LogAI_FilteredAccess_List
Done when the eight tabs exist and Alerts_Config shows six default categories. A Vaulter menu appears in the Sheet's menu bar the next time you reload it.

Checklist

STAGE 3ABOUT 15 MINUTES

3

Configure

Four tabs in the Sheet and one script property. All of it can be changed later from the dashboard.

Do this

  1. 1On the Setup tab, fill column B: which OUs to import, the date range and the schedule.
  2. 2On the App_Config tab, set who gets the alert email and how it appears.
  3. 3On the Access_List tab, add yourself with role Admin, then each reviewer.
  4. 4Back in the script editor, Project Settings›Script properties›Add script property and add the Gemini key.
TabRowSet it to
SetupOUs to ImportComma-separated OU paths, for example /Students/High School,/Students/Middle School
SetupDate Rangeday for daily runs; week or month once, for a first backfill
SetupImport Frequency, Time, Daydaily at 06:00 is the default; hourly and weekly also work
SetupStatusActive
App_ConfigAlert RecipientsComma-separated counselor and admin emails
App_ConfigFrom Name, Reply-ToHow the alert email appears
Alerts_Configeach rowKeep or edit the six defaults. Multi-word phrases cut false positives
Access_Listeach rowYour email with Admin, then each reviewer with Viewer or Admin

Where to click

YOUR SHEET · SETUP TAB · STEP 1
Vaulter
ABC1SettingValueNotes2OUs to Import/Students/High School,/Students/Middle SchoolComma-separated OU paths3Date Rangedayday | week | month4Import Frequencydailyhourly | daily | weekly5Import Time (24h)06:00HH:MM6Import DayMondayweekly only7StatusActiveActive | Paused
Vault_DataFlaggedAlerts_ConfigApp_ConfigSetupRun_LogAI_FilteredAccess_List
1
APPS SCRIPT · SCRIPT PROPERTIES · STEP 4
VaulterProject Settings

Script Properties

PropertyValue
GEMINI_API_KEYAIza…your key…
DASHBOARD_URL(added at stage 4)
Add script propertySave script properties
4
GEMINI_API_KEY DASHBOARD_URL
Done when Setup names at least one OU, App_Config has at least one alert recipient, and your own email is on Access_List as Admin.

Checklist

STAGE 4ABOUT 10 MINUTES

4

Publish the dashboard

One web app deployment. Its URL is what reviewers bookmark, so keep it.

Do this

  1. 1In the editor, top right: Deploy›New deployment.
  2. 2Click the gear beside Select type and choose Web app.
  3. 3Fill the dialog: Description Vaulter dashboard, Execute as Me, Who has access Anyone within your domain. Press Deploy and copy the Web app URL.
  4. 4Add a script property DASHBOARD_URL with that URL, so the Sheet's Vaulter menu opens it.
  5. 5Open the URL. Your account is on Access_List, so it loads. Add other reviewers on the Access page. The Demo switch in the header shows fictional sample data for walkthroughs.

Where to click

NEW DEPLOYMENT · STEPS 2 AND 3
New deployment
Select type ⚙Web app
DescriptionVaulter dashboard
Execute asMe (admin@yourdistrict.org)
Who has accessAnyone within yourdistrict.org
CancelDeploy
2 3
AFTER DEPLOY · COPY THE URL
Deployment updated
Version 1 on Oct 29, 10:58 AM
Deployment IDAKfycb…
Web app URLhttps://script.google.com/a/macros/yourdistrict.org/s/AKfycb…/exec
Copy
Done
3
Every later code change: Deploy›Manage deployments›Edit ✎›Version: New version keeps the same URL. A brand-new deployment makes a new URL and breaks bookmarks.

You should see

THE DASHBOARD · FIRST OPEN
Vaulter Dashboard · Bulk review · AI filtered log · Access · Settings
PIPELINE ACTIVENO RUNS YETNEXT RUN TOMORROW 06:00KEYWORD RULES · 6 ACTIVE
No flags yetNo student prompts have matched a keyword rule.
Run import now
Done when the dashboard opens with an empty queue, the strip says PIPELINE ACTIVE, and the Settings page lists your organizational units.

Checklist

STAGE 510 MINUTES, THEN WAIT FOR VAULT

5

Schedule and first run

Install the trigger, kick off an import, watch the first flags arrive.

Do this

  1. 1In the editor, pick installTrigger in the function dropdown and press Run. It creates the scheduled runPipeline trigger at the configured time. Saving settings in the dashboard reinstalls it too.
  2. 2In the dashboard, press Run import now. The first run creates a Vault matter named "Vaulter — Gemini Activity Imports", queues one export per OU, and installs a five-minute checker trigger that collects each export when Vault finishes it, usually within the hour.
  3. 3Watch the readout strip, then the Run_Log table on the Settings page.

You should see

RIGHT AFTER RUN IMPORT NOW
Vaulter
PIPELINE ACTIVELAST RUN TODAY 11:02 AM · OK2 EXPORTS PROCESSING
No flags yetExports are processing in the background. Records appear when they finish.
SETTINGS PAGE · RUN LOG, AN HOUR LATER
Vaulter Settings
StartedStatusExportsFlaggedAlerted
Today 11:02 AMSUCCESS233
Three matches are now in the queue and the alert email went out.
Done when Run_Log shows a SUCCESS row, matches appear in the queue, and the alert recipients get an email on that run or the next. From here the schedule runs itself.

Checklist

IF SOMETHING IS OFFSYMPTOM · LIKELY CAUSE · FIX

You seeLikely causeFix
Settings shows no OUs, or Run_Log says it could not resolve an OUThe account lacks Admin SDK read, or the OU path in Setup is misspelledCheck the path against the Admin console; it starts with a slash and matches case
Run_Log: Vault POST failed (403)The account lacks Vault privileges, or Gemini activity is not retained in Vault for those usersGrant Vault privileges in the Admin console; confirm Gemini is covered by Vault for the OU
Exports never finishVault failed the exportOpen Vault, find the matter and its Exports list. Run clearPendingExports from the editor to reset the queue, then Run import now again
No alert emailNo recipients, or the daily mail quotaCheck App_Config Alert Recipients and the Alerted column in Run_Log
No AI verdictsGEMINI_API_KEY missing, or its project has the Generative Language API offAdd the property; flags still appear without it
A run stops at six minutesThe Apps Script execution capExpected. Exports are collected by the checker trigger instead of in the run
Access Denied on the dashboardThe signed-in account is not on Access_ListAdd it on the Access_List tab, or have an Admin add it on the Access page