A structured 6-phase biomedical engineering research program platform
Live-synced with Google Sheets · Gemini/Groq AI-powered applicant review · Role-based dashboards
- Overview
- Features
- Tech Stack
- Quick Start
- Google Sheets Setup
- AI Setup (Free Groq Key)
- Apps Script Setup
- Project Structure
- User Roles
- Sheets Architecture
- Filtration & Scoring System
- Deployment
- Troubleshooting
Ri-Sō 理創 (Japanese: "Research Creation") is a full-featured research program management platform for the IEEE E-JUST EMBS Student Branch Chapter. It manages the complete lifecycle of student researchers — from application and filtration through mentorship, IEEE paper drafting, and international competition entry.
📢 Recruitment → 🔍 Filtration → 📚 Training → 🤝 Mentorship → ⚡ Implementation → 📄 Publication
Everything is live-synced with Google Sheets — no separate database needed.
- Login directly from your Google Sheets
Userstab — email + password verified server-side - Role-based routing:
superadmin→mentor→participant - Session persistence via
sessionStorage - Graceful offline fallback to local seed data
| Role | Capabilities |
|---|---|
| Super Admin | Full program control, applicant review, track assignment, resource management |
| Mentor | Mentee management, meeting scheduler, paper review portal, progress tracking |
| Participant | Phase progress, training modules, research hub, novelty tool, competitions |
- Loads applicants live from Google Form responses (
Applicationssheet) - 7-criteria competitive scoring rubric (100 pts total)
- Groq AI analysis (free, 90 req/min) — scores essays, gives strengths/weaknesses, recommends Accept/Waitlist/Reject
- CV embed — Google Drive CVs render directly in the panel via
<iframe> - Always re-editable decisions — no one-shot lock-in
- Per-admin columns —
Nada Decision,Nada Score,Nada Noteauto-created in Applications sheet - See all other reviewers' decisions in one view
- All actions push to Sheets in real-time
updateByMatch— updates existing rows without creating duplicates- Auto-creates new columns on first use (e.g. new admin review columns)
- Activity log tracks every push
Frontend React 19 + Vite 8
Styling Pure CSS-in-JS (no Tailwind, no UI lib) — custom design system
Backend Google Apps Script (deployed as Web App)
Database Google Sheets (via REST proxy)
AI Groq API — llama-3.1-8b-instant (FREE, 90 req/min)
Fonts DM Sans + DM Mono + Fraunces (Google Fonts)
git clone https://github.com/your-org/riso-dashboard.git
cd riso-dashboard
npm installPlace your logo file at:
public/logo.jpg
It renders in the navbar (52px), hero section (180px), and sign-in page (64px).
In vite.config.js, replace the Apps Script deployment ID:
rewrite: (path) => path.replace(/^\/sheets-api/, '/macros/s/YOUR_DEPLOYMENT_ID/exec')In src/App.jsx, find:
const GROQ_KEY = ""; // ← paste your key hereGet your free key at console.groq.com/keys — no credit card needed.
npm run devThe app is configured for spreadsheet:
1AMkHfFLSpTDY8JvrMbJrkzA628rFbpAyXFvWTjQI1UU
Update SPREADSHEET_ID in Code.gs if you use a different spreadsheet.
Create these tabs in your spreadsheet:
| Sheet Name | Purpose | Key Columns |
|---|---|---|
Users |
Admin/mentor/participant accounts | email, password, role, name |
Applications |
Google Form responses | All form fields + auto-added review columns |
Filtration |
Legacy filtration log | Auto-created |
Meetings |
Mentor meeting records | Auto-created |
PaperReviews |
IEEE draft feedback | Auto-created |
NoveltyAssessments |
Novelty tool submissions | Auto-created |
ResourceRequests |
Hardware/software requests | Auto-created |
CompetitionEnrollments |
Competition entries | Auto-created |
CalendarRegistrations |
Webinar registrations | Auto-created |
TrackAssignments |
Track engine results | Auto-created |
Capstone |
Capstone project submissions | Auto-created |
ResearchHub |
Research workspace saves | Auto-created |
ProfileUpdates |
Profile change log | Auto-created |
Note: Most sheets are auto-created by the Apps Script on first use. Only
UsersandApplicationsneed to exist upfront.
Your Users sheet must have these column headers (row 1):
id | email | password | role | name | avatar | phase | track | trackLabel | gpa | ...
The role column must contain exactly: superadmin, mentor, or participant (lowercase).
This is your Google Form responses sheet. The app reads these columns:
Timestamp,Name,University,Email,Phone,Student IDGender,LinkedIn,CV Link,Faculty,Department,Academic Year,GPATarget Track,Programming Skill,Math/Stats Skill,Research MotivationStatus,Reviewed
Admin review columns are auto-created when a reviewer saves their first decision:
{AdminName} Decision— Accept / Waitlist / Reject{AdminName} Score— score out of 100{AdminName} Note— reviewer notes{AdminName} AI— Groq AI recommendation{AdminName} Scores— JSON breakdown of 7 criteria scores{AdminName} ReviewedAt— timestamp
Groq provides free AI inference at 90 requests/minute — no credit card required.
- Go to console.groq.com/keys
- Sign up (free, takes 30 seconds)
- Click "Create API Key"
- Copy the key (starts with
gsk_...)
Open src/App.jsx and find line:
const GROQ_KEY = ""; // ← paste your key hereReplace with:
const GROQ_KEY = "gsk_your_key_here";For each applicant, the AI evaluates:
- Q1 (Problem Solving) — depth, systematic approach, technical substance
- Q2 (Methodology) — first-week plan quality, clinical domain awareness
- Q3 (Goals) — IEEE publication alignment, specificity
- Track Fit — maps evidence to chosen biomedical track
- Portfolio — only from provided CV/LinkedIn text (cannot open URLs)
Output: scores for all 7 criteria, strengths, weaknesses, evidence bullets, admission note.
Model:
llama-3.1-8b-instant— fast, accurate, and free at this scale.
- Open your Google Spreadsheet
- Click Extensions → Apps Script
- Delete the default
myFunction()code
Copy the entire contents of Code.gs and paste it into the Apps Script editor.
- Click Deploy → New Deployment
- Click the gear icon ⚙️ → Web App
- Set:
- Execute as: Me
- Who has access: Anyone ← (critical — must be "Anyone", not "Anyone with Google account")
- Click Deploy
- Copy the Web App URL
// vite.config.js
server: {
proxy: {
'/sheets-api': {
target: 'https://script.google.com',
changeOrigin: true,
rewrite: (path) => path.replace(
/^\/sheets-api/,
'/macros/s/YOUR_NEW_DEPLOYMENT_ID/exec' // ← replace this
),
secure: true,
}
}
}
⚠️ Important: Every time you modifyCode.gs, you must create a new deployment (not just save). Old deployments serve cached code.
| Action | Method | Description |
|---|---|---|
get |
GET ?sheet=SheetName |
Fetch all rows as JSON array |
login |
POST {action:"login", email, password} |
Authenticate user |
push |
POST {action:"push", sheet, data} |
Append new row (auto-creates columns) |
update |
POST {action:"update", sheet, rowId, data} |
Update row by id column |
updateByMatch |
POST {action:"updateByMatch", sheet, matchCol, matchVal, data} |
Update row by any column match (auto-creates columns) |
delete |
POST {action:"delete", sheet, rowId} |
Delete row by id |
riso-dashboard/
├── public/
│ └── logo.jpg ← your program logo
├── src/
│ ├── App.jsx ← entire application (1 file)
│ ├── main.jsx ← React entry point
│ ├── index.css ← global reset
│ └── App.css ← (legacy, not used)
├── Code.gs ← Google Apps Script backend
├── vite.config.js ← Vite config + proxy
├── index.html ← HTML shell
└── package.json
The entire frontend is one file (
App.jsx~2700 lines) containing all CSS-in-JS, all components, all business logic. This is intentional for this project's scope.
- Dashboard — live stats from Applications sheet, phase/track distribution
- Filtration Center — full AI-powered applicant review with CV embed
- User Management — CRUD for participants, mentors, admins
- Track Assignment Engine — runs composite scoring algorithm
- Resource Management — track procurement status
- Metrics Dashboard — publication rates, competition performance
- Sheets Config — activity log, connection test
- Dashboard — mentee overview, avg progress
- My Mentees — detailed profile cards
- Meeting Scheduler — schedule + save to Sheets
- Paper Review Portal — 3-round IEEE draft review
- Progress Tracking — mentee scorecard
- Dashboard — phase timeline, webinars, connected tools
- My Progress — 6-phase tracker with scores
- Training Modules — video lectures, reading list, assignments, capstone
- Research Hub — workspace, Overleaf/GitHub links, draft rounds
- Novelty Tool — 6-item checklist + contribution statement
- Competitions — MICCAI, BCI Award, NHID enrollment
- Request Resources — GPU, lab access, hardware
- Enrichment Calendar — webinars & workshops
Google Spreadsheet
│
├── Users ← authentication source
│ id | email | role | name | password | ...
│
├── Applications ← Google Form responses + review columns
│ Timestamp | Name | Email | GPA | ... | Nada Decision | Nada Score | ...
│
├── Meetings ← mentor meeting records
├── PaperReviews ← IEEE draft feedback
├── NoveltyAssessments ← novelty tool submissions
├── ResourceRequests ← hardware/software requests
├── CompetitionEnrollments
├── CalendarRegistrations
├── TrackAssignments ← track engine output
├── Capstone ← capstone project data
└── ResearchHub ← research workspace saves
| Criterion | Weight | Auto-scored? | Description |
|---|---|---|---|
| 🎓 Academic Standing | 15 | ✅ Yes | GPA + year + faculty relevance |
| 💻 Programming Skills | 15 | ✅ Yes | Self-assessment + library evidence |
| 📐 Mathematical Maturity | 10 | ✅ Yes | Linear algebra, probability, optimization |
| 🧩 Problem-Solving Essay | 20 | 🤖 AI | Q1: real challenge, systematic approach |
| 🔬 Research Methodology | 20 | 🤖 AI | Q2: first-week plan, clinical awareness |
| 🚀 Goals & Vision | 10 | 🤖 AI | Q3: IEEE publication alignment |
| 🎯 Motivation & Track Fit | 10 | 🤖 AI | Track rationale + portfolio evidence |
| Score | Recommendation |
|---|---|
| ≥ 75 | ✅ Accept |
| 55–74 | ◐ Waitlist |
| < 55 | ✗ Reject |
Composite = (portfolioScore × 0.3) + (interviewScore × 0.3) + (GPA × 10 × 0.4)
If composite ≥ 85 AND max(mlScore, modelingScore, electronicsScore) ≥ 80:
→ TOP-TIER BYPASS: skip Phase III → directly to Phase IV Mentorship
Otherwise:
→ Assign to track with highest domain score:
Track 1: AI & Machine Learning (mlScore)
Track 2: Modeling & Simulation (modelingScore)
Track 3: Biomedical Electronics (electronicsScore)
npm run buildOutput goes to dist/. Deploy to any static host.
The Vite dev proxy (/sheets-api) only works during npm run dev. For production, you have two options:
Option A — Vercel/Netlify rewrite (recommended)
// vercel.json
{
"rewrites": [
{
"source": "/sheets-api/:path*",
"destination": "https://script.google.com/macros/s/YOUR_ID/exec/:path*"
}
]
}Option B — Update SHEETS_URL directly
// In App.jsx, change:
const SHEETS_URL = "/sheets-api";
// to:
const SHEETS_URL = "https://script.google.com/macros/s/YOUR_DEPLOYMENT_ID/exec";Cause: User object from Sheets is missing required fields.
Fix: Check your Users sheet has:
rolecolumn with valuesuperadmin,mentor, orparticipant(lowercase)namecolumn (orName) with the user's display nameemailcolumn matching what you log in with
Open browser DevTools → Console for the yellow debug panel output.
Cause: Sheet name mismatch or Apps Script not deployed correctly.
Checklist:
- Sheet tab is named exactly
Applications(capital A, no spaces) npm run devis running (proxy only works in dev mode)- Apps Script deployed as "Anyone" (not "Anyone with Google account")
- You created a new deployment after updating the script (not just saved)
Cause: Groq API key not set or invalid.
Fix:
- Get free key at console.groq.com/keys
- Set
const GROQ_KEY = "gsk_your_key_here";inApp.jsx - Check browser console for the specific error message
Cause: Sheets login action can't find user.
Checklist:
Userssheet has columns named exactlyemailandpassword(lowercase)- No extra spaces in the cell values
- Apps Script has been redeployed after adding
loginaction - Access is set to "Anyone" in deployment settings
Cause: updateByMatch action not supported by old Apps Script deployment.
Fix: Replace your Apps Script with the latest Code.gs from this repo and create a new deployment.
MIT — IEEE E-JUST EMBS SBC 2026
Built with ❤️ for the Ri-Sō 理創 Research Program 2026
IEEE Engineering in Medicine and Biology Society · E-JUST Student Branch Chapter