• Blog
  • Docs
  • Pricing
  • We’re hiring!
Log inSign up
sahar

sahar

law-student-tracker

Public
Like
law-student-tracker
Home
Code
17
README.md
H
add-roster-columns.http.tsx
H
assign-pools.http.tsx
H
data-integrity-check.http.tsx
C
lc-oncall-notify.cron.tsx
H
lc-oncall-selection.http.tsx
C
lc-report-prompt.cron.tsx
H
main.http.tsx
C
oncall-notify.cron.tsx
H
oncall-selection.http.tsx
H
post-class-report.http.tsx
H
refresh-watch-list.http.tsx
H
sarah-report-form.http.tsx
H
setup-guide.http.tsx
C
te-report-prompt.cron.tsx
utils.tsx
C
weekly-summary.cron.tsx
Environment variables
6
Branches
1
Pull requests
Remixes
History
Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data – all from the browser, and deployed in milliseconds.
Sign up now
Code
/
Code
/
Search
README.md

Law Student Tracker - Val.town Project

Automates attendance tracking and cold-call selection for both T&E and L&C classes.

Architecture

Two Google Spreadsheets:

SpreadsheetPurposeEnv Var
MainRosters, Cold Call Log, derived tabsMAIN_SHEET_ID
Student FormsStudent self-report Google Form responsesSTUDENT_FORMS_SHEET_ID

Sarah submits reports via HTML form (no Google Form needed for her).

Vals

FileTypePurpose
Sarah's Interface
sarah-report-form.http.tsxHTTPHTML form for Sarah to submit post-class reports
post-class-report.http.tsxHTTPAPI: receives reports, updates tracking, triggers alerts
T&E (Trusts & Estates)
oncall-selection.http.tsxHTTPAlgorithmically selects 6 students for cold-calling
oncall-notify.cron.tsxCronEmails on-call list before class (3 PM)
te-report-prompt.cron.tsxCronReminds Sarah to submit T&E report (6 PM)
L&C (Law & Capitalism)
lc-oncall-selection.http.tsxHTTPLooks up preset on-call from syllabus
lc-oncall-notify.cron.tsxCronEmails on-call list before class (8 AM)
lc-report-prompt.cron.tsxCronReminds Sarah to submit L&C report (12 PM)
Utilities
weekly-summary.cron.tsxCronFriday summary of students above thresholds
data-integrity-check.http.tsxHTTPCompares roster counts vs Cold Call Log
refresh-watch-list.http.tsxHTTPManually refresh Watch-List tab
assign-pools.http.tsxHTTPCalculate optimal A-Z pool split for T&E
utils.tsxScriptShared utilities, constants, types

Environment Variables

Set in Val.town UI (Settings → Environment Variables):

VariablePurpose
GOOGLE_APPLICATION_CREDENTIALSService account JSON (full string)
REPORT_API_KEYSecret key for report submissions
MAIN_SHEET_IDMain spreadsheet (rosters, logs)
STUDENT_FORMS_SHEET_IDStudent self-report form responses

Sheet Structure

Main Spreadsheet (MAIN_SHEET_ID)

Source of Truth (Sarah can edit to fix data):

TabPurpose
T&E-RosterStudent list + cumulative counters
L&C-RosterStudent list + cumulative counters
Cold-Call-LogAudit trail of all cold calls
L&C-SchedulePreset on-call assignments from syllabus

Derived (auto-generated, don't edit):

TabPurpose
T&E-On-Call-TodayToday's T&E selection (cached)
L&C-On-Call-TodayToday's L&C selection (cached)
Watch-ListStudents approaching thresholds
Pending-ReviewUnmatched names for manual review
Cancelled-ClassesLog of cancelled class dates

Roster Columns

student_name, last_name, pool (T&E only)
cold_call_count, last_called
absences, absences_announced, absences_unannounced
concerning_events, refused_count, bad_performance_count
last_absence_watch, last_absence_warning, last_absence_alert
last_concerning_watch, last_concerning_warning, last_concerning_alert

Student Forms Spreadsheet (STUDENT_FORMS_SHEET_ID)

TabPurpose
Form Responses 1Student self-reports (Google Form writes here)

Alert Thresholds

Early Watch ([WATCH])

  • 2 absences → Watch alert (early warning)
  • 3 concerning events → Watch alert

Warning ([WARNING])

  • 3 absences → Sarah warns student
  • 4 concerning events → Sarah warns student

Alert ([ALERT])

  • 4 absences → Contact dean + student
  • 5 concerning events → Contact student

Concerning events = absences + refused + bad performance + unprepared

Sarah's Workflow

  1. Before class: Receives on-call email automatically
  2. After class: Opens HTML form, fills out report, submits
  3. On alerts: Receives email with student details and required action

Form URL: https://sahar--{hash}.web.val.run (get from Val.town UI)

API Reference

POST /post-class-report

curl -X POST "https://sahar--{hash}.web.val.run" \ -H "Content-Type: application/json" \ -H "X-API-Key: $REPORT_API_KEY" \ -d '{ "date": "2026-01-12", "class_type": "te", "cold_calls": [ {"student_name": "Alice Adams", "result": "completed", "performance": "great"}, {"student_name": "Bob Baker", "result": "absent"}, {"student_name": "Carol Chen", "result": "refused"} ], "absences": ["David Davis"] }'

cold_call results:

  • completed + performance (great/normal/bad)
  • absent (unannounced - didn't show up)
  • refused (present but declined)

absences: Students not on call list who were absent

Cron Schedules (UTC)

ValEST TimeUTC Cron
oncall-notify3 PM Mon/Wed0 20 * * 1,3
te-report-prompt6 PM Mon/Wed0 23 * * 1,3
lc-oncall-notify8 AM Mon/Wed0 13 * * 1,3
lc-report-prompt12 PM Mon/Wed0 17 * * 1,3
weekly-summary9 AM Fri0 14 * * 5

Note: Adjust for DST. EST = UTC-5, EDT = UTC-4.

Development

# Deploy changes ~/.deno/bin/vt push # Pull remote changes ~/.deno/bin/vt pull
Code
README.md
H
add-roster-columns.http.tsx
H
assign-pools.http.tsx
H
data-integrity-check.http.tsx
C
lc-oncall-notify.cron.tsx
H
lc-oncall-selection.http.tsx
C
lc-report-prompt.cron.tsx
H
main.http.tsx
C
oncall-notify.cron.tsx
H
oncall-selection.http.tsx
H
post-class-report.http.tsx
H
refresh-watch-list.http.tsx
H
sarah-report-form.http.tsx
H
setup-guide.http.tsx
C
te-report-prompt.cron.tsx
utils.tsx
C
weekly-summary.cron.tsx
FeaturesVersion controlCode intelligenceCLIMCP
Use cases
TeamsAI agentsSlackGTM
DocsShowcaseTemplatesNewestTrendingAPI examplesNPM packages
PricingNewsletterBlogAboutCareers
We’re hiring!
Brandhi@val.townStatus
X (Twitter)
Discord community
GitHub discussions
YouTube channel
Bluesky
Open Source Pledge
Terms of usePrivacy policyAbuse contact
© 2026 Val Town, Inc.