TL;DR: AI-powered tool for answering security questionnaires, RFIs, and vendor assessments. Uses Claude + Notion + Zenlytic docs to generate citation-backed responses. Restricted to @zenlytic.com Google accounts.
Live: https://zenlytic-rfi-assistant.netlify.app
- Features
- Architecture
- Quick Start
- Environment Variables
- Local Development
- Deployment
- API Reference
- Knowledge Sources
- Contributing
| Feature | Description |
|---|---|
| Ask | Single question lookup with real-time AI responses |
| Batch | Upload Excel/CSV questionnaires, process all at once, download results |
| Admin | Manage approved Q&A pairs for common questions |
| Google Auth | Restricted to @zenlytic.com accounts only |
| Citations | Every response includes source citations |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Netlify (Hosting) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Frontend (React + Vite + Tailwind) β
β βββ packages/web/ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Serverless Functions (Netlify Functions) β
β βββ netlify/functions/ β
β βββ ask.ts - Single question endpoint β
β βββ batch.ts - Batch processing endpoint β
β βββ qa-pairs.ts - Q&A management β
β βββ auth-*.ts - Google OAuth endpoints β
β βββ _shared/ β
β βββ claude.ts - Claude API + tool orchestration β
β βββ notion-tools.ts - Notion search/fetch β
β βββ docs-tools.ts - Docs search/fetch β
β βββ auth.ts - Auth middleware β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β External Services β
β βββ Claude API (Anthropic) - AI responses β
β βββ Notion API - Internal policies & procedures β
β βββ Google OAuth - Authentication β
β βββ docs/ submodule - Public documentation β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Node.js 20+
- npm
- Git
- Zenlytic Google account (@zenlytic.com)
# Clone with submodules
git clone --recurse-submodules https://github.com/Zenlytic/rfi-assistent.git
cd rfi-assistent
# Install all dependencies
npm install
cd netlify/functions && npm install && cd ../..
cd packages/web && npm install && cd ../..
# Copy environment template
cp .env.example .envEdit .env with your credentials (see Environment Variables).
# Option 1: Run servers separately (recommended for debugging)
# Terminal 1 - Functions
npx netlify functions:serve
# Terminal 2 - Frontend
cd packages/web && npm run dev
# Option 2: Run together via Netlify CLI
npx netlify dev- Frontend: http://localhost:5173
- Functions: http://localhost:9999/.netlify/functions/
| Variable | Description | Where to Get |
|---|---|---|
ANTHROPIC_API_KEY |
Claude API key | console.anthropic.com |
NOTION_TOKEN |
Notion integration token | notion.so/my-integrations |
| Variable | Description | Where to Get |
|---|---|---|
GOOGLE_CLIENT_ID |
Google OAuth client ID | Google Cloud Console |
GOOGLE_CLIENT_SECRET |
Google OAuth client secret | Google Cloud Console |
SESSION_SECRET |
Random 32+ char string for JWT signing | openssl rand -hex 32 |
SITE_URL |
Production URL | https://zenlytic-rfi-assistant.netlify.app |
| Variable | Description |
|---|---|
SLACK_BOT_TOKEN |
Slack bot integration |
SLACK_SIGNING_SECRET |
Slack webhook verification |
SLACK_APP_TOKEN |
Slack app-level token |
rfi-assistent/
βββ packages/web/ # React frontend
β βββ src/
β β βββ components/ # Reusable UI components
β β βββ pages/ # Page components
β β βββ hooks/ # Custom React hooks
β βββ vite.config.ts # Vite configuration
βββ netlify/functions/ # Serverless backend
β βββ _shared/ # Shared utilities
β βββ *.ts # API endpoints
βββ docs/ # Git submodule (zenlytic-docs)
βββ config/ # Static configuration
βββ netlify.toml # Netlify configuration
# Update docs submodule to latest
git submodule update --remote docs
# Type check
cd packages/web && npm run build
# Add new dependencies to functions
cd netlify/functions && npm install <package>Deployment is automatic via Netlify:
- Push to
mainβ Production deploy - Create PR β Deploy preview (unique URL)
- Merge PR β Production deploy
Trigger from Netlify dashboard or:
npx netlify deploy --prodSet in Netlify Dashboard β Site settings β Environment variables.
All endpoints require authentication (session cookie).
Ask a single question.
Request:
{
"question": "What encryption does Zenlytic use?",
"context": "Optional context about the customer"
}Response:
{
"answer": "Zenlytic uses AES-256 encryption...",
"citations": ["Security Policy", "docs.zenlytic.com"],
"searches": ["search_notion: encryption", "search_docs: encryption"]
}Process multiple questions (max 10).
Request:
{
"questions": [
{ "id": "1", "question": "SOC2 certified?", "context": "" },
{ "id": "2", "question": "Data retention policy?" }
]
}Response:
{
"total": 2,
"processed": 2,
"results": [
{ "id": "1", "question": "...", "answer": "...", "citations": [] },
{ "id": "2", "question": "...", "answer": "...", "citations": [] }
]
}Check authentication status.
Response:
{
"authenticated": true,
"user": {
"email": "user@zenlytic.com",
"name": "User Name",
"picture": "https://..."
}
}Redirects to Google OAuth.
Clears session and redirects to home.
The assistant searches these sources to answer questions:
- Employee Handbook - HR policies, CC* controls, training
- Security Homepage - SOC2 reports, audit evidence
- Engineering Wiki - Architecture, technical documentation
Synced via git submodule from zenlytic-docs:
/data-sources/- Database connection guides/authentication-and-security/- SSO, security features/legal-and-support/- Terms, DPA, subprocessors
Pre-approved answers stored in config/qa-pairs.json. Manage via Admin page.
The main branch is protected:
- Requires pull request
- Requires 1 approval (bypass available for admins)
- No force pushes
- Create feature branch from
main - Make changes
- Create PR
- Admin review/bypass and merge
- TypeScript for all code
- React functional components with hooks
- Tailwind CSS for styling
- Authentication restricted to @zenlytic.com Google Workspace
- API keys stored in Netlify environment variables (not in code)
- Session tokens expire after 7 days
- All API routes protected with auth middleware
Proprietary - Zenlytic Internal Use Only