Thank you for your interest in contributing to ScoutBot. This is a controlled open-source project — meaning contributions are welcome and encouraged, but all changes go through a review process before being merged. The core identity of the project (a clean, automated Python bot — no web app, no frontend) is non-negotiable.
ScoutBot is a bot. It runs in the background, scrapes the internet, updates a spreadsheet, and sends emails. That is its job and it does it well.
ScoutBot will never be:
- A web application or dashboard
- A mobile app
- Something that requires a user to log in
- A service with a fancy UI
If you want to build something on top of ScoutBot's data (a frontend, a website, a Telegram bot), that is a separate project. ScoutBot itself stays a clean Python bot. Please respect this before contributing.
| Role | Responsibility |
|---|---|
| Project Lead | Final say on all merges and direction (Kamsi Richard Ivanna) |
| Core Team | Review pull requests, triage issues, test contributions |
| Contributors | Add features, fix bugs, improve docs via pull requests |
All major decisions are made by the project lead. Contributors are welcome to propose features via email or GitHub Issues, but the lead has final authority on what gets merged.
You do not need to be a backend developer to contribute. Here is what the project needs:
| Contribution Type | What It Involves |
|---|---|
| Add new sources | Add a URL to the spider's start_urls list |
| Improve scraping | Fix broken selectors, improve field extraction accuracy |
| Add categories/industries | Extend keyword lists in the spider |
| Improve the email template | Edit the HTML in notify.py |
| Write documentation | Improve README, CONTRIBUTING, or CODE_REFERENCE |
| Report broken sources | Open a GitHub Issue with the site name and what's wrong |
| Add tests | Write Python tests for pipelines or utilities |
Before starting significant work, please email the team first. This avoids duplicated effort and makes sure your contribution fits the project direction.
Primary contact: kamsirichard1960@gmail.com
Subject line format: [ScoutBot] Brief description of what you want to do
Core team emails (copy them in for bigger changes):
- kamsirichard1960@gmail.com
- tegazion7@gmail.com
- successolamide46@gmail.com
- ayanfeoluwaalalade2000@gmail.com
# Fork the repo on GitHub first, then:
git clone https://github.com/YOUR_USERNAME/ScoutBot.git
cd ScoutBotNever work directly on main. Create a branch named after what you are doing:
git checkout -b add-worldbank-source
# or
git checkout -b fix-deadline-extraction
# or
git checkout -b improve-email-templateBranch naming convention: type/short-description
Types: add, fix, improve, docs, test
pip install -r requirements.txt
cp .env.example .env
# Fill in your own credentials in .envFollow the code standards below. Keep changes focused — one pull request per feature or fix.
Before submitting anything, test it:
# Test scraping (limit to 10 items so it runs fast)
scrapy crawl opportunities -s CLOSESPIDER_ITEMCOUNT=10 -s LOG_LEVEL=INFO
# Test email
python notify.py
# Test full pipeline
python run.pyMake sure no errors appear in the output.
Write clear, descriptive commit messages:
git add .
git commit -m "add: World Bank Open Data as scraping source"
# or
git commit -m "fix: deadline extraction failing on date format 'DD/MM/YYYY'"
# or
git commit -m "docs: add instructions for cron setup on Ubuntu"Commit message format: type: short description
Types: add, fix, improve, docs, test, refactor
git push origin your-branch-nameGo to github.com/TechHub-Extensions/ScoutBot and open a Pull Request from your fork.
In the PR description, include:
- What you changed and why
- What you tested
- Any issues it closes (e.g.
Closes #12)
A core team member will review it. You may be asked to make changes before it is merged.
This is the most common contribution and the simplest one.
Open scoutbot/spiders/opportunities_spider.py and add the URL to start_urls:
start_urls = [
# existing URLs...
"https://new-opportunity-site.com/category/scholarships/", # Add here
]The existing parser will handle it automatically if the site uses a standard WordPress-style layout (most opportunity sites do).
If the site has a unique structure, add a special case inside the parse method:
def parse(self, response):
url = response.url
if "specificsite.com" in url:
for article in response.css("div.custom-article-class"):
item = OpportunityItem()
item["title"] = article.css("h2.title::text").get("").strip()
item["application_link"] = article.css("a.apply-btn::attr(href)").get("")
# ... fill other fields
yield item
else:
# existing generic parser runs for all other sites
...- The site focuses on African or Nigerian students
- Opportunities are listed as individual articles or posts
- The site is publicly accessible (no login required)
- It is updated regularly
- worldbank.org/en/programs
- commonwealthscholarships.ac.uk
- yali.state.gov
- africaportal.org
- fundsforngos.org
- aiesec.org
Subscribers are managed in the .env file. No code changes are needed.
Open .env and add the new email to the comma-separated RECIPIENT_EMAILS list:
RECIPIENT_EMAILS=kamsirichard1960@gmail.com,tegazion7@gmail.com,newsubscriber@gmail.comIf you are a contributor who does not have access to the production .env, email the project lead at kamsirichard1960@gmail.com with the subject [ScoutBot] Add email subscriber and the email address to add.
- Python 3.10+ compatible code only
- Follow PEP 8 (use 4 spaces for indentation, not tabs)
- Keep functions short and focused — one function, one job
- Use descriptive variable names (
opportunity_link, notxortemp)
- Write comments for anything that is not immediately obvious
- Use docstrings on all functions and classes
- Do not comment out code and leave it in — delete it
- Never commit
.envorservice_account.json— ever - Never hardcode emails, passwords, API keys, or spreadsheet IDs in source files
- All configuration goes in
.envand is read viaos.getenv()
- Do not add new Python packages without discussing it first
- If a package is needed, add it to
requirements.txtwith a pinned version
- Pull requests that add a web frontend, dashboard, or GUI
- Code that hardcodes credentials
- Untested code (run it locally first)
- Massive PRs that change everything at once — keep changes focused
- Changes that break the existing spreadsheet column format
- Anything that changes the core scheduling from twice-daily without discussion
Found a broken source? A bug? A site that is not being scraped correctly?
Open a GitHub Issue at github.com/TechHub-Extensions/ScoutBot/issues with:
- Title: Short description of the problem
- What you expected: What should have happened
- What actually happened: Include any error messages
- Steps to reproduce: How can someone else see the same problem?
Or email kamsirichard1960@gmail.com with subject [ScoutBot] Bug: short description.
- Be respectful and constructive in all communications
- Assume good intent — contributors are volunteers
- Focus feedback on the code, not the person
- If you disagree with a decision made by the project lead, raise it via email — not in public comments
- This is a Nigerian student project built for Nigerian students. Keep that spirit in everything you contribute.
Email: kamsirichard1960@gmail.com
Subject: [ScoutBot] Your question here
Or reach out to the founder directly: Kamsi Richard Ivanna — linkedin.com/in/kamsi-richard-024879257