A lightweight Flask prototype for analyzing NOFO (Notice of Funding Opportunity) documents using Flesch–Kincaid readability scores and AI-assisted reviews.
The NOFO Scanner uses the NOFO Builder API for retrieving documents.
- Load a NOFO document into the NOFO Scanner
a. via the API using a NOFO Builder URL (anything containing
/nofos/<uuid>) b. or via a JSON file upload (example here) - Render the NOFO content, displaying Flesch–Kincaid (FK) readability scores for each section a. Uses heatmap-style visual cues to quickly flag high-complexity areas
- Review any section and use AI to: a. analyze what makes the text complex b. suggest plain-language alternatives (or use a custom prompt)
- Python 3.14
- Flask
- OpenAI
- Jinja2
- jQuery
- Markdown
- BeautifulSoup
- fkscore (Flesch–Kincaid implementation)
- US Web Design System (USWDS)
This is a prototype / exploratory tool.
It is optimized for quick iteration, not part of a production workflow. NOFOs loaded into the NOFO Scanner are ephemeral and disappear every 5-10 minutes.
This tool is meant for NOFO analysis only and does not allow users to save content or push updates.
poetry is a tool for dependency management and packaging in Python. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you.
Updating dependencies
Note: this is also not required for initial installation + booting up the app.
# check for outdated deps
poetry show --outdated
# update 1 package
poetry update flask
# reinstall deps from lockfile
poetry install --no-root
# update everything
poetry update
# update only nested dependencies
poetry update --lock
# inspect dependency tree for 1 dependency
poetry show --tree martorpoetry install
poetry run startThen open: http://127.0.0.1:8001
At this point, you will be able to upload a NOFO JSON file and see the NOFO overview page, but you can’t call the API or get AI analysis.
Create a .env file (or copy .env.example). There are 2 variables you will need to set.
NOFOS_API_BEARER_TOKEN: Required for live NOFO lookup from the NOFO BuilderOPENAI_API_KEY: required for AI text analysis
poetry install
poetry run testThe NOFO Scanner has a set of unit tests that verify internal functions work as intended.
If any major changes to logic are being brought in, they should also include unit tests, as well as updating existing using tests that are affected.
- Retrieved/uploaded NOFOs are stored in memory only
- Links generated by the app are temporary and expire on cold boots (every 5-10 minutes)
- AI messages are ephemeral and disappear on page refreshes
- FK scores are not authoritative; they’re used to spotlight likely problem areas quickly