Skip to content

Repository files navigation

PerTern Banner

PerTern

Your personal internship feed — delivered straight to your Discord DMs.

PerTern scrapes 570+ company career pages every 30 minutes, filters for internships that match your background, and sends each new match directly to you via Discord DM. No server. No channels. Just you.

Version Python discord.py SQLite License: MIT


What PerTern does

  • 570+ companies scraped every 30 minutes across Greenhouse, Lever, Ashby, SmartRecruiters, Workday, Oracle, ADP, custom career pages, SimplifyJobs, and InternatLas
  • Personalized matching — filters for roles aligned to your skills: Cybersecurity, Cloud/GCP, Data Analytics, Python, SQL, Linux, Network Security, IT Support, AI/ML
  • Discord DMs only — no server required, matches land directly in your inbox
  • Deduplication — never sends the same listing twice, checked by job ID, apply URL, and normalized role title; skipped jobs never resurface even if the title changes slightly (e.g. "SWE Intern Summer 2027" = "Software Engineering Internship")
  • Skip memory — jobs you skip are permanently filtered from future scans across all three dedup dimensions
  • 2027 filter — only surfaces Spring, Summer, and Fall 2027 internships; drops 2026 and undated listings
  • Rolling deadline — when no deadline is set but the description says "rolling" or "open until filled", the embed shows ⏰ Rolling so you know to apply early
  • Auto-deadline detection — scans job descriptions for deadline phrases and flags them with ⏰; embed turns orange (⚠️) if ≤7 days away, red (🚨) if ≤3 days
  • Smart location — if the scraper returns a generic location, the title is parsed to extract the real city/state or Remote/Hybrid status
  • Rotating bot status — cycling presence messages including live Raspberry Pi temperature and CPU usage
  • Startup confirmation — DMs you when the bot comes online

Browse & track

When a match arrives you get a job embed with a compact action bar:

◀ Prev  |  ✅ Applied  |  ⏭️ Skip  |  ▶ Next  |  ••• More

Tap ••• More to expand:

🗣️ Interview  |  🎉 Offer  |  ❌ Rejected  |  💤 Snooze  |  ← Back
🔗 Copy Link  |  ⭐ Priority  |  📄 Details  |  🤖 Match  |  ⏰ Remind

🤖 Match runs the job description against your resume.txt using a local Ollama model and returns a private match score, reasons it fits, and a one-line recommendation — all ephemeral.

⏰ Remind sets a custom reminder N days out — the bot DMs you when it fires.

The browse session auto-deletes after 3 minutes of inactivity to keep your DMs clean. The summary embed updates automatically after every job you review so your counts stay current.

Commands

Command What it does
/summary Summary of all unreviewed internships by category with a browse dropdown
/find <query> Search indexed jobs by keyword — opens browse card navigation
/pipeline Full application funnel with company names — applied, interviews, offers
/stats Application pipeline stats — counts by status and response rate
/export DM a CSV of all applied, interview, and offer jobs
/setgoal <n> Set a weekly application target shown as a progress bar in the summary
/check [company] Trigger a manual scan immediately (all companies or one by name)
/blacklist <company> Permanently hide a company from your feed
/unblacklist <company> Remove a company from your blacklist
/blacklist-show See your full blacklist
/setlocation <cities> Only receive jobs matching specific cities (comma-separated)
/status Bot health — scan stats, job counts, company error report, and live Pi hardware stats
/companies [filter] [search] List tracked companies filtered by active / deactivated / erroring
/errors Last 15 scrape errors with timestamps
/reactivate [company] [all] Reactivate deactivated companies from Discord
/help Full slash command reference organized by section
/version Current version, last scan time, new jobs found, and bot uptime
/live-pi Live Raspberry Pi hardware monitor — CPU temp, GPU temp, RAM, disk, uptime
/log Downloads a combined report — last 50 log lines and full company health table
/clear-dm Delete all bot messages from your DMs for a clean slate

Matched categories

PerTern filters across these categories by default. Edit MY_CATEGORIES and MY_KEYWORDS in bot.py to match your own background.

Category Subcategories
🔒 Cybersecurity Security Engineering, Network Security, Cloud Security, Pen Testing, SOC & Threat Intel, Incident Response, GRC, Cryptography
☁️ DevOps & Cloud DevOps & CI/CD, Cloud Engineering, Site Reliability, IT & Sysadmin, Automation & Scripting
💻 Software Engineering General, Frontend, Backend, Mobile, Game Dev, QA & Test Engineering
📈 Data Analytics Data Analyst, BI, Tableau, Power BI, Reporting
📊 Data Science Data Scientist, Research Analyst, Applied Scientist
🔩 Data Engineering Data Pipeline, ETL, Spark, Airflow, Database Administration
🤖 AI & Machine Learning ML Engineering, Computer Vision, NLP & Language AI
💼 Business & Finance Investment Banking, Consulting, Product Management, Finance, Sales
🎨 Creative & Design UI/UX, Graphic Design, Video & Animation, Content
🔬 Science & Research Biology, Chemistry, Physics, Aerospace, Climate
🏥 Healthcare & Medicine Clinical Research, Biotech, Public Health, Healthcare IT
⚖️ Law & Policy Legal, Public Policy, Compliance, IP Law
📰 Media & Communications Journalism, PR, Marketing, Social Media
🏛️ Government & Defense Intelligence, Defense Tech, Civil Service
🎓 Education & Non-profit Teaching, EdTech, Social Work, Non-profit
⚙️ Operations & HR Supply Chain, Project Management, HR, Customer Success
🔧 Hardware & Embedded Embedded Systems, Hardware Engineering, Robotics
⛓️ Blockchain & Web3 Smart Contracts, DeFi, Web3 Engineering

Keyword matching includes: cybersecurity, network security, cloud security, cloud, python, sql, linux, data analyst, power bi, it support, incident response, vulnerability, siem, zero trust, and more.


Setup

1. Clone and install

git clone https://github.com/EA-1-AU/PerTern-2027-Tech-Internship-Discord-Bot.git
cd PerTern-2027-Tech-Internship-Discord-Bot
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

2. Configure environment

cp .env.example .env
nano .env
DISCORD_TOKEN=your-bot-token-here
MY_DISCORD_USER_ID=your-discord-user-id-here

Get your user ID: Discord → Settings → Advanced → enable Developer Mode → right-click your name → Copy User ID.

Bot token: discord.com/developers → your app → Bot → Reset Token. Enable Message Content Intent.

3. Seed companies and start

python seed_companies.py        # load all 570+ companies into the database
python bot.py                   # start the bot

You'll receive a DM confirmation when the bot is online.

4. Run as a systemd service (auto-start on boot)

sed -i 's/YOUR_USERNAME/your-actual-username/g' pertern.service

sudo cp pertern.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable pertern
sudo systemctl start pertern

# Check status / live logs
sudo systemctl status pertern
journalctl -u pertern -f

Updating

git pull
pip install -r requirements.txt
python seed_companies.py --reset-all --prune   # reactivate fixed companies, remove deleted ones
sudo systemctl restart pertern

Customizing your filters

Open bot.py and edit the MY_CATEGORIES and MY_KEYWORDS sets near the top to adjust what roles get sent to you.


Project structure

PerTern/
├── bot.py              # Main bot — scraper loop, DM delivery, slash commands
├── db.py               # SQLite database layer
├── filters.py          # Preference matching helpers
├── tagging.py          # Auto-tags jobs: category, term, salary, deadline, location
├── scraper/
│   ├── __init__.py     # run_all_scrapers() entry point with per-source rate limiting
│   └── ats.py          # Fetchers: Greenhouse, Lever, Ashby, Workday, iCIMS, etc.
├── seed_companies.py   # Upserts companies.csv → DB (--reset-all, --prune flags)
├── companies.csv       # 570+ companies to track
├── pertern.service     # systemd service file for Raspberry Pi
├── requirements.txt
└── .env.example

Tech stack

Layer Tech
Bot framework discord.py 2.x
Language Python 3.11+
Database SQLite
HTTP scraping requests + BeautifulSoup
Concurrency asyncio + ThreadPoolExecutor
Deployment systemd on Raspberry Pi

Keywords

2027 internships · summer 2027 internships · fall 2027 internships · spring 2027 internships · tech internships 2027 · software engineering internship 2027 · cybersecurity internship 2027 · data science internship 2027 · cloud engineering internship 2027 · AI internship 2027 · Discord internship bot · internship tracker Discord · automated internship finder · Greenhouse scraper · Workday internship scraper · Lever internship · Ashby jobs · SimplifyJobs · internship alert bot · Discord DM bot · Raspberry Pi Discord bot · Python Discord bot · internship aggregator · job board scraper · 2027 SWE intern · 2027 tech recruit


Made with ☕ · Report an issue

About

Personal Discord bot that scrapes 570+ companies for 2027 tech internships and DMs you matches — Greenhouse, Workday, Lever, Ashby, and more

Topics

Resources

Security policy

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages