Skip to content

nuthanm/lets-evaluate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

133 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Let's Evaluate

AI-powered interview evaluation platform β€” upload a resume, get instant AI analysis, generate tailored interview questions, score candidates, and archive everything in one elegant app.

image

✨ Features

Feature Description
πŸ” Authentication Register, Login, Forgot Password (email passcode)
πŸ“ Projects Create/edit/delete projects with tech stack configuration
πŸ‘₯ Roles Define roles linked to projects
❓ Questions Build a reusable question bank linked to roles
πŸ€– AI Evaluation Upload resume β†’ AI analysis β†’ question generation β†’ submit
πŸ’Ύ Save Draft Auto-save & resume evaluation progress at any step
πŸ“‚ Archives Browse past evaluations, update status, download PDF reports
πŸ”’ Privacy Policy Transparent data usage and privacy information
πŸ“‹ Terms & Conditions Usage terms and acceptable use policy
πŸ“€ Bulk Actions Export/import projects, roles & questions as JSON for backup or sharing

πŸš€ Quick Start

1. Clone & set up environment

git clone https://github.com/nuthanm/lets-evaluate.git
cd lets-evaluate

python -m venv .venv
source .venv/bin/activate          # Windows: .venv\Scripts\activate

pip install -r requirements.txt

2. Configure environment variables

cp .env.example .env

Edit .env with your values (see Configuration below).

3. Run the app

streamlit run app.py

Open http://localhost:8501 in your browser.


βš™οΈ Configuration

Copy .env.example to .env and fill in the values:

# ── OpenAI ────────────────────────────────────────────────────────────────────
OPENAI_API_KEY=your_openai_api_key_here

# ── Email (SMTP) ───────────────────────────────────────────────────────────────
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USERNAME=your_email@gmail.com
SMTP_PASSWORD=your_app_password_here   # NOT your regular password β€” see below
EMAIL_FROM=your_email@gmail.com

# ── App ────────────────────────────────────────────────────────────────────────
APP_SECRET_KEY=your_secret_key_here_change_this
DATABASE_URL=postgresql://user:password@host:5432/dbname

πŸ“§ Email Setup β€” Getting an App Password

The "Forgot Password" feature sends a 6-digit passcode via email. Use an App Password (not your normal login password).

Gmail

  1. Enable 2-Step Verification: https://myaccount.google.com/security
  2. Go to Security β†’ App Passwords (search "App passwords")
  3. Select Mail + Other (Custom name) β†’ name it "Let's Evaluate"
  4. Copy the 16-character password and paste into SMTP_PASSWORD
  5. Set SMTP_USERNAME and EMAIL_FROM to your Gmail address

Microsoft Outlook / Hotmail

  1. Sign in at https://account.microsoft.com/security
  2. Go to Advanced security options β†’ App passwords
  3. Create a new app password and copy it into SMTP_PASSWORD
  4. Set SMTP_USERNAME = your full Outlook email address

Yahoo Mail

  1. Sign in and go to Account Security: https://login.yahoo.com/account/security
  2. Enable Two-step verification then create an App Password
  3. Copy the generated password into SMTP_PASSWORD
  4. Set SMTP_USERNAME = your Yahoo email address

⚠️ Important: Never commit your .env file to version control. It is already listed in .gitignore.


πŸ—„οΈ Database

PostgreSQL is required. The app will refuse to start without a valid DATABASE_URL pointing to a PostgreSQL instance.

DATABASE_URL=postgresql://user:password@host:5432/dbname

The PostgreSQL driver (psycopg2-binary) is already included in requirements.txt β€” no extra install needed.

postgres:// vs postgresql:// β€” SQLAlchemy 2.0+ removed the older postgres:// dialect alias. The app automatically normalises any postgres:// connection string to postgresql:// at startup, so connection strings from Heroku, Neon, Supabase, and similar platforms work without any manual editing.

🐘 Don't have Docker? Use a free cloud PostgreSQL instance

You do not need Docker or a locally-installed PostgreSQL server. All of the following providers offer a free PostgreSQL database that you can connect to from anywhere β€” including your local machine or Streamlit Community Cloud:

Provider Free tier Setup time
Supabase βœ… Generous free tier ~2 min
Neon βœ… Free serverless Postgres ~2 min
Railway βœ… Free starter plan ~3 min

Steps (using Supabase as an example):

  1. Go to https://supabase.com and create a free account
  2. Create a new project β€” choose any region
  3. Go to Project Settings β†’ Database β†’ Connection string and select the URI tab
  4. Copy the connection string β€” it will look like one of these:
    • Direct: postgresql://postgres:[PASSWORD]@db.[PROJECT-REF].supabase.co:5432/postgres
    • Pooler: postgresql://postgres.[PROJECT-REF]:[PASSWORD]@aws-0-[REGION].pooler.supabase.com:6543/postgres (In the pooler format postgres.[PROJECT-REF] is the full username, not two separate fields.)
  5. Paste it as DATABASE_URL in your .env file (or Streamlit Cloud secrets)

