Skip to content

Repository maps

← Visual assets · Documentation home · Architecture · Diagram source

European Tech Opportunities 2027 turns permission-gated public listing evidence into a validated directory. SQLite owns the lifecycle; the website, API, downloads, and README only present it.

The maps use colored subsystem groups, labeled connections, database shapes, and clickable implementation links, inspired by GitDiagram. They describe the checked-in architecture, not production data or a live deployment.

Choose a view

View Question it answers
Repository overview How does the whole system fit together?
Collection and lifecycle How does evidence become an accepted listing?
Website and publication What reaches users, and what stays in their browser?
Automation and deployment How does reviewed state reach production safely?
Testing, documentation, and tooling What builds, verifies, documents, and protects the project?
Editable Mermaid source Where do I change or reuse these diagrams?

Viewing: open an SVG directly in your browser to zoom and follow its code links. On GitHub, use the raw/download view; embedded image previews may disable node links. The SVGs work without JavaScript, a diagram service, API keys, or external resources. Code links open GitHub only when selected and target main, which may differ from the revision you are viewing.

Legend: solid arrows carry data, evidence, or artifacts; dashed arrows mean “runs,” “configures,” or “supports.” Cylinders represent stored data; the hexagon identifies the controlled application writer, and diamonds mark publication gates. Grouped boxes are ownership boundaries, not necessarily separate services. Python paths are relative to src/opportunities/ unless shown in full.

Repository overview

Open the full-size repository map

Full repository map linking configuration and CLI, collection, availability, Repository, canonical SQLite, public projections, browser-local state, and supporting operations and tooling

Read the main path as configure → collect → classify → persist → publish. Search definitions and acceptance rules tell the CLI where to look and what evidence is required. The Python pipeline rotates searches by persistent completion time, fetches permitted guest HTML, and applies deterministic acceptance checks. Only Repository writes application state, keeping lifecycle evidence, search rotation, and aggregate quality baselines in SQLite.

HTTP 429 stops subsequent source requests. Independently completed searches or confirmed availability checks may qualify for HTTP 429-only partial publication only after every required gate passes; the resulting proposal requires manual review and merge.

The website, API, downloads, and bounded README present that state; production readers use verified releases. Browser-local lists sit beside the public data flow and never write back to the database. The surrounding groups show the automation, tests, documentation, policies, and build tools supporting these boundaries.

Collection and lifecycle

Open the collection map · Acceptance policy · Lifecycle details

Collection map showing permission-gated transport, search-card prefilters, validated details, normalization, deterministic classification, isolated search outcomes, repository transactions, and separate maintenance paths

Search YAML defines discovery scope; classification rules define publication eligibility. The CLI supplies validated settings to a runner that bounds concurrency and isolates each search. Never-completed and oldest-completed searches run first, with stable registry ties; denied and skipped searches retain priority. Permission-gated HTTP provides search cards and identity-validated details, with company/title prefilters first. Normalization and classification check role type, seniority, technology, cycle/date, and European location. Successful searches commit independently with their completion timestamps; failed and skipped searches save diagnostics without lifecycle evidence or scheduling advancement.

Full, partial, and blocked outcomes remain distinct. HTTP 429 partial candidates require at least one completed search, only HTTP 429 failures or source-skipped searches, and every publication gate. Any other search failure blocks publication, even alongside a rate limit. Only successful, nonblocking full-registry collections establish quality baselines.

Missing cards cannot close jobs. Known-ID rechecks require repeated explicit 404/410 confirmations; closure occurs only after no active search association remains. The collection map shows the built-in availability default: at most 50 due jobs, with a five-day minimum interval. Production automation recommends the Actions variable OPPORTUNITIES_AVAILABILITY_MAX_JOBS=100 for scheduled audits; the software default remains unchanged. It keeps or reopens valid listings, deletes explicitly unavailable ones, and preserves inconclusive rows. An HTTP 429-only partial audit requires completed confirmed checks and no independent failures, skips scraping, and passes validation for manual review. Other audit source stops block publication.

Reviewed offline additions reuse acceptance checks and repository transactions, without invented provenance or manual reopening.

Website and publication

Open the publication map · Website contract · Public data

Publication map separating Python-generated READMEs and downloads, read-only SQLite queries, listing API, feeds, dataset status, React directory controls, and private browser localStorage

SQLite feeds two publication paths: Python-generated files and server-only website queries. Python owns the README preview, full-state review seal, sanitized CSV/JSON, and dataset metadata. The README projection node includes English and the five localized READMEs in docs/translations/: all six share canonical counts, seals, and bounded listing data, with localized presentation labels and UTC date displays. The renderer preserves authored text and reciprocal language selectors outside those regions. The Next.js page, v1 listing API, and RSS/Atom feeds share a read-only query; download routes only serve existing export files. The status endpoint separately reads successful-collection time and open counts, then verifies bounded metadata against the streamed JSON download hash. In versioned mode, each server operation selects one release before opening its database or downloads.

React components handle search, filters, sorting, pagination, and theme without changing canonical data. Saved/applied/hidden IDs and visit times stay in localStorage, never SQLite, shared URLs, the API, or analytics. Schema, link-validation, and metadata helpers keep the public output predictable and safe to consume.

Automation and deployment

Open the operations map · Canonical automation guide

Operations map showing serialized protected processing, verified restricted snapshots, a README-only review handoff, and a separate approved versioned-release deployment

Scheduled and manual workflows serialize canonical updates through a shared one-writer lock. The nightly node shows the default audit → scrape sequence. Manual runs can set skip_availability=true to select scraping only; scheduled runs always audit. An eligible HTTP 429 partial audit skips scraping and proceeds only through validation and manual-review handoff. The protected processor restores verified state, migrates, requires its README to match reviewed main, and runs selected CLI phases. Full and eligible HTTP 429 partial results must pass SQLite integrity and projection checks before checkpointing and restricted snapshot publication. Collection also requires its aggregate quality gate; audit-only partials never fabricate collection metrics or reports. Round-trip snapshot verification must succeed before the README handoff. Search rotation travels with the database, never a separate queue or artifact.

A separate job receives only the six public README projections and outcome output, opens a pull request restricted to their explicit path allowlist, and waits for validation. Only the English README controls the reviewed-state barrier; localized projections cannot approve mismatched canonical state. Fully successful nightly collections retain the existing automatic-merge policy; partial proposals use a labeled -partial branch and require manual review and merge. Unmerged or rejected partial snapshots still block ordinary subsequent mutation and deployment at the reviewed-state barrier. Merging the matching README does not deploy: publication is a separate protected manual run.

Deployment verifies payloads under a lock and switches the release pointer atomically, retaining old releases for readers. Canonical databases and snapshot manifests never enter public GitHub caches or artifacts. Recovery modes differ: the normal drill publishes a verified snapshot; seal adoption and README recovery propose only README changes for review.

Testing, documentation, and tooling

Open the foundations map · Testing guide · Documentation ownership

Foundations map connecting frozen Python and Bun toolchains, domain models, utilities and schemas, offline and synthetic browser tests, security checks, public media, and the separate documentation publishing path

These groups explain how the repository is built and checked without accessing live listing data. Frozen Python and Bun dependencies provide consistent linting, typing, unit tests, and browser tooling. Domain models, shared utilities, migrations, and public schemas define the contracts those checks protect. Offline fixtures and synthetic SQLite/exports drive integration, browser, accessibility, and privacy tests. CI adds container smoke tests and security checks; normal validation never collects LinkedIn listings. Documentation and sanitized visuals use a separate allowlisted build, publishing to GitHub Pages only from main. Coverage and registry summaries come from their owning tools, while policies and contribution controls guide review.

Repository coverage

Repeated search definitions, tests, and small UI primitives are grouped so the maps stay readable. Together these views cover the maintained repository at subsystem level, not every file or import.

Area Included responsibilities
configs/ Company/country/role searches, categories, example settings
src/opportunities/cli/, config/ Entry point, commands, settings, search registry, rules, cycle policy
src/opportunities/scrapers/ Bounded HTTP transport and LinkedIn guest parsing
src/opportunities/normalization/, pipeline/ Title/location normalization, acceptance, rotating collection, aggregate quality gates, bounded availability
src/opportunities/models/, utils/ Typed records/enums; concurrency, atomic files, paths, time, text, URL, logging
src/opportunities/database/, migrations/, alembic.ini Repository, SQLAlchemy models/sessions, schema history, verified snapshots
Python projection modules readme.py, readme_localization.py, public_exports.py, search_registry_docs.py
schemas/ Public v1 schema and sanitized contract examples
site/src/app/, components/, lib/, types/ Routes, directory UI, theme/layout, server queries, browser state, helpers, metadata
site/scripts/, site configuration Standalone startup, synthetic demo recording, Next.js/security headers, browser/Lighthouse tooling
tests/, site/tests/, scripts/testing/ Unit/integration/benchmark coverage, fixtures, synthetic state, browser accessibility and privacy checks
scripts/database/, scripts/deployment/ Migration checks, backup/bootstrap/recovery, snapshot transfer, locked release activation
.github/ Workflows, shared Python setup action, issue/PR templates, owners, Dependabot, prose rules
docs/, scripts/docs/, mkdocs.yml User/maintainer guides, visual assets, link/lint/build checks, coverage documentation, Pages
Root tooling and policies Python/Bun manifests and locks, Makefile, Docker/Compose, ignore/lint settings, contribution/security/privacy/community/license rules
data/ Ignored runtime SQLite, generated exports, and versioned release files; shown conceptually, never read or included in these assets

Vendored dependencies, build outputs, caches, local logs, secrets, private databases, and personal .context/ or .agents/skills/ content are intentionally excluded.

Maintain the maps

Edit the relevant block in source.md, then regenerate its SVG using the rendering profile. The five SVGs in svg/ are rendered artifacts of that source; the README and editable source stay at this folder's root. Keep diagram source and rendered SVGs in this folder; changes to product-showcase media follow the separate asset guide.

Check Mermaid parsing, code-link targets, text containment, SVG accessibility labels, and readability at both preview and full size. Include group headings in overlap checks: they must clear the first component box and remain inside their group. SVGs must remain self-contained: no scripts, HTML labels, embedded credentials, or runtime data. The canonical architecture, security policy, and linked maintainer guides remain authoritative if implementation changes make a map stale.