European Tech Opportunities 2027
Internships · New Grad · Documentation · Contributing · Privacy
Last successful collection: September 26, 2026 at 09:34 UTC
Download CSV · Download JSON · Explore the live directory →
Live directory¶
Search the open opportunities by company, country, category, employment type, and first-seen recency. Sort and paginate results, share a filtered view, open the original listing, or download the sanitized CSV and JSON datasets.
https://techopportunities.eu/ is the sole canonical public origin. The former https://opportunities2027.simonesiega.com host is retained only for permanent redirects to the same path and query on the canonical site, not as an alternative canonical URL. See deployment instructions.
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: 724 (Internships: 316 · New Grad: 408)
Last successful collection: September 26, 2026 at 09:34 UTC
Browse and filter the complete directory at https://techopportunities.eu/.
Latest New Grad opportunities¶
Showing the 5 most recently discovered of 408 open New Grad opportunities:
| Company | Title | Location | Listing |
|---|---|---|---|
| Bending Spoons | Graduate software engineer | Munich, Bavaria, Germany | View |
| Bending Spoons | Graduate software engineer | Padua, Veneto, Italy | View |
| Bending Spoons | Graduate software engineer | Turin, Piedmont, Italy | View |
| Bending Spoons | Graduate software engineer | Seville, Andalusia, Spain | View |
| Bending Spoons | Graduate AI software engineer | Madrid, Community of Madrid, Spain | View |
Latest internships¶
Showing the 5 most recently discovered of 316 open internships:
| Company | Title | Location | Listing |
|---|---|---|---|
| Barco | Internship - Computer Vision & Image Analysis | Kortrijk, Flemish Region, Belgium | View |
| Barco | Internship - Software Engineering | Kortrijk, Flemish Region, Belgium | View |
| Sanofi | internship 6 months data science | Paris, Île-de-France, France | View |
| Dassault Systèmes | Software Developer Intern | Cracow, Małopolskie, Poland | View |
| Motorola Solutions | Intern Software Developer (React/JS) | Cracow, Małopolskie, Poland | 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.
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 a checksum-verified, versioned release-pointer cutover (after a coordinated site rollout).
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:
| 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 opportunity-cycle evidence is accepted, and any explicit conflicting cycle year is rejected. Without explicit cycle evidence, posting-date evidence must resolve 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.
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.
| Metric | Current | Required |
|---|---|---|
| Combined statement and branch coverage | 91.7% | ≥ 85.0% |
| Branch coverage | 85.9% | 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.
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¶
Browse the searchable documentation or read the documentation hub in this repository. The guides in docs/ and the linked root policy files are the source documents.
| 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 |
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¶
A huge thank you to everyone who has contributed to the project!