⚠️ Common mistake: Supabase uses postgres as both the default username and the default database name. The hostname is different β€” it always contains dots (e.g. db.abcdef.supabase.co). Do not use postgres as the hostname.

βœ… Does data persist when the Streamlit app is inactive?

Yes β€” because all data lives in the external PostgreSQL database, completely independent of whether the Streamlit app is running, sleeping, or redeployed.

Scenario Data persists when app sleeps / restarts?
DATABASE_URL=postgres://... βœ… Yes (auto-corrected to postgresql://)
DATABASE_URL=postgresql://... βœ… Yes
DATABASE_URL not set ❌ App refuses to start β€” set it to a PostgreSQL URL

Streamlit Community Cloud

Add DATABASE_URL under App settings β†’ Secrets:

DATABASE_URL = "postgresql://user:password@host:5432/dbname"

πŸ€– AI Model Recommendation

This app uses OpenAI GPT-4o-mini β€” the best balance of cost, speed, and quality for:

  • Resume parsing & tech stack analysis
  • Tailored interview question generation
  • Structured JSON output reliability

Why GPT-4o-mini?

  • ~95% as capable as GPT-4o for structured text tasks
  • 10Γ— cheaper per token vs GPT-4o
  • Fast enough for real-time interaction

To switch to a more powerful model, edit utils/ai_utils.py:

return ChatOpenAI(model="gpt-4o", ...)  # More capable, higher cost

🌐 Deployment Options (Free, Lifetime)

☁️ Option 1 β€” Streamlit Community Cloud ⭐ Recommended

  1. Push repo to GitHub
  2. Go to https://share.streamlit.io
  3. Connect repo, set app.py as main file
  4. Add secrets in the Streamlit Cloud dashboard (same keys as .env)
  5. Deploy β€” free forever with public repos

Set DATABASE_URL to a Supabase PostgreSQL URL for persistent cloud storage.

πŸš‚ Option 2 β€” Railway

  1. Create account at https://railway.app
  2. New Project β†’ Deploy from GitHub
  3. Add environment variables in the Railway dashboard
  4. Add a PostgreSQL plugin for the database
  5. Free starter plan available

🎨 Option 3 β€” Render

  1. Create account at https://render.com
  2. New Web Service β†’ connect GitHub repo
  3. Build command: pip install -r requirements.txt
  4. Start command: streamlit run app.py --server.port $PORT --server.address 0.0.0.0
  5. Free tier available (spins down after inactivity)

🐳 Option 4 β€” Docker (self-hosted)

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8501
CMD ["streamlit", "run", "app.py", "--server.address", "0.0.0.0"]

πŸ“ Project Structure

lets-evaluate/
β”œβ”€β”€ app.py                         # Landing page (animated workflow)
β”œβ”€β”€ requirements.txt
β”œβ”€β”€ runtime.txt                    # Python version pin (python-3.12)
β”œβ”€β”€ .env.example                   # Environment variable template
β”œβ”€β”€ .streamlit/
β”‚   └── config.toml                # Theme & upload size config
β”œβ”€β”€ pages/
β”‚   β”œβ”€β”€ 1_Auth.py                  # Login / Register / Forgot Password
β”‚   β”œβ”€β”€ 2_Dashboard.py             # Stats & quick navigation
β”‚   β”œβ”€β”€ 3_Projects.py              # Projects CRUD
β”‚   β”œβ”€β”€ 4_Roles.py                 # Roles CRUD
β”‚   β”œβ”€β”€ 5_Questions.py             # Questions CRUD
β”‚   β”œβ”€β”€ 6_Evaluate_Candidate.py    # 4-step AI evaluation wizard (with draft save)
β”‚   β”œβ”€β”€ 7_Archives.py              # Evaluation archive + PDF download
β”‚   β”œβ”€β”€ 8_Privacy_Policy.py        # Privacy policy page
β”‚   β”œβ”€β”€ 9_Terms_Conditions.py      # Terms & conditions page
β”‚   └── 10_Bulk_Actions.py         # Export / import projects, roles & questions (JSON)
└── utils/
    β”œβ”€β”€ database.py                # SQLAlchemy models & CRUD helpers
    β”œβ”€β”€ auth.py                    # bcrypt auth + session helpers
    β”œβ”€β”€ email_utils.py             # SMTP email (Gmail/Outlook/Yahoo)
    β”œβ”€β”€ ai_utils.py                # OpenAI/LangChain integration
    β”œβ”€β”€ pdf_utils.py               # ReportLab PDF generation
    └── ui.py                      # Shared UI components (logo, sidebar, CSS)

πŸ“¦ Dependencies

Library Purpose
streamlit Web UI framework
langchain + langchain-openai + langchain-core LLM orchestration
openai GPT-4o-mini API
sqlalchemy Database ORM
bcrypt Password hashing
reportlab PDF report generation
pillow Image processing (logo/favicon)
python-dotenv Environment variable loading

πŸ”’ Security Notes

  • Passwords are hashed with bcrypt (never stored in plain text)
  • Password reset codes expire after 15 minutes and are single-use
  • API keys are loaded from environment variables, never hardcoded
  • The database is hosted externally (PostgreSQL), keeping credentials separate from the app

πŸ“„ Pages Overview

Landing Page (/)

Animated workflow showcase with gradient hero, feature cards, and "Start Evaluate" CTA.

Authentication (/1_Auth)

  • Left panel: Sign In with email/password
  • Right panel: Create Account
  • Forgot Password: Two-step flow β€” enter email β†’ receive 6-digit code β†’ set new password

Dashboard (/2_Dashboard)

Stats cards (Projects / Roles / Questions / Evaluations) + quick-access navigation + recent evaluations table.

Projects (/3_Projects)

Grid of project cards with tech stack chips. Add/Edit/Delete with "type Delete to confirm" guard. Linked roles & questions are shown in the confirmation message.

Roles (/4_Roles)

Same as Projects. Roles can be linked to a project (optional). Delete shows linked questions.

Questions (/5_Questions)

Filterable question bank (by role, category, difficulty). Questions can be linked to roles.

Evaluate Candidate (/6_Evaluate_Candidate)

4-step wizard:

  1. Select project + role, enter candidate details, upload resume (PDF/DOCX)
  2. AI analysis β€” tech match score, experience level, strengths, concerns, recommendation
  3. Generate standard questions (AI) + resume-based questions (AI)
  4. Add evaluator notes, set status, submit

Save Draft: Progress is saved automatically at any step via the πŸ’Ύ Save Progress button. Drafts can be resumed from the Dashboard or by returning to the page with the draft_id query parameter.

Archives (/7_Archives)

Full evaluation history with filters. Update status per evaluation (Pending / Selected / Rejected / Hold). Download evaluation as a professional PDF.

Privacy Policy (/8_Privacy_Policy)

Describes what data is collected, how it is used, stored, and protected. Accessible to both authenticated and unauthenticated users.

Terms & Conditions (/9_Terms_Conditions)

Outlines the acceptable use policy, user responsibilities, and limitations of liability. Accessible to both authenticated and unauthenticated users.

Bulk Actions (/10_Bulk_Actions)

Export: Downloads a single JSON file containing all your projects, roles, and questions β€” useful for sharing with colleagues or keeping a backup.

Import: Uploads a previously exported JSON file and adds records in bulk.

  • Duplicate detection automatically skips records that already exist.
  • If a question references a role not yet present in your account, the role is auto-created and linked to that question.

πŸ—οΈ Architecture

flowchart TD
    User(["πŸ‘€ User (Browser)"])

    subgraph StreamlitApp["☁️ Streamlit Application"]
        direction TB
        Landing["app.py\n🏠 Landing Page"]

        subgraph Pages["πŸ“„ Pages"]
            Auth["1_Auth\nπŸ” Login / Register"]
            Dashboard["2_Dashboard\nπŸ“Š Stats & Navigation"]
            Projects["3_Projects\nπŸ“ Projects CRUD"]
            Roles["4_Roles\nπŸ‘₯ Roles CRUD"]
            Questions["5_Questions\n❓ Question Bank"]
            Evaluate["6_Evaluate_Candidate\nπŸ€– AI Evaluation Wizard"]
            Archives["7_Archives\nπŸ“‚ History & PDF"]
            Privacy["8_Privacy_Policy\nπŸ”’ Privacy"]
            Terms["9_Terms_Conditions\nπŸ“‹ Terms"]
            BulkActions["10_Bulk_Actions\nπŸ“€ Export / Import"]
        end

        subgraph Utils["πŸ› οΈ Utils"]
            DB["database.py\nSQLAlchemy ORM & CRUD"]
            AuthUtil["auth.py\nbcrypt + session helpers"]
            EmailUtil["email_utils.py\nSMTP email"]
            AIUtil["ai_utils.py\nLangChain / OpenAI"]
            PDFUtil["pdf_utils.py\nReportLab PDF"]
            UIUtil["ui.py\nShared CSS & sidebar"]
        end
    end

    subgraph External["🌐 External Services"]
        OpenAI["πŸ€– OpenAI API\n(GPT-4o-mini)"]
        SMTP["πŸ“§ SMTP Server\n(Gmail / Outlook / Yahoo)"]
        PG["🐘 PostgreSQL\n(Supabase / Neon / Railway)"]
    end

    User -->|HTTP| Landing
    Landing --> Pages
    Pages --> Utils
    AuthUtil --> PG
    DB --> PG
    AIUtil --> OpenAI
    EmailUtil --> SMTP
Loading

🀝 Contributing

Pull requests welcome! Please open an issue first to discuss any significant changes.


πŸ“œ License

MIT

About

Evaluate the candidate profile and have all the stats in one place in ease.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages