Skip to content

Param302/GRWM

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

28 Commits
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸš€ GRWM - Get README With Me

GRWM Banner

Revolutionary AI Agentic GitHub Portfolio Generator
Powered by Multi-Agent AI System

Live Demo Backend Frontend License

Features β€’ Demo β€’ Architecture β€’ Installation β€’ Usage β€’ API


πŸ“– Overview

GRWM (Get README With Me) is an AI Agentic system that transforms your GitHub profile into a stunning, personalized portfolio README in seconds. Unlike traditional generators, GRWM uses a Multi-Agent AI architecture where three specialized AI agents collaborate to analyze your GitHub profile and craft custom-toned professional portfolios.

🎯 The Problem

  • Creating a compelling GitHub README is time-consuming
  • Generic templates don't capture your unique developer identity
  • Keeping your profile updated is tedious
  • Choosing the right tone and style is challenging

✨ The Solution

GRWM automates the entire process using AI Agentic Workflows with three specialized agents working in harmony:

  • πŸ” Detective Agent: Investigates your GitHub profile, analyzes repositories, and gathers comprehensive data
  • 🧠 CTO Agent: Performs deep technical analysis, identifies skills, determines developer archetype, and calculates impact metrics
  • ✍️ Ghostwriter Agent: Crafts personalized, engaging README content with custom tones and styles

🌟 Features

πŸ€– AI Agentic Multi-Agent System

  • 3 Specialized AI Agents working collaboratively
  • LangGraph-powered workflow orchestration
  • Real-time progress streaming with Server-Sent Events (SSE)
  • Autonomous decision-making with intelligent routing

🎨 Customization Options

  • 4 Style Presets: Professional, Creative, Minimal, Detailed
  • Custom Tone Control: Tailor the writing style to your preference
  • Personalized Descriptions: Add specific requirements or highlights
  • Live Preview: Dark/Light mode markdown preview

πŸ“Š Intelligent Analysis

  • Grind Score Calculation: Measures your GitHub activity and impact
  • Developer Archetype Detection: Identifies your coding personality
  • Tech Stack Recognition: Automatically detects languages, frameworks, and tools
  • Key Project Identification: Highlights your most impactful repositories
  • Social Proof Metrics: Analyzes stars, forks, and community engagement

πŸš€ Modern Tech Stack

  • Frontend: Next.js 16.1.1, React 19, TypeScript, TailwindCSS 4
  • Backend: Python 3.11+, FastAPI, LangGraph, LangChain
  • AI: Google Gemini Flash (Free Tier)
  • Real-time: Server-Sent Events (SSE) for live updates
  • PWA: Installable as Progressive Web App

🎁 Additional Features

  • Instant download and clipboard copy
  • Social media sharing with screenshot capture
  • Responsive brutalist design
  • SEO optimized with comprehensive metadata
  • Zero-cost AI model (Gemini Flash free tier)

🎬 Demo

Visit the live application: getreadmewithme.vercel.app

How It Works

  1. Enter GitHub Username - Start with any public GitHub profile
  2. Watch AI Agents Work - See real-time progress as each agent completes its task
  3. Choose Your Style - Select from 4 professional style options
  4. Get Your README - Download, copy, or share your personalized portfolio

πŸ—οΈ Architecture

πŸ“ System Architecture (Click to expand)

Multi-Agent Workflow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Frontend (Next.js)                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚
β”‚  β”‚ Home Screen β”‚β†’β”‚ Progress View β”‚β†’β”‚ Preview & DL  β”‚       β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚ SSE Connection
                         ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  Backend (FastAPI + SSE)                     β”‚
