Project Info
Inspiration
The rush toward fully automated AI generation has introduced a costly crisis to the enterprise: "work slop." Roughly 40% of US employees report receiving AI-generated work riddled with critical errors, and 15% of all corporate output now falls into this category. In high-stakes fields like law, finance, and marketing, these unchecked hallucinations create massive legal and financial liabilities. Scaffold solves this by shifting the paradigm from autonomous AI generation to augmented human competence.
What it does
Scaffold is an AI-powered writing assistant that automatically pulls assignment requirements from applications like Notion, Canvas, etc. with an option to manually input rubrics. By dynamically generating rubric subtasks, verifying context, and updating project milestones, Scaffold gives feedback without AI generating the work. This ensures the human writer remains firmly in control of the core ideas, delivering the accuracy that low-tolerance industries need while providing support in making sure the writing content stays on track.
How we built it
Backend: FastAPI, Python, BrowserBase Frontend: Next.js, React Hosted on: Plasmo
Challenges we ran into
We had to think about how to optimize token costs, since updating the rubric progress bars requires re-examining the text written. We decided to make a few triggers for whether the extension decides to evaluate the writing again, based upon whether or not it detects a new paragraph is added or enough of a word difference from the last time it was checked. Accomplishments we’re proud of We’re proud of the UI. We created a logo and animations for the extension, as well as a website that hosts a dashboard for managing lots of tasks and connecting work management apps. We’re also proud that we were able to connect our application across numerous different workspaces.
What we learned
We learned how difficult it can be to turn an idea into something executable. While we had this idea for a while, it was complicated to break down the end goal into actual technical tasks. Additionally, we learned how to communicate as a team so we could streamline the efficiency of tasks.
What's next
for scaffold We would want to continue testing the extension, since we didn't have time to write an entire assignment from scratch during the hackathon. We would like to see how the extension changes the rubric progress bars when we type word by word rather than testing on previously finished assignments.
Scaffold — AI Writing Companion
Scaffold tracks how complete your work is against assignment requirements as you write. Point it at an assignment (manually or auto-discovered from Canvas, Notion, or Google Classroom), and Claude breaks the rubric into measurable tasks and scores your draft 0–100% in real time — in a web dashboard and a browser sidebar for Google Docs / Notion.
Architecture
| Component | Stack | Role |
|---|---|---|
Backend (backend/) | FastAPI + Python 3.12 | REST API, Claude calls, caching, platform discovery |
Web dashboard (web/) | Next.js 15 + React 19 | Assignment list, detail view, draft editor with live progress |
Browser extension (extension/) | Plasmo (Chrome MV3) | Sidebar inside Google Docs / Notion that tracks writing live |
clients (web + extension) ──► FastAPI ──► Claude (rubric analysis + scoring)
│
├──► Redis (cache + progress history)
├──► Supabase (persistent storage)
├──► Browserbase + Stagehand (LMS discovery)
├──► Sentry (errors + AI monitoring)
└──► Arize Phoenix (LLM tracing)
How it works
- Create an assignment — manually via the API/UI, or auto-discovered from a platform.
- Analyze the rubric — Claude decomposes the prompt + rubric into measurable tasks.
- Track progress — as you write, Claude scores each task and surfaces what's missing.
- Cache smartly — Redis skips re-calling Claude unless the document changed ≥100 chars.
Prerequisites
- Docker & Docker Compose
- Node.js 18+
- Python 3.12 (only if running the backend without Docker)
- API keys: Anthropic and Supabase are required; Browserbase, Sentry, and Arize Phoenix are optional.
Setup
1. Create the Supabase table
Run backend/supabase_schema.sql in the Supabase SQL editor
(or via psql). It creates the assignments table the backend expects.
2. Configure environment files
cp backend/.env.example backend/.env
cp web/.env.example web/.env.local
cp extension/.env.example extension/.env
Fill in the real values. At minimum the backend needs ANTHROPIC_API_KEY,
SUPABASE_URL, and SUPABASE_SERVICE_KEY.
Deploy
Option A — Docker Compose (backend + web + Redis + Phoenix)
docker compose up --build
| Service | URL |
|---|---|
| Backend API | http://localhost:8000 |
| API docs (Swagger) | http://localhost:8000/docs |
| Web dashboard | http://localhost:3000 |
| Arize Phoenix | http://localhost:6006 |
| Redis | localhost:6379 |
Option B — run services individually
Backend
cd backend
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
uvicorn main:app --reload # needs a Redis instance reachable at REDIS_URL
Web dashboard
cd web
npm install
npm run dev # http://localhost:3000
# production: npm run build && npm start
Browser extension
cd extension
npm install
npm run dev # or: npm run build
Then in Chrome: Extensions → Developer mode → Load unpacked and select the Plasmo
output folder (extension/build/chrome-mv3-dev for dev, chrome-mv3-prod for build).
The sidebar injects on docs.google.com/document/* and notion.so.
Test
Backend (pytest)
cd backend
pip install -r requirements.txt -r requirements-dev.txt
pytest
The suite covers pure logic (rubric/JSON parsing, change detection, scraped-data
normalization) and the no-dependency API routes (/health, /api/discovery/supported).
It runs without any live external services.
Web (Vitest)
cd web
npm install
npm test
Manual API smoke test
# Health
curl http://localhost:8000/health
# Create an assignment (triggers Claude rubric analysis)
curl -X POST http://localhost:8000/api/assignments/ \
-H "Content-Type: application/json" \
-d '{
"title": "Essay on Climate Change",
"prompt": "Write a 1000-word essay analyzing three causes of climate change.",
"rubric": [
{"criterion": "Thesis", "description": "Clear thesis in intro", "points": 20},
{"criterion": "Evidence", "description": "Three cited sources", "points": 30}
]
}'
# List assignments
curl http://localhost:8000/api/assignments/
# Update progress (replace {id})
curl -X POST http://localhost:8000/api/assignments/{id}/progress \
-H "Content-Type: application/json" \
-d '{"assignment_id": "{id}", "document_content": "Climate change is driven by..."}'
Project layout
backend/ FastAPI app, services (Claude, Redis, Supabase, Browserbase, Sentry, Arize)
web/ Next.js dashboard
extension/ Plasmo Chrome extension (Google Docs / Notion sidebar)
docker-compose.yml
Environment variables
| Variable | Where | Required | Notes |
|---|---|---|---|
ANTHROPIC_API_KEY | backend | yes | Claude rubric analysis + scoring |
SUPABASE_URL / SUPABASE_SERVICE_KEY | backend | yes | Persistent storage |
REDIS_URL | backend | yes | Defaults to redis://localhost:6379 |
BROWSERBASE_API_KEY / BROWSERBASE_PROJECT_ID | backend | no | LMS auto-discovery |
SENTRY_DSN | backend | no | Error + AI monitoring |
PHOENIX_COLLECTOR_ENDPOINT / PHOENIX_API_KEY | backend | no | LLM tracing |
ALLOWED_ORIGINS | backend | no | CORS allowlist |
NEXT_PUBLIC_API_URL | web | yes | Points the dashboard at the backend |
NEXT_PUBLIC_SENTRY_DSN / SENTRY_ORG / SENTRY_PROJECT | web | no | Sentry |
PLASMO_PUBLIC_API_URL / PLASMO_PUBLIC_DASHBOARD_URL | extension | yes | Backend + dashboard URLs |
PLASMO_PUBLIC_SENTRY_DSN | extension | no | Sentry |
Analysis
View
Metric
- 10
- 6
- 5
- 4
- 2
- 1
- 1
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- AnthropicIn code
- CSSIn code
- FastAPIIn code
- JavaScriptIn code
- Next.jsIn code
- PythonIn code
- ReactIn code
- SQLIn code
- SupabaseIn code
- Tailwind CSSIn code
- TypeScriptIn code
11 of 11 appear in the indexed code.
AI coding agents
- Claude CodeCommits
- CursorCommits
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
272 KB
Source files
70
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
Aakkash-Muthukumar/AI-Hackathon-2026
95 files · 2.0 MB · @ 57fb7f7
Structure
Interface
24 files · 25%Screens, components and styles rendered to the user.
Application logic
33 files · 35%Domain rules, services and shared utilities.
+1 moreData & schema
3 files · 3%Schema definitions, migrations and data access.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- TypeScript53%
- Python43%
- Markdown2%
- SQL1%
- CSS0%
- YAML0%
- Other (1)0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
backend/requirements.txt
pypi · 22- anthropic
- arize-phoenix
- browserbase
- fastapi
- fastembed
- google-api-python-client
- google-auth-oauthlib
- httpx
- numpy
- openinference-instrumentation-anthropic
- opentelemetry-sdk
- playwright
- pydantic
- pydantic-settings
- python-docx
- python-dotenv
- python-multipart
- redis[hiredis]
- +4 more
web/package.json
npm · 15- @sentry/nextjs
- clsx
- date-fns
- lucide-react
- next
- react
- react-dom
- +8 more
extension/package.json
npm · 11- @sentry/browser
- clsx
- lucide-react
- plasmo
- react
- react-dom
- +5 more
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.