Welcome, and thank you for contributing to Arachnode.
Arachnode is a self-hosted microservice platform for:
- automated job discovery
- contact enrichment
- cold email generation
- workflow orchestration for engineering job hunts
Built with:
- Python 3.11
- FastAPI
- Scrapy
- Redis
- PostgreSQL
- Docker
Arachnode was built to automate repetitive engineering job-hunt workflows like discovery, aggregation, outreach, and tracking at scale.
- discover relevant roles automatically
- aggregate jobs from scattered platforms
- identify hiring managers
- generate personalized outreach emails
- automate repetitive application workflows
Arachnode automates the top of the job-hunt funnel so contributors and users can focus on what actually matters:
interviewing, networking, and shipping.
We strongly prefer:
✅ small focused PRs
✅ readable code
✅ architecture awareness
✅ documentation updates
✅ tested changes
✅ respectful collaboration
We discourage:
❌ giant refactors without discussion
❌ drive-by breaking changes
❌ force pushes during review
❌ "fix everything" PRs
❌ untested AI-generated code dumps
flowchart LR
A[Job Sources<br/>LinkedIn / Naukri / Internshala]
--> B[Scraper Service]
B --> C[Aggregator]
C --> D[(PostgreSQL)]
D --> E[Contact Discovery]
E --> F[Email Generator]
F --> G[Gateway API]
G --> H[Dashboard UI]
S[Scheduler]
--> B
S --> E
S --> F
R[(Redis Streams)]
--> B
R --> C
R --> E
R --> F
sequenceDiagram
participant Scheduler
participant Scraper
participant Aggregator
participant ContactDiscovery
participant EmailGenerator
participant Gateway
Scheduler->>Scraper: Trigger scrape cycle
Scraper->>Aggregator: Send raw jobs
Aggregator->>Aggregator: Normalize & deduplicate
Aggregator->>Gateway: Store jobs
Scheduler->>ContactDiscovery: Trigger enrichment
ContactDiscovery->>Gateway: Store contacts
Scheduler->>EmailGenerator: Generate outreach drafts
EmailGenerator->>Gateway: Store email drafts
Gateway->>User: Dashboard updates
- Forking & Cloning
- Local Development Setup
- Running Services Without Docker
- Environment Variables
- Project Structure
- Branch Naming Convention
- Commit Convention
- Testing Workflow
- PR Process
- Contributor Expectations
- Issue Claiming Workflow
- Using
.claude/agents/ - Beginner-Safe Areas
- Restricted Architectural Areas
- Troubleshooting
- TBD Areas
Click the Fork button at the top-right of the repository page.
git clone https://github.com/YOUR_USERNAME/arachnode.git
cd arachnodegit remote add upstream https://github.com/ORIGINAL_OWNER/arachnode.gitVerify:
git remote -vgit fetch upstream
git checkout main
git merge upstream/mainArachnode is designed to run as a microservice stack using Docker Compose.
Reference setup instructions from GUIDE.md.
cp .env.example .env
docker compose up --buildflowchart TD
A[Postgres + Redis]
--> B[Aggregator]
A --> C[Scraper]
B --> D[Contact Discovery]
D --> E[Email Generator]
E --> F[Gateway]
F --> G[Scheduler]
# PostgreSQL
POSTGRES_USER=jobuser
POSTGRES_PASSWORD=jobpass
POSTGRES_DB=jobsdb
# Job Preferences
JOBSEEKER_ROLE=Backend Engineer
JOBSEEKER_STACK=Python,FastAPI,Redis,PostgreSQL
# Gmail Integration
GMAIL_ADDRESS=you@gmail.com
GMAIL_APP_PASSWORD=xxxx xxxx xxxx xxxx
# Profile Personalization
YOUR_NAME=Your Name
YOUR_GITHUB_URL=https://github.com/yourusername
# Ollama
OLLAMA_BASE_URL=http://host.docker.internal:11434Contributors often only need one service running locally.
python -m venv .venvActivate:
source .venv/bin/activate.venv\Scripts\activateTBD — update once dependency tooling is finalized.
Possible examples:
pip install -r requirements.txtor
poetry installYou can run only Redis + PostgreSQL through Docker:
docker compose up postgres rediscd services/gateway
python app.pycd services/scraper
python -m scrapy crawl remotivecd services/scheduler
python scheduler.pyflowchart LR
A[Start Redis/Postgres]
--> B[Run Single Service]
B --> C[Run Tests]
C --> D[Verify API/Logs]
D --> E[Open PR]
arachnode/
│
├── services/
│ ├── gateway/
│ ├── scraper/
│ ├── scheduler/
│ ├── aggregator/
│ ├── email-generator/
│ └── contact-discovery/
│
├── tests/
├── docker-compose.yml
├── GUIDE.md
├── CONTRIBUTING.md
│
├── .claude/
│ └── agents/
│
└── README.md
Use:
type/short-description
Examples:
feat/add-health-endpoint
fix/redis-stream-timeout
docs/improve-contributing-guide
test/add-gateway-tests
| Prefix | Purpose |
|---|---|
| feat | New feature |
| fix | Bug fix |
| docs | Documentation |
| test | Testing |
| refactor | Internal cleanup |
| chore | Maintenance |
Format:
type: short description
Examples:
feat: add scheduler retry handling
fix: resolve duplicate email generation
docs: improve local setup instructions
test: add aggregator integration tests
All changes should be tested before opening a PR.
TBD — update with official commands.
Examples:
pytestpytest services/gateway/testsBefore submitting:
- service boots correctly
- logs contain no runtime errors
- API endpoints respond correctly
- Redis consumers behave normally
- scheduler cycles complete
- no unrelated services break
docker compose logs -f gateway
docker compose logs -f scheduler
docker compose logs -f scrapercurl http://localhost:8080/api/healthEnsure:
- tests pass
- formatting passes
- branch is updated
- commits are clean
- PR scope is focused
[type] concise description
Examples:
[docs] add CONTRIBUTING guide
[fix] resolve Redis consumer deadlock
[test] add scraper endpoint tests
Closes #42
# Changes
- added local setup guide
- documented contributor workflow
- improved testing documentation
# Testing
- verified markdown rendering
- tested local startup