β”‚                                                               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”            β”‚
β”‚  β”‚         LangGraph Orchestration              β”‚            β”‚
β”‚  β”‚                                               β”‚            β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                            β”‚            β”‚
β”‚  β”‚  β”‚ πŸ” DETECTIVE β”‚  Fetches Profile Data      β”‚            β”‚
β”‚  β”‚  β”‚    AGENT     β”‚  β€’ GitHub API Client       β”‚            β”‚
β”‚  β”‚  β”‚              β”‚  β€’ Repository Analysis     β”‚            β”‚
β”‚  β”‚  β”‚              β”‚  β€’ Tech Stack Detection    β”‚            β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜                            β”‚            β”‚
β”‚  β”‚         β”‚ State Flow                         β”‚            β”‚
β”‚  β”‚         ↓                                    β”‚            β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                            β”‚            β”‚
β”‚  β”‚  β”‚   🧠 CTO     β”‚  Technical Analysis        β”‚            β”‚
β”‚  β”‚  β”‚    AGENT     β”‚  β€’ Language Analysis       β”‚            β”‚
β”‚  β”‚  β”‚              β”‚  β€’ Skill Mapping           β”‚            β”‚
β”‚  β”‚  β”‚              β”‚  β€’ Archetype Detection     β”‚            β”‚
β”‚  β”‚  β”‚              β”‚  β€’ Grind Score Calculation β”‚            β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜                            β”‚            β”‚
β”‚  β”‚         β”‚ Awaits User Style Selection        β”‚            β”‚
β”‚  β”‚         ↓                                    β”‚            β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                            β”‚            β”‚
β”‚  β”‚  β”‚βœοΈ GHOSTWRITERβ”‚  Content Generation        β”‚            β”‚
β”‚  β”‚  β”‚    AGENT     β”‚  β€’ Gemini Flash LLM        β”‚            β”‚
β”‚  β”‚  β”‚              β”‚  β€’ Tone Instructions       β”‚            β”‚
β”‚  β”‚  β”‚              β”‚  β€’ Style Templates         β”‚            β”‚
β”‚  β”‚  β”‚              β”‚  β€’ Markdown Generation     β”‚            β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                            β”‚            β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Agent State Management

Each agent maintains and transforms a shared state object:

AgentState = {
    "username": str,
    "user_preferences": {
        "tone": str,      # professional/creative/minimal/detailed
        "style": str,     # user's selected style
        "description": str # custom requirements
    },
    "raw_data": dict,     # Detective's gathered data
    "analysis": dict,     # CTO's analysis results
    "final_markdown": str, # Ghostwriter's output
    "messages": list,     # Agent communication log
    "error": str,         # Error tracking
    "retry_count": int,   # Retry logic
    "intermediate_results": dict,
    "generation_history": list
}
πŸ” Detective Agent - Data Gathering (Click to expand)

Detective Agent Responsibilities

The Detective is the first agent in the pipeline, responsible for gathering comprehensive GitHub profile data.

Key Components:

  • GitHubAPIClient: Interfaces with GitHub REST API
  • ProfileDetective: Fetches user profile information
  • RepositoryStalker: Analyzes repositories (stars, forks, languages)
  • ExReadme: Checks for existing README files
  • TechStackDetective: Identifies technologies and frameworks

Data Collected:

{
    "profile": {
        "name", "username", "bio", "location",
        "company", "public_repos", "followers", "following"
    },
    "repositories": [
        {
            "name", "description", "stars", "forks",
            "language", "topics", "is_pinned", "is_archived"
        }
    ],
    "social_proof": {
        "total_stars", "total_forks", "total_repos"
    },
    "contributions": {
        "total_commits", "active_streak"
    },
    "existing_readme": str  # If found
}

Performance Optimization:

  • Parallel API requests using asyncio
  • Smart caching for rate limit management
  • Efficient data batching
🧠 CTO Agent - Technical Analysis (Click to expand)

CTO Agent Responsibilities

The CTO Agent performs deep technical analysis of the developer's profile and codebase.

Analysis Components:

  1. Language Analysis

    • Primary and secondary languages
    • Language distribution percentages
    • Specialization detection
  2. Tech Stack Mapping

    • Framework identification
    • Tool detection
    • Technology categorization
  3. Developer Archetype

    • Personality classification (e.g., "The Full-Stack Wizard", "The Backend Architect")
    • Based on language diversity and project patterns
  4. Grind Score Calculation

    factors = [
        ("Commit Frequency", 0.25),
        ("Code Consistency", 0.20),
        ("Project Diversity", 0.15),
        ("Community Impact", 0.20),
        ("Code Quality", 0.20)
    ]
    # Score: 0-100 with emoji indicators
  5. Key Projects Identification

    • Sorts by stars, forks, and recency
    • Identifies most impactful repositories
    • Extracts project metadata
  6. Impact Metrics

    • Social proof aggregation
    • Contribution patterns
    • Community engagement scores

Output Structure:

{
    "grind_score": {"score": int, "label": str, "emoji": str},
    "developer_archetype": {"title": str, "full_title": str},
    "language_analysis": {"primary": dict, "distribution": list},
    "skill_mapping": {"languages": list, "frameworks": list, "tools": list},
    "tech_diversity": {"score": float, "description": str},
    "key_projects": list,
    "impact_metrics": dict
}
✍️ Ghostwriter Agent - Content Generation (Click to expand)

Ghostwriter Agent Responsibilities

The Ghostwriter is the creative director, transforming raw data and analysis into engaging README content.

Generation Process:

  1. Tone Selection (4 options)

    • Professional: Polished, corporate-ready language
    • Creative: Bold, expressive with personality
    • Minimal: Clean, data-focused, concise
    • Detailed: Comprehensive, thorough coverage
  2. Style Templates (4 options)

    • Professional Style: Clean sections, organized skills, business impact
    • Creative Style: Unique formatting, storytelling, visual elements
    • Minimal Style: Essential info only, whitespace-focused
    • Detailed Style: Comprehensive sections, extensive project showcase
  3. LLM Integration

    • Uses Google Gemini Flash (free tier)
    • Structured prompts with tone and style instructions
    • Custom requirements injection from user input
    • Post-processing for markdown formatting
  4. Content Structure

    # Personalized Header with Archetype
    ## About Me (tone-adjusted)
    ## Skills & Technologies (categorized)
    ## Featured Projects (key projects highlighted)
    ## GitHub Statistics (visual badges)
    ## Connect With Me (social links)
  5. Smart Features

    • Shields.io badge integration
    • GitHub stats widgets
    • Responsive image handling
    • Markdown optimization

Revision Support:

  • Maintains generation history
  • Supports revision instructions
  • Version tracking
πŸ”„ Real-time Communication - SSE Implementation (Click to expand)

Server-Sent Events (SSE) Architecture

GRWM uses SSE for real-time, unidirectional streaming from backend to frontend.

Why SSE over WebSockets?

  • Simpler implementation for one-way updates
  • Better for event streaming
  • Automatic reconnection
  • Lower overhead
  • HTTP/2 multiplexing support

Event Flow:

Frontend subscribes to SSE endpoint:
GET /api/generate/{session_id}/stream

Backend emits events:
{
  type: "detective_progress" | "detective_complete" |
        "cto_progress" | "cto_complete" |
        "ghostwriter_progress" | "ghostwriter_complete" |
        "awaiting_style_selection",
  stage: "detective" | "cto" | "ghostwriter",
  message: string,
  timestamp: ISO string,
  data?: any
}

Session Management:

  • UUID-based session tracking
  • In-memory storage (scalable to Redis)
  • Thread-safe queues for event routing
  • Automatic cleanup on completion

Frontend Integration:

const eventSource = new EventSource(`/api/generate/${sessionId}/stream`);

eventSource.onmessage = (event) => {
  const data = JSON.parse(event.data);
  // Update UI based on event type
  setEvents(prev => [...prev, data]);
};

πŸ› οΈ Installation

Prerequisites

  • Node.js 18+ (for frontend)
  • Python 3.11+ (for backend)
  • GitHub Personal Access Token (for API access)
  • Google Gemini API Key (free tier available)

Backend Setup

# Navigate to backend directory
cd backend
# download uv first
# pip install uv
uv sync

# Activate virtual env
source venv/bin/activate  # On Windows: venv\Scripts\activate

# Create .env file
cat > .env << EOL
GITHUB_PAT=your_github_token_here
GEMINI_API_KEY=your_gemini_api_key_here
EOL

# Run the server
python api.py

Frontend Setup

# Navigate to frontend directory
cd frontend

# Install dependencies
npm install

# Create .env.local file
cat > .env.local << EOL
NEXT_PUBLIC_API_URL=http://localhost:8000
EOL

# Run development server
npm run dev

πŸ“± Usage

Basic Flow

  1. Start the Application

  2. Enter GitHub Username

    • Type any public GitHub username
    • Press Enter or click "START"
  3. Watch the Agents Work

    • πŸ” Detective gathers profile data (5-10 seconds)
    • 🧠 CTO analyzes your tech stack (5-8 seconds)
    • ⏸️ System awaits your style selection
  4. Customize Your README

    • Choose from 4 style options
    • (Optional) Add custom description for specific requirements
  5. Get Your README

    • ✍️ Ghostwriter generates your portfolio (10-15 seconds)
    • Preview in dark/light mode
    • Download, copy, or share

Advanced Usage

Testing Individual Agents (Click to expand)
cd backend

# Test Detective Agent only
python test_agents.py
# Select option 1

# Test CTO Agent (requires Detective data)
python test_agents.py
# Select option 2

# Test Ghostwriter Agent (requires both)
python test_agents.py
# Select option 3

# Test complete pipeline
python test_agents.py
# Select option 4
Direct Agent Usage (Click to expand)
from agents import (
    create_detective_graph,
    create_initial_state,
    GhostwriterAgent
)

# Create the agent graph
app = create_detective_graph()

# Initialize state
initial_state = create_initial_state(
    username="octocat",
    preferences={
        "tone": "professional",
        "style": "modern"
    }
)

# Run Detective and CTO
for event in app.stream(initial_state):
    print(event)

# Get final state
final_state = next(iter(event.values()))

# Run Ghostwriter separately
ghostwriter = GhostwriterAgent()
result = ghostwriter(final_state)

print(result["final_markdown"])

πŸ“‘ API Documentation

Endpoints

1. POST /api/generate

Start a new README generation session.

Request:

{
  "username": "octocat",
  "tone": "professional",
  "style": "modern"
}

Response:

{
  "session_id": "uuid-string",
  "message": "Generation started"
}

2. GET /api/generate/{session_id}/stream

Server-Sent Events endpoint for real-time progress updates.

Events:

  • detective_progress: Detective agent working
  • detective_complete: Detective finished
  • cto_progress: CTO agent analyzing
  • cto_complete: CTO finished
  • awaiting_style_selection: Waiting for user to choose style
  • ghostwriter_progress: Ghostwriter generating
  • ghostwriter_complete: README ready

3. POST /api/generate/{session_id}/continue

Continue generation after style selection.

Request:

{
  "style": "professional",
  "description": "Highlight my open-source contributions"
}

Response:

{
  "session_id": "uuid-string",
  "message": "Continuing with Ghostwriter"
}

4. GET /api/generate/{session_id}/result

Get the final generated README.

Response:

{
  "session_id": "uuid-string",
  "username": "octocat",
  "markdown": "# Full README content...",
  "analysis": {
    "grind_score": {...},
    "developer_archetype": {...}
  }
}
πŸ“‹ Complete API Reference (Click to expand)

Error Handling

All endpoints return standardized error responses:

{
  "detail": "Error message",
  "error": "INTERNAL_ERROR | NOT_FOUND | VALIDATION_ERROR",
  "timestamp": "2025-12-29T12:00:00Z"
}

Rate Limiting

  • GitHub API: 5000 requests/hour (authenticated)
  • Gemini API: Free tier limits apply
  • SSE connections: 100 concurrent per server

CORS Configuration

allow_origins = [
    "http://localhost:3000",
    "https://*.vercel.app"
]

πŸ§ͺ Testing

Backend Tests

cd backend

# Run test suite
python test_agents.py

# Test options:
# 1. Detective Agent Only
# 2. CTO Agent Only  
# 3. Ghostwriter Agent Only
# 4. Complete Pipeline

Frontend Tests

cd frontend

# Run type checking
npm run type-check

# Build test
npm run build

# Lint
npm run lint

🎨 Customization

Adding New Tones (Click to expand)

Edit backend/agents.py:

def _get_tone_instructions(self, tone: str) -> str:
    instructions = {
        "professional": "...",
        "creative": "...",
        "minimal": "...",
        "your_new_tone": """
        TONE: Your Custom Tone Description
        - Instruction 1
        - Instruction 2
        """
    }
    return instructions.get(tone, instructions["professional"])
Adding New Styles (Click to expand)

Edit backend/agents.py:

def _get_style_instructions(self, style: str) -> str:
    instructions = {
        "professional": "...",
        "creative": "...",
        "minimal": "...",
        "your_new_style": """
        STYLE: Your Custom Style
        SECTIONS TO INCLUDE:
        - Section 1
        - Section 2
        """
    }
    return instructions.get(style, instructions["professional"])

Update frontend LoadingPanel.tsx:

const styles = [
    { id: 'professional', name: 'Professional', icon: Briefcase, color: 'bg-blue-50' },
    // Add your new style
    { id: 'your_new_style', name: 'Your Style', icon: YourIcon, color: 'bg-custom' },
];

πŸ“Š Tech Stack

Frontend

  • Framework: Next.js 16.1.1 (React 19.2.3)
  • Language: TypeScript 5
  • Styling: TailwindCSS 4 (Brutalist Design)
  • UI Components: Custom + Lucide Icons
  • Markdown: ReactMarkdown + remark-gfm + rehype-raw
  • PWA: Service Worker + Web Manifest
  • Screenshot: html2canvas-pro

Backend

  • Framework: FastAPI 0.115+
  • Language: Python 3.11+
  • AI/ML: LangGraph, LangChain, Google Gemini Flash
  • GitHub API: PyGithub + httpx
  • State Management: LangGraph MemorySaver
  • Async: asyncio, uvicorn
  • Environment: python-dotenv

Infrastructure

  • Frontend Hosting: Vercel
  • Backend Hosting: Railway/Render/Fly.io
  • CDN: Vercel Edge Network
  • Domain: Custom domain support

🀝 Contributing

Contributions are welcome! Here's how you can help:

  1. Fork the Repository
  2. Create a Feature Branch
    git checkout -b feature/AmazingFeature
  3. Commit Your Changes
    git commit -m 'Add some AmazingFeature'
  4. Push to the Branch
    git push origin feature/AmazingFeature
  5. Open a Pull Request

Development Guidelines

  • Follow the existing code style
  • Add tests for new features
  • Update documentation as needed
  • Ensure all tests pass before submitting

πŸ“ License

This project is licensed under the MIT License - see the LICENSE file for details.


πŸ™ Acknowledgments

  • Google Gemini for providing free-tier AI models
  • LangGraph for agent orchestration framework
  • GitHub API for profile data access
  • Shields.io for beautiful badges
  • Vercel for seamless deployment

πŸ› Known Issues & Roadmap

Current Limitations

  • Single session per user (no concurrent generations)
  • In-memory session storage (not production-scalable)
  • Limited to public GitHub profiles
  • GitHub API rate limits apply

Roadmap

  • Redis-based session storage
  • User authentication & saved READMEs
  • Multiple README versions
  • Private repository support (OAuth)
  • More customization options
  • Batch generation for organizations
  • Analytics dashboard
  • API key management for users

πŸ“ž Contact & Support

Created by: Parampreet Singh

Email: connectwithparam.30@gmail.com

Portfolio: parampreetsingh.me

GitHub: @Param302

Live Demo: getreadmewithme.vercel.app


⭐ Star this repository if you found it helpful!

Made with ❀️ by Parampreet Singh

GitHub stars Follow on GitHub

About

Get README with Me!

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors