Europe-first directory of validated 2027 tech internships and new-grad roles, updated daily with a searchable web app.
See the codeFind validated 2027 tech internships and new-grad roles across Europe.
Internships · New Grad · Documentation · Contributing · Privacy
Last successful collection: September 22, 2026 at 10:46 UTC
Download CSV · Download JSON · Explore the live directory →
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.
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.
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/.
Showing the 5 most recently discovered of 384 open New Grad opportunities:
| Company | Title | Location | Listing |
|---|---|---|---|
| Wayflyer | Graduate Software Engineer | Dublin, County Dublin, Ireland | View |
| Cegeka | Young Graduate - Java developer | Flemish Region, Belgium | View |
| Bending Spoons | Graduate software engineer | Milan, Lombardy, Italy | View |
| Var Group | Incident Responder - Cybersecurity (Entry Level) | Veneto, Italy | View |
| Bending Spoons | Graduate software engineer | Spain | View |
Showing the 5 most recently discovered of 318 open internships:
| Company | Title | Location | Listing |
|---|---|---|---|
| BIP Red | Software Tester - Intern | Milan, Lombardy, Italy | View |
| Vidiemme | Software Tester - Intern | Milan, Lombardy, Italy | View |
| Stealth Startup | Data Science Intern | Germany | View |
| Criteo Deutschland | Software Engineer Intern - Front-End or Fullstack | Paris, Île-de-France, France | View |
| Perplexity | Internship - Machine Learning Research Engineer | Berlin, Berlin, Germany | View |
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.
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.
A listing is published only when all five checks pass:
| Check | Required evidence |
|---|---|
| Employment type | The title explicitly identifies either an internship (including placement or co-op) or a New Grad role. Internship terminology takes precedence if both appear. |
| Cycle evidence | Explicit 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. |
| Seniority | The title contains no configured senior-level or management terminology. |
| Technology role | The title, or a narrowly allowed description fallback, matches a configured technology category. |
| European location | The 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.
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.
The offline suite measures critical classification and lifecycle paths and enforces the configured combined coverage threshold.
| Metric | Current | Required |
|---|---|---|
| Combined statement and branch coverage | 90.5% | ≥ 85.0% |
| Branch coverage | 83.6% | Reported |
| Classifier branch coverage | 97.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.
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.
Use the documentation hub to find the canonical guide for each task.
| Area | Canonical guides |
|---|---|
| Setup | Installation · Configuration |
| Using the project | Website · CLI · Search registry |
| Production operation | Automation · Database · Docker · Troubleshooting |
| Development | Architecture · Development · Contributing |
| Policies | Security · Privacy · Code of Conduct |
[!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.
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.
Project code and documentation are available under the MIT License. Third-party assets remain subject to their respective licenses and terms.
Python
80.0%
TypeScript
20.0%
Europe-first directory of validated 2027 tech internships and new-grad roles, updated daily with a searchable web app.
See the codeFind validated 2027 tech internships and new-grad roles across Europe.
Internships · New Grad · Documentation · Contributing · Privacy
Last successful collection: September 22, 2026 at 10:46 UTC
Download CSV · Download JSON · Explore the live directory →
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.
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.
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/.
Showing the 5 most recently discovered of 384 open New Grad opportunities:
| Company | Title | Location | Listing |
|---|---|---|---|
| Wayflyer | Graduate Software Engineer | Dublin, County Dublin, Ireland | View |
| Cegeka | Young Graduate - Java developer | Flemish Region, Belgium | View |
| Bending Spoons | Graduate software engineer | Milan, Lombardy, Italy | View |
| Var Group | Incident Responder - Cybersecurity (Entry Level) | Veneto, Italy | View |
| Bending Spoons | Graduate software engineer | Spain | View |
Showing the 5 most recently discovered of 318 open internships:
| Company | Title | Location | Listing |
|---|---|---|---|
| BIP Red | Software Tester - Intern | Milan, Lombardy, Italy | View |
| Vidiemme | Software Tester - Intern | Milan, Lombardy, Italy | View |
| Stealth Startup | Data Science Intern | Germany | View |
| Criteo Deutschland | Software Engineer Intern - Front-End or Fullstack | Paris, Île-de-France, France | View |
| Perplexity | Internship - Machine Learning Research Engineer | Berlin, Berlin, Germany | View |
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.
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.
A listing is published only when all five checks pass:
| Check | Required evidence |
|---|---|
| Employment type | The title explicitly identifies either an internship (including placement or co-op) or a New Grad role. Internship terminology takes precedence if both appear. |
| Cycle evidence | Explicit 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. |
| Seniority | The title contains no configured senior-level or management terminology. |
| Technology role | The title, or a narrowly allowed description fallback, matches a configured technology category. |
| European location | The 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.
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.
The offline suite measures critical classification and lifecycle paths and enforces the configured combined coverage threshold.
| Metric | Current | Required |
|---|---|---|
| Combined statement and branch coverage | 90.5% | ≥ 85.0% |
| Branch coverage | 83.6% | Reported |
| Classifier branch coverage | 97.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.
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.
Use the documentation hub to find the canonical guide for each task.
| Area | Canonical guides |
|---|---|
| Setup | Installation · Configuration |
| Using the project | Website · CLI · Search registry |
| Production operation | Automation · Database · Docker · Troubleshooting |
| Development | Architecture · Development · Contributing |
| Policies | Security · Privacy · Code of Conduct |
[!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.
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.
Project code and documentation are available under the MIT License. Third-party assets remain subject to their respective licenses and terms.
Python
80.0%
TypeScript
20.0%