Set up a cloud-based portfolio feedback system using Google Forms, Google Sheets, Streamlit Cloud, Render, Gmail, and Gemini.
DPAssist has two cloud services that work together:
| Service | Platform | Purpose |
|---|---|---|
| Teacher Dashboard | Streamlit Cloud | Upload rubrics, view submissions, and check system status. |
| Background Worker | Render Starter Worker | Checks Google Sheets every 60 seconds, evaluates portfolios, sends emails, and updates statuses. |
| Data Store | Google Sheets | Stores student submissions, rubric data, and processing status. |
| AI Evaluation | Google Gemini | Evaluates portfolio evidence against teacher rubrics. |
Current production deployment has been verified with real student submissions using the Streamlit dashboard and Render worker.
Students submit portfolio links through a Google Form. Google Forms automatically records each submission in a connected Google Sheet.
DPAssist is designed to work with Google Form response sheets that include these fields:
TimestampWhat is your class section?What is your last name?What is your first name?Select the unitPUBLISHED in the column nameWhat is your email address?DPAssist automatically adds status-tracking columns if they do not already exist.
Milling About is different from milling about or Milling About!.DPAssist needs secure access to the Google Sheet connected to your form.
client_email value.The Sheet ID is the long string between /d/ and /edit in the Google Sheet URL.
https://docs.google.com/spreadsheets/d/THIS_PART_IS_THE_SHEET_ID/edit
DPAssist sends student feedback emails through Gmail using an App Password, not your normal Google password.
abcd efgh ijkl mnop. When entering it in Streamlit or Render, use abcdefghijklmnop with no spaces.The key is used by DPAssist to evaluate portfolios and parse rubric content.
The Streamlit app is the teacher-facing dashboard. It lets teachers upload rubrics, view submissions, and confirm system configuration.
bmorrow574/DPAssist or your fork.main.portfolio_reviewer/teacher_ui.py.Paste the following secrets, replacing placeholder values with your real values:
GOOGLE_SHEET_ID = "paste-your-sheet-id-here" GEMINI_API_KEY = "paste-your-gemini-key-here" TEACHER_EMAIL = "your.email@gmail.com" GMAIL_APP_PASSWORD = "your16characterapppassword" RUBRIC_STORAGE = "sheets" CHECK_INTERVAL_SECONDS = "60" GOOGLE_CREDENTIALS_JSON = ''' paste the entire contents of service-account-credentials.json here '''
{ and closing }.Deploy the app. When the dashboard opens, go to System Status and confirm the required services show green check marks.
The Render worker is what actually processes submissions. It must be deployed for DPAssist to run automatically.
render.yaml.main.render.yaml.Enter these values when Render prompts for them:
| Variable | Value |
|---|---|
GOOGLE_CREDENTIALS_JSON | Entire contents of the service account JSON file |
GOOGLE_SHEET_ID | Your Google Sheet ID |
GEMINI_API_KEY | Your Gemini API key |
TEACHER_EMAIL | The Gmail address that sends feedback |
GMAIL_APP_PASSWORD | The Gmail App Password with no spaces |
The following values are defined in render.yaml:
RUBRIC_STORAGE=sheets CHECK_INTERVAL_SECONDS=60
Deploy the worker. In Render logs, successful startup should show that the service is live and running python portfolio_reviewer/background_service.py. After deployment, the worker checks the Google Sheet every 60 seconds.
Open Submissions to view student names, units, due dates, and status.
| Status | Meaning |
|---|---|
| Feedback sent | Student feedback email was sent successfully. |
| Teacher draft created | A teacher-facing draft/review message was created for a late submission. |
| Portfolio access issue emailed | The student's portfolio requires sign-in or is not publicly accessible. |
| Processing | The worker is actively evaluating the submission. |
Students must publish portfolio links so they are accessible without Google sign-in. DPAssist now detects Google sign-in pages and emails the student instructions to fix the access issue.
DPAssist provides feedback and draft evaluation language. Teachers remain responsible for reviewing student work, assigning final grades, and making instructional decisions.
This usually means the Streamlit dashboard is deployed but the Render worker is not running.
RUBRIC_STORAGE=sheets.Ask the student to open the submitted link in an incognito/private window. If Google asks them to sign in, the site is not public yet.
.env to GitHub.service-account-credentials.json to GitHub.