Reflect

[!IMPORTANT]
While this tool helps document your GitHub contributions, itโs crucial to remember that your impact and value to a company extends far beyond whatโs visible in GitHub. Many critical aspects of software engineering - such as mentoring, documentation, cross-team collaboration, and technical leadership - often happen outside of version control. For more on this topic, check out Glue Work, an excellent resource about the often-overlooked but essential work that makes teams successful.
Quickstart ๐
Prerequisites โ๏ธ
- Install nodenv (preferred) or nvm
- Install npm or yarn package manager
- GitHub Personal Access Token (PAT) with
repo
and read:org
scopes
- OpenAI API key (optional, for summary and brag document generation)
Usage ๐ป
- Set up your environment variables:
- Run the setup script to configure your environment:
- Run the tool:
./reflect --username <github-username> --lookback <months-to-look-back> --brag
This will generate three markdown files in the output
directory:
- A detailed list of your GitHub contributions
- A summarized version of your contributions
- A professional brag document highlighting your achievements
Features โจ
- ๐ฅ Fetches merged pull requests and closed issues from GitHub
- ๐ Filters by author and date range (last 6 months by default)
- ๐ Generates a clean, chronological markdown document
- ๐ Combines both PRs and issues into a single reflection document
- โก Uses GitHubโs official Octokit API client for efficient data retrieval
- ๐ค Optional AI-powered summary and brag document generation
- ๐ Secure handling of API keys and sensitive data
Usage ๐ ๏ธ
Run the tool:
./reflect --username <github-username> --lookback <months-to-look-back> [--brag]
Example:
./reflect --username bostonaholic --lookback 6 --brag
Arguments ๐
Required:
-u, --username <username>
: Your GitHub username to fetch activity for
-l, --lookback <number>
: Number of months to look back for activity (must be a positive number)
Optional:
-p, --provider <provider>
: LLM provider to use (e.g., openai, anthropic), defaults to openai
-m, --model <model>
: OpenAI model to use (e.g., gpt-4, gpt-3.5-turbo), defaults to gpt-4o
-b, --brag
: Optional flag to generate a summary and brag document
-i, --include-orgs <orgs...>
: Only include contributions from these organizations (mutually exclusive with โexclude-orgs)
-e, --exclude-orgs <orgs...>
: Exclude contributions from these organizations (mutually exclusive with โinclude-orgs)
Examples ๐
Basic usage:
./reflect --username bostonaholic --lookback 6 --brag
Choose a model:
./reflect --username bostonaholic --lookback 6 --model gpt-3-5-turbo --brag
Choose an LLM provider and model
./reflect --username bostonaholic --lookback 6 --provider anthropic --model claude-3-7-sonnet-20250219 --brag
Filter by specific organizations:
./reflect --username bostonaholic --lookback 6 --include-orgs shopify github
Exclude specific organizations:
./reflect --username bostonaholic --lookback 6 --exclude-orgs secret archived
Environment Variables ๐
Required environment variables:
GITHUB_TOKEN
: Your GitHub Personal Access Token (required)
To create a GitHub Personal Access Token:
- Go to GitHub Settings > Developer Settings > Personal Access Tokens > Tokens (classic)
- Generate a new token with the following scopes:
repo
(Full control of private repositories)
read:org
(Read organization data)
- Copy the token and add it to your
.env
file
Required for making LLM calls (one of):
OPENAI_API_KEY
ANTHROPIC_API_KEY
Optional for using a different provider-compatible endpoint:
OPENAI_BASE_URL
ANTHROPIC_BASE_URL
Security Considerations ๐
- API keys are only accepted through environment variables, not command-line arguments
- All file operations are sanitized to prevent path traversal attacks
- GitHub API rate limits are properly handled with informative error messages
- Input validation is performed on all user-provided parameters
- Output files are restricted to a predefined list of allowed filenames
- GitHub tokens are never logged or exposed in error messages
Output ๐
The script will generate one or more markdown files in the output
directory:
output/contributions.md ๐
Contains:
- A chronological list of your merged pull requests and closed issues
- Each item includes:
- Title
- Closing date
- Description/body
- Items are sorted by closing date (most recent first)
- Activity for the specified time period
output/summarized_contributions.md (with โbrag flag) ๐
Contains:
- A technical summary of your contributions
- Groups similar contributions together
- Highlights key technical changes and improvements
- Identifies patterns in the work
- Notes significant architectural changes
output/brag_document.md (with โbrag flag) ๐ฏ
Contains:
- A professional brag document highlighting your achievements
- Focuses on business impact and value
- Emphasizes collaboration and leadership
- Highlights key metrics and improvements
- Suitable for performance reviews or portfolio
Note: The output
directory and all generated files are automatically git-ignored to prevent accidental commits.
Troubleshooting ๐
- If you get TypeScript errors, ensure youโre using Node.js v22 or higher:
- If you get GitHub API errors:
- Verify your GitHub Personal Access Token (PAT) is correctly set in your
.env
file
- Check that your PAT has the required scopes (
repo
and read:org
)
- Ensure your PAT hasnโt expired (they can be set to expire after a certain time)
- Verify you have access to the repositories youโre trying to fetch data from
- If the script runs but generates an empty file:
- Check that you have activity in the specified time period
- Verify your GitHub username is correct
- Ensure you have the necessary permissions to access the repositories
- If you get an error about the OpenAI API key:
- Make sure youโve set it in your
.env
file
- Check that the API key is valid and has sufficient credits
- Verify the .env file is in the correct location
- If you get environment variable errors:
- Ensure your
.env
file exists and is properly formatted
- Check that there are no spaces around the
=
sign in your .env
file
- Verify the
.env
file is in the root directory of the project
Links ๐