Skip to content

Repository files navigation

NOFA AI Evaluator

A browser-based tool that helps staff evaluate grant applications faster and more consistently. Runs entirely in your browser with no servers of our own — application data goes only to Anthropic's AI API.

NOFA AI Evaluator Demo


⬇️ One-Click Install

No installation required! Just download and open.

v7.25 is the current version — the "privacy & hardening release": third-party document-fetch services are now strictly opt-in (off by default), the cross-site-scripting escaping sweep is complete, and several bugs are fixed (export error dialog, Full Reset). See What's New in v7.25 below.

How to use:

  1. Click the download link above
  2. Open the downloaded NOFA_AI_Evaluator_v7.25.html file in your browser (double-click it)
  3. Enter your Anthropic API key (see Getting Your API Key below)
  4. That's it! The tool runs entirely in your browser

💡 Tip: Save the file somewhere easy to find (like your Desktop) for quick access.


Why This Tool?

Benefit What It Means
Increase Capacity Review more applications that serve our community
Improve Consistency Same criteria applied fairly to every application
Save Time Reduce manual data entry and repetitive analysis
Focus on What Matters More time for judgment calls, less on paperwork

Quick Start

  1. Open the Application: Double-click NOFA_AI_Evaluator_v7.25.html
  2. Load a Template: Upload your Excel scoring template
  3. Enter Application: Paste or type the application text
  4. Run Evaluation: Click "Start Evaluation"
  5. Review & Export: Check scores, make adjustments, export results

Getting Your Anthropic API Key

This tool uses Claude AI from Anthropic to analyze grant applications. You'll need an API key to get started. Your API key is stored locally in your browser and is only sent directly to Anthropic's servers.

🏢 For Agency/Team Use

If your organization (e.g., San Mateo County Housing and Community Development) has already set up an Anthropic account, your administrator will provide you with a shared API key. Simply skip to Step 4 below and enter the key provided by your admin. All usage will be billed to your agency's account.

For Individual Setup or Administrators:

  1. Create an Anthropic Account: Go to console.anthropic.com and sign up. You'll need to verify your phone number.
  2. Set Up Billing: Navigate to Billing Settings to add a payment method and purchase credits. We recommend starting with $5-10 for testing, or more for team usage.
  3. Create an API Key: Go to API Keys, click "Create Key", give it a name (e.g., "NOFA Evaluator - County Team"), and copy the key.
  4. Enter in the Tool: Open the NOFA AI Evaluator, click "Settings", and paste your API key in the "Anthropic API Key" field.

💡 Important: Your API key starts with "sk-ant-" and should be kept private within your organization. The API will not work until the account has credits — billing must be set up first!


Administrator Setup

To pre-configure a shared API key for your team (so staff don't need to configure anything):

  1. Download the NOFA_AI_Evaluator_v7.25.html file
  2. Open it in a text editor (Notepad, VS Code, etc.)
  3. Search for SHARED_API_KEY
  4. Replace the empty quotes with your API key:
    const SHARED_API_KEY = 'sk-ant-api03-your-key-here';
  5. Save the file and distribute to your team via shared drive, email, or intranet

Note: Users can still override this key in Settings if needed. Keep the pre-configured file internal to your organization.


Security & Privacy

Your data security is our top priority. This tool was designed from the ground up with privacy in mind.

Feature Description
🔒 100% Local Processing The entire application runs in your browser. No data is ever sent to our servers because we don't have any servers. Your files never leave your computer.
🔐 Secure API Communication Your API key and application data are sent directly to Anthropic's secure servers using encrypted HTTPS connections. We never see or store this information.
💾 Local Storage Only Your API key is stored in your browser's local storage on your device. It never travels through any third-party servers or cloud services.
👁️ Full Transparency This is open-source software. You can inspect every line of code on GitHub to verify exactly how your data is handled.

What This Means For You

  • Grant applications stay private — Sensitive applicant information never touches external servers except Anthropic's AI
  • No data collection — We don't track usage, collect analytics, or store any information about you or your work
  • You control your API key — Clear it anytime from Settings, and you can revoke it from your Anthropic console
  • Offline capable — The application itself works offline; only AI evaluation requires an internet connection

Important Limitations to Be Aware Of

Two behaviors are worth understanding before handling sensitive applicant data:

  • Third-party fetch services are opt-in (off by default since v7.25). When an application PDF links to external supporting documents, the tool tries to fetch them directly. Because a file opened via file:// cannot fetch cross-origin URLs, some documents can only be retrieved through public CORS proxy services (corsproxy.io, allorigins.win), and legacy .doc files can only be previewed via Google's document viewer. Those paths send the document URL (and, for the proxy path, the document contents) through a third party that is not Anthropic and has no data-handling agreement with the county — so they are now disabled by default and require an explicit "Third-party fetch services" opt-in in Settings (the Google viewer also asks per use when the opt-in is off). With the opt-in off, blocked documents are marked as such; download and attach them manually instead.
  • Data persists in the browser. Your in-progress evaluation (including extracted application text) and AI responses are cached in this browser's localStorage so you can resume after a reload. On a shared workstation, clear browser data (or use the app's reset) when finished.
  • The app loads five libraries from CDNs (Tailwind, pdf.js, xlsx, exceljs, mammoth) the first time it opens, so it needs internet access on first load and is not fully offline-capable.

Best Practices

  • Never share your API key or commit it to version control
  • Regularly rotate your API key from the Anthropic console
  • Set spending limits in your Anthropic account to control costs
  • Use a dedicated API key for this tool (don't reuse keys across applications)

You Are Always in Control

Human-in-the-Loop: The AI assists, but YOU decide.

  • Review Every Score: All AI-generated scores are visible and can be adjusted
  • Read the Reasoning: AI explains why it assigned each score
  • Override Anytime: Change any score with a single click
  • Final Approval: Nothing is submitted or finalized without your explicit action

What AI Does vs. Does NOT Do

What AI Does What AI Does NOT Do
Reads and analyzes text Make final funding decisions
Analyzes charts, graphs, and tables (with Vision enabled) Override your judgment
Extracts and analyzes linked supporting documents Store or share your data
Detects and suggests appropriate funding source Submit anything automatically
Applies consistent criteria Replace human expertise
Explains its reasoning
Suggests scores for review

Cost & ROI Analysis

The tool itself is free. The only cost is AI API usage (Claude Fable 5 — Anthropic's most capable model — by default; selectable in Settings).

API Cost Breakdown

As of v7.24, the app shows the actual cost of each evaluation live in the header ("AI cost: $0.42"), computed from real token usage — trust that number over any table. Typical ranges with prompt caching (introduced in v7.24, which serves the repeated application text from cache at ~10% of the input price):

Model (selectable in Settings) Typical text-only cost per application
Claude Fable 5 (default — most capable) ~$1.00 – $3.00
Claude Sonnet 5 (best value) ~$0.10 – $0.25
Claude Haiku 4.5 (high volume) ~$0.05 – $0.10

Fable 5: $10/M input, $50/M output (its always-on reasoning also produces more output tokens). Sonnet 5: $3/$15 per M (introductory $2/$10 through Aug 31, 2026). Opus 4.8: $5/$25. Haiku 4.5: $1/$5. Linked documents and vision analysis add to these ranges. If cost matters more than squeezing out the last bit of quality, switch to Sonnet 5 in Settings. Actual cost depends on application length; the in-app meter is authoritative.

Time Savings

Task Manual Time With AI Tool Time Saved
Read full application 15 min 2 min 13 min
Review linked documents 20 min 3 min 17 min
Score 15 criteria 25 min 5 min 20 min
Write justifications 15 min 3 min 12 min
Cross-reference priorities 10 min 0 min 10 min
Total per Application 85 min 13 min 72 min (85%)

What You Get for $0.50-$0.75 per Application

  • ✅ Full PDF text extraction and analysis
  • ✅ Automatic linked document retrieval (PDFs, Word docs)
  • ✅ AI-powered document classification
  • ✅ 15 criteria scored with detailed reasoning
  • ✅ Counter-arguments for each score
  • ✅ Evidence excerpts with page references
  • ✅ Smart document recommendations per criterion
  • ✅ Vision analysis of charts/graphs (when detected)
  • ✅ Cross-reference against County funding priorities
  • ✅ Funding source recommendation (HOME/CDBG)
  • ✅ Export-ready Excel output

What's New in v7.25

The "privacy & hardening release" — no workflow changes; the fixes make the tool safer and more honest about where data goes.

🔒 Third-party document fetching is now opt-in (default: off)

Previously, if a linked supporting document couldn't be fetched directly, the tool silently fell back to public CORS proxies, and the in-app "View" button used Google's document viewer — sending applicant document URLs (and, for proxies, document contents) through services with no county data agreement. Both paths now require an explicit "Third-party fetch services" toggle in Settings, with a plain-language privacy warning; the Google viewer additionally asks for per-use confirmation while the toggle is off. Blocked documents now say to download them manually (or opt in). The defunct cors-anywhere.herokuapp.com proxy, which never worked, was removed.

🛡️ Cross-site-scripting sweep completed

Finishes the escaping pass started in v7.22. All remaining display areas that show AI output or document-derived text (red-flag details, supplemental/reference/template document names, funding source, template-profile fields) now escape it before rendering. In addition, everything the app ingests from outside — AI JSON responses, the response cache, and .evaluation.json files loaded from disk — is now type-sanitized on the way in: scores must be real numbers, text fields must be strings. A tampered evaluation file or a malformed model reply can no longer inject content or corrupt score totals.

Also fixed

  • Failed Excel exports now show an error dialog with a Retry button. Previously the error handler itself crashed (it called a function that didn't exist), so the reviewer saw nothing.
  • "Full Reset" now actually clears cached AI responses. It previously cleared only the stored copy, so re-analysis kept serving the old in-memory answers (and a pending write could restore the cleared cache).
  • AI-suggested scores returned as text (e.g. "2" instead of 2) no longer corrupt the score total.

What's New in v7.24

The "trust release" — features that make AI-assisted scoring defensible, transparent, and cheaper.

📋 AI Review Record — an audit trail in every export

Every exported Excel workbook now includes an extra "AI Review Record" worksheet documenting, for each criterion: the AI's suggested score, confidence, reasoning, and counter-argument alongside the reviewer's final score and comment, with overrides clearly marked — plus the AI model used, the date, the reviewer's name, and the actual AI cost of the evaluation. If a funding decision is ever questioned (records request, appeal, counsel review), this is the county's evidence that a human made every decision.

💰 Live cost meter

The header now shows the actual cost of the current evaluation ("AI cost: $0.42"), computed from real token usage returned by the API — not an estimate. Hover for a breakdown (calls, tokens, and how much prompt caching saved). The figure is also written into the audit sheet.

🧠 Claude Fable 5 by default

The default model is now Claude Fable 5, Anthropic's most capable model, for the highest-quality scoring reasoning. It costs more per token than Sonnet 5 — if budget matters more than the last increment of quality, switch to Sonnet 5 in Settings (one dropdown). On Fable 5 the app also enables Anthropic's server-side fallback, so in the rare case a request is declined by safety filters it is automatically re-served by Claude Opus 4.8 instead of failing the criterion.

⚡ Prompt caching — roughly 60–80% lower AI cost per application

Previously, every one of the ~15 criteria evaluations re-sent the entire application text (and page images, in vision mode) at full price. The shared content is now sent once and served from Anthropic's prompt cache at ~10% of the input price for the remaining calls. Combined with the cost meter, you can see the savings live.

💾 Portable evaluation files

Save evaluation to file / Load evaluation from file (on the upload screen): download your entire evaluation — scores, comments, AI suggestions, red flags, and cost record — as a single .evaluation.json file. Keep it on a shared drive, move it between computers, or hand it to a supervisor. This also protects your work when IT policies clear browser storage.

Also fixed

  • Auto-save now includes supplemental documents, notes-included selections, and red flags — previously these were silently dropped from drafts despite "Saved" confirmations.
  • If auto-save fails (storage full), you now get a warning pointing to Save-to-File instead of silent data loss.
  • Restoring a draft now tells you up front if the Excel template needs re-uploading before export.

What's New in v7.23

A usability release focused on making the tool intuitive for first-time reviewers, based on a full UX review of every screen. No workflow changes — everything is where it was, it just explains itself better and no longer loses work.

You always know where you are

  • A progress indicator now appears on every screen (Upload → Verify Info → Score → Review → Recommend → Export). Completed steps are clickable to go back.
  • The header status pill is now clickable and speaks plainly: "Set up AI — click here" / "AI Ready."

Your work is protected

  • Typing notes no longer loses them. Previously, clicking a score button (or "Analyze with AI") while notes were unsaved silently erased what you had typed.
  • Discard Draft and Start New Evaluation now always ask for confirmation before deleting an evaluation. Previously, one mis-click right after exporting could destroy everything silently.
  • Exporting no longer deletes your saved evaluation. A green "Exported to Excel" banner confirms the export, and you can keep editing or export again — useful when the funding committee has questions later.

Honest progress and errors

  • Auto-analysis now shows "Criterion 4 of 15" with a time estimate, and explains up front that it takes a few minutes and can be stopped safely.
  • If some criteria fail to analyze, the completion message now names them instead of claiming success. Stopping the analysis no longer shows "Analysis complete!"
  • API errors are now written in plain English with the fix (e.g., a rejected key says to re-paste it in Settings, and watch for extra spaces).
  • Warning messages now have an amber warning icon instead of looking like harmless notices.
  • Dropping a file in the wrong upload box now says which box it belongs in, instead of showing a cryptic error.

Clearer AI assistance

  • The AI suggestion now shows both sides. Simple mode previously displayed the AI's score with a green checkmark, like a graded-correct answer, and hid the counter-argument. It's now neutral blue, labeled as a suggestion, shows the "on the other hand" case, and reminds you that you decide.
  • Unscored criteria on the Review screen now show a red "Needs score" badge (previously displayed a confusing "undefined/10").
  • Keyboard shortcuts (press 0–4 to score, Ctrl+Z to undo) are now shown on the scoring screen.
  • Adding your API key after uploading files no longer leaves the app stuck — it now picks up where you left off.
  • The screen no longer flashes on every click (the entrance animation now plays only when you move to a new step).

What's New in v7.22

This release revives the tool (evaluations had stopped working) and modernizes the code that talks to the AI, then fixes a batch of correctness and security bugs found in a full code review. Behavior that reviewers see day-to-day is unchanged; the fixes are under the hood. The tool remains a single self-contained HTML file with no build step.

Fixed — critical

  • Evaluations were failing on every run. The AI model was hardcoded to claude-sonnet-4-20250514, which Anthropic retired on June 15, 2026. After that date the API returned a 404 for every call, so scoring, summaries, and questions all silently failed. The tool now defaults to Claude Sonnet 5, a current model.
  • Added a model selector in Settings. You can now choose the AI model (Sonnet 5, Opus 4.8, or Haiku 4.5) from a dropdown instead of editing the code. If a model is ever retired again, you get a clear "model not available — pick a current one" message and can switch without a developer.

Changed — API layer refactor

  • One API client instead of five copies. The five separate places that called the Anthropic API (criteria scoring, vision, document classification, AI summary, AI questions) were duplicated code with the model ID and settings hardcoded in each. They now all route through a single client, so the model and behavior are defined in exactly one place.
  • Smarter, safer retries. Failed calls used to be retried based on fragile text-matching of error messages, which meant real "overloaded" (529) errors and network drops were never retried. Retries are now based on the actual HTTP status code and honor the server's Retry-After header.
  • Correct handling of modern model responses. Response parsing no longer assumes the answer is the first content block (newer models can return other blocks first), and a safety refusal from the model is now surfaced as a clear message instead of an opaque failure.
  • Removed the fixed temperature: 0 setting, which current models reject with an error. Scoring consistency is preserved by the existing response cache, which reuses the identical answer for identical inputs.

Fixed — other bugs

  • AI summary, AI questions, and the exported filename read project/applicant fields that were never populated, so they showed "Unknown" and exports were named generically. They now read the correct fields.
  • Number-key quick-scoring (0–4) could fire while a popup was open or while holding Cmd/Ctrl (e.g. Cmd+1 to switch browser tabs), silently changing an official score. It is now ignored in both cases.
  • A corrupted saved value could prevent the app from loading at all. Saved data is now parsed defensively so a bad value is ignored instead of crashing startup.
  • Toast notifications could be dismissed early by a previous notification's timer and ignored their requested display time; both are fixed.
  • Two status badges rendered invisibly (white text on no background) due to an invalid style class; they now display correctly.

Security

  • Reduced cross-site-scripting (XSS) exposure. Applicant and project names extracted from uploaded files are now escaped before being shown, so a malicious file can't inject active content into the page. A follow-up pass to escape the remaining AI-output and document-text display areas is planned.

Documentation

  • Corrected the cost section to reflect current model pricing and the new model options.
  • Added an Important Limitations section to the Security docs, honestly disclosing that fetching linked documents can route through third-party proxy/viewer services, that in-progress work is cached in the browser, and that the app loads several libraries from CDNs on first open (so it is not fully offline-capable).

Planned next

Prompt caching to cut per-application cost (done in v7.24), completing the XSS-escaping pass (done in v7.25), gating the third-party document-fetch behind explicit consent (done in v7.25), bundling the CDN libraries into the file for true offline use (still planned), and persisting supplemental documents across reloads (done in v7.24).


Version History

Version Changes
v7.25 Privacy & hardening release. Third-party fetch services (CORS proxies, Google Docs viewer) now require an explicit Settings opt-in and are off by default; completed the XSS-escaping sweep and added type-sanitization of AI responses, cached responses, and loaded .evaluation.json files; fixed the silent export-failure handler and the Full Reset in-memory cache bug. Details in What's New in v7.25.
v7.24 Trust release. "AI Review Record" audit worksheet in every Excel export (AI suggestion vs. final human score, overrides marked, model/reviewer/cost metadata), live AI cost meter from real token usage, prompt caching (~60–80% lower cost per application), portable .evaluation.json save/load files, autosave now includes supplemental docs / notes-included / red flags. Details in What's New in v7.24.
v7.23 Usability release. Persistent step indicator on every screen, typed notes no longer lost on re-render, confirmations before destructive actions, draft kept after export, honest analysis progress ("N of 15" + time estimate) and failure reporting, plain-English API errors, AI suggestions restyled as neutral suggestions with counter-arguments shown in Simple mode, keyboard-shortcut hints, wrong-file-type redirects. Details in What's New in v7.23.
v7.22 Maintenance & modernization release. Migrated off the retired AI model (evaluations were failing), added an in-app model selector, consolidated and hardened the API layer, and fixed a batch of correctness and security bugs. Full details in What's New in v7.22.
v7.21 Keyboard shortcuts (0-4 keys), Ctrl+Z undo, 50-change history, Analyze button for individual criteria, sticky headers, compact Pro Mode
v7.20 Counter-arguments for each score
v7.19 Word document (.docx) support
v7.18 AI-powered document classification
v7.17 Smart document recommendations per criterion
v7.16 Linked documents panel in PDF viewer
v7.15 Automatic linked document extraction and analysis
v7.14 PDF zoom scroll fix
v7.13 PDF viewer orientation fix
v7.12 Nonprofit-appropriate evaluation standards
v7.11 Reference documents upload (Funding Priorities, NOFA Guidelines)
v7.10 AI-powered funding source auto-detection

Demo Video

For a full walkthrough, see the NOFA AI Analyzer Video in the Releases section.


License

MIT License - see LICENSE for details.

Releases

Packages

Contributors

Languages