simonesiega/european-tech-opportunities-2027

Europe-first directory of validated 2027 tech internships and new-grad roles, updated daily with a searchable web app.

Python

24

189 commits

updated Sep 22, 2026

See the code

See what people are saying

SourceMessageScoreDate

I got tired of missing EU tech internships, so I built an open-source job scraper (r/SideProject)

**I got tired of missing EU tech internships, so I built an open-source job scraper** I've spent way too many hours going down the LinkedIn Jobs rabbit hole, constantly wondering if there was another internship or new-grad role I was missing. So I ended up building my own. It collects public…

4

Sep 22, 2026

I was tired of constantly searching for EU tech internships, so I built my own open-source scraper (r/opensource)

I kept spending way too much time scrolling through LinkedIn Jobs, always thinking there might be another internship or new-grad position I hadn't found yet. Eventually, I decided to build something for it. It collects public LinkedIn job listings and organizes them into a searchable directory…

0

Sep 22, 2026

README

European Tech Opportunities 2027

Find validated 2027 tech internships and new-grad roles across Europe.

Internships · New Grad · Documentation · Contributing · Privacy

Python CI status Site CI status CodeQL security analysis status MIT license

Last successful collection: September 22, 2026 at 10:46 UTC
Total opportunities: 702 Internships: 318 New Grad opportunities: 384

Download CSV · Download JSON · Explore the live directory →

Live directory

Searchable European Tech Opportunities 2027 directory in light mode Searchable European Tech Opportunities 2027 directory in dark mode

The public directory has surpassed 1,000 unique visitors across 50+ countries since launch. Search hundreds of validated opportunities by company, country, category, employment type, and first-seen recency, with sortable results, pagination, shareable directory views, direct links to the original listings, and sanitized CSV and JSON downloads.

Why this exists

Finding early-career tech roles across Europe is noisy: listings often mix hiring cycles, senior positions, unrelated roles, stale jobs, and unsupported locations.

European Tech Opportunities 2027 turns that stream into a focused dataset of validated internships and new-grad roles. An automated pipeline discovers, classifies, tracks, and publishes only opportunities that satisfy explicit acceptance rules.

The project intentionally favors precision over coverage. Ambiguous listings are excluded rather than guessed into the dataset.

Latest opportunities

The README shows up to five opportunities for each employment type as a lightweight preview; use the live directory for the complete searchable collection.

Open opportunities: 702 (Internships: 318 · New Grad: 384)
Last successful collection: September 22, 2026 at 10:46 UTC

Browse and filter the complete directory at https://opportunities2027.simonesiega.com/.

Latest New Grad opportunities

Showing the 5 most recently discovered of 384 open New Grad opportunities:

CompanyTitleLocationListing
WayflyerGraduate Software EngineerDublin, County Dublin, IrelandView
CegekaYoung Graduate - Java developerFlemish Region, BelgiumView
Bending SpoonsGraduate software engineerMilan, Lombardy, ItalyView
Var GroupIncident Responder - Cybersecurity (Entry Level)Veneto, ItalyView
Bending SpoonsGraduate software engineerSpainView

Latest internships

Showing the 5 most recently discovered of 318 open internships:

CompanyTitleLocationListing
BIP RedSoftware Tester - InternMilan, Lombardy, ItalyView
VidiemmeSoftware Tester - InternMilan, Lombardy, ItalyView
Stealth StartupData Science InternGermanyView
Criteo DeutschlandSoftware Engineer Intern - Front-End or FullstackParis, Île-de-France, FranceView
PerplexityInternship - Machine Learning Research EngineerBerlin, Berlin, GermanyView

Listings can change or expire. Verify the role, eligibility requirements, location, deadline, compensation, and visa or work-authorization requirements on the original listing before applying.

Missing a relevant opportunity? Suggest a listing.

Engineering highlights

  • Python data pipeline: bounded asynchronous collection, normalization, deterministic classification, and lifecycle processing.
  • TypeScript web application: server-rendered Next.js directory with search, filters, sorting, pagination, and shareable URLs.
  • Canonical lifecycle state: SQLite tracks provenance, first/last-seen timestamps, isolated search outcomes, conservative closure evidence, and daily availability checks.
  • Production-grade validation: strict typing, unit and integration tests, Playwright end-to-end tests, branch coverage gates, CodeQL security analysis, and parsing/classification benchmarks.
  • Automated operations: Alembic migrations, scheduled collection, availability checks, sanitized public CSV/JSON exports, restore-verified backups, CI, and locked deployment with checksum-verified atomic file replacement.

How it works

search definitions + validation rules
↓
bounded LinkedIn guest HTML collection
↓
normalization + deterministic classification
↓
transactional SQLite lifecycle state
↓
┌──────────────────────┬──────────────────────┬──────────────────────┐
│ searchable website   │ README preview       │ public CSV + JSON    │
│ all open listings    │ 5/type latest rows   │ approved fields only │
└──────────────────────┴──────────────────────┴──────────────────────┘

SQLite is the canonical store. The website, README, and sanitized downloads are read-only projections; none can mutate lifecycle state.

See the architecture guide for the complete data flow, component boundaries, and extension policy.

Publication rules

A listing is published only when all five checks pass:

CheckRequired evidence
Employment typeThe title explicitly identifies either an internship (including placement or co-op) or a New Grad role. Internship terminology takes precedence if both appear.
Cycle evidenceExplicit 2027 evidence is accepted, and any explicit conflicting cycle year is rejected. A listing with no explicit cycle year can qualify only when LinkedIn’s relative posting age resolves to May 1, 2026 or later. Graduation-year eligibility alone is ignored for internships.
SeniorityThe title contains no configured senior-level or management terminology.
Technology roleThe title, or a narrowly allowed description fallback, matches a configured technology category.
European locationThe parsed location explicitly resolves to Europe or a supported European country.

Ambiguous evidence is excluded rather than guessed. Search-page absence never closes a listing; only explicit unavailability evidence can change lifecycle state. See Architecture and Database lifecycle for the exact acceptance and closure rules.

Quality & testing

Critical Python classification and lifecycle paths are protected by branch-aware coverage gates. The TypeScript application is independently validated through formatting, linting, strict type checking, production builds, unit tests, and Playwright end-to-end tests.

Python quality baseline

The offline suite measures critical classification and lifecycle paths and enforces the configured combined coverage threshold.

MetricCurrentRequired
Combined statement and branch coverage90.5%≥ 85.0%
Branch coverage83.6%Reported
Classifier branch coverage97.5%Reported

The table is generated from the same coverage report used by the quality gate. Run make coverage after changing Python behavior or tests.

Python CI verifies that committed metrics are current and publishes the complete statement, branch, and per-module coverage reports alongside parsing and classification benchmarks. Compare benchmark timings only across equivalent environments.

Site CI separately enforces formatting, linting, TypeScript type checking, a production build, unit tests, and Playwright end-to-end tests. CodeQL scans the Python and TypeScript code on pushes, pull requests, and a weekly schedule.

Run locally

Requirements: Python 3.12+, uv, and Git. Node.js and Bun are required only for local website development.

git clone https://github.com/simonesiega/european-tech-opportunities-2027.git
cd european-tech-opportunities-2027
uv sync --frozen --dev
cp .env.example .env
uv run opportunities db-upgrade
uv run opportunities stats

A fresh local database intentionally contains no listings. Use the hosted directory for current data.

Continue with the installation guide for the local website, Windows commands, Docker, and verification. Runtime settings are documented in configuration, and CLI commands in the CLI reference.

Documentation

Use the documentation hub to find the canonical guide for each task.

AreaCanonical guides
SetupInstallation · Configuration
Using the projectWebsite · CLI · Search registry
Production operationAutomation · Database · Docker · Troubleshooting
DevelopmentArchitecture · Development · Contributing
PoliciesSecurity · Privacy · Code of Conduct

Responsible operation

[!IMPORTANT] LinkedIn collection is disabled by default. Public accessibility is not authorization to automate access.

The project uses no credentials, authenticated sessions, browser automation, private endpoints, proxies, CAPTCHA bypasses, or anti-bot evasion. It is not affiliated with or endorsed by LinkedIn or any listed employer. See SECURITY.md for the complete source-access and operational policy and PRIVACY.md for website analytics and visitor-data handling.

Contributing

Focused improvements to strict classification, sanitized parser fixtures, search coverage, lifecycle safety, tests, website usability, and documentation are welcome.

Read CONTRIBUTING.md before opening a pull request. Participation is governed by the Code of Conduct.

License

Project code and documentation are available under the MIT License. Third-party assets remain subject to their respective licenses and terms.

Contributors

Contributors

career
data-pipeline
europe
internship
job-opportunity-tracker
job-search
new-grad
nextjs
open-source-resources
python
sqlite-database
tech-jobs
web-scraping

Contributors

simonesiega

65 commits

dependabot[bot]

40 commits

mattiacerutti

2 commits

simonesiega/european-tech-opportunities-2027

Europe-first directory of validated 2027 tech internships and new-grad roles, updated daily with a searchable web app.

Python

24

189 commits

updated Sep 22, 2026

See the code

See what people are saying

SourceMessageScoreDate

I got tired of missing EU tech internships, so I built an open-source job scraper (r/SideProject)

**I got tired of missing EU tech internships, so I built an open-source job scraper** I've spent way too many hours going down the LinkedIn Jobs rabbit hole, constantly wondering if there was another internship or new-grad role I was missing. So I ended up building my own. It collects public…

4

Sep 22, 2026

I was tired of constantly searching for EU tech internships, so I built my own open-source scraper (r/opensource)

I kept spending way too much time scrolling through LinkedIn Jobs, always thinking there might be another internship or new-grad position I hadn't found yet. Eventually, I decided to build something for it. It collects public LinkedIn job listings and organizes them into a searchable directory…

0

Sep 22, 2026

README

European Tech Opportunities 2027

Find validated 2027 tech internships and new-grad roles across Europe.

Internships · New Grad · Documentation · Contributing · Privacy

Python CI status Site CI status CodeQL security analysis status MIT license

Last successful collection: September 22, 2026 at 10:46 UTC
Total opportunities: 702 Internships: 318 New Grad opportunities: 384

Download CSV · Download JSON · Explore the live directory →

Live directory

Searchable European Tech Opportunities 2027 directory in light mode Searchable European Tech Opportunities 2027 directory in dark mode

The public directory has surpassed 1,000 unique visitors across 50+ countries since launch. Search hundreds of validated opportunities by company, country, category, employment type, and first-seen recency, with sortable results, pagination, shareable directory views, direct links to the original listings, and sanitized CSV and JSON downloads.

Why this exists

Finding early-career tech roles across Europe is noisy: listings often mix hiring cycles, senior positions, unrelated roles, stale jobs, and unsupported locations.

European Tech Opportunities 2027 turns that stream into a focused dataset of validated internships and new-grad roles. An automated pipeline discovers, classifies, tracks, and publishes only opportunities that satisfy explicit acceptance rules.

The project intentionally favors precision over coverage. Ambiguous listings are excluded rather than guessed into the dataset.

Latest opportunities

The README shows up to five opportunities for each employment type as a lightweight preview; use the live directory for the complete searchable collection.

Open opportunities: 702 (Internships: 318 · New Grad: 384)
Last successful collection: September 22, 2026 at 10:46 UTC

Browse and filter the complete directory at https://opportunities2027.simonesiega.com/.

Latest New Grad opportunities

Showing the 5 most recently discovered of 384 open New Grad opportunities:

CompanyTitleLocationListing
WayflyerGraduate Software EngineerDublin, County Dublin, IrelandView
CegekaYoung Graduate - Java developerFlemish Region, BelgiumView
Bending SpoonsGraduate software engineerMilan, Lombardy, ItalyView
Var GroupIncident Responder - Cybersecurity (Entry Level)Veneto, ItalyView
Bending SpoonsGraduate software engineerSpainView

Latest internships

Showing the 5 most recently discovered of 318 open internships:

CompanyTitleLocationListing
BIP RedSoftware Tester - InternMilan, Lombardy, ItalyView
VidiemmeSoftware Tester - InternMilan, Lombardy, ItalyView
Stealth StartupData Science InternGermanyView
Criteo DeutschlandSoftware Engineer Intern - Front-End or FullstackParis, Île-de-France, FranceView
PerplexityInternship - Machine Learning Research EngineerBerlin, Berlin, GermanyView

Listings can change or expire. Verify the role, eligibility requirements, location, deadline, compensation, and visa or work-authorization requirements on the original listing before applying.

Missing a relevant opportunity? Suggest a listing.

Engineering highlights

  • Python data pipeline: bounded asynchronous collection, normalization, deterministic classification, and lifecycle processing.
  • TypeScript web application: server-rendered Next.js directory with search, filters, sorting, pagination, and shareable URLs.
  • Canonical lifecycle state: SQLite tracks provenance, first/last-seen timestamps, isolated search outcomes, conservative closure evidence, and daily availability checks.
  • Production-grade validation: strict typing, unit and integration tests, Playwright end-to-end tests, branch coverage gates, CodeQL security analysis, and parsing/classification benchmarks.
  • Automated operations: Alembic migrations, scheduled collection, availability checks, sanitized public CSV/JSON exports, restore-verified backups, CI, and locked deployment with checksum-verified atomic file replacement.

How it works

search definitions + validation rules
↓
bounded LinkedIn guest HTML collection
↓
normalization + deterministic classification
↓
transactional SQLite lifecycle state
↓
┌──────────────────────┬──────────────────────┬──────────────────────┐
│ searchable website   │ README preview       │ public CSV + JSON    │
│ all open listings    │ 5/type latest rows   │ approved fields only │
└──────────────────────┴──────────────────────┴──────────────────────┘

SQLite is the canonical store. The website, README, and sanitized downloads are read-only projections; none can mutate lifecycle state.

See the architecture guide for the complete data flow, component boundaries, and extension policy.

Publication rules

A listing is published only when all five checks pass:

CheckRequired evidence
Employment typeThe title explicitly identifies either an internship (including placement or co-op) or a New Grad role. Internship terminology takes precedence if both appear.
Cycle evidenceExplicit 2027 evidence is accepted, and any explicit conflicting cycle year is rejected. A listing with no explicit cycle year can qualify only when LinkedIn’s relative posting age resolves to May 1, 2026 or later. Graduation-year eligibility alone is ignored for internships.
SeniorityThe title contains no configured senior-level or management terminology.
Technology roleThe title, or a narrowly allowed description fallback, matches a configured technology category.
European locationThe parsed location explicitly resolves to Europe or a supported European country.

Ambiguous evidence is excluded rather than guessed. Search-page absence never closes a listing; only explicit unavailability evidence can change lifecycle state. See Architecture and Database lifecycle for the exact acceptance and closure rules.

Quality & testing

Critical Python classification and lifecycle paths are protected by branch-aware coverage gates. The TypeScript application is independently validated through formatting, linting, strict type checking, production builds, unit tests, and Playwright end-to-end tests.

Python quality baseline

The offline suite measures critical classification and lifecycle paths and enforces the configured combined coverage threshold.

MetricCurrentRequired
Combined statement and branch coverage90.5%≥ 85.0%
Branch coverage83.6%Reported
Classifier branch coverage97.5%Reported

The table is generated from the same coverage report used by the quality gate. Run make coverage after changing Python behavior or tests.

Python CI verifies that committed metrics are current and publishes the complete statement, branch, and per-module coverage reports alongside parsing and classification benchmarks. Compare benchmark timings only across equivalent environments.

Site CI separately enforces formatting, linting, TypeScript type checking, a production build, unit tests, and Playwright end-to-end tests. CodeQL scans the Python and TypeScript code on pushes, pull requests, and a weekly schedule.

Run locally

Requirements: Python 3.12+, uv, and Git. Node.js and Bun are required only for local website development.

git clone https://github.com/simonesiega/european-tech-opportunities-2027.git
cd european-tech-opportunities-2027
uv sync --frozen --dev
cp .env.example .env
uv run opportunities db-upgrade
uv run opportunities stats

A fresh local database intentionally contains no listings. Use the hosted directory for current data.

Continue with the installation guide for the local website, Windows commands, Docker, and verification. Runtime settings are documented in configuration, and CLI commands in the CLI reference.

Documentation

Use the documentation hub to find the canonical guide for each task.

AreaCanonical guides
SetupInstallation · Configuration
Using the projectWebsite · CLI · Search registry
Production operationAutomation · Database · Docker · Troubleshooting
DevelopmentArchitecture · Development · Contributing
PoliciesSecurity · Privacy · Code of Conduct

Responsible operation

[!IMPORTANT] LinkedIn collection is disabled by default. Public accessibility is not authorization to automate access.

The project uses no credentials, authenticated sessions, browser automation, private endpoints, proxies, CAPTCHA bypasses, or anti-bot evasion. It is not affiliated with or endorsed by LinkedIn or any listed employer. See SECURITY.md for the complete source-access and operational policy and PRIVACY.md for website analytics and visitor-data handling.

Contributing

Focused improvements to strict classification, sanitized parser fixtures, search coverage, lifecycle safety, tests, website usability, and documentation are welcome.

Read CONTRIBUTING.md before opening a pull request. Participation is governed by the Code of Conduct.

License

Project code and documentation are available under the MIT License. Third-party assets remain subject to their respective licenses and terms.

Contributors

Contributors

career
data-pipeline
europe
internship
job-opportunity-tracker
job-search
new-grad
nextjs
open-source-resources
python
sqlite-database
tech-jobs
web-scraping

Contributors

simonesiega

65 commits

dependabot[bot]

40 commits

mattiacerutti

2 commits

Languages

Python

80.0%

TypeScript

20.0%