diff --git a/.gitignore b/.gitignore index dde0a7c4f..9b89eca3f 100644 --- a/.gitignore +++ b/.gitignore @@ -142,3 +142,6 @@ storybook-static/ # EuroPython website src/content/days + +# Local secrets (never commit) +.env.local diff --git a/docs/social-media-scheduling.md b/docs/social-media-scheduling.md new file mode 100644 index 000000000..e03a18720 --- /dev/null +++ b/docs/social-media-scheduling.md @@ -0,0 +1,269 @@ +# Social Media Scheduling + +This document describes the end-to-end process for generating social media cards +and scheduling posts for EuroPython 2026 speakers, sponsors, and community +partners via Buffer. + +--- + +## Overview + +The pipeline has three stages: + +1. **Generate social card images** — render PNG cards for speakers and sponsors + using Puppeteer +2. **Generate the post queue** — hit the Astro API endpoint to produce + `queue.json` +3. **Schedule posts to Buffer** — run the Python script to push items from the + queue + +--- + +## Prerequisites + +- Dev server running locally (`pnpm dev`, default port `4321`) +- Node.js + pnpm installed +- Python environment with dependencies: `requests`, `python-dotenv` +- A `.env.local` file in the project root with your Buffer API key: + +``` +BUFFER_API_KEY=your_buffer_api_key_here +``` + +This file is gitignored and never committed. + +### Getting the Buffer API key + +1. Log in to [buffer.com](https://buffer.com) with the EuroPython account +2. Go to **Account Settings** → **Apps & Integrations** (or navigate directly to + https://account.buffer.com/apps) +3. Under **Access Token**, copy your personal access token +4. Paste it as the value of `BUFFER_API_KEY` in your `.env.local` + +--- + +## Step 1 — Generate Social Card Images + +Social cards are 900×900px PNG images rendered from Astro pages and +screenshotted with Puppeteer. + +### Speaker cards + +```bash +node scripts/download_social_speakers.cjs +``` + +Screenshots are saved to the current directory. Move them to the right place: + +```bash +mv social-*.png public/media/speakers/ +``` + +### Sponsor & partner cards + +```bash +node scripts/download_social_sponsors.cjs +``` + +Move them: + +```bash +mv social-*.png public/media/sponsors/ +``` + +> The scripts read from `http://localhost:4321/media/speakers` and +> `http://localhost:4321/media/sponsors` respectively, so the dev server must be +> running. + +### Checking for missing images + +Cross-reference the live site with what's in `public/media/sponsors/`. Every +sponsor and partner listed on: + +- https://ep2026.europython.eu/sponsors/ +- https://ep2026.europython.eu/community-partners/ + +should have a corresponding `social-.png` in `public/media/sponsors/`. + +--- + +## Step 2 — Generate the Post Queue + +The queue is a JSON file that interleaves speakers, sponsors, and community +partners in a repeating pattern: + +``` +speaker → speaker → sponsor → speaker → partner → (repeat) +``` + +Regenerate it by hitting the API endpoint while the dev server is running: + +```bash +curl -s http://localhost:4321/api/media/combined_socials_queue > src/pages/api/media/combined_socials_queue.json +``` + +This overwrites `src/pages/api/media/combined_socials_queue.json` with all 150+ +items sorted and interleaved. + +### Tier classification + +Sponsors are split into two buckets: + +- **Commercial** (go into the sponsor slot): Keystone, Diamond, Platinum, + Platinum X, Gold, Silver, Bronze, Patron +- **Community partners** (go into the partner slot): Partners, Supporters, + Financial Aid + +If a new sponsor tier is added, update `commercialTiers` in +`src/pages/api/media/combined_socials_queue.ts`. + +### Manual queue adjustments + +You can edit `src/pages/api/media/combined_socials_queue.json` directly to +reorder entries. For example, to swap two sponsors: + +```python +python3 -c " +import json +path = 'src/pages/api/media/combined_socials_queue.json' +with open(path) as f: + q = json.load(f) +q[2], q[17] = q[17], q[2] # swap positions 3 and 18 (0-indexed) +with open(path, 'w') as f: + json.dump(q, f, indent=2, ensure_ascii=False) +" +``` + +`src/pages/api/media/combined_socials_queue.json` is committed to the repo. Any +manual reordering should be committed so the intentional order is preserved and +not lost when the queue is regenerated. + +--- + +## Step 3 — Commit and Merge Images + +Before scheduling, the social card images need to be live on the production +site. Buffer fetches the image URL at scheduling time and will fail with +`Failed to fetch image dimensions: Not Found` if the file isn't deployed yet. + +1. Stage the new images: + +```bash +git add public/media/speakers/ public/media/sponsors/ +``` + +2. Commit: + +```bash +git commit -m "Add social media cards for speakers/sponsors" +``` + +3. Push to a branch and open a PR: + +```bash +git push -u origin your-branch-name +gh pr create --title "Add social media cards" --body "New speaker and sponsor social card PNGs for Buffer scheduling." +``` + +4. Wait for the PR to be merged and deployed before proceeding to Step 4. + +You can verify the images are live by checking a URL like: +`https://ep2026.europython.eu/media/sponsors/social-arm.png` + +--- + +## Step 4 — Schedule Posts via Buffer + +> ⚠️ **Images must be live before scheduling.** Buffer fetches the image URL at +> scheduling time. If the PNG hasn't been deployed yet (i.e. the PR adding it +> hasn't been merged and deployed), Buffer will fail with +> `Failed to fetch image dimensions: Not Found`. Always merge and confirm the +> images are live at `https://ep2026.europython.eu/media/speakers/` or +> `https://ep2026.europython.eu/media/sponsors/` before running the script. + +### How Buffer scheduling works + +Buffer operates as a FIFO queue against pre-configured time slots: + +- Time slots are defined per channel inside Buffer (e.g. "Twitter, weekdays at + 09:00 and 14:00"). +- Incoming posts fill the next available slot in order — you don't pick a + specific date/time. +- Slots can be added or shifted directly in Buffer if you need to change the + cadence. + +> ⚠️ **Check your Buffer slots before running the script.** If you push 120 +> cards and there is only one slot per day per channel, you'll end up with posts +> queued months out — and there is no bulk deletion in Buffer, so you'd have to +> remove them one by one. Before each run, open Buffer and verify the number and +> cadence of slots for each channel matches your intended rollout pace. + +The scheduling script is at `src/pages/api/media/buffer-scheduling.py`. + +### Configuration + +Open the script and set the range of queue items to schedule: + +```python +QUEUE_START = 1 # first item (1-based, inclusive) +QUEUE_END = 5 # last item (1-based, inclusive) +``` + +It's a good idea to start with a small batch (e.g. 1–5) to verify everything +looks correct in Buffer before pushing the full queue. Once you're happy with +the results, increment the range for subsequent runs. + +### Running the script + +```bash +uv run python src/pages/api/media/buffer-scheduling.py +``` + +Or with your venv activated: + +```bash +python src/pages/api/media/buffer-scheduling.py +``` + +### What it does + +1. Connects to Buffer and fetches your channel profile IDs +2. Iterates over the selected queue items +3. For each item, posts to every channel that has text defined (`instagram`, + `x`, `linkedin`, `bsky`, `fosstodon`) +4. Skips channels with empty text or no matching Buffer profile +5. Adds Instagram-specific metadata (`postType: post`) automatically +6. Waits 1.5 seconds between items to respect rate limits + +### Channel notes + +- **Instagram**: requires `postType: post` — handled automatically +- **Sponsors/partners**: no Instagram channel (only x, linkedin, bsky, + fosstodon) +- **Speakers**: all 5 channels including Instagram +- **Bluesky**: Buffer returns this as `"bluesky"` — normalized to `"bsky"` + automatically + +### Tracking progress + +After each successful run, note the last `QUEUE_END` value. The next run should +set `QUEUE_START = previous QUEUE_END + 1`. + +Already scheduled as of initial setup: + +- Positions 1–3: Abhik Sarkar, Abhimanyu Singh Shekhawat, Abigail Afi Gbadago + +Next batch (positions 4–8): Adam Gorgoń, Alejandro Cabello Jiménez, +ActiveCampaign, Aleksander, 1Password + +--- + +## Troubleshooting + +| Error | Cause | Fix | +| --------------------------------------------- | ------------------------------- | ---------------------------------------------------------- | +| `BUFFER_API_KEY not set` | Missing `.env.local` | Create `.env.local` with the key | +| `Failed to fetch image dimensions: Not Found` | Image not deployed yet | Generate and commit the missing PNG first | +| `Field "postType" is not defined` | Wrong field placement | `postType` goes inside `metadata.instagram`, not top-level | +| `Channel profile not connected` | Service name mismatch | Check the normalization block in the script | +| `KeyError: 'channel'` | Queue item missing channel data | Re-run `curl .../queue > queue.json` to regenerate | diff --git a/public/media/sponsors/social-1password.png b/public/media/sponsors/social-1password.png new file mode 100644 index 000000000..118ded24b Binary files /dev/null and b/public/media/sponsors/social-1password.png differ diff --git a/public/media/sponsors/social-activecampaign.png b/public/media/sponsors/social-activecampaign.png new file mode 100644 index 000000000..f0d4d64d1 Binary files /dev/null and b/public/media/sponsors/social-activecampaign.png differ diff --git a/public/media/sponsors/social-apify.png b/public/media/sponsors/social-apify.png new file mode 100644 index 000000000..7aec672f7 Binary files /dev/null and b/public/media/sponsors/social-apify.png differ diff --git a/public/media/sponsors/social-arm.png b/public/media/sponsors/social-arm.png index 77da9159c..6eb986d89 100644 Binary files a/public/media/sponsors/social-arm.png and b/public/media/sponsors/social-arm.png differ diff --git a/public/media/sponsors/social-backmarket.png b/public/media/sponsors/social-backmarket.png index d86a9b3c0..a64512a88 100644 Binary files a/public/media/sponsors/social-backmarket.png and b/public/media/sponsors/social-backmarket.png differ diff --git a/public/media/sponsors/social-bloomberg.png b/public/media/sponsors/social-bloomberg.png index 48c2ebcf4..74f76fbbb 100644 Binary files a/public/media/sponsors/social-bloomberg.png and b/public/media/sponsors/social-bloomberg.png differ diff --git a/public/media/sponsors/social-clug.png b/public/media/sponsors/social-clug.png index 809ac7432..9813f2f1f 100644 Binary files a/public/media/sponsors/social-clug.png and b/public/media/sponsors/social-clug.png differ diff --git a/public/media/sponsors/social-euroscipy.png b/public/media/sponsors/social-euroscipy.png index 878fe1e01..0d2d19224 100644 Binary files a/public/media/sponsors/social-euroscipy.png and b/public/media/sponsors/social-euroscipy.png differ diff --git a/public/media/sponsors/social-evolabel.png b/public/media/sponsors/social-evolabel.png new file mode 100644 index 000000000..416d58ece Binary files /dev/null and b/public/media/sponsors/social-evolabel.png differ diff --git a/public/media/sponsors/social-fsfe.png b/public/media/sponsors/social-fsfe.png index b518623c6..dc4ff7e52 100644 Binary files a/public/media/sponsors/social-fsfe.png and b/public/media/sponsors/social-fsfe.png differ diff --git a/public/media/sponsors/social-google-cloud.png b/public/media/sponsors/social-google-cloud.png index 84ebf71e7..264c76ffe 100644 Binary files a/public/media/sponsors/social-google-cloud.png and b/public/media/sponsors/social-google-cloud.png differ diff --git a/public/media/sponsors/social-hablemospython.png b/public/media/sponsors/social-hablemospython.png index bc64f42af..ef14317f6 100644 Binary files a/public/media/sponsors/social-hablemospython.png and b/public/media/sponsors/social-hablemospython.png differ diff --git a/public/media/sponsors/social-hrt.png b/public/media/sponsors/social-hrt.png index 4f251c5f1..3c17fdf2a 100644 Binary files a/public/media/sponsors/social-hrt.png and b/public/media/sponsors/social-hrt.png differ diff --git a/public/media/sponsors/social-jetbrains.png b/public/media/sponsors/social-jetbrains.png index 70dbf8c77..dd0545331 100644 Binary files a/public/media/sponsors/social-jetbrains.png and b/public/media/sponsors/social-jetbrains.png differ diff --git a/public/media/sponsors/social-manychat.png b/public/media/sponsors/social-manychat.png index 821bb900f..a9a143f74 100644 Binary files a/public/media/sponsors/social-manychat.png and b/public/media/sponsors/social-manychat.png differ diff --git a/public/media/sponsors/social-microsoft.png b/public/media/sponsors/social-microsoft.png index 9ce26b8e6..df13e2867 100644 Binary files a/public/media/sponsors/social-microsoft.png and b/public/media/sponsors/social-microsoft.png differ diff --git a/public/media/sponsors/social-numberly.png b/public/media/sponsors/social-numberly.png index 9e2dbf953..691efd63c 100644 Binary files a/public/media/sponsors/social-numberly.png and b/public/media/sponsors/social-numberly.png differ diff --git a/public/media/sponsors/social-optiver.png b/public/media/sponsors/social-optiver.png index 62503bda5..552b1643a 100644 Binary files a/public/media/sponsors/social-optiver.png and b/public/media/sponsors/social-optiver.png differ diff --git a/public/media/sponsors/social-pretalx.png b/public/media/sponsors/social-pretalx.png new file mode 100644 index 000000000..815ade55b Binary files /dev/null and b/public/media/sponsors/social-pretalx.png differ diff --git a/public/media/sponsors/social-pretix.png b/public/media/sponsors/social-pretix.png new file mode 100644 index 000000000..e6edec34e Binary files /dev/null and b/public/media/sponsors/social-pretix.png differ diff --git a/public/media/sponsors/social-psf.png b/public/media/sponsors/social-psf.png index bc42c9802..8fb7688bc 100644 Binary files a/public/media/sponsors/social-psf.png and b/public/media/sponsors/social-psf.png differ diff --git a/public/media/sponsors/social-pycon-greece.png b/public/media/sponsors/social-pycon-greece.png index 7b1679b9e..217543448 100644 Binary files a/public/media/sponsors/social-pycon-greece.png and b/public/media/sponsors/social-pycon-greece.png differ diff --git a/public/media/sponsors/social-pyconwro.png b/public/media/sponsors/social-pyconwro.png index 6d22f52bc..023e3dfd0 100644 Binary files a/public/media/sponsors/social-pyconwro.png and b/public/media/sponsors/social-pyconwro.png differ diff --git a/public/media/sponsors/social-pydatabydgoszcz.png b/public/media/sponsors/social-pydatabydgoszcz.png index 0bdca515c..639bd5f0a 100644 Binary files a/public/media/sponsors/social-pydatabydgoszcz.png and b/public/media/sponsors/social-pydatabydgoszcz.png differ diff --git a/public/media/sponsors/social-pydatakrk.png b/public/media/sponsors/social-pydatakrk.png index 59f6c495c..1ea912b76 100644 Binary files a/public/media/sponsors/social-pydatakrk.png and b/public/media/sponsors/social-pydatakrk.png differ diff --git a/public/media/sponsors/social-pydatatrojmiasto.png b/public/media/sponsors/social-pydatatrojmiasto.png index 640361ab4..564f78426 100644 Binary files a/public/media/sponsors/social-pydatatrojmiasto.png and b/public/media/sponsors/social-pydatatrojmiasto.png differ diff --git a/public/media/sponsors/social-pygda.png b/public/media/sponsors/social-pygda.png index 2a5995ffb..13cd0b96c 100644 Binary files a/public/media/sponsors/social-pygda.png and b/public/media/sponsors/social-pygda.png differ diff --git a/public/media/sponsors/social-pykonik.png b/public/media/sponsors/social-pykonik.png index 9f5397b92..ea3a1d78e 100644 Binary files a/public/media/sponsors/social-pykonik.png and b/public/media/sponsors/social-pykonik.png differ diff --git a/public/media/sponsors/social-pyladiescon.png b/public/media/sponsors/social-pyladiescon.png index 084e625f8..8e3cdb3ee 100644 Binary files a/public/media/sponsors/social-pyladiescon.png and b/public/media/sponsors/social-pyladiescon.png differ diff --git a/public/media/sponsors/social-pystok.png b/public/media/sponsors/social-pystok.png index d1584fb80..c7136b5d7 100644 Binary files a/public/media/sponsors/social-pystok.png and b/public/media/sponsors/social-pystok.png differ diff --git a/public/media/sponsors/social-python-ankara.png b/public/media/sponsors/social-python-ankara.png index 5bdc03063..455ddb8d1 100644 Binary files a/public/media/sponsors/social-python-ankara.png and b/public/media/sponsors/social-python-ankara.png differ diff --git a/public/media/sponsors/social-pythonlodz.png b/public/media/sponsors/social-pythonlodz.png index ca855e45a..a34f13b1a 100644 Binary files a/public/media/sponsors/social-pythonlodz.png and b/public/media/sponsors/social-pythonlodz.png differ diff --git a/public/media/sponsors/social-pythonpizza.png b/public/media/sponsors/social-pythonpizza.png index 788b802a9..8fee12fe6 100644 Binary files a/public/media/sponsors/social-pythonpizza.png and b/public/media/sponsors/social-pythonpizza.png differ diff --git a/public/media/sponsors/social-pywaw.png b/public/media/sponsors/social-pywaw.png index fc664c2ce..780f5303a 100644 Binary files a/public/media/sponsors/social-pywaw.png and b/public/media/sponsors/social-pywaw.png differ diff --git a/public/media/sponsors/social-revolut.png b/public/media/sponsors/social-revolut.png new file mode 100644 index 000000000..c83c65e23 Binary files /dev/null and b/public/media/sponsors/social-revolut.png differ diff --git a/public/social/partner_card_white.png b/public/social/partner_card_white.png new file mode 100644 index 000000000..f67b150b2 Binary files /dev/null and b/public/social/partner_card_white.png differ diff --git a/public/social/sponsor_card_white.png b/public/social/sponsor_card_white.png new file mode 100644 index 000000000..64114fcb8 Binary files /dev/null and b/public/social/sponsor_card_white.png differ diff --git a/src/components/SocialMediaSponsorCard.astro b/src/components/SocialMediaSponsorCard.astro index bdb8d5d9f..f6bbcc4d4 100644 --- a/src/components/SocialMediaSponsorCard.astro +++ b/src/components/SocialMediaSponsorCard.astro @@ -21,7 +21,7 @@ const tiers = [ "Patron", ] as const; -const bg_url = tiers.includes(tier)? '/social/sponsor_card.png' : '/social/partner_card.png'; +const bg_url = tiers.includes(tier)? '/social/sponsor_card_white.png' : '/social/partner_card_white.png'; // Function to parse CSS padding values diff --git a/src/pages/api/media/buffer-scheduling.py b/src/pages/api/media/buffer-scheduling.py new file mode 100644 index 000000000..4837a17d0 --- /dev/null +++ b/src/pages/api/media/buffer-scheduling.py @@ -0,0 +1,157 @@ +import requests +import json +import time +import os + +# Load .env.local if present (for local development). +# Run from the project root or open the project root in your IDE. +try: + from dotenv import load_dotenv + load_dotenv(".env.local") +except ImportError: + pass # dotenv not installed, rely on environment variables being set externally + +# ========================================== +# 1. CONFIGURATION +# ========================================== +API_KEY = os.environ.get("BUFFER_API_KEY") +if not API_KEY: + raise EnvironmentError("BUFFER_API_KEY environment variable is not set.") +URL = "https://api.buffer.com/" + +# ========================================== +# QUEUE RANGE (1-based, inclusive) +# Edit these two numbers to pick which items +# from queue.json to schedule. +# ========================================== +QUEUE_START = 5 # first item to schedule +QUEUE_END = 5 # last item to schedule (inclusive) + +# ========================================== +# LOAD ITEMS FROM queue.json +# ========================================== +queue_path = os.path.join(os.path.dirname(__file__), "combined_socials_queue.json") +with open(queue_path, encoding="utf-8") as f: + full_queue = json.load(f) + +data_payload = full_queue[QUEUE_START - 1 : QUEUE_END] + +headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json" +} + +# ========================================== +# 2. DYNAMICALLY FETCH PROFILE CHANNEL IDs +# ========================================== +print("🔄 Connecting to Buffer to fetch channel metadata...") + +get_channels_query = """ +query GetAllChannels { + account { + organizations { + channels { + id + service + } + } + } +} +""" + +response = requests.post(URL, json={"query": get_channels_query}, headers=headers) +if response.status_code != 200 or "errors" in response.json(): + print("❌ Failed to retrieve profiles. Verify your API key.") + exit() + +# Map the fetched network profiles into a lookup dictionary +profile_map = {} +organizations = response.json()["data"]["account"]["organizations"] +for org in organizations: + for channel in org["channels"]: + service_name = channel["service"].lower() + if service_name == "twitter": + service_name = "x" + elif service_name == "mastodon": + service_name = "fosstodon" + elif service_name == "bluesky": + service_name = "bsky" + profile_map[service_name] = channel["id"] + +print("✅ Found profiles mapping layout directly from Buffer:") +print(json.dumps(profile_map, indent=2)) +print("-" * 60) + +# ========================================== +# 3. CONSTRUCT & RUN MUTATION PIPELINE +# ========================================== +create_post_mutation = """ +mutation CreatePost($input: CreatePostInput!) { + createPost(input: $input) { + ... on PostActionSuccess { + post { + id + } + } + ... on MutationError { + message + } + } +} +""" + +print(f"🚀 Starting dynamic upload sequence of {len(data_payload)} items (queue positions {QUEUE_START}–{QUEUE_END})...") + +for index, item in enumerate(data_payload, start=1): + queue_pos = QUEUE_START + index - 1 + print(f"\n📦 Processing [{index}/{len(data_payload)}] (queue #{queue_pos}): {item['name']}") + + if "channel" not in item: + print(f" ⚠️ Skipped — no channel data found for this item.") + continue + + for network, text in item["channel"].items(): + if not text: + continue + + profile_id = profile_map.get(network) + if not profile_id: + print(f" ⚠️ Skipped [{network}] - Channel profile not connected in Buffer dashboard.") + continue + + variables = { + "input": { + "channelId": profile_id, + "text": text, + "schedulingType": "automatic", + "mode": "addToQueue", + "assets": [{"image": {"url": item["image"], "alt_text": item.get("alt_text", "")}}] if item.get("image") else [], + **({"metadata": {"instagram": {"type": "post", "shouldShareToFeed": True}}} if network == "instagram" else {}) + } + } + + post_response = requests.post( + URL, + json={"query": create_post_mutation, "variables": variables}, + headers=headers + ) + + if post_response.status_code == 200: + res_json = post_response.json() + if "errors" in res_json: + print(f" ❌ GraphQL Error on [{network}]: {res_json['errors'][0]['message']}") + else: + create_post_result = res_json.get("data", {}).get("createPost", {}) + if create_post_result.get("__typename") == "MutationError" or "message" in create_post_result: + print(f" ❌ Failed [{network}]: {create_post_result.get('message', 'Unknown error')}") + elif create_post_result.get("post", {}).get("id"): + print(f" ✅ Scheduled into next available [{network}] FIFO queue slot. (post id: {create_post_result['post']['id']})") + else: + print(f" ⚠️ Unexpected response for [{network}]: {json.dumps(create_post_result)}") + else: + print(f" ❌ Server Error on [{network}]: Status code {post_response.status_code}") + print(f" 🔍 Response body: {post_response.text}") + + time.sleep(1.5) + +print("\n🎉 All tasks processed successfully!") diff --git a/src/pages/api/media/queue.ts b/src/pages/api/media/combined_socials_queue.ts similarity index 84% rename from src/pages/api/media/queue.ts rename to src/pages/api/media/combined_socials_queue.ts index edff84158..3cef220ed 100644 --- a/src/pages/api/media/queue.ts +++ b/src/pages/api/media/combined_socials_queue.ts @@ -21,17 +21,20 @@ function getMastodonUsername(url: string): string | undefined { return match ? `@${match[2]}@${match[1]}` : undefined; } -function getLinkedInUsernameHandler(url: string): string | undefined { +function getLinkedInUrl(url: string): string | undefined { if (!url) return undefined; - const match = url.match(/https?:\/\/([^\/]+)\/in\/([^\/]+)(\/|\?|$)/); + // Normalise linkedin.com URLs (handles both /in/ and /company/ paths) + const match = url.match( + /https?:\/\/(?:www\.)?linkedin\.com\/(in|company|showcase)\/([^\/\?]+)/ + ); if (match) { try { - return `https://www.linkedin.com/in/${decodeURIComponent(match[2])}`; + return `https://www.linkedin.com/${match[1]}/${decodeURIComponent(match[2])}`; } catch { - return `https://www.linkedin.com/in/${match[2]}`; + return `https://www.linkedin.com/${match[1]}/${match[2]}`; } } - return undefined; + return url; // fall back to the raw URL } const trimToLimit = (text: string, limit: number) => @@ -105,11 +108,18 @@ function buildSponsorMessage( handle: string, url: string ): string { - return template + // If no handle, remove the placeholder (and any leading space before it) + const withHandle = handle + ? template + .replace(/SPONSOR_HANDLE/g, handle) + .replace(/SUPPORTER_HANDLE/g, handle) + : template + .replace(/ ?SPONSOR_HANDLE/g, "") + .replace(/ ?SUPPORTER_HANDLE/g, ""); + + return withHandle .replace(/SPONSOR_NAME/g, name) - .replace(/SPONSOR_HANDLE/g, handle) .replace(/SPONSOR_URL/g, url) - .replace(/SUPPORTER_HANDLE/g, handle) .replace(/SUPPORTER_URL/g, url); } @@ -158,7 +168,7 @@ export const GET: APIRoute = async () => { const handles = { x: getTwitterUsername(twitter_url || ""), - linkedin: getLinkedInUsernameHandler(linkedin_url || ""), + linkedin: getLinkedInUrl(linkedin_url || ""), bsky: getBlueskyUsername(bluesky_url || ""), fosstodon: getMastodonUsername(mastodon_url || ""), }; @@ -184,6 +194,7 @@ export const GET: APIRoute = async () => { type: "speaker", name, image, + alt_text: `Speaker announcement for EuroPython 2026 conference: ${name} — ${talkTitle}`, handles, channel: { instagram: generateSpeakerMessage("instagram"), @@ -206,10 +217,10 @@ export const GET: APIRoute = async () => { const image = `https://ep2026.europython.eu/media/sponsors/social-${sponsor.id}.png`; const handles = { - x: socials?.twitter || "", - linkedin: socials?.linkedin || "", - bsky: socials?.bluesky || "", - fosstodon: socials?.mastodon || "", + x: getTwitterUsername(socials?.twitter || "") || "", + linkedin: getLinkedInUrl(socials?.linkedin || "") || "", + bsky: getBlueskyUsername(socials?.bluesky || "") || "", + fosstodon: getMastodonUsername(socials?.mastodon || "") || "", }; const makeMsg = (platform: "x" | "linkedin" | "bsky" | "fosstodon") => { @@ -224,6 +235,7 @@ export const GET: APIRoute = async () => { type: "sponsor", name, image, + alt_text: `Sponsor announcement for EuroPython 2026 conference: ${name}`, handles, channel: { x: makeMsg("x"), @@ -245,10 +257,10 @@ export const GET: APIRoute = async () => { const image = `https://ep2026.europython.eu/media/sponsors/social-${sponsor.id}.png`; const handles = { - x: socials?.twitter || "", - linkedin: socials?.linkedin || "", - bsky: socials?.bluesky || "", - fosstodon: socials?.mastodon || "", + x: getTwitterUsername(socials?.twitter || "") || "", + linkedin: getLinkedInUrl(socials?.linkedin || "") || "", + bsky: getBlueskyUsername(socials?.bluesky || "") || "", + fosstodon: getMastodonUsername(socials?.mastodon || "") || "", }; const makeMsg = (platform: "x" | "linkedin" | "bsky" | "fosstodon") => { @@ -261,6 +273,7 @@ export const GET: APIRoute = async () => { type: "partner", name, image, + alt_text: `Partner announcement for EuroPython 2026 conference: ${name}`, handles, channel: { x: makeMsg("x"), @@ -271,6 +284,11 @@ export const GET: APIRoute = async () => { }); } + // ── sort each bucket alphabetically by name ───────────────────────────── + speakerRecords.sort((a, b) => a.name.localeCompare(b.name)); + sponsorRecords.sort((a, b) => a.name.localeCompare(b.name)); + partnerRecords.sort((a, b) => a.name.localeCompare(b.name)); + // ── interleave: speaker, speaker, sponsor, speaker, partner ────────────── // The pattern is a sequence of bucket references that repeats until all // buckets are exhausted; remaining items are appended at the end. diff --git a/src/pages/api/media/combined_socials_queue_2026.json b/src/pages/api/media/combined_socials_queue_2026.json new file mode 100644 index 000000000..2c4c2e1fd --- /dev/null +++ b/src/pages/api/media/combined_socials_queue_2026.json @@ -0,0 +1,2553 @@ +[ + { + "type": "speaker", + "name": "Abhik Sarkar", + "image": "https://ep2026.europython.eu/media/speakers/social-abhik-sarkar.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Abhik Sarkar — An Introduction to Writing Fast GPU Code in Python", + "handles": { + "x": "@abhiksark", + "linkedin": "https://www.linkedin.com/in/abhiksark" + }, + "channel": { + "instagram": "Join Abhik Sarkar at EuroPython for \"An Introduction to Writing Fast GPU Code in Python\".", + "x": "Join Abhik Sarkar (@abhiksark) at EuroPython for \"An Introduction to Writing Fast GPU Code in Python\". Talk: https://ep2026.europython.eu/JQSQBB", + "linkedin": "Join Abhik Sarkar at EuroPython for \"An Introduction to Writing Fast GPU Code in Python\".", + "bsky": "Join Abhik Sarkar at EuroPython for \"An Introduction to Writing Fast GPU Code in Python\". Talk: https://ep2026.europython.eu/JQSQBB", + "fosstodon": "Join Abhik Sarkar at EuroPython for \"An Introduction to Writing Fast GPU Code in Python\". Talk: https://ep2026.europython.eu/JQSQBB" + } + }, + { + "type": "speaker", + "name": "Abhimanyu Singh Shekhawat", + "image": "https://ep2026.europython.eu/media/speakers/social-abhimanyu-singh-shekhawat.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Abhimanyu Singh Shekhawat — Deconstructing the tenets of Planet Scale Systems with Python", + "handles": { + "x": "@abshekha", + "linkedin": "https://www.linkedin.com/in/abhimanyubitsgoa" + }, + "channel": { + "instagram": "Join Abhimanyu Singh Shekhawat at EuroPython for \"Deconstructing the tenets of Planet Scale Systems with Python\".", + "x": "Join Abhimanyu Singh Shekhawat (@abshekha) at EuroPython for \"Deconstructing the tenets of Planet Scale Systems with Python\". Talk: https://ep2026.europython.eu/SNKUW7", + "linkedin": "Join Abhimanyu Singh Shekhawat at EuroPython for \"Deconstructing the tenets of Planet Scale Systems with Python\".", + "bsky": "Join Abhimanyu Singh Shekhawat at EuroPython for \"Deconstructing the tenets of Planet Scale Systems with Python\". Talk: https://ep2026.europython.eu/SNKUW7", + "fosstodon": "Join Abhimanyu Singh Shekhawat at EuroPython for \"Deconstructing the tenets of Planet Scale Systems with Python\". Talk: https://ep2026.europython.eu/SNKUW7" + } + }, + { + "type": "speaker", + "name": "Abigail Afi Gbadago", + "image": "https://ep2026.europython.eu/media/speakers/social-abigail-afi-gbadago.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Abigail Afi Gbadago — Pointers, Objects, and References - How Python Manages Memory", + "handles": { + "linkedin": "https://www.linkedin.com/in/abigail-afi-gbadago" + }, + "channel": { + "instagram": "Join Abigail Afi Gbadago at EuroPython for \"Pointers, Objects, and References - How Python Manages Memory\".", + "x": "Join Abigail Afi Gbadago at EuroPython for \"Pointers, Objects, and References - How Python Manages Memory\". Talk: https://ep2026.europython.eu/ARRMQR", + "linkedin": "Join Abigail Afi Gbadago at EuroPython for \"Pointers, Objects, and References - How Python Manages Memory\".", + "bsky": "Join Abigail Afi Gbadago at EuroPython for \"Pointers, Objects, and References - How Python Manages Memory\". Talk: https://ep2026.europython.eu/ARRMQR", + "fosstodon": "Join Abigail Afi Gbadago at EuroPython for \"Pointers, Objects, and References - How Python Manages Memory\". Talk: https://ep2026.europython.eu/ARRMQR" + } + }, + { + "type": "speaker", + "name": "Adam Gorgoń", + "image": "https://ep2026.europython.eu/media/speakers/social-adam-gorgon.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Adam Gorgoń — gRPC for Beginners", + "handles": {}, + "channel": { + "instagram": "Join Adam Gorgoń at EuroPython for \"gRPC for Beginners\".", + "x": "Join Adam Gorgoń at EuroPython for \"gRPC for Beginners\". Talk: https://ep2026.europython.eu/TGGHKC", + "linkedin": "Join Adam Gorgoń at EuroPython for \"gRPC for Beginners\".", + "bsky": "Join Adam Gorgoń at EuroPython for \"gRPC for Beginners\". Talk: https://ep2026.europython.eu/TGGHKC", + "fosstodon": "Join Adam Gorgoń at EuroPython for \"gRPC for Beginners\". Talk: https://ep2026.europython.eu/TGGHKC" + } + }, + { + "type": "speaker", + "name": "Alejandro Cabello Jiménez", + "image": "https://ep2026.europython.eu/media/speakers/social-alejandro-cabello-jimenez.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Alejandro Cabello Jiménez — Python on Serverless: Strategies for Peak Performance", + "handles": { + "linkedin": "https://www.linkedin.com/in/alejandrocabello" + }, + "channel": { + "instagram": "Join Alejandro Cabello Jiménez at EuroPython for \"Python on Serverless: Strategies for Peak Performance\".", + "x": "Join Alejandro Cabello Jiménez at EuroPython for \"Python on Serverless: Strategies for Peak Performance\". Talk: https://ep2026.europython.eu/PPQ3KE", + "linkedin": "Join Alejandro Cabello Jiménez at EuroPython for \"Python on Serverless: Strategies for Peak Performance\".", + "bsky": "Join Alejandro Cabello Jiménez at EuroPython for \"Python on Serverless: Strategies for Peak Performance\". Talk: https://ep2026.europython.eu/PPQ3KE", + "fosstodon": "Join Alejandro Cabello Jiménez at EuroPython for \"Python on Serverless: Strategies for Peak Performance\". Talk: https://ep2026.europython.eu/PPQ3KE" + } + }, + { + "type": "sponsor", + "name": "ActiveCampaign", + "image": "https://ep2026.europython.eu/media/sponsors/social-activecampaign.png", + "alt_text": "Sponsor announcement for EuroPython 2026 conference: ActiveCampaign", + "handles": { + "x": "@ActiveCampaign", + "linkedin": "https://www.linkedin.com/company/activecampaign", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ We are pleased to welcome ActiveCampaign as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 @ActiveCampaign https://www.activecampaign.com/", + "linkedin": "🚀✨ We are delighted to welcome ActiveCampaign as a sponsor for EuroPython 2026! Your support helps make this event extraordinary. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.linkedin.com/company/activecampaign https://www.activecampaign.com/", + "bsky": "🎉✨ A big thank you to ActiveCampaign for joining us as a sponsor for EuroPython 2026! Your support is making a huge impact. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.activecampaign.com/", + "fosstodon": "🚀✨ A huge thank you to ActiveCampaign for sponsoring EuroPython 2026! Your support helps make this event extraordinary. 🙌 https://www.activecampaign.com/" + } + }, + { + "type": "speaker", + "name": "Aleksander", + "image": "https://ep2026.europython.eu/media/speakers/social-aleksander.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Aleksander — Python in the Service of Justice: Modern Analysis Tools in Forensics", + "handles": { + "linkedin": "https://www.linkedin.com/in/aleksander-kopyto-6b0339123" + }, + "channel": { + "instagram": "Join Aleksander at EuroPython for \"Python in the Service of Justice: Modern Analysis Tools in Forensics\".", + "x": "Join Aleksander at EuroPython for \"Python in the Service of Justice: Modern Analysis Tools in Forensics\". Talk: https://ep2026.europython.eu/PQCHT3", + "linkedin": "Join Aleksander at EuroPython for \"Python in the Service of Justice: Modern Analysis Tools in Forensics\".", + "bsky": "Join Aleksander at EuroPython for \"Python in the Service of Justice: Modern Analysis Tools in Forensics\". Talk: https://ep2026.europython.eu/PQCHT3", + "fosstodon": "Join Aleksander at EuroPython for \"Python in the Service of Justice: Modern Analysis Tools in Forensics\". Talk: https://ep2026.europython.eu/PQCHT3" + } + }, + { + "type": "partner", + "name": "1Password", + "image": "https://ep2026.europython.eu/media/sponsors/social-1password.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: 1Password", + "handles": { + "x": "@1Password", + "linkedin": "https://www.linkedin.com/company/1password", + "bsky": "", + "fosstodon": "@1password@1password.social" + }, + "channel": { + "x": "🎉✨ A warm thank you to 1Password for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 @1Password https://1password.com", + "linkedin": "🎉✨ A warm thank you to 1Password for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.linkedin.com/company/1password https://1password.com", + "bsky": "🎉✨ A warm thank you to 1Password for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://1password.com", + "fosstodon": "🎉✨ A warm thank you to 1Password for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 @1password@1password.social https://1password.com" + } + }, + { + "type": "sponsor", + "name": "Apify", + "image": "https://ep2026.europython.eu/media/sponsors/social-apify.png", + "alt_text": "Sponsor announcement for EuroPython 2026 conference: Apify", + "handles": { + "x": "@apify", + "linkedin": "https://www.linkedin.com/company/apify", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ We are pleased to welcome Apify as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 @apify https://apify.com/", + "linkedin": "🚀✨ We are delighted to welcome Apify as a sponsor for EuroPython 2026! Your support helps make this event extraordinary. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.linkedin.com/company/apify https://apify.com/", + "bsky": "🎉✨ Thank you to Apify for sponsoring EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://apify.com/", + "fosstodon": "🎉✨ A big thank you to Apify for joining us as a sponsor for EuroPython 2026! Your support is making a huge impact. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://apify.com/" + } + }, + { + "type": "partner", + "name": "Cracow Linux Users Group", + "image": "https://ep2026.europython.eu/media/sponsors/social-clug.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: Cracow Linux Users Group", + "handles": { + "x": "", + "linkedin": "", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to Cracow Linux Users Group for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://clug.space/", + "linkedin": "🎉✨ A warm thank you to Cracow Linux Users Group for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://clug.space/", + "bsky": "🎉✨ A warm thank you to Cracow Linux Users Group for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://clug.space/", + "fosstodon": "🎉✨ A warm thank you to Cracow Linux Users Group for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://clug.space/" + } + }, + { + "type": "speaker", + "name": "Alenka Frim", + "image": "https://ep2026.europython.eu/media/speakers/social-alenka-frim.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Alenka Frim — Stop Guessing, Start Understanding: How Arrow and Pandas Exchange Data", + "handles": {}, + "channel": { + "instagram": "Join Alenka Frim at EuroPython for \"Stop Guessing, Start Understanding: How Arrow and Pandas Exchange Data\".", + "x": "Join Alenka Frim at EuroPython for \"Stop Guessing, Start Understanding: How Arrow and Pandas Exchange Data\". Talk: https://ep2026.europython.eu/ZFJEUJ", + "linkedin": "Join Alenka Frim at EuroPython for \"Stop Guessing, Start Understanding: How Arrow and Pandas Exchange Data\".", + "bsky": "Join Alenka Frim at EuroPython for \"Stop Guessing, Start Understanding: How Arrow and Pandas Exchange Data\". Talk: https://ep2026.europython.eu/ZFJEUJ", + "fosstodon": "Join Alenka Frim at EuroPython for \"Stop Guessing, Start Understanding: How Arrow and Pandas Exchange Data\". Talk: https://ep2026.europython.eu/ZFJEUJ" + } + }, + { + "type": "speaker", + "name": "Anwesha Das", + "image": "https://ep2026.europython.eu/media/speakers/social-anwesha-das.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Anwesha Das — Demystifying CRA for the community", + "handles": { + "linkedin": "https://www.linkedin.com/in/anwesha-das-1247121a2", + "fosstodon": "@anwesha@toots.dgplug.org" + }, + "channel": { + "instagram": "Join Anwesha Das at EuroPython for \"Demystifying CRA for the community\".", + "x": "Join Anwesha Das at EuroPython for \"Demystifying CRA for the community\". Talk: https://ep2026.europython.eu/Y3DGWB", + "linkedin": "Join Anwesha Das at EuroPython for \"Demystifying CRA for the community\".", + "bsky": "Join Anwesha Das at EuroPython for \"Demystifying CRA for the community\". Talk: https://ep2026.europython.eu/Y3DGWB", + "fosstodon": "Join Anwesha Das (@anwesha@toots.dgplug.org) at EuroPython for \"Demystifying CRA for the community\". talk: https://ep2026.europython.eu/Y3DGWB" + } + }, + { + "type": "sponsor", + "name": "Arm", + "image": "https://ep2026.europython.eu/media/sponsors/social-arm.png", + "alt_text": "Sponsor announcement for EuroPython 2026 conference: Arm", + "handles": { + "x": "@Arm", + "linkedin": "https://www.linkedin.com/company/arm", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ We are pleased to welcome Arm as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 @Arm https://www.arm.com", + "linkedin": "🎉✨ We are pleased to welcome Arm as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.linkedin.com/company/arm https://www.arm.com", + "bsky": "🎉✨ Thank you to Arm for sponsoring EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.arm.com", + "fosstodon": "🚀✨ We are delighted to welcome Arm as a sponsor for EuroPython 2026! Your support helps make this event extraordinary. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.arm.com" + } + }, + { + "type": "speaker", + "name": "Ariel Ortiz", + "image": "https://ep2026.europython.eu/media/speakers/social-ariel-ortiz.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Ariel Ortiz — Crafting Your Own Compiler: From Python Logic to High-Speed WebAssembly", + "handles": { + "linkedin": "https://www.linkedin.com/in/ariel-ortiz-ramirez" + }, + "channel": { + "instagram": "Join Ariel Ortiz at EuroPython for \"Crafting Your Own Compiler: From Python Logic to High-Speed WebAssembly\".", + "x": "Join Ariel Ortiz at EuroPython for \"Crafting Your Own Compiler: From Python Logic to High-Speed WebAssembly\". Talk: https://ep2026.europython.eu/QWEJWT", + "linkedin": "Join Ariel Ortiz at EuroPython for \"Crafting Your Own Compiler: From Python Logic to High-Speed WebAssembly\".", + "bsky": "Join Ariel Ortiz at EuroPython for \"Crafting Your Own Compiler: From Python Logic to High-Speed WebAssembly\". Talk: https://ep2026.europython.eu/QWEJWT", + "fosstodon": "Join Ariel Ortiz at EuroPython for \"Crafting Your Own Compiler: From Python Logic to High-Speed WebAssembly\". Talk: https://ep2026.europython.eu/QWEJWT" + } + }, + { + "type": "partner", + "name": "EuroPython Society", + "image": "https://ep2026.europython.eu/media/sponsors/social-eps.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: EuroPython Society", + "handles": { + "x": "@EuroPython", + "linkedin": "https://www.linkedin.com/company/europython", + "bsky": "@europython.eu", + "fosstodon": "@europython@fosstodon.org" + }, + "channel": { + "x": "🎉✨ A warm thank you to EuroPython Society for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 @EuroPython https://www.europython-society.org/", + "linkedin": "🎉✨ A warm thank you to EuroPython Society for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.linkedin.com/company/europython https://www.europython-society.org/", + "bsky": "🎉✨ A warm thank you to EuroPython Society for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 @europython.eu https://www.europython-society.org/", + "fosstodon": "🎉✨ A warm thank you to EuroPython Society for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 @europython@fosstodon.org https://www.europython-society.org/" + } + }, + { + "type": "speaker", + "name": "Bryce Adelstein Lelbach", + "image": "https://ep2026.europython.eu/media/speakers/social-bryce-adelstein-lelbach.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Bryce Adelstein Lelbach — GPU Programming in Pure Python", + "handles": { + "x": "@blelbach", + "linkedin": "https://www.linkedin.com/in/brycelelbach" + }, + "channel": { + "instagram": "Join Bryce Adelstein Lelbach at EuroPython for \"GPU Programming in Pure Python\".", + "x": "Join Bryce Adelstein Lelbach (@blelbach) at EuroPython for \"GPU Programming in Pure Python\". Talk: https://ep2026.europython.eu/JSLSHM", + "linkedin": "Join Bryce Adelstein Lelbach at EuroPython for \"GPU Programming in Pure Python\".", + "bsky": "Join Bryce Adelstein Lelbach at EuroPython for \"GPU Programming in Pure Python\". Talk: https://ep2026.europython.eu/JSLSHM", + "fosstodon": "Join Bryce Adelstein Lelbach at EuroPython for \"GPU Programming in Pure Python\". Talk: https://ep2026.europython.eu/JSLSHM" + } + }, + { + "type": "speaker", + "name": "Carlos A Aranibar", + "image": "https://ep2026.europython.eu/media/speakers/social-carlos-a-aranibar.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Carlos A Aranibar — Designing and Building Custom Keyboards ⌨️ with Python", + "handles": { + "linkedin": "https://www.linkedin.com/in/carlos-aranibar" + }, + "channel": { + "instagram": "Join Carlos A Aranibar at EuroPython for \"Designing and Building Custom Keyboards ⌨️ with Python\".", + "x": "Join Carlos A Aranibar at EuroPython for \"Designing and Building Custom Keyboards ⌨️ with Python\". Talk: https://ep2026.europython.eu/CBA98V", + "linkedin": "Join Carlos A Aranibar at EuroPython for \"Designing and Building Custom Keyboards ⌨️ with Python\".", + "bsky": "Join Carlos A Aranibar at EuroPython for \"Designing and Building Custom Keyboards ⌨️ with Python\". Talk: https://ep2026.europython.eu/CBA98V", + "fosstodon": "Join Carlos A Aranibar at EuroPython for \"Designing and Building Custom Keyboards ⌨️ with Python\". Talk: https://ep2026.europython.eu/CBA98V" + } + }, + { + "type": "sponsor", + "name": "Back Market", + "image": "https://ep2026.europython.eu/media/sponsors/social-backmarket.png", + "alt_text": "Sponsor announcement for EuroPython 2026 conference: Back Market", + "handles": { + "x": "", + "linkedin": "https://www.linkedin.com/company/back-market", + "bsky": "@backmarketeng.bsky.social", + "fosstodon": "@BackMarketEng@mastodon.social" + }, + "channel": { + "x": "🎉✨ We are pleased to welcome Back Market as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.backmarket.com/en-us", + "linkedin": "🚀✨ A huge thank you to Back Market for sponsoring EuroPython 2026! Your support helps make this event extraordinary. 🙌 https://www.linkedin.com/company/back-market https://www.backmarket.com/en-us", + "bsky": "🚀✨ We are delighted to welcome Back Market as a sponsor for EuroPython 2026! Your support helps make this event extraordinary. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 @backmarketeng.bsky.social https://www.backmarket.com/en-us", + "fosstodon": "🎉✨ Thank you to Back Market for sponsoring EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 @BackMarketEng@mastodon.social https://www.backmarket.com/en-us" + } + }, + { + "type": "speaker", + "name": "Cheuk Ting Ho", + "image": "https://ep2026.europython.eu/media/speakers/social-cheuk-ting-ho.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Cheuk Ting Ho — Rust Summit at EuroPython", + "handles": { + "linkedin": "https://www.linkedin.com/in/cheukting-ho", + "bsky": "@cheuk.dev", + "fosstodon": "@cheukting_ho@fosstodon.org" + }, + "channel": { + "instagram": "Join Cheuk Ting Ho at EuroPython for \"Rust Summit at EuroPython\".", + "x": "Join Cheuk Ting Ho at EuroPython for \"Rust Summit at EuroPython\". Talk: https://ep2026.europython.eu/VYUNHG", + "linkedin": "Join Cheuk Ting Ho at EuroPython for \"Rust Summit at EuroPython\".", + "bsky": "Join Cheuk Ting Ho (@cheuk.dev) at EuroPython for \"Rust Summit at EuroPython\". Talk: https://ep2026.europython.eu/VYUNHG", + "fosstodon": "Join Cheuk Ting Ho (@cheukting_ho@fosstodon.org) at EuroPython for \"Rust Summit at EuroPython\". talk: https://ep2026.europython.eu/VYUNHG" + } + }, + { + "type": "partner", + "name": "EuroSciPy", + "image": "https://ep2026.europython.eu/media/sponsors/social-euroscipy.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: EuroSciPy", + "handles": { + "x": "", + "linkedin": "", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to EuroSciPy for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://euroscipy.org/", + "linkedin": "🎉✨ A warm thank you to EuroSciPy for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://euroscipy.org/", + "bsky": "🎉✨ A warm thank you to EuroSciPy for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://euroscipy.org/", + "fosstodon": "🎉✨ A warm thank you to EuroSciPy for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://euroscipy.org/" + } + }, + { + "type": "speaker", + "name": "Christian Leitold", + "image": "https://ep2026.europython.eu/media/speakers/social-christian-leitold.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Christian Leitold — How to blend Python, physics, and art to create (hopefully) pretty pictures", + "handles": { + "linkedin": "https://www.linkedin.com/in/christian-leitold-273492197" + }, + "channel": { + "instagram": "Join Christian Leitold at EuroPython for \"How to blend Python, physics, and art to create (hopefully) pretty pictures\".", + "x": "Join Christian Leitold at EuroPython for \"How to blend Python, physics, and art to create (hopefully) pretty pictures\". Talk: https://ep2026.europython.eu/3HBWHB", + "linkedin": "Join Christian Leitold at EuroPython for \"How to blend Python, physics, and art to create (hopefully) pretty pictures\".", + "bsky": "Join Christian Leitold at EuroPython for \"How to blend Python, physics, and art to create (hopefully) pretty pictures\". Talk: https://ep2026.europython.eu/3HBWHB", + "fosstodon": "Join Christian Leitold at EuroPython for \"How to blend Python, physics, and art to create (hopefully) pretty pictures\". Talk: https://ep2026.europython.eu/3HBWHB" + } + }, + { + "type": "speaker", + "name": "Claudiu Belu", + "image": "https://ep2026.europython.eu/media/speakers/social-claudiu-belu.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Claudiu Belu — What is this footgun called unittest.mock, and how to avoid misusing it", + "handles": { + "linkedin": "https://www.linkedin.com/in/claudiubelu" + }, + "channel": { + "instagram": "Join Claudiu Belu at EuroPython for \"What is this footgun called unittest.mock, and how to avoid misusing it\".", + "x": "Join Claudiu Belu at EuroPython for \"What is this footgun called unittest.mock, and how to avoid misusing it\". Talk: https://ep2026.europython.eu/93XE3S", + "linkedin": "Join Claudiu Belu at EuroPython for \"What is this footgun called unittest.mock, and how to avoid misusing it\".", + "bsky": "Join Claudiu Belu at EuroPython for \"What is this footgun called unittest.mock, and how to avoid misusing it\". Talk: https://ep2026.europython.eu/93XE3S", + "fosstodon": "Join Claudiu Belu at EuroPython for \"What is this footgun called unittest.mock, and how to avoid misusing it\". Talk: https://ep2026.europython.eu/93XE3S" + } + }, + { + "type": "sponsor", + "name": "Bloomberg", + "image": "https://ep2026.europython.eu/media/sponsors/social-bloomberg.png", + "alt_text": "Sponsor announcement for EuroPython 2026 conference: Bloomberg", + "handles": { + "x": "@TechAtBloomberg", + "linkedin": "https://www.linkedin.com/company/bloomberg", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ We are pleased to welcome Bloomberg as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 @TechAtBloomberg https://www.bloomberg.com/company/values/tech-at-bloomberg/python/", + "linkedin": "🎉✨ A big thank you to Bloomberg for joining us as a sponsor for EuroPython 2026! Your support is making a huge impact. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.linkedin.com/company/bloomberg https://www.bloomberg.com/company/values/tech-at-bloomberg/python/", + "bsky": "🚀✨ Big shoutout and heartfelt thanks to Bloomberg for sponsoring EuroPython 2026! Your support is crucial in bringing the European Python 🐍 community closer together. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.bloomberg.com/company/values/tech-at-…", + "fosstodon": "🎉✨ A big thank you to Bloomberg for joining us as a sponsor for EuroPython 2026! Your support is making a huge impact. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.bloomberg.com/company/values/tech-at-bloomberg/python/" + } + }, + { + "type": "speaker", + "name": "Cody Fincher", + "image": "https://ep2026.europython.eu/media/speakers/social-cody-fincher.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Cody Fincher — Designing Performant APIs with Litestar", + "handles": { + "linkedin": "https://www.linkedin.com/in/cofin" + }, + "channel": { + "instagram": "Join Cody Fincher at EuroPython for \"Designing Performant APIs with Litestar\".", + "x": "Join Cody Fincher at EuroPython for \"Designing Performant APIs with Litestar\". Talk: https://ep2026.europython.eu/ZRWENU", + "linkedin": "Join Cody Fincher at EuroPython for \"Designing Performant APIs with Litestar\".", + "bsky": "Join Cody Fincher at EuroPython for \"Designing Performant APIs with Litestar\". Talk: https://ep2026.europython.eu/ZRWENU", + "fosstodon": "Join Cody Fincher at EuroPython for \"Designing Performant APIs with Litestar\". Talk: https://ep2026.europython.eu/ZRWENU" + } + }, + { + "type": "partner", + "name": "Evolabel", + "image": "https://ep2026.europython.eu/media/sponsors/social-evolabel.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: Evolabel", + "handles": { + "x": "", + "linkedin": "https://www.linkedin.com/company/autolabel-ab", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to Evolabel for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.evolabel.com", + "linkedin": "🎉✨ A warm thank you to Evolabel for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.linkedin.com/company/autolabel-ab https://www.evolabel.com", + "bsky": "🎉✨ A warm thank you to Evolabel for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.evolabel.com", + "fosstodon": "🎉✨ A warm thank you to Evolabel for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.evolabel.com" + } + }, + { + "type": "speaker", + "name": "Cristián Maureira-Fredes", + "image": "https://ep2026.europython.eu/media/speakers/social-cristian-maureira-fredes.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Cristián Maureira-Fredes — Understand and expand Python: a hands-on experience on Python internals", + "handles": { + "linkedin": "https://www.linkedin.com/in/cmaureir", + "bsky": "@maureira.dev", + "fosstodon": "@maureira.dev@mastodon.social" + }, + "channel": { + "instagram": "Join Cristián Maureira-Fredes at EuroPython for \"Understand and expand Python: a hands-on experience on Python internals\".", + "x": "Join Cristián Maureira-Fredes at EuroPython for \"Understand and expand Python: a hands-on experience on Python internals\". Talk: https://ep2026.europython.eu/K7XNTF", + "linkedin": "Join Cristián Maureira-Fredes at EuroPython for \"Understand and expand Python: a hands-on experience on Python internals\".", + "bsky": "Join Cristián Maureira-Fredes (@maureira.dev) at EuroPython for \"Understand and expand Python: a hands-on experience on Python internals\". Talk: https://ep2026.europython.eu/K7XNTF", + "fosstodon": "Join Cristián Maureira-Fredes (@maureira.dev@mastodon.social) at EuroPython for \"Understand and expand Python: a hands-on experience on Python internals\". talk: https://ep2026.europython.eu/K7XNTF" + } + }, + { + "type": "speaker", + "name": "Damian Wysocki", + "image": "https://ep2026.europython.eu/media/speakers/social-damian-wysocki.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Damian Wysocki — From Ticket Taker to Problem Solver: Discovery for Senior Thinking", + "handles": {}, + "channel": { + "instagram": "Join Damian Wysocki at EuroPython for \"From Ticket Taker to Problem Solver: Discovery for Senior Thinking\".", + "x": "Join Damian Wysocki at EuroPython for \"From Ticket Taker to Problem Solver: Discovery for Senior Thinking\". Talk: https://ep2026.europython.eu/NTZ7DG", + "linkedin": "Join Damian Wysocki at EuroPython for \"From Ticket Taker to Problem Solver: Discovery for Senior Thinking\".", + "bsky": "Join Damian Wysocki at EuroPython for \"From Ticket Taker to Problem Solver: Discovery for Senior Thinking\". Talk: https://ep2026.europython.eu/NTZ7DG", + "fosstodon": "Join Damian Wysocki at EuroPython for \"From Ticket Taker to Problem Solver: Discovery for Senior Thinking\". Talk: https://ep2026.europython.eu/NTZ7DG" + } + }, + { + "type": "sponsor", + "name": "Google Cloud", + "image": "https://ep2026.europython.eu/media/sponsors/social-google-cloud.png", + "alt_text": "Sponsor announcement for EuroPython 2026 conference: Google Cloud", + "handles": { + "x": "@GoogleCloudTech", + "linkedin": "https://www.linkedin.com/showcase/google-cloud", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ We are pleased to welcome Google Cloud as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 @GoogleCloudTech https://cloud.google.com/", + "linkedin": "🎉✨ Thank you to Google Cloud for sponsoring EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.linkedin.com/showcase/google-cloud https://cloud.google.com/", + "bsky": "🚀✨ We are delighted to welcome Google Cloud as a sponsor for EuroPython 2026! Your support helps make this event extraordinary. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://cloud.google.com/", + "fosstodon": "🚀✨ A huge thank you to Google Cloud for sponsoring EuroPython 2026! Your support helps make this event extraordinary. 🙌 https://cloud.google.com/" + } + }, + { + "type": "speaker", + "name": "Daniel Vahla", + "image": "https://ep2026.europython.eu/media/speakers/social-daniel-vahla.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Daniel Vahla — Python and HTTP/3: feel the difference in performance", + "handles": {}, + "channel": { + "instagram": "Join Daniel Vahla at EuroPython for \"Python and HTTP/3: feel the difference in performance\".", + "x": "Join Daniel Vahla at EuroPython for \"Python and HTTP/3: feel the difference in performance\". Talk: https://ep2026.europython.eu/DRXC3E", + "linkedin": "Join Daniel Vahla at EuroPython for \"Python and HTTP/3: feel the difference in performance\".", + "bsky": "Join Daniel Vahla at EuroPython for \"Python and HTTP/3: feel the difference in performance\". Talk: https://ep2026.europython.eu/DRXC3E", + "fosstodon": "Join Daniel Vahla at EuroPython for \"Python and HTTP/3: feel the difference in performance\". Talk: https://ep2026.europython.eu/DRXC3E" + } + }, + { + "type": "partner", + "name": "Free Software Foundation Europe", + "image": "https://ep2026.europython.eu/media/sponsors/social-fsfe.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: Free Software Foundation Europe", + "handles": { + "x": "", + "linkedin": "", + "bsky": "", + "fosstodon": "@fsfe@mastodon.social" + }, + "channel": { + "x": "🎉✨ A warm thank you to Free Software Foundation Europe for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://fsfe.org/", + "linkedin": "🎉✨ A warm thank you to Free Software Foundation Europe for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://fsfe.org/", + "bsky": "🎉✨ A warm thank you to Free Software Foundation Europe for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://fsfe.org/", + "fosstodon": "🎉✨ A warm thank you to Free Software Foundation Europe for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 @fsfe@mastodon.social https://fsfe.org/" + } + }, + { + "type": "speaker", + "name": "Daria Korsakova", + "image": "https://ep2026.europython.eu/media/speakers/social-daria-korsakova.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Daria Korsakova — Stop firefighting: practical observability for Python APIs, workers & jobs", + "handles": { + "linkedin": "https://www.linkedin.com/in/dariakors" + }, + "channel": { + "instagram": "Join Daria Korsakova at EuroPython for \"Stop firefighting: practical observability for Python APIs, workers & jobs\".", + "x": "Join Daria Korsakova at EuroPython for \"Stop firefighting: practical observability for Python APIs, workers & jobs\". Talk: https://ep2026.europython.eu/9MRVPM", + "linkedin": "Join Daria Korsakova at EuroPython for \"Stop firefighting: practical observability for Python APIs, workers & jobs\".", + "bsky": "Join Daria Korsakova at EuroPython for \"Stop firefighting: practical observability for Python APIs, workers & jobs\". Talk: https://ep2026.europython.eu/9MRVPM", + "fosstodon": "Join Daria Korsakova at EuroPython for \"Stop firefighting: practical observability for Python APIs, workers & jobs\". Talk: https://ep2026.europython.eu/9MRVPM" + } + }, + { + "type": "speaker", + "name": "David Rousset", + "image": "https://ep2026.europython.eu/media/speakers/social-david-rousset.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: David Rousset — When Python Agents Meet 3D: Automating Blender from Natural Language", + "handles": { + "x": "@davrous", + "linkedin": "https://www.linkedin.com/in/davrous" + }, + "channel": { + "instagram": "Join David Rousset at EuroPython for \"When Python Agents Meet 3D: Automating Blender from Natural Language\".", + "x": "Join David Rousset (@davrous) at EuroPython for \"When Python Agents Meet 3D: Automating Blender from Natural Language\". Talk: https://ep2026.europython.eu/7NWR9R", + "linkedin": "Join David Rousset at EuroPython for \"When Python Agents Meet 3D: Automating Blender from Natural Language\".", + "bsky": "Join David Rousset at EuroPython for \"When Python Agents Meet 3D: Automating Blender from Natural Language\". Talk: https://ep2026.europython.eu/7NWR9R", + "fosstodon": "Join David Rousset at EuroPython for \"When Python Agents Meet 3D: Automating Blender from Natural Language\". Talk: https://ep2026.europython.eu/7NWR9R" + } + }, + { + "type": "sponsor", + "name": "Hudson River Trading", + "image": "https://ep2026.europython.eu/media/sponsors/social-hrt.png", + "alt_text": "Sponsor announcement for EuroPython 2026 conference: Hudson River Trading", + "handles": { + "x": "@weareHRT", + "linkedin": "https://www.linkedin.com/company/hudson-river-trading", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ We are pleased to welcome Hudson River Trading as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 @weareHRT https://www.hudsonrivertrading.com", + "linkedin": "🚀✨ Big shoutout and heartfelt thanks to Hudson River Trading for sponsoring EuroPython 2026! Your support is crucial in bringing the European Python 🐍 community closer together. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌https://www.linkedin.com/company/hudson-river-trading https://www.hudsonrivertrading.com", + "bsky": "🎉✨ We are pleased to welcome Hudson River Trading as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.hudsonrivertrading.com", + "fosstodon": "🚀✨ We are delighted to welcome Hudson River Trading as a sponsor for EuroPython 2026! Your support helps make this event extraordinary. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.hudsonrivertrading.com" + } + }, + { + "type": "speaker", + "name": "David Vaz", + "image": "https://ep2026.europython.eu/media/speakers/social-david-vaz.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: David Vaz — I Am a Sucker for Conventions. Why Django’s Defaults Work, Until They Don’t", + "handles": { + "linkedin": "https://www.linkedin.com/in/davidmgvaz" + }, + "channel": { + "instagram": "Join David Vaz at EuroPython for \"I Am a Sucker for Conventions. Why Django’s Defaults Work, Until They Don’t\".", + "x": "Join David Vaz at EuroPython for \"I Am a Sucker for Conventions. Why Django’s Defaults Work, Until They Don’t\". Talk: https://ep2026.europython.eu/HVTSPC", + "linkedin": "Join David Vaz at EuroPython for \"I Am a Sucker for Conventions. Why Django’s Defaults Work, Until They Don’t\".", + "bsky": "Join David Vaz at EuroPython for \"I Am a Sucker for Conventions. Why Django’s Defaults Work, Until They Don’t\". Talk: https://ep2026.europython.eu/HVTSPC", + "fosstodon": "Join David Vaz at EuroPython for \"I Am a Sucker for Conventions. Why Django’s Defaults Work, Until They Don’t\". Talk: https://ep2026.europython.eu/HVTSPC" + } + }, + { + "type": "partner", + "name": "pretalx", + "image": "https://ep2026.europython.eu/media/sponsors/social-pretalx.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: pretalx", + "handles": { + "x": "", + "linkedin": "https://www.linkedin.com/company/pretalx", + "bsky": "", + "fosstodon": "@pretalx@chaos.social" + }, + "channel": { + "x": "🎉✨ A warm thank you to pretalx for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pretalx.org", + "linkedin": "🎉✨ A warm thank you to pretalx for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.linkedin.com/company/pretalx https://pretalx.org", + "bsky": "🎉✨ A warm thank you to pretalx for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pretalx.org", + "fosstodon": "🎉✨ A warm thank you to pretalx for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 @pretalx@chaos.social https://pretalx.org" + } + }, + { + "type": "speaker", + "name": "Dawn Wages", + "image": "https://ep2026.europython.eu/media/speakers/social-dawn-wages.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Dawn Wages — How many spoons does your environment cost: Broken demos & human element", + "handles": { + "linkedin": "https://www.linkedin.com/in/dawnwages", + "bsky": "@bajoranengineer.bsky.social", + "fosstodon": "@bajoranengineer@mastodon.online" + }, + "channel": { + "instagram": "Join Dawn Wages at EuroPython for \"How many spoons does your environment cost: Broken demos & human element\".", + "x": "Join Dawn Wages at EuroPython for \"How many spoons does your environment cost: Broken demos & human element\". Talk: https://ep2026.europython.eu/PCMBVT", + "linkedin": "Join Dawn Wages at EuroPython for \"How many spoons does your environment cost: Broken demos & human element\".", + "bsky": "Join Dawn Wages (@bajoranengineer.bsky.social) at EuroPython for \"How many spoons does your environment cost: Broken demos & human element\". Talk: https://ep2026.europython.eu/PCMBVT", + "fosstodon": "Join Dawn Wages (@bajoranengineer@mastodon.online) at EuroPython for \"How many spoons does your environment cost: Broken demos & human element\". talk: https://ep2026.europython.eu/PCMBVT" + } + }, + { + "type": "speaker", + "name": "Deb Nicholson", + "image": "https://ep2026.europython.eu/media/speakers/social-deb-nicholson.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Deb Nicholson — International Open Source – Your Best Choice in Interesting Times", + "handles": { + "linkedin": "https://www.linkedin.com/in/denicholson", + "bsky": "@baconandcoconut.bsky.social", + "fosstodon": "@baconandcoconut@freeradical.zone" + }, + "channel": { + "instagram": "Join Deb Nicholson at EuroPython for \"International Open Source – Your Best Choice in Interesting Times\".", + "x": "Join Deb Nicholson at EuroPython for \"International Open Source – Your Best Choice in Interesting Times\". Talk: https://ep2026.europython.eu/SQRYJA", + "linkedin": "Join Deb Nicholson at EuroPython for \"International Open Source – Your Best Choice in Interesting Times\".", + "bsky": "Join Deb Nicholson (@baconandcoconut.bsky.social) at EuroPython for \"International Open Source – Your Best Choice in Interesting Times\". Talk: https://ep2026.europython.eu/SQRYJA", + "fosstodon": "Join Deb Nicholson (@baconandcoconut@freeradical.zone) at EuroPython for \"International Open Source – Your Best Choice in Interesting Times\". talk: https://ep2026.europython.eu/SQRYJA" + } + }, + { + "type": "sponsor", + "name": "JetBrains", + "image": "https://ep2026.europython.eu/media/sponsors/social-jetbrains.png", + "alt_text": "Sponsor announcement for EuroPython 2026 conference: JetBrains", + "handles": { + "x": "@pycharm", + "linkedin": "https://www.linkedin.com/products/jetbrains-pycharm/", + "bsky": "@pycharm.dev", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ We are pleased to welcome JetBrains as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 @pycharm https://www.jetbrains.com/pycharm/", + "linkedin": "🎉✨ A big thank you to JetBrains for joining us as a sponsor for EuroPython 2026! Your support is making a huge impact. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.linkedin.com/products/jetbrains-pycharm/ https://www.jetbrains.com/pycharm/", + "bsky": "🚀✨ A huge thank you to JetBrains for sponsoring EuroPython 2026! Your support helps make this event extraordinary. 🙌 @pycharm.dev https://www.jetbrains.com/pycharm/", + "fosstodon": "🎉✨ A big thank you to JetBrains for joining us as a sponsor for EuroPython 2026! Your support is making a huge impact. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.jetbrains.com/pycharm/" + } + }, + { + "type": "speaker", + "name": "DEBORAH E DANJUMA", + "image": "https://ep2026.europython.eu/media/speakers/social-deborah-e-danjuma.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: DEBORAH E DANJUMA — Flying in Formation - with Python Threading and ROS2 Parallelism", + "handles": { + "x": "@danjumaedeborah", + "linkedin": "https://www.linkedin.com/in/deborahdanjuma" + }, + "channel": { + "instagram": "Join DEBORAH E DANJUMA at EuroPython for \"Flying in Formation - with Python Threading and ROS2 Parallelism\".", + "x": "Join DEBORAH E DANJUMA (@danjumaedeborah) at EuroPython for \"Flying in Formation - with Python Threading and ROS2 Parallelism\". Talk: https://ep2026.europython.eu/SASJQU", + "linkedin": "Join DEBORAH E DANJUMA at EuroPython for \"Flying in Formation - with Python Threading and ROS2 Parallelism\".", + "bsky": "Join DEBORAH E DANJUMA at EuroPython for \"Flying in Formation - with Python Threading and ROS2 Parallelism\". Talk: https://ep2026.europython.eu/SASJQU", + "fosstodon": "Join DEBORAH E DANJUMA at EuroPython for \"Flying in Formation - with Python Threading and ROS2 Parallelism\". Talk: https://ep2026.europython.eu/SASJQU" + } + }, + { + "type": "partner", + "name": "PyCon Greece", + "image": "https://ep2026.europython.eu/media/sponsors/social-pycon-greece.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: PyCon Greece", + "handles": { + "x": "", + "linkedin": "https://www.linkedin.com/company/pycon-greece", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to PyCon Greece for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pycon.gr/", + "linkedin": "🎉✨ A warm thank you to PyCon Greece for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.linkedin.com/company/pycon-greece https://pycon.gr/", + "bsky": "🎉✨ A warm thank you to PyCon Greece for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pycon.gr/", + "fosstodon": "🎉✨ A warm thank you to PyCon Greece for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pycon.gr/" + } + }, + { + "type": "speaker", + "name": "Diego Russo", + "image": "https://ep2026.europython.eu/media/speakers/social-diego-russo.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Diego Russo — Python on Windows on Arm: Ecosystem Enablement Update", + "handles": { + "x": "@diegor", + "linkedin": "https://www.linkedin.com/in/diegor", + "bsky": "@diegor.it" + }, + "channel": { + "instagram": "Join Diego Russo at EuroPython for \"Python on Windows on Arm: Ecosystem Enablement Update\".", + "x": "Join Diego Russo (@diegor) at EuroPython for \"Python on Windows on Arm: Ecosystem Enablement Update\". Talk: https://ep2026.europython.eu/QXZMP8", + "linkedin": "Join Diego Russo at EuroPython for \"Python on Windows on Arm: Ecosystem Enablement Update\".", + "bsky": "Join Diego Russo (@diegor.it) at EuroPython for \"Python on Windows on Arm: Ecosystem Enablement Update\". Talk: https://ep2026.europython.eu/QXZMP8", + "fosstodon": "Join Diego Russo at EuroPython for \"Python on Windows on Arm: Ecosystem Enablement Update\". Talk: https://ep2026.europython.eu/QXZMP8" + } + }, + { + "type": "speaker", + "name": "Domagoj Marić", + "image": "https://ep2026.europython.eu/media/speakers/social-domagoj-maric.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Domagoj Marić — Friendly Borders: Graph algorithms reveal Eurovision voting patterns", + "handles": { + "linkedin": "https://www.linkedin.com/in/domagoj-maric" + }, + "channel": { + "instagram": "Join Domagoj Marić at EuroPython for \"Friendly Borders: Graph algorithms reveal Eurovision voting patterns\".", + "x": "Join Domagoj Marić at EuroPython for \"Friendly Borders: Graph algorithms reveal Eurovision voting patterns\". Talk: https://ep2026.europython.eu/UPELCT", + "linkedin": "Join Domagoj Marić at EuroPython for \"Friendly Borders: Graph algorithms reveal Eurovision voting patterns\".", + "bsky": "Join Domagoj Marić at EuroPython for \"Friendly Borders: Graph algorithms reveal Eurovision voting patterns\". Talk: https://ep2026.europython.eu/UPELCT", + "fosstodon": "Join Domagoj Marić at EuroPython for \"Friendly Borders: Graph algorithms reveal Eurovision voting patterns\". Talk: https://ep2026.europython.eu/UPELCT" + } + }, + { + "type": "sponsor", + "name": "Manychat", + "image": "https://ep2026.europython.eu/media/sponsors/social-manychat.png", + "alt_text": "Sponsor announcement for EuroPython 2026 conference: Manychat", + "handles": { + "x": "@Manychat_life", + "linkedin": "https://www.linkedin.com/company/manychat", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ We are pleased to welcome Manychat as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 @Manychat_life https://careers.manychat.com/", + "linkedin": "🚀✨ We are delighted to welcome Manychat as a sponsor for EuroPython 2026! Your support helps make this event extraordinary. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.linkedin.com/company/manychat https://careers.manychat.com/", + "bsky": "🚀✨ We are delighted to welcome Manychat as a sponsor for EuroPython 2026! Your support helps make this event extraordinary. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://careers.manychat.com/", + "fosstodon": "🚀✨ We are delighted to welcome Manychat as a sponsor for EuroPython 2026! Your support helps make this event extraordinary. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://careers.manychat.com/" + } + }, + { + "type": "speaker", + "name": "ELENI TOKMAKTSI", + "image": "https://ep2026.europython.eu/media/speakers/social-eleni-tokmaktsi.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: ELENI TOKMAKTSI — From Pixels to Insights: Python for Earth Observation", + "handles": { + "linkedin": "https://gr.linkedin.com/in/eleni-tokmaktsi-982334257" + }, + "channel": { + "instagram": "Join ELENI TOKMAKTSI at EuroPython for \"From Pixels to Insights: Python for Earth Observation\".", + "x": "Join ELENI TOKMAKTSI at EuroPython for \"From Pixels to Insights: Python for Earth Observation\". Talk: https://ep2026.europython.eu/DWGSFA", + "linkedin": "Join ELENI TOKMAKTSI at EuroPython for \"From Pixels to Insights: Python for Earth Observation\".", + "bsky": "Join ELENI TOKMAKTSI at EuroPython for \"From Pixels to Insights: Python for Earth Observation\". Talk: https://ep2026.europython.eu/DWGSFA", + "fosstodon": "Join ELENI TOKMAKTSI at EuroPython for \"From Pixels to Insights: Python for Earth Observation\". Talk: https://ep2026.europython.eu/DWGSFA" + } + }, + { + "type": "partner", + "name": "PyCon Wrocław", + "image": "https://ep2026.europython.eu/media/sponsors/social-pyconwro.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: PyCon Wrocław", + "handles": { + "x": "", + "linkedin": "", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to PyCon Wrocław for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pyconwroclaw.com/", + "linkedin": "🎉✨ A warm thank you to PyCon Wrocław for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pyconwroclaw.com/", + "bsky": "🎉✨ A warm thank you to PyCon Wrocław for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pyconwroclaw.com/", + "fosstodon": "🎉✨ A warm thank you to PyCon Wrocław for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pyconwroclaw.com/" + } + }, + { + "type": "speaker", + "name": "Emmanuel Ugwu", + "image": "https://ep2026.europython.eu/media/speakers/social-emmanuel-ugwu.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Emmanuel Ugwu — Python Stings Your Ego: Finding Pride in Community, Not Just Code", + "handles": { + "linkedin": "https://www.linkedin.com/in/emmanuel-ugwu-b58b80223" + }, + "channel": { + "instagram": "Join Emmanuel Ugwu at EuroPython for \"Python Stings Your Ego: Finding Pride in Community, Not Just Code\".", + "x": "Join Emmanuel Ugwu at EuroPython for \"Python Stings Your Ego: Finding Pride in Community, Not Just Code\". Talk: https://ep2026.europython.eu/FB93DB", + "linkedin": "Join Emmanuel Ugwu at EuroPython for \"Python Stings Your Ego: Finding Pride in Community, Not Just Code\".", + "bsky": "Join Emmanuel Ugwu at EuroPython for \"Python Stings Your Ego: Finding Pride in Community, Not Just Code\". Talk: https://ep2026.europython.eu/FB93DB", + "fosstodon": "Join Emmanuel Ugwu at EuroPython for \"Python Stings Your Ego: Finding Pride in Community, Not Just Code\". Talk: https://ep2026.europython.eu/FB93DB" + } + }, + { + "type": "speaker", + "name": "Evan Kohilas", + "image": "https://ep2026.europython.eu/media/speakers/social-evan-kohilas.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Evan Kohilas — Args: Amazing or Approaching?", + "handles": { + "x": "@ekohilas", + "linkedin": "https://www.linkedin.com/in/ekohilas" + }, + "channel": { + "instagram": "Join Evan Kohilas at EuroPython for \"Args: Amazing or Approaching?\".", + "x": "Join Evan Kohilas (@ekohilas) at EuroPython for \"Args: Amazing or Approaching?\". Talk: https://ep2026.europython.eu/G9FDRY", + "linkedin": "Join Evan Kohilas at EuroPython for \"Args: Amazing or Approaching?\".", + "bsky": "Join Evan Kohilas at EuroPython for \"Args: Amazing or Approaching?\". Talk: https://ep2026.europython.eu/G9FDRY", + "fosstodon": "Join Evan Kohilas at EuroPython for \"Args: Amazing or Approaching?\". Talk: https://ep2026.europython.eu/G9FDRY" + } + }, + { + "type": "sponsor", + "name": "Microsoft", + "image": "https://ep2026.europython.eu/media/sponsors/social-microsoft.png", + "alt_text": "Sponsor announcement for EuroPython 2026 conference: Microsoft", + "handles": { + "x": "@code", + "linkedin": "https://www.linkedin.com/showcase/vs-code", + "bsky": "@visualstudio.com", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ We are pleased to welcome Microsoft as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 @code https://www.microsoft.com", + "linkedin": "🎉✨ A big thank you to Microsoft for joining us as a sponsor for EuroPython 2026! Your support is making a huge impact. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.linkedin.com/showcase/vs-code https://www.microsoft.com", + "bsky": "🚀✨ A huge thank you to Microsoft for sponsoring EuroPython 2026! Your support helps make this event extraordinary. 🙌 @visualstudio.com https://www.microsoft.com", + "fosstodon": "🎉✨ Thank you to Microsoft for sponsoring EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.microsoft.com" + } + }, + { + "type": "speaker", + "name": "Farhaan Bukhsh", + "image": "https://ep2026.europython.eu/media/speakers/social-farhaan-bukhsh.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Farhaan Bukhsh — Python Games in the Browser: Teaching with WebAssembly", + "handles": { + "x": "@fhackdroid", + "linkedin": "https://www.linkedin.com/in/farhaanbukhsh", + "bsky": "@fhackdroid.bsky.social" + }, + "channel": { + "instagram": "Join Farhaan Bukhsh at EuroPython for \"Python Games in the Browser: Teaching with WebAssembly\".", + "x": "Join Farhaan Bukhsh (@fhackdroid) at EuroPython for \"Python Games in the Browser: Teaching with WebAssembly\". Talk: https://ep2026.europython.eu/LN7EF3", + "linkedin": "Join Farhaan Bukhsh at EuroPython for \"Python Games in the Browser: Teaching with WebAssembly\".", + "bsky": "Join Farhaan Bukhsh (@fhackdroid.bsky.social) at EuroPython for \"Python Games in the Browser: Teaching with WebAssembly\". Talk: https://ep2026.europython.eu/LN7EF3", + "fosstodon": "Join Farhaan Bukhsh at EuroPython for \"Python Games in the Browser: Teaching with WebAssembly\". Talk: https://ep2026.europython.eu/LN7EF3" + } + }, + { + "type": "partner", + "name": "PyData Bydgoszcz", + "image": "https://ep2026.europython.eu/media/sponsors/social-pydatabydgoszcz.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: PyData Bydgoszcz", + "handles": { + "x": "", + "linkedin": "", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to PyData Bydgoszcz for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/PyData-Bydgoszcz/", + "linkedin": "🎉✨ A warm thank you to PyData Bydgoszcz for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/PyData-Bydgoszcz/", + "bsky": "🎉✨ A warm thank you to PyData Bydgoszcz for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/PyData-Bydgoszcz/", + "fosstodon": "🎉✨ A warm thank you to PyData Bydgoszcz for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/PyData-Bydgoszcz/" + } + }, + { + "type": "speaker", + "name": "Felipe Arruda Pontes", + "image": "https://ep2026.europython.eu/media/speakers/social-felipe-arruda-pontes.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Felipe Arruda Pontes — How Python is Democratising Agritech for Farmers Across Europe", + "handles": { + "linkedin": "https://www.linkedin.com/in/felipe-arruda-pontes" + }, + "channel": { + "instagram": "Join Felipe Arruda Pontes at EuroPython for \"How Python is Democratising Agritech for Farmers Across Europe\".", + "x": "Join Felipe Arruda Pontes at EuroPython for \"How Python is Democratising Agritech for Farmers Across Europe\". Talk: https://ep2026.europython.eu/T7ATVM", + "linkedin": "Join Felipe Arruda Pontes at EuroPython for \"How Python is Democratising Agritech for Farmers Across Europe\".", + "bsky": "Join Felipe Arruda Pontes at EuroPython for \"How Python is Democratising Agritech for Farmers Across Europe\". Talk: https://ep2026.europython.eu/T7ATVM", + "fosstodon": "Join Felipe Arruda Pontes at EuroPython for \"How Python is Democratising Agritech for Farmers Across Europe\". Talk: https://ep2026.europython.eu/T7ATVM" + } + }, + { + "type": "speaker", + "name": "Filip Makraduli", + "image": "https://ep2026.europython.eu/media/speakers/social-filip-makraduli.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Filip Makraduli — Self-Hosted Small Models: From OpenAI Lock-In to Open Models", + "handles": {}, + "channel": { + "instagram": "Join Filip Makraduli at EuroPython for \"Self-Hosted Small Models: From OpenAI Lock-In to Open Models\".", + "x": "Join Filip Makraduli at EuroPython for \"Self-Hosted Small Models: From OpenAI Lock-In to Open Models\". Talk: https://ep2026.europython.eu/CWBA3L", + "linkedin": "Join Filip Makraduli at EuroPython for \"Self-Hosted Small Models: From OpenAI Lock-In to Open Models\".", + "bsky": "Join Filip Makraduli at EuroPython for \"Self-Hosted Small Models: From OpenAI Lock-In to Open Models\". Talk: https://ep2026.europython.eu/CWBA3L", + "fosstodon": "Join Filip Makraduli at EuroPython for \"Self-Hosted Small Models: From OpenAI Lock-In to Open Models\". Talk: https://ep2026.europython.eu/CWBA3L" + } + }, + { + "type": "sponsor", + "name": "Numberly", + "image": "https://ep2026.europython.eu/media/sponsors/social-numberly.png", + "alt_text": "Sponsor announcement for EuroPython 2026 conference: Numberly", + "handles": { + "x": "", + "linkedin": "https://www.linkedin.com/company/numberly", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ We are pleased to welcome Numberly as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://numberly.tech/", + "linkedin": "🎉✨ We are pleased to welcome Numberly as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.linkedin.com/company/numberly https://numberly.tech/", + "bsky": "🚀✨ Big shoutout and heartfelt thanks to Numberly for sponsoring EuroPython 2026! Your support is crucial in bringing the European Python 🐍 community closer together. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://numberly.tech/", + "fosstodon": "🎉✨ We are pleased to welcome Numberly as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://numberly.tech/" + } + }, + { + "type": "speaker", + "name": "Florian Freitag", + "image": "https://ep2026.europython.eu/media/speakers/social-florian-freitag.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Florian Freitag — How CPythons Errors keep getting better", + "handles": { + "linkedin": "https://www.linkedin.com/in/flofriday", + "bsky": "@flofriday.bsky.social" + }, + "channel": { + "instagram": "Join Florian Freitag at EuroPython for \"How CPythons Errors keep getting better\".", + "x": "Join Florian Freitag at EuroPython for \"How CPythons Errors keep getting better\". Talk: https://ep2026.europython.eu/DWBGJ9", + "linkedin": "Join Florian Freitag at EuroPython for \"How CPythons Errors keep getting better\".", + "bsky": "Join Florian Freitag (@flofriday.bsky.social) at EuroPython for \"How CPythons Errors keep getting better\". Talk: https://ep2026.europython.eu/DWBGJ9", + "fosstodon": "Join Florian Freitag at EuroPython for \"How CPythons Errors keep getting better\". Talk: https://ep2026.europython.eu/DWBGJ9" + } + }, + { + "type": "partner", + "name": "PyData Kraków", + "image": "https://ep2026.europython.eu/media/sponsors/social-pydatakrk.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: PyData Kraków", + "handles": { + "x": "", + "linkedin": "", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to PyData Kraków for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/PyData-Krakow/", + "linkedin": "🎉✨ A warm thank you to PyData Kraków for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/PyData-Krakow/", + "bsky": "🎉✨ A warm thank you to PyData Kraków for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/PyData-Krakow/", + "fosstodon": "🎉✨ A warm thank you to PyData Kraków for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/PyData-Krakow/" + } + }, + { + "type": "speaker", + "name": "Francesco Lucantoni", + "image": "https://ep2026.europython.eu/media/speakers/social-francesco-lucantoni.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Francesco Lucantoni — Everything you always wanted to know about pandas*", + "handles": { + "linkedin": "https://www.linkedin.com/in/flucantoni" + }, + "channel": { + "instagram": "Join Francesco Lucantoni at EuroPython for \"Everything you always wanted to know about pandas*\".", + "x": "Join Francesco Lucantoni at EuroPython for \"Everything you always wanted to know about pandas*\". Talk: https://ep2026.europython.eu/UGLF7Q", + "linkedin": "Join Francesco Lucantoni at EuroPython for \"Everything you always wanted to know about pandas*\".", + "bsky": "Join Francesco Lucantoni at EuroPython for \"Everything you always wanted to know about pandas*\". Talk: https://ep2026.europython.eu/UGLF7Q", + "fosstodon": "Join Francesco Lucantoni at EuroPython for \"Everything you always wanted to know about pandas*\". Talk: https://ep2026.europython.eu/UGLF7Q" + } + }, + { + "type": "speaker", + "name": "Freya Bruhin", + "image": "https://ep2026.europython.eu/media/speakers/social-freya-bruhin.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Freya Bruhin — Property based testing with Hypothesis", + "handles": { + "x": "@the_compiler", + "bsky": "@the-compiler.org", + "fosstodon": "@the_compiler@mastodon.social" + }, + "channel": { + "instagram": "Join Freya Bruhin at EuroPython for \"Property based testing with Hypothesis\".", + "x": "Join Freya Bruhin (@the_compiler) at EuroPython for \"Property based testing with Hypothesis\". Talk: https://ep2026.europython.eu/NEH7RE", + "linkedin": "Join Freya Bruhin at EuroPython for \"Property based testing with Hypothesis\".", + "bsky": "Join Freya Bruhin (@the-compiler.org) at EuroPython for \"Property based testing with Hypothesis\". Talk: https://ep2026.europython.eu/NEH7RE", + "fosstodon": "Join Freya Bruhin (@the_compiler@mastodon.social) at EuroPython for \"Property based testing with Hypothesis\". talk: https://ep2026.europython.eu/NEH7RE" + } + }, + { + "type": "sponsor", + "name": "Optiver", + "image": "https://ep2026.europython.eu/media/sponsors/social-optiver.png", + "alt_text": "Sponsor announcement for EuroPython 2026 conference: Optiver", + "handles": { + "x": "@OptiverGlobal", + "linkedin": "https://www.linkedin.com/company/optiver", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ We are pleased to welcome Optiver as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 @OptiverGlobal https://optiver.com/", + "linkedin": "🚀✨ Big shoutout and heartfelt thanks to Optiver for sponsoring EuroPython 2026! Your support is crucial in bringing the European Python 🐍 community closer together. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌https://www.linkedin.com/company/optiver https://optiver.com/", + "bsky": "🎉✨ A big thank you to Optiver for joining us as a sponsor for EuroPython 2026! Your support is making a huge impact. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://optiver.com/", + "fosstodon": "🚀✨ A huge thank you to Optiver for sponsoring EuroPython 2026! Your support helps make this event extraordinary. 🙌 https://optiver.com/" + } + }, + { + "type": "speaker", + "name": "Fridtjof Stoldt", + "image": "https://ep2026.europython.eu/media/speakers/social-fridtjof-stoldt.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Fridtjof Stoldt — Immutability: Fast and Safe sharing of Data across Subinterpreters", + "handles": { + "linkedin": "https://www.linkedin.com/in/fridtjof-stoldt" + }, + "channel": { + "instagram": "Join Fridtjof Stoldt at EuroPython for \"Immutability: Fast and Safe sharing of Data across Subinterpreters\".", + "x": "Join Fridtjof Stoldt at EuroPython for \"Immutability: Fast and Safe sharing of Data across Subinterpreters\". Talk: https://ep2026.europython.eu/GEJAQW", + "linkedin": "Join Fridtjof Stoldt at EuroPython for \"Immutability: Fast and Safe sharing of Data across Subinterpreters\".", + "bsky": "Join Fridtjof Stoldt at EuroPython for \"Immutability: Fast and Safe sharing of Data across Subinterpreters\". Talk: https://ep2026.europython.eu/GEJAQW", + "fosstodon": "Join Fridtjof Stoldt at EuroPython for \"Immutability: Fast and Safe sharing of Data across Subinterpreters\". Talk: https://ep2026.europython.eu/GEJAQW" + } + }, + { + "type": "partner", + "name": "PyData Trójmiasto", + "image": "https://ep2026.europython.eu/media/sponsors/social-pydatatrojmiasto.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: PyData Trójmiasto", + "handles": { + "x": "", + "linkedin": "", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to PyData Trójmiasto for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/PyData-Trojmiasto/", + "linkedin": "🎉✨ A warm thank you to PyData Trójmiasto for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/PyData-Trojmiasto/", + "bsky": "🎉✨ A warm thank you to PyData Trójmiasto for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/PyData-Trojmiasto/", + "fosstodon": "🎉✨ A warm thank you to PyData Trójmiasto for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/PyData-Trojmiasto/" + } + }, + { + "type": "speaker", + "name": "GAFFIOT Jonathan", + "image": "https://ep2026.europython.eu/media/speakers/social-gaffiot-jonathan.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: GAFFIOT Jonathan — Getting out of the testing hell", + "handles": {}, + "channel": { + "instagram": "Join GAFFIOT Jonathan at EuroPython for \"Getting out of the testing hell\".", + "x": "Join GAFFIOT Jonathan at EuroPython for \"Getting out of the testing hell\". Talk: https://ep2026.europython.eu/GCWCEU", + "linkedin": "Join GAFFIOT Jonathan at EuroPython for \"Getting out of the testing hell\".", + "bsky": "Join GAFFIOT Jonathan at EuroPython for \"Getting out of the testing hell\". Talk: https://ep2026.europython.eu/GCWCEU", + "fosstodon": "Join GAFFIOT Jonathan at EuroPython for \"Getting out of the testing hell\". Talk: https://ep2026.europython.eu/GCWCEU" + } + }, + { + "type": "speaker", + "name": "Giovanni Barillari", + "image": "https://ep2026.europython.eu/media/speakers/social-giovanni-barillari.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Giovanni Barillari — Rethinking AsyncIO from scratch for free-threaded Python", + "handles": { + "x": "@gi0baro", + "bsky": "@baro.dev" + }, + "channel": { + "instagram": "Join Giovanni Barillari at EuroPython for \"Rethinking AsyncIO from scratch for free-threaded Python\".", + "x": "Join Giovanni Barillari (@gi0baro) at EuroPython for \"Rethinking AsyncIO from scratch for free-threaded Python\". Talk: https://ep2026.europython.eu/US3W8J", + "linkedin": "Join Giovanni Barillari at EuroPython for \"Rethinking AsyncIO from scratch for free-threaded Python\".", + "bsky": "Join Giovanni Barillari (@baro.dev) at EuroPython for \"Rethinking AsyncIO from scratch for free-threaded Python\". Talk: https://ep2026.europython.eu/US3W8J", + "fosstodon": "Join Giovanni Barillari at EuroPython for \"Rethinking AsyncIO from scratch for free-threaded Python\". Talk: https://ep2026.europython.eu/US3W8J" + } + }, + { + "type": "sponsor", + "name": "pretix", + "image": "https://ep2026.europython.eu/media/sponsors/social-pretix.png", + "alt_text": "Sponsor announcement for EuroPython 2026 conference: pretix", + "handles": { + "x": "", + "linkedin": "https://www.linkedin.com/company/pretix", + "bsky": "", + "fosstodon": "@pretix@pretix.social" + }, + "channel": { + "x": "🎉✨ We are pleased to welcome pretix as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://pretix.eu", + "linkedin": "🎉✨ We are pleased to welcome pretix as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.linkedin.com/company/pretix https://pretix.eu", + "bsky": "🎉✨ A big thank you to pretix for joining us as a sponsor for EuroPython 2026! Your support is making a huge impact. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://pretix.eu", + "fosstodon": "🎉✨ A big thank you to pretix for joining us as a sponsor for EuroPython 2026! Your support is making a huge impact. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 @pretix@pretix.social https://pretix.eu" + } + }, + { + "type": "speaker", + "name": "Gleb Khmyznikov", + "image": "https://ep2026.europython.eu/media/speakers/social-gleb-khmyznikov.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Gleb Khmyznikov — Python on Windows on Arm: Ecosystem Enablement Update", + "handles": { + "x": "@khmyznikov", + "linkedin": "https://www.linkedin.com/in/gleb-khmyznikov-130511128" + }, + "channel": { + "instagram": "Join Gleb Khmyznikov at EuroPython for \"Python on Windows on Arm: Ecosystem Enablement Update\".", + "x": "Join Gleb Khmyznikov (@khmyznikov) at EuroPython for \"Python on Windows on Arm: Ecosystem Enablement Update\". Talk: https://ep2026.europython.eu/QXZMP8", + "linkedin": "Join Gleb Khmyznikov at EuroPython for \"Python on Windows on Arm: Ecosystem Enablement Update\".", + "bsky": "Join Gleb Khmyznikov at EuroPython for \"Python on Windows on Arm: Ecosystem Enablement Update\". Talk: https://ep2026.europython.eu/QXZMP8", + "fosstodon": "Join Gleb Khmyznikov at EuroPython for \"Python on Windows on Arm: Ecosystem Enablement Update\". Talk: https://ep2026.europython.eu/QXZMP8" + } + }, + { + "type": "partner", + "name": "PyGda", + "image": "https://ep2026.europython.eu/media/sponsors/social-pygda.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: PyGda", + "handles": { + "x": "", + "linkedin": "", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to PyGda for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pygda.pl/", + "linkedin": "🎉✨ A warm thank you to PyGda for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pygda.pl/", + "bsky": "🎉✨ A warm thank you to PyGda for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pygda.pl/", + "fosstodon": "🎉✨ A warm thank you to PyGda for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pygda.pl/" + } + }, + { + "type": "speaker", + "name": "Goutam Tiwari", + "image": "https://ep2026.europython.eu/media/speakers/social-goutam-tiwari.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Goutam Tiwari — I Accidentally Built a Monitoring System While Trying to Debug Memory Leak", + "handles": { + "linkedin": "https://www.linkedin.com/in/goutam-tiwari" + }, + "channel": { + "instagram": "Join Goutam Tiwari at EuroPython for \"I Accidentally Built a Monitoring System While Trying to Debug Memory Leak\".", + "x": "Join Goutam Tiwari at EuroPython for \"I Accidentally Built a Monitoring System While Trying to Debug Memory Leak\". Talk: https://ep2026.europython.eu/VSZSMW", + "linkedin": "Join Goutam Tiwari at EuroPython for \"I Accidentally Built a Monitoring System While Trying to Debug Memory Leak\".", + "bsky": "Join Goutam Tiwari at EuroPython for \"I Accidentally Built a Monitoring System While Trying to Debug Memory Leak\". Talk: https://ep2026.europython.eu/VSZSMW", + "fosstodon": "Join Goutam Tiwari at EuroPython for \"I Accidentally Built a Monitoring System While Trying to Debug Memory Leak\". Talk: https://ep2026.europython.eu/VSZSMW" + } + }, + { + "type": "speaker", + "name": "Gracjan Adamus", + "image": "https://ep2026.europython.eu/media/speakers/social-gracjan-adamus.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Gracjan Adamus — PyPartMC: A Pythonic interface enhancing Fortran-based simulation package", + "handles": { + "linkedin": "https://www.linkedin.com/in/gracjan-adamus" + }, + "channel": { + "instagram": "Join Gracjan Adamus at EuroPython for \"PyPartMC: A Pythonic interface enhancing Fortran-based simulation package\".", + "x": "Join Gracjan Adamus at EuroPython for \"PyPartMC: A Pythonic interface enhancing Fortran-based simulation package\". Talk: https://ep2026.europython.eu/U7AHP3", + "linkedin": "Join Gracjan Adamus at EuroPython for \"PyPartMC: A Pythonic interface enhancing Fortran-based simulation package\".", + "bsky": "Join Gracjan Adamus at EuroPython for \"PyPartMC: A Pythonic interface enhancing Fortran-based simulation package\". Talk: https://ep2026.europython.eu/U7AHP3", + "fosstodon": "Join Gracjan Adamus at EuroPython for \"PyPartMC: A Pythonic interface enhancing Fortran-based simulation package\". Talk: https://ep2026.europython.eu/U7AHP3" + } + }, + { + "type": "sponsor", + "name": "Revolut", + "image": "https://ep2026.europython.eu/media/sponsors/social-revolut.png", + "alt_text": "Sponsor announcement for EuroPython 2026 conference: Revolut", + "handles": { + "x": "@Revolut", + "linkedin": "https://www.linkedin.com/company/revolut", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ We are pleased to welcome Revolut as a sponsor for EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 @Revolut https://www.revolut.com/", + "linkedin": "🚀✨ A huge thank you to Revolut for sponsoring EuroPython 2026! Your support helps make this event extraordinary. 🙌 https://www.linkedin.com/company/revolut https://www.revolut.com/", + "bsky": "🎉✨ Thank you to Revolut for sponsoring EuroPython 2026! Your support is making a huge difference. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.revolut.com/", + "fosstodon": "🚀✨ Big shoutout and heartfelt thanks to Revolut for sponsoring EuroPython 2026! Your support is crucial in bringing the European Python 🐍 community closer together. We are so grateful for your sponsorship and are thrilled to have you with us. 🙌 https://www.revolut.com/" + } + }, + { + "type": "speaker", + "name": "Grzegorz Bokota", + "image": "https://ep2026.europython.eu/media/speakers/social-grzegorz-bokota.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Grzegorz Bokota — Plugins in python - how it is done", + "handles": { + "linkedin": "https://www.linkedin.com/in/grzegorz-bokota-765682243", + "bsky": "@czaki-pl.bsky.social", + "fosstodon": "@czaki@fostodon.org" + }, + "channel": { + "instagram": "Join Grzegorz Bokota at EuroPython for \"Plugins in python - how it is done\".", + "x": "Join Grzegorz Bokota at EuroPython for \"Plugins in python - how it is done\". Talk: https://ep2026.europython.eu/SGM9SV", + "linkedin": "Join Grzegorz Bokota at EuroPython for \"Plugins in python - how it is done\".", + "bsky": "Join Grzegorz Bokota (@czaki-pl.bsky.social) at EuroPython for \"Plugins in python - how it is done\". Talk: https://ep2026.europython.eu/SGM9SV", + "fosstodon": "Join Grzegorz Bokota (@czaki@fostodon.org) at EuroPython for \"Plugins in python - how it is done\". talk: https://ep2026.europython.eu/SGM9SV" + } + }, + { + "type": "partner", + "name": "Pykonik", + "image": "https://ep2026.europython.eu/media/sponsors/social-pykonik.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: Pykonik", + "handles": { + "x": "", + "linkedin": "", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to Pykonik for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.pykonik.org/", + "linkedin": "🎉✨ A warm thank you to Pykonik for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.pykonik.org/", + "bsky": "🎉✨ A warm thank you to Pykonik for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.pykonik.org/", + "fosstodon": "🎉✨ A warm thank you to Pykonik for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.pykonik.org/" + } + }, + { + "type": "speaker", + "name": "Grzegorz Kocjan", + "image": "https://ep2026.europython.eu/media/speakers/social-grzegorz-kocjan.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Grzegorz Kocjan — The hardest test suite I ever built - a pytest case study", + "handles": { + "linkedin": "https://www.linkedin.com/in/grzegorzkocjan" + }, + "channel": { + "instagram": "Join Grzegorz Kocjan at EuroPython for \"The hardest test suite I ever built - a pytest case study\".", + "x": "Join Grzegorz Kocjan at EuroPython for \"The hardest test suite I ever built - a pytest case study\". Talk: https://ep2026.europython.eu/TWBDVZ", + "linkedin": "Join Grzegorz Kocjan at EuroPython for \"The hardest test suite I ever built - a pytest case study\".", + "bsky": "Join Grzegorz Kocjan at EuroPython for \"The hardest test suite I ever built - a pytest case study\". Talk: https://ep2026.europython.eu/TWBDVZ", + "fosstodon": "Join Grzegorz Kocjan at EuroPython for \"The hardest test suite I ever built - a pytest case study\". Talk: https://ep2026.europython.eu/TWBDVZ" + } + }, + { + "type": "speaker", + "name": "Ivan Markeev", + "image": "https://ep2026.europython.eu/media/speakers/social-ivan-markeev.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Ivan Markeev — Scaling Python Systems by Designing Team-Aware Architecture", + "handles": { + "linkedin": "https://www.linkedin.com/in/markeyev" + }, + "channel": { + "instagram": "Join Ivan Markeev at EuroPython for \"Scaling Python Systems by Designing Team-Aware Architecture\".", + "x": "Join Ivan Markeev at EuroPython for \"Scaling Python Systems by Designing Team-Aware Architecture\". Talk: https://ep2026.europython.eu/QT97WA", + "linkedin": "Join Ivan Markeev at EuroPython for \"Scaling Python Systems by Designing Team-Aware Architecture\".", + "bsky": "Join Ivan Markeev at EuroPython for \"Scaling Python Systems by Designing Team-Aware Architecture\". Talk: https://ep2026.europython.eu/QT97WA", + "fosstodon": "Join Ivan Markeev at EuroPython for \"Scaling Python Systems by Designing Team-Aware Architecture\". Talk: https://ep2026.europython.eu/QT97WA" + } + }, + { + "type": "speaker", + "name": "Ivana Kellyer", + "image": "https://ep2026.europython.eu/media/speakers/social-ivana-kellyer.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Ivana Kellyer — How to Maintain 60 Integrations and Not Go Bananas", + "handles": { + "linkedin": "https://www.linkedin.com/in/ivana-kellyer", + "bsky": "@jenxness.bsky.social", + "fosstodon": "@jenx@hachyderm.io" + }, + "channel": { + "instagram": "Join Ivana Kellyer at EuroPython for \"How to Maintain 60 Integrations and Not Go Bananas\".", + "x": "Join Ivana Kellyer at EuroPython for \"How to Maintain 60 Integrations and Not Go Bananas\". Talk: https://ep2026.europython.eu/H7DVRJ", + "linkedin": "Join Ivana Kellyer at EuroPython for \"How to Maintain 60 Integrations and Not Go Bananas\".", + "bsky": "Join Ivana Kellyer (@jenxness.bsky.social) at EuroPython for \"How to Maintain 60 Integrations and Not Go Bananas\". Talk: https://ep2026.europython.eu/H7DVRJ", + "fosstodon": "Join Ivana Kellyer (@jenx@hachyderm.io) at EuroPython for \"How to Maintain 60 Integrations and Not Go Bananas\". talk: https://ep2026.europython.eu/H7DVRJ" + } + }, + { + "type": "partner", + "name": "PyLadiesCon", + "image": "https://ep2026.europython.eu/media/sponsors/social-pyladiescon.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: PyLadiesCon", + "handles": { + "x": "@pyladiescon", + "linkedin": "https://www.linkedin.com/company/pyladiescon", + "bsky": "@pyladiescon.bsky.social", + "fosstodon": "@pyladiescon@fosstodon.org" + }, + "channel": { + "x": "🎉✨ A warm thank you to PyLadiesCon for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 @pyladiescon https://conference.pyladies.com/", + "linkedin": "🎉✨ A warm thank you to PyLadiesCon for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.linkedin.com/company/pyladiescon https://conference.pyladies.com/", + "bsky": "🎉✨ A warm thank you to PyLadiesCon for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 @pyladiescon.bsky.social https://conference.pyladies.com/", + "fosstodon": "🎉✨ A warm thank you to PyLadiesCon for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 @pyladiescon@fosstodon.org https://conference.pyladies.com/" + } + }, + { + "type": "speaker", + "name": "Jan Bjørge", + "image": "https://ep2026.europython.eu/media/speakers/social-jan-bjorge.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Jan Bjørge — PgQueuer: Drop the Broker, Keep the Queue", + "handles": {}, + "channel": { + "instagram": "Join Jan Bjørge at EuroPython for \"PgQueuer: Drop the Broker, Keep the Queue\".", + "x": "Join Jan Bjørge at EuroPython for \"PgQueuer: Drop the Broker, Keep the Queue\". Talk: https://ep2026.europython.eu/RMY7Y7", + "linkedin": "Join Jan Bjørge at EuroPython for \"PgQueuer: Drop the Broker, Keep the Queue\".", + "bsky": "Join Jan Bjørge at EuroPython for \"PgQueuer: Drop the Broker, Keep the Queue\". Talk: https://ep2026.europython.eu/RMY7Y7", + "fosstodon": "Join Jan Bjørge at EuroPython for \"PgQueuer: Drop the Broker, Keep the Queue\". Talk: https://ep2026.europython.eu/RMY7Y7" + } + }, + { + "type": "speaker", + "name": "Jan Koprowski", + "image": "https://ep2026.europython.eu/media/speakers/social-jan-koprowski.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Jan Koprowski — How we write unit test in my team in Openchip", + "handles": { + "linkedin": "https://www.linkedin.com/in/jankoprowski" + }, + "channel": { + "instagram": "Join Jan Koprowski at EuroPython for \"How we write unit test in my team in Openchip\".", + "x": "Join Jan Koprowski at EuroPython for \"How we write unit test in my team in Openchip\". Talk: https://ep2026.europython.eu/9URK9U", + "linkedin": "Join Jan Koprowski at EuroPython for \"How we write unit test in my team in Openchip\".", + "bsky": "Join Jan Koprowski at EuroPython for \"How we write unit test in my team in Openchip\". Talk: https://ep2026.europython.eu/9URK9U", + "fosstodon": "Join Jan Koprowski at EuroPython for \"How we write unit test in my team in Openchip\". Talk: https://ep2026.europython.eu/9URK9U" + } + }, + { + "type": "speaker", + "name": "Jan Musílek", + "image": "https://ep2026.europython.eu/media/speakers/social-jan-musilek.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Jan Musílek — Breaking changes – not great, not terrible", + "handles": { + "fosstodon": "@stinovlas@fosstodon.org" + }, + "channel": { + "instagram": "Join Jan Musílek at EuroPython for \"Breaking changes – not great, not terrible\".", + "x": "Join Jan Musílek at EuroPython for \"Breaking changes – not great, not terrible\". Talk: https://ep2026.europython.eu/FBQQXS", + "linkedin": "Join Jan Musílek at EuroPython for \"Breaking changes – not great, not terrible\".", + "bsky": "Join Jan Musílek at EuroPython for \"Breaking changes – not great, not terrible\". Talk: https://ep2026.europython.eu/FBQQXS", + "fosstodon": "Join Jan Musílek (@stinovlas@fosstodon.org) at EuroPython for \"Breaking changes – not great, not terrible\". talk: https://ep2026.europython.eu/FBQQXS" + } + }, + { + "type": "partner", + "name": "PyStok", + "image": "https://ep2026.europython.eu/media/sponsors/social-pystok.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: PyStok", + "handles": { + "x": "", + "linkedin": "", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to PyStok for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pystok.org/", + "linkedin": "🎉✨ A warm thank you to PyStok for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pystok.org/", + "bsky": "🎉✨ A warm thank you to PyStok for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pystok.org/", + "fosstodon": "🎉✨ A warm thank you to PyStok for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pystok.org/" + } + }, + { + "type": "speaker", + "name": "Jan Smitka", + "image": "https://ep2026.europython.eu/media/speakers/social-jan-smitka.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Jan Smitka — Faster Django ORM queries for everybody", + "handles": { + "x": "@jansmitka", + "linkedin": "https://www.linkedin.com/in/jansmitka", + "fosstodon": "@jansmitka@fosstodon.org" + }, + "channel": { + "instagram": "Join Jan Smitka at EuroPython for \"Faster Django ORM queries for everybody\".", + "x": "Join Jan Smitka (@jansmitka) at EuroPython for \"Faster Django ORM queries for everybody\". Talk: https://ep2026.europython.eu/BFK3JK", + "linkedin": "Join Jan Smitka at EuroPython for \"Faster Django ORM queries for everybody\".", + "bsky": "Join Jan Smitka at EuroPython for \"Faster Django ORM queries for everybody\". Talk: https://ep2026.europython.eu/BFK3JK", + "fosstodon": "Join Jan Smitka (@jansmitka@fosstodon.org) at EuroPython for \"Faster Django ORM queries for everybody\". talk: https://ep2026.europython.eu/BFK3JK" + } + }, + { + "type": "speaker", + "name": "Jarosław Śmietanka", + "image": "https://ep2026.europython.eu/media/speakers/social-jaroslaw-smietanka.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Jarosław Śmietanka — The Hidden Cost of Complexity: Reducing Cognitive Load in Python", + "handles": { + "linkedin": "https://www.linkedin.com/in/jsmietanka" + }, + "channel": { + "instagram": "Join Jarosław Śmietanka at EuroPython for \"The Hidden Cost of Complexity: Reducing Cognitive Load in Python\".", + "x": "Join Jarosław Śmietanka at EuroPython for \"The Hidden Cost of Complexity: Reducing Cognitive Load in Python\". Talk: https://ep2026.europython.eu/UGM7F8", + "linkedin": "Join Jarosław Śmietanka at EuroPython for \"The Hidden Cost of Complexity: Reducing Cognitive Load in Python\".", + "bsky": "Join Jarosław Śmietanka at EuroPython for \"The Hidden Cost of Complexity: Reducing Cognitive Load in Python\". Talk: https://ep2026.europython.eu/UGM7F8", + "fosstodon": "Join Jarosław Śmietanka at EuroPython for \"The Hidden Cost of Complexity: Reducing Cognitive Load in Python\". Talk: https://ep2026.europython.eu/UGM7F8" + } + }, + { + "type": "speaker", + "name": "Jenny Vega", + "image": "https://ep2026.europython.eu/media/speakers/social-jenny-vega.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Jenny Vega — From Molecules to Models: A Guide to AI Drug Discovery with Python", + "handles": { + "linkedin": "https://www.linkedin.com/in/jennyluciav" + }, + "channel": { + "instagram": "Join Jenny Vega at EuroPython for \"From Molecules to Models: A Guide to AI Drug Discovery with Python\".", + "x": "Join Jenny Vega at EuroPython for \"From Molecules to Models: A Guide to AI Drug Discovery with Python\". Talk: https://ep2026.europython.eu/VNR377", + "linkedin": "Join Jenny Vega at EuroPython for \"From Molecules to Models: A Guide to AI Drug Discovery with Python\".", + "bsky": "Join Jenny Vega at EuroPython for \"From Molecules to Models: A Guide to AI Drug Discovery with Python\". Talk: https://ep2026.europython.eu/VNR377", + "fosstodon": "Join Jenny Vega at EuroPython for \"From Molecules to Models: A Guide to AI Drug Discovery with Python\". Talk: https://ep2026.europython.eu/VNR377" + } + }, + { + "type": "partner", + "name": "Python Ankara", + "image": "https://ep2026.europython.eu/media/sponsors/social-python-ankara.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: Python Ankara", + "handles": { + "x": "", + "linkedin": "https://www.linkedin.com/groups/10081345/", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to Python Ankara for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pythonankara.com/", + "linkedin": "🎉✨ A warm thank you to Python Ankara for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.linkedin.com/groups/10081345/ https://pythonankara.com/", + "bsky": "🎉✨ A warm thank you to Python Ankara for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pythonankara.com/", + "fosstodon": "🎉✨ A warm thank you to Python Ankara for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pythonankara.com/" + } + }, + { + "type": "speaker", + "name": "Johannes Kolbe", + "image": "https://ep2026.europython.eu/media/speakers/social-johannes-kolbe.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Johannes Kolbe — Robot Holmes and the Silenced Witness: A Noir Guide to Real-Time Voice AI", + "handles": { + "bsky": "@johko.bsky.social" + }, + "channel": { + "instagram": "Join Johannes Kolbe at EuroPython for \"Robot Holmes and the Silenced Witness: A Noir Guide to Real-Time Voice AI\".", + "x": "Join Johannes Kolbe at EuroPython for \"Robot Holmes and the Silenced Witness: A Noir Guide to Real-Time Voice AI\". Talk: https://ep2026.europython.eu/LFSJYL", + "linkedin": "Join Johannes Kolbe at EuroPython for \"Robot Holmes and the Silenced Witness: A Noir Guide to Real-Time Voice AI\".", + "bsky": "Join Johannes Kolbe (@johko.bsky.social) at EuroPython for \"Robot Holmes and the Silenced Witness: A Noir Guide to Real-Time Voice AI\". Talk: https://ep2026.europython.eu/LFSJYL", + "fosstodon": "Join Johannes Kolbe at EuroPython for \"Robot Holmes and the Silenced Witness: A Noir Guide to Real-Time Voice AI\". Talk: https://ep2026.europython.eu/LFSJYL" + } + }, + { + "type": "speaker", + "name": "Jon Nordby", + "image": "https://ep2026.europython.eu/media/speakers/social-jon-nordby.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Jon Nordby — Developing IoT sensors with MicroPython", + "handles": {}, + "channel": { + "instagram": "Join Jon Nordby at EuroPython for \"Developing IoT sensors with MicroPython\".", + "x": "Join Jon Nordby at EuroPython for \"Developing IoT sensors with MicroPython\". Talk: https://ep2026.europython.eu/NQGSY7", + "linkedin": "Join Jon Nordby at EuroPython for \"Developing IoT sensors with MicroPython\".", + "bsky": "Join Jon Nordby at EuroPython for \"Developing IoT sensors with MicroPython\". Talk: https://ep2026.europython.eu/NQGSY7", + "fosstodon": "Join Jon Nordby at EuroPython for \"Developing IoT sensors with MicroPython\". Talk: https://ep2026.europython.eu/NQGSY7" + } + }, + { + "type": "speaker", + "name": "Jukka Lehtosalo", + "image": "https://ep2026.europython.eu/media/speakers/social-jukka-lehtosalo.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Jukka Lehtosalo — Speeding Up Python with Free Threading and Mypyc", + "handles": {}, + "channel": { + "instagram": "Join Jukka Lehtosalo at EuroPython for \"Speeding Up Python with Free Threading and Mypyc\".", + "x": "Join Jukka Lehtosalo at EuroPython for \"Speeding Up Python with Free Threading and Mypyc\". Talk: https://ep2026.europython.eu/PWGSJQ", + "linkedin": "Join Jukka Lehtosalo at EuroPython for \"Speeding Up Python with Free Threading and Mypyc\".", + "bsky": "Join Jukka Lehtosalo at EuroPython for \"Speeding Up Python with Free Threading and Mypyc\". Talk: https://ep2026.europython.eu/PWGSJQ", + "fosstodon": "Join Jukka Lehtosalo at EuroPython for \"Speeding Up Python with Free Threading and Mypyc\". Talk: https://ep2026.europython.eu/PWGSJQ" + } + }, + { + "type": "partner", + "name": "Python en Español", + "image": "https://ep2026.europython.eu/media/sponsors/social-hablemospython.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: Python en Español", + "handles": { + "x": "@hablemospython", + "linkedin": "https://www.linkedin.com/company/94153525", + "bsky": "@hablemospython.dev", + "fosstodon": "@hablemospython@fosstodon.org" + }, + "channel": { + "x": "🎉✨ A warm thank you to Python en Español for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 @hablemospython https://hablemospython.dev", + "linkedin": "🎉✨ A warm thank you to Python en Español for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.linkedin.com/company/94153525 https://hablemospython.dev", + "bsky": "🎉✨ A warm thank you to Python en Español for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 @hablemospython.dev https://hablemospython.dev", + "fosstodon": "🎉✨ A warm thank you to Python en Español for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 @hablemospython@fosstodon.org https://hablemospython.dev" + } + }, + { + "type": "speaker", + "name": "Julien Courtès", + "image": "https://ep2026.europython.eu/media/speakers/social-julien-courtes.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Julien Courtès — Designing Performant APIs with Litestar", + "handles": {}, + "channel": { + "instagram": "Join Julien Courtès at EuroPython for \"Designing Performant APIs with Litestar\".", + "x": "Join Julien Courtès at EuroPython for \"Designing Performant APIs with Litestar\". Talk: https://ep2026.europython.eu/ZRWENU", + "linkedin": "Join Julien Courtès at EuroPython for \"Designing Performant APIs with Litestar\".", + "bsky": "Join Julien Courtès at EuroPython for \"Designing Performant APIs with Litestar\". Talk: https://ep2026.europython.eu/ZRWENU", + "fosstodon": "Join Julien Courtès at EuroPython for \"Designing Performant APIs with Litestar\". Talk: https://ep2026.europython.eu/ZRWENU" + } + }, + { + "type": "speaker", + "name": "Julien Lenormand", + "image": "https://ep2026.europython.eu/media/speakers/social-julien-lenormand.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Julien Lenormand — Getting out of the testing hell", + "handles": { + "linkedin": "https://www.linkedin.com/in/julien-lenormand" + }, + "channel": { + "instagram": "Join Julien Lenormand at EuroPython for \"Getting out of the testing hell\".", + "x": "Join Julien Lenormand at EuroPython for \"Getting out of the testing hell\". Talk: https://ep2026.europython.eu/GCWCEU", + "linkedin": "Join Julien Lenormand at EuroPython for \"Getting out of the testing hell\".", + "bsky": "Join Julien Lenormand at EuroPython for \"Getting out of the testing hell\". Talk: https://ep2026.europython.eu/GCWCEU", + "fosstodon": "Join Julien Lenormand at EuroPython for \"Getting out of the testing hell\". Talk: https://ep2026.europython.eu/GCWCEU" + } + }, + { + "type": "speaker", + "name": "Kamil Kulig", + "image": "https://ep2026.europython.eu/media/speakers/social-kamil-kulig.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Kamil Kulig — gRPC for Beginners", + "handles": {}, + "channel": { + "instagram": "Join Kamil Kulig at EuroPython for \"gRPC for Beginners\".", + "x": "Join Kamil Kulig at EuroPython for \"gRPC for Beginners\". Talk: https://ep2026.europython.eu/TGGHKC", + "linkedin": "Join Kamil Kulig at EuroPython for \"gRPC for Beginners\".", + "bsky": "Join Kamil Kulig at EuroPython for \"gRPC for Beginners\". Talk: https://ep2026.europython.eu/TGGHKC", + "fosstodon": "Join Kamil Kulig at EuroPython for \"gRPC for Beginners\". Talk: https://ep2026.europython.eu/TGGHKC" + } + }, + { + "type": "partner", + "name": "Python Łódź", + "image": "https://ep2026.europython.eu/media/sponsors/social-pythonlodz.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: Python Łódź", + "handles": { + "x": "", + "linkedin": "", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to Python Łódź for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/Python-Lodz/", + "linkedin": "🎉✨ A warm thank you to Python Łódź for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/Python-Lodz/", + "bsky": "🎉✨ A warm thank you to Python Łódź for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/Python-Lodz/", + "fosstodon": "🎉✨ A warm thank you to Python Łódź for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.meetup.com/Python-Lodz/" + } + }, + { + "type": "speaker", + "name": "Karen Jex", + "image": "https://ep2026.europython.eu/media/speakers/social-karen-jex.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Karen Jex — How much do you really need to know about Databases?", + "handles": { + "linkedin": "https://www.linkedin.com/in/karenhjex", + "bsky": "@karenhjex.bsky.social", + "fosstodon": "@karenhjex@mastodon.online" + }, + "channel": { + "instagram": "Join Karen Jex at EuroPython for \"How much do you really need to know about Databases?\".", + "x": "Join Karen Jex at EuroPython for \"How much do you really need to know about Databases?\". Talk: https://ep2026.europython.eu/X3ENDU", + "linkedin": "Join Karen Jex at EuroPython for \"How much do you really need to know about Databases?\".", + "bsky": "Join Karen Jex (@karenhjex.bsky.social) at EuroPython for \"How much do you really need to know about Databases?\". Talk: https://ep2026.europython.eu/X3ENDU", + "fosstodon": "Join Karen Jex (@karenhjex@mastodon.online) at EuroPython for \"How much do you really need to know about Databases?\". talk: https://ep2026.europython.eu/X3ENDU" + } + }, + { + "type": "speaker", + "name": "Katie Bickford", + "image": "https://ep2026.europython.eu/media/speakers/social-katie-bickford.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Katie Bickford — Why doing difficult things is good for you and good for your team", + "handles": { + "linkedin": "https://www.linkedin.com/in/katie-bickford-7a9958aa" + }, + "channel": { + "instagram": "Join Katie Bickford at EuroPython for \"Why doing difficult things is good for you and good for your team\".", + "x": "Join Katie Bickford at EuroPython for \"Why doing difficult things is good for you and good for your team\". Talk: https://ep2026.europython.eu/NWLBJC", + "linkedin": "Join Katie Bickford at EuroPython for \"Why doing difficult things is good for you and good for your team\".", + "bsky": "Join Katie Bickford at EuroPython for \"Why doing difficult things is good for you and good for your team\". Talk: https://ep2026.europython.eu/NWLBJC", + "fosstodon": "Join Katie Bickford at EuroPython for \"Why doing difficult things is good for you and good for your team\". Talk: https://ep2026.europython.eu/NWLBJC" + } + }, + { + "type": "speaker", + "name": "Ken Jin", + "image": "https://ep2026.europython.eu/media/speakers/social-ken-jin.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Ken Jin — Inside Python 3.15's JIT Optimizer", + "handles": {}, + "channel": { + "instagram": "Join Ken Jin at EuroPython for \"Inside Python 3.15's JIT Optimizer\".", + "x": "Join Ken Jin at EuroPython for \"Inside Python 3.15's JIT Optimizer\". Talk: https://ep2026.europython.eu/KRMBWS", + "linkedin": "Join Ken Jin at EuroPython for \"Inside Python 3.15's JIT Optimizer\".", + "bsky": "Join Ken Jin at EuroPython for \"Inside Python 3.15's JIT Optimizer\". Talk: https://ep2026.europython.eu/KRMBWS", + "fosstodon": "Join Ken Jin at EuroPython for \"Inside Python 3.15's JIT Optimizer\". Talk: https://ep2026.europython.eu/KRMBWS" + } + }, + { + "type": "partner", + "name": "Python Pizza Warsaw", + "image": "https://ep2026.europython.eu/media/sponsors/social-pythonpizza.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: Python Pizza Warsaw", + "handles": { + "x": "@pythonpizza", + "linkedin": "https://www.linkedin.com/company/98334563", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to Python Pizza Warsaw for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 @pythonpizza https://warsaw.python.pizza/", + "linkedin": "🎉✨ A warm thank you to Python Pizza Warsaw for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://www.linkedin.com/company/98334563 https://warsaw.python.pizza/", + "bsky": "🎉✨ A warm thank you to Python Pizza Warsaw for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://warsaw.python.pizza/", + "fosstodon": "🎉✨ A warm thank you to Python Pizza Warsaw for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://warsaw.python.pizza/" + } + }, + { + "type": "speaker", + "name": "Koudai Aono", + "image": "https://ep2026.europython.eu/media/speakers/social-koudai-aono.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Koudai Aono — Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset", + "handles": { + "linkedin": "https://www.linkedin.com/in/koxudaxi", + "fosstodon": "@koxudaxi@fosstodon.org" + }, + "channel": { + "instagram": "Join Koudai Aono at EuroPython for \"Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset\".", + "x": "Join Koudai Aono at EuroPython for \"Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset\". Talk: https://ep2026.europython.eu/7VKQQM", + "linkedin": "Join Koudai Aono at EuroPython for \"Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset\".", + "bsky": "Join Koudai Aono at EuroPython for \"Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset\". Talk: https://ep2026.europython.eu/7VKQQM", + "fosstodon": "Join Koudai Aono (@koxudaxi@fosstodon.org) at EuroPython for \"Beyond `Optional` in Real-World Projects: Missing, `None`, and Unset\". talk: https://ep2026.europython.eu/7VKQQM" + } + }, + { + "type": "speaker", + "name": "Kuldeep Pisda", + "image": "https://ep2026.europython.eu/media/speakers/social-kuldeep-pisda.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Kuldeep Pisda — Django TDD Patterns: A Visual Field Guide", + "handles": { + "x": "@kdpisda", + "linkedin": "https://www.linkedin.com/in/kuldeep-pisda" + }, + "channel": { + "instagram": "Join Kuldeep Pisda at EuroPython for \"Django TDD Patterns: A Visual Field Guide\".", + "x": "Join Kuldeep Pisda (@kdpisda) at EuroPython for \"Django TDD Patterns: A Visual Field Guide\". Talk: https://ep2026.europython.eu/LNVDY3", + "linkedin": "Join Kuldeep Pisda at EuroPython for \"Django TDD Patterns: A Visual Field Guide\".", + "bsky": "Join Kuldeep Pisda at EuroPython for \"Django TDD Patterns: A Visual Field Guide\". Talk: https://ep2026.europython.eu/LNVDY3", + "fosstodon": "Join Kuldeep Pisda at EuroPython for \"Django TDD Patterns: A Visual Field Guide\". Talk: https://ep2026.europython.eu/LNVDY3" + } + }, + { + "type": "speaker", + "name": "Larry Hastings", + "image": "https://ep2026.europython.eu/media/speakers/social-larry-hastings.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Larry Hastings — Conquer multithreaded Python with Blanket", + "handles": {}, + "channel": { + "instagram": "Join Larry Hastings at EuroPython for \"Conquer multithreaded Python with Blanket\".", + "x": "Join Larry Hastings at EuroPython for \"Conquer multithreaded Python with Blanket\". Talk: https://ep2026.europython.eu/QY7PFR", + "linkedin": "Join Larry Hastings at EuroPython for \"Conquer multithreaded Python with Blanket\".", + "bsky": "Join Larry Hastings at EuroPython for \"Conquer multithreaded Python with Blanket\". Talk: https://ep2026.europython.eu/QY7PFR", + "fosstodon": "Join Larry Hastings at EuroPython for \"Conquer multithreaded Python with Blanket\". Talk: https://ep2026.europython.eu/QY7PFR" + } + }, + { + "type": "partner", + "name": "Python Software Foundation", + "image": "https://ep2026.europython.eu/media/sponsors/social-psf.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: Python Software Foundation", + "handles": { + "x": "", + "linkedin": "", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to Python Software Foundation for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://python.org/", + "linkedin": "🎉✨ A warm thank you to Python Software Foundation for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://python.org/", + "bsky": "🎉✨ A warm thank you to Python Software Foundation for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://python.org/", + "fosstodon": "🎉✨ A warm thank you to Python Software Foundation for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://python.org/" + } + }, + { + "type": "speaker", + "name": "Laura Summers", + "image": "https://ep2026.europython.eu/media/speakers/social-laura-summers.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Laura Summers — The Human-in-the-Loop is Tired", + "handles": { + "linkedin": "https://www.linkedin.com/in/summerscope" + }, + "channel": { + "instagram": "Join Laura Summers at EuroPython for \"The Human-in-the-Loop is Tired\".", + "x": "Join Laura Summers at EuroPython for \"The Human-in-the-Loop is Tired\". Talk: https://ep2026.europython.eu/HJ8KPY", + "linkedin": "Join Laura Summers at EuroPython for \"The Human-in-the-Loop is Tired\".", + "bsky": "Join Laura Summers at EuroPython for \"The Human-in-the-Loop is Tired\". Talk: https://ep2026.europython.eu/HJ8KPY", + "fosstodon": "Join Laura Summers at EuroPython for \"The Human-in-the-Loop is Tired\". Talk: https://ep2026.europython.eu/HJ8KPY" + } + }, + { + "type": "speaker", + "name": "Lokko Joyce Dzifa", + "image": "https://ep2026.europython.eu/media/speakers/social-lokko-joyce-dzifa.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Lokko Joyce Dzifa — The Unseen Pull Request: The Crisis We Don’t Measure", + "handles": { + "x": "@dzifa_lokko", + "linkedin": "https://www.linkedin.com/in/joyce-dzifa-lokko" + }, + "channel": { + "instagram": "Join Lokko Joyce Dzifa at EuroPython for \"The Unseen Pull Request: The Crisis We Don’t Measure\".", + "x": "Join Lokko Joyce Dzifa (@dzifa_lokko) at EuroPython for \"The Unseen Pull Request: The Crisis We Don’t Measure\". Talk: https://ep2026.europython.eu/NS8QQA", + "linkedin": "Join Lokko Joyce Dzifa at EuroPython for \"The Unseen Pull Request: The Crisis We Don’t Measure\".", + "bsky": "Join Lokko Joyce Dzifa at EuroPython for \"The Unseen Pull Request: The Crisis We Don’t Measure\". Talk: https://ep2026.europython.eu/NS8QQA", + "fosstodon": "Join Lokko Joyce Dzifa at EuroPython for \"The Unseen Pull Request: The Crisis We Don’t Measure\". Talk: https://ep2026.europython.eu/NS8QQA" + } + }, + { + "type": "speaker", + "name": "Lysandros Nikolaou", + "image": "https://ep2026.europython.eu/media/speakers/social-lysandros-nikolaou.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Lysandros Nikolaou — Python Dicts: Past, Present, and Free-Threaded Future", + "handles": { + "linkedin": "https://www.linkedin.com/in/lysnikolaou", + "bsky": "@lysnikolaou.com", + "fosstodon": "@lysnikolaou@fosstodon.org" + }, + "channel": { + "instagram": "Join Lysandros Nikolaou at EuroPython for \"Python Dicts: Past, Present, and Free-Threaded Future\".", + "x": "Join Lysandros Nikolaou at EuroPython for \"Python Dicts: Past, Present, and Free-Threaded Future\". Talk: https://ep2026.europython.eu/VKURLV", + "linkedin": "Join Lysandros Nikolaou at EuroPython for \"Python Dicts: Past, Present, and Free-Threaded Future\".", + "bsky": "Join Lysandros Nikolaou (@lysnikolaou.com) at EuroPython for \"Python Dicts: Past, Present, and Free-Threaded Future\". Talk: https://ep2026.europython.eu/VKURLV", + "fosstodon": "Join Lysandros Nikolaou (@lysnikolaou@fosstodon.org) at EuroPython for \"Python Dicts: Past, Present, and Free-Threaded Future\". talk: https://ep2026.europython.eu/VKURLV" + } + }, + { + "type": "partner", + "name": "PyWaw", + "image": "https://ep2026.europython.eu/media/sponsors/social-pywaw.png", + "alt_text": "Partner announcement for EuroPython 2026 conference: PyWaw", + "handles": { + "x": "", + "linkedin": "", + "bsky": "", + "fosstodon": "" + }, + "channel": { + "x": "🎉✨ A warm thank you to PyWaw for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pywaw.org/", + "linkedin": "🎉✨ A warm thank you to PyWaw for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pywaw.org/", + "bsky": "🎉✨ A warm thank you to PyWaw for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pywaw.org/", + "fosstodon": "🎉✨ A warm thank you to PyWaw for supporting EuroPython 2026! We're proud to be a space where communities come together, and we value the opportunity to collaborate with other communities and open-source projects. 🙌 https://pywaw.org/" + } + }, + { + "type": "speaker", + "name": "Maciej Sobczak", + "image": "https://ep2026.europython.eu/media/speakers/social-maciej-sobczak.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Maciej Sobczak — Django’s Magic, FastAPI’s Reality: Test Isolation at Scale", + "handles": {}, + "channel": { + "instagram": "Join Maciej Sobczak at EuroPython for \"Django’s Magic, FastAPI’s Reality: Test Isolation at Scale\".", + "x": "Join Maciej Sobczak at EuroPython for \"Django’s Magic, FastAPI’s Reality: Test Isolation at Scale\". Talk: https://ep2026.europython.eu/YKWMBZ", + "linkedin": "Join Maciej Sobczak at EuroPython for \"Django’s Magic, FastAPI’s Reality: Test Isolation at Scale\".", + "bsky": "Join Maciej Sobczak at EuroPython for \"Django’s Magic, FastAPI’s Reality: Test Isolation at Scale\". Talk: https://ep2026.europython.eu/YKWMBZ", + "fosstodon": "Join Maciej Sobczak at EuroPython for \"Django’s Magic, FastAPI’s Reality: Test Isolation at Scale\". Talk: https://ep2026.europython.eu/YKWMBZ" + } + }, + { + "type": "speaker", + "name": "Mai Giménez", + "image": "https://ep2026.europython.eu/media/speakers/social-mai-gimenez.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Mai Giménez — Let it rip a diffusion tutorial", + "handles": {}, + "channel": { + "instagram": "Join Mai Giménez at EuroPython for \"Let it rip a diffusion tutorial\".", + "x": "Join Mai Giménez at EuroPython for \"Let it rip a diffusion tutorial\". Talk: https://ep2026.europython.eu/ZPCDKE", + "linkedin": "Join Mai Giménez at EuroPython for \"Let it rip a diffusion tutorial\".", + "bsky": "Join Mai Giménez at EuroPython for \"Let it rip a diffusion tutorial\". Talk: https://ep2026.europython.eu/ZPCDKE", + "fosstodon": "Join Mai Giménez at EuroPython for \"Let it rip a diffusion tutorial\". Talk: https://ep2026.europython.eu/ZPCDKE" + } + }, + { + "type": "speaker", + "name": "Malcolm Smith", + "image": "https://ep2026.europython.eu/media/speakers/social-malcolm-smith.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Malcolm Smith — Supporting Android and iOS in your Python package", + "handles": { + "linkedin": "https://www.linkedin.com/in/malcolmhsmith" + }, + "channel": { + "instagram": "Join Malcolm Smith at EuroPython for \"Supporting Android and iOS in your Python package\".", + "x": "Join Malcolm Smith at EuroPython for \"Supporting Android and iOS in your Python package\". Talk: https://ep2026.europython.eu/MP9ZRM", + "linkedin": "Join Malcolm Smith at EuroPython for \"Supporting Android and iOS in your Python package\".", + "bsky": "Join Malcolm Smith at EuroPython for \"Supporting Android and iOS in your Python package\". Talk: https://ep2026.europython.eu/MP9ZRM", + "fosstodon": "Join Malcolm Smith at EuroPython for \"Supporting Android and iOS in your Python package\". Talk: https://ep2026.europython.eu/MP9ZRM" + } + }, + { + "type": "speaker", + "name": "Manivannan Selvaraj", + "image": "https://ep2026.europython.eu/media/speakers/social-manivannan-selvaraj.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Manivannan Selvaraj — From Code Hero to Team Leader: Learning to Let Go", + "handles": { + "x": "@citizenmani", + "linkedin": "https://www.linkedin.com/in/citizenmani" + }, + "channel": { + "instagram": "Join Manivannan Selvaraj at EuroPython for \"From Code Hero to Team Leader: Learning to Let Go\".", + "x": "Join Manivannan Selvaraj (@citizenmani) at EuroPython for \"From Code Hero to Team Leader: Learning to Let Go\". Talk: https://ep2026.europython.eu/WHHAQK", + "linkedin": "Join Manivannan Selvaraj at EuroPython for \"From Code Hero to Team Leader: Learning to Let Go\".", + "bsky": "Join Manivannan Selvaraj at EuroPython for \"From Code Hero to Team Leader: Learning to Let Go\". Talk: https://ep2026.europython.eu/WHHAQK", + "fosstodon": "Join Manivannan Selvaraj at EuroPython for \"From Code Hero to Team Leader: Learning to Let Go\". Talk: https://ep2026.europython.eu/WHHAQK" + } + }, + { + "type": "speaker", + "name": "Marc-André Lemburg", + "image": "https://ep2026.europython.eu/media/speakers/social-marc-andre-lemburg.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Marc-André Lemburg — DuckLake - Take Python and DuckDB for a swim in your data lake", + "handles": { + "linkedin": "https://www.linkedin.com/in/lemburg", + "fosstodon": "@malemburg@mastodon.social" + }, + "channel": { + "instagram": "Join Marc-André Lemburg at EuroPython for \"DuckLake - Take Python and DuckDB for a swim in your data lake\".", + "x": "Join Marc-André Lemburg at EuroPython for \"DuckLake - Take Python and DuckDB for a swim in your data lake\". Talk: https://ep2026.europython.eu/H7KGU3", + "linkedin": "Join Marc-André Lemburg at EuroPython for \"DuckLake - Take Python and DuckDB for a swim in your data lake\".", + "bsky": "Join Marc-André Lemburg at EuroPython for \"DuckLake - Take Python and DuckDB for a swim in your data lake\". Talk: https://ep2026.europython.eu/H7KGU3", + "fosstodon": "Join Marc-André Lemburg (@malemburg@mastodon.social) at EuroPython for \"DuckLake - Take Python and DuckDB for a swim in your data lake\". talk: https://ep2026.europython.eu/H7KGU3" + } + }, + { + "type": "speaker", + "name": "Marcelo Trylesinski", + "image": "https://ep2026.europython.eu/media/speakers/social-marcelo-trylesinski.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Marcelo Trylesinski — What I've Learned Maintaining the MCP Python SDK", + "handles": {}, + "channel": { + "instagram": "Join Marcelo Trylesinski at EuroPython for \"What I've Learned Maintaining the MCP Python SDK\".", + "x": "Join Marcelo Trylesinski at EuroPython for \"What I've Learned Maintaining the MCP Python SDK\". Talk: https://ep2026.europython.eu/BJBKRM", + "linkedin": "Join Marcelo Trylesinski at EuroPython for \"What I've Learned Maintaining the MCP Python SDK\".", + "bsky": "Join Marcelo Trylesinski at EuroPython for \"What I've Learned Maintaining the MCP Python SDK\". Talk: https://ep2026.europython.eu/BJBKRM", + "fosstodon": "Join Marcelo Trylesinski at EuroPython for \"What I've Learned Maintaining the MCP Python SDK\". Talk: https://ep2026.europython.eu/BJBKRM" + } + }, + { + "type": "speaker", + "name": "Marco Grossi", + "image": "https://ep2026.europython.eu/media/speakers/social-marco-grossi.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Marco Grossi — From one to 1 million packet/second: scaling global Internet monitoring", + "handles": {}, + "channel": { + "instagram": "Join Marco Grossi at EuroPython for \"From one to 1 million packet/second: scaling global Internet monitoring\".", + "x": "Join Marco Grossi at EuroPython for \"From one to 1 million packet/second: scaling global Internet monitoring\". Talk: https://ep2026.europython.eu/788XZA", + "linkedin": "Join Marco Grossi at EuroPython for \"From one to 1 million packet/second: scaling global Internet monitoring\".", + "bsky": "Join Marco Grossi at EuroPython for \"From one to 1 million packet/second: scaling global Internet monitoring\". Talk: https://ep2026.europython.eu/788XZA", + "fosstodon": "Join Marco Grossi at EuroPython for \"From one to 1 million packet/second: scaling global Internet monitoring\". Talk: https://ep2026.europython.eu/788XZA" + } + }, + { + "type": "speaker", + "name": "Maria Ashna", + "image": "https://ep2026.europython.eu/media/speakers/social-maria-ashna.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Maria Ashna — Climbing the Pyramid: Behind the Scenes of the Python Package Index", + "handles": { + "linkedin": "https://www.linkedin.com/in/mariaashna" + }, + "channel": { + "instagram": "Join Maria Ashna at EuroPython for \"Climbing the Pyramid: Behind the Scenes of the Python Package Index\".", + "x": "Join Maria Ashna at EuroPython for \"Climbing the Pyramid: Behind the Scenes of the Python Package Index\". Talk: https://ep2026.europython.eu/TAZHCD", + "linkedin": "Join Maria Ashna at EuroPython for \"Climbing the Pyramid: Behind the Scenes of the Python Package Index\".", + "bsky": "Join Maria Ashna at EuroPython for \"Climbing the Pyramid: Behind the Scenes of the Python Package Index\". Talk: https://ep2026.europython.eu/TAZHCD", + "fosstodon": "Join Maria Ashna at EuroPython for \"Climbing the Pyramid: Behind the Scenes of the Python Package Index\". Talk: https://ep2026.europython.eu/TAZHCD" + } + }, + { + "type": "speaker", + "name": "Maria Lowas-Rzechonek", + "image": "https://ep2026.europython.eu/media/speakers/social-maria-lowas-rzechonek.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Maria Lowas-Rzechonek — How to tackle complex authorization logic (and don't go crazy)", + "handles": { + "linkedin": "https://www.linkedin.com/in/maria-lowas-rzechonek-1a215150" + }, + "channel": { + "instagram": "Join Maria Lowas-Rzechonek at EuroPython for \"How to tackle complex authorization logic (and don't go crazy)\".", + "x": "Join Maria Lowas-Rzechonek at EuroPython for \"How to tackle complex authorization logic (and don't go crazy)\". Talk: https://ep2026.europython.eu/PBTPJR", + "linkedin": "Join Maria Lowas-Rzechonek at EuroPython for \"How to tackle complex authorization logic (and don't go crazy)\".", + "bsky": "Join Maria Lowas-Rzechonek at EuroPython for \"How to tackle complex authorization logic (and don't go crazy)\". Talk: https://ep2026.europython.eu/PBTPJR", + "fosstodon": "Join Maria Lowas-Rzechonek at EuroPython for \"How to tackle complex authorization logic (and don't go crazy)\". Talk: https://ep2026.europython.eu/PBTPJR" + } + }, + { + "type": "speaker", + "name": "Mario García", + "image": "https://ep2026.europython.eu/media/speakers/social-mario-garcia.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Mario García — Localization Made Easy: A Pythonic Approach to Global Applications", + "handles": { + "x": "@mariogmd", + "linkedin": "https://www.linkedin.com/in/mariogmd" + }, + "channel": { + "instagram": "Join Mario García at EuroPython for \"Localization Made Easy: A Pythonic Approach to Global Applications\".", + "x": "Join Mario García (@mariogmd) at EuroPython for \"Localization Made Easy: A Pythonic Approach to Global Applications\". Talk: https://ep2026.europython.eu/ETBPVR", + "linkedin": "Join Mario García at EuroPython for \"Localization Made Easy: A Pythonic Approach to Global Applications\".", + "bsky": "Join Mario García at EuroPython for \"Localization Made Easy: A Pythonic Approach to Global Applications\". Talk: https://ep2026.europython.eu/ETBPVR", + "fosstodon": "Join Mario García at EuroPython for \"Localization Made Easy: A Pythonic Approach to Global Applications\". Talk: https://ep2026.europython.eu/ETBPVR" + } + }, + { + "type": "speaker", + "name": "Mateusz Modrzejewski", + "image": "https://ep2026.europython.eu/media/speakers/social-mateusz-modrzejewski.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Mateusz Modrzejewski — How Music Generation Actually Works", + "handles": {}, + "channel": { + "instagram": "Join Mateusz Modrzejewski at EuroPython for \"How Music Generation Actually Works\".", + "x": "Join Mateusz Modrzejewski at EuroPython for \"How Music Generation Actually Works\". Talk: https://ep2026.europython.eu/7SSS93", + "linkedin": "Join Mateusz Modrzejewski at EuroPython for \"How Music Generation Actually Works\".", + "bsky": "Join Mateusz Modrzejewski at EuroPython for \"How Music Generation Actually Works\". Talk: https://ep2026.europython.eu/7SSS93", + "fosstodon": "Join Mateusz Modrzejewski at EuroPython for \"How Music Generation Actually Works\". Talk: https://ep2026.europython.eu/7SSS93" + } + }, + { + "type": "speaker", + "name": "Mateusz Sokół", + "image": "https://ep2026.europython.eu/media/speakers/social-mateusz-sokol.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Mateusz Sokół — Building your DSL compiler in Python", + "handles": { + "linkedin": "https://www.linkedin.com/in/mateusz-sokol" + }, + "channel": { + "instagram": "Join Mateusz Sokół at EuroPython for \"Building your DSL compiler in Python\".", + "x": "Join Mateusz Sokół at EuroPython for \"Building your DSL compiler in Python\". Talk: https://ep2026.europython.eu/SCZ8ZK", + "linkedin": "Join Mateusz Sokół at EuroPython for \"Building your DSL compiler in Python\".", + "bsky": "Join Mateusz Sokół at EuroPython for \"Building your DSL compiler in Python\". Talk: https://ep2026.europython.eu/SCZ8ZK", + "fosstodon": "Join Mateusz Sokół at EuroPython for \"Building your DSL compiler in Python\". Talk: https://ep2026.europython.eu/SCZ8ZK" + } + }, + { + "type": "speaker", + "name": "Michael Seifert", + "image": "https://ep2026.europython.eu/media/speakers/social-michael-seifert.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Michael Seifert — Code organization for non-engineers", + "handles": { + "linkedin": "https://www.linkedin.com/in/seifertm" + }, + "channel": { + "instagram": "Join Michael Seifert at EuroPython for \"Code organization for non-engineers\".", + "x": "Join Michael Seifert at EuroPython for \"Code organization for non-engineers\". Talk: https://ep2026.europython.eu/JRMSZT", + "linkedin": "Join Michael Seifert at EuroPython for \"Code organization for non-engineers\".", + "bsky": "Join Michael Seifert at EuroPython for \"Code organization for non-engineers\". Talk: https://ep2026.europython.eu/JRMSZT", + "fosstodon": "Join Michael Seifert at EuroPython for \"Code organization for non-engineers\". Talk: https://ep2026.europython.eu/JRMSZT" + } + }, + { + "type": "speaker", + "name": "Michał Karzyński", + "image": "https://ep2026.europython.eu/media/speakers/social-michal-karzynski.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Michał Karzyński — Building a Smart Home Device with MicroPython", + "handles": {}, + "channel": { + "instagram": "Join Michał Karzyński at EuroPython for \"Building a Smart Home Device with MicroPython\".", + "x": "Join Michał Karzyński at EuroPython for \"Building a Smart Home Device with MicroPython\". Talk: https://ep2026.europython.eu/BMQP7J", + "linkedin": "Join Michał Karzyński at EuroPython for \"Building a Smart Home Device with MicroPython\".", + "bsky": "Join Michał Karzyński at EuroPython for \"Building a Smart Home Device with MicroPython\". Talk: https://ep2026.europython.eu/BMQP7J", + "fosstodon": "Join Michał Karzyński at EuroPython for \"Building a Smart Home Device with MicroPython\". Talk: https://ep2026.europython.eu/BMQP7J" + } + }, + { + "type": "speaker", + "name": "Mike Fiedler", + "image": "https://ep2026.europython.eu/media/speakers/social-mike-fiedler.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Mike Fiedler — Anatomy of a Phishing Campaign", + "handles": { + "linkedin": "https://www.linkedin.com/in/miketheman", + "bsky": "@miketheman.com", + "fosstodon": "@miketheman@hachyderm.io" + }, + "channel": { + "instagram": "Join Mike Fiedler at EuroPython for \"Anatomy of a Phishing Campaign\".", + "x": "Join Mike Fiedler at EuroPython for \"Anatomy of a Phishing Campaign\". Talk: https://ep2026.europython.eu/NXNHSB", + "linkedin": "Join Mike Fiedler at EuroPython for \"Anatomy of a Phishing Campaign\".", + "bsky": "Join Mike Fiedler (@miketheman.com) at EuroPython for \"Anatomy of a Phishing Campaign\". Talk: https://ep2026.europython.eu/NXNHSB", + "fosstodon": "Join Mike Fiedler (@miketheman@hachyderm.io) at EuroPython for \"Anatomy of a Phishing Campaign\". talk: https://ep2026.europython.eu/NXNHSB" + } + }, + { + "type": "speaker", + "name": "Mike Müller", + "image": "https://ep2026.europython.eu/media/speakers/social-mike-muller.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Mike Müller — Fast Python Development with uv", + "handles": { + "x": "@pyacademy", + "linkedin": "https://www.linkedin.com/in/mike-müller-1937695" + }, + "channel": { + "instagram": "Join Mike Müller at EuroPython for \"Fast Python Development with uv\".", + "x": "Join Mike Müller (@pyacademy) at EuroPython for \"Fast Python Development with uv\". Talk: https://ep2026.europython.eu/RARRL7", + "linkedin": "Join Mike Müller at EuroPython for \"Fast Python Development with uv\".", + "bsky": "Join Mike Müller at EuroPython for \"Fast Python Development with uv\". Talk: https://ep2026.europython.eu/RARRL7", + "fosstodon": "Join Mike Müller at EuroPython for \"Fast Python Development with uv\". Talk: https://ep2026.europython.eu/RARRL7" + } + }, + { + "type": "speaker", + "name": "Mohamed Elmaghraby", + "image": "https://ep2026.europython.eu/media/speakers/social-mohamed-elmaghraby.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Mohamed Elmaghraby — Refactor, Optimize, and Test: Crafting Cleaner Python Code", + "handles": { + "linkedin": "https://www.linkedin.com/in/mohamed-elmaghraby-a6b836127" + }, + "channel": { + "instagram": "Join Mohamed Elmaghraby at EuroPython for \"Refactor, Optimize, and Test: Crafting Cleaner Python Code\".", + "x": "Join Mohamed Elmaghraby at EuroPython for \"Refactor, Optimize, and Test: Crafting Cleaner Python Code\". Talk: https://ep2026.europython.eu/TG7YMS", + "linkedin": "Join Mohamed Elmaghraby at EuroPython for \"Refactor, Optimize, and Test: Crafting Cleaner Python Code\".", + "bsky": "Join Mohamed Elmaghraby at EuroPython for \"Refactor, Optimize, and Test: Crafting Cleaner Python Code\". Talk: https://ep2026.europython.eu/TG7YMS", + "fosstodon": "Join Mohamed Elmaghraby at EuroPython for \"Refactor, Optimize, and Test: Crafting Cleaner Python Code\". Talk: https://ep2026.europython.eu/TG7YMS" + } + }, + { + "type": "speaker", + "name": "Mohit Kumar Vyas", + "image": "https://ep2026.europython.eu/media/speakers/social-mohit-kumar-vyas.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Mohit Kumar Vyas — I Accidentally Built a Monitoring System While Trying to Debug Memory Leak", + "handles": {}, + "channel": { + "instagram": "Join Mohit Kumar Vyas at EuroPython for \"I Accidentally Built a Monitoring System While Trying to Debug Memory Leak\".", + "x": "Join Mohit Kumar Vyas at EuroPython for \"I Accidentally Built a Monitoring System While Trying to Debug Memory Leak\". Talk: https://ep2026.europython.eu/VSZSMW", + "linkedin": "Join Mohit Kumar Vyas at EuroPython for \"I Accidentally Built a Monitoring System While Trying to Debug Memory Leak\".", + "bsky": "Join Mohit Kumar Vyas at EuroPython for \"I Accidentally Built a Monitoring System While Trying to Debug Memory Leak\". Talk: https://ep2026.europython.eu/VSZSMW", + "fosstodon": "Join Mohit Kumar Vyas at EuroPython for \"I Accidentally Built a Monitoring System While Trying to Debug Memory Leak\". Talk: https://ep2026.europython.eu/VSZSMW" + } + }, + { + "type": "speaker", + "name": "Nathan Goldbaum", + "image": "https://ep2026.europython.eu/media/speakers/social-nathan-goldbaum.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Nathan Goldbaum — What every Python developer should know about the CPython ABI", + "handles": {}, + "channel": { + "instagram": "Join Nathan Goldbaum at EuroPython for \"What every Python developer should know about the CPython ABI\".", + "x": "Join Nathan Goldbaum at EuroPython for \"What every Python developer should know about the CPython ABI\". Talk: https://ep2026.europython.eu/ENK9EF", + "linkedin": "Join Nathan Goldbaum at EuroPython for \"What every Python developer should know about the CPython ABI\".", + "bsky": "Join Nathan Goldbaum at EuroPython for \"What every Python developer should know about the CPython ABI\". Talk: https://ep2026.europython.eu/ENK9EF", + "fosstodon": "Join Nathan Goldbaum at EuroPython for \"What every Python developer should know about the CPython ABI\". Talk: https://ep2026.europython.eu/ENK9EF" + } + }, + { + "type": "speaker", + "name": "Nicholas H.Tollervey", + "image": "https://ep2026.europython.eu/media/speakers/social-nicholas-h-tollervey.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Nicholas H.Tollervey — Web Assembly Summit", + "handles": {}, + "channel": { + "instagram": "Join Nicholas H.Tollervey at EuroPython for \"Web Assembly Summit\".", + "x": "Join Nicholas H.Tollervey at EuroPython for \"Web Assembly Summit\". Talk: https://ep2026.europython.eu/BTTFFJ", + "linkedin": "Join Nicholas H.Tollervey at EuroPython for \"Web Assembly Summit\".", + "bsky": "Join Nicholas H.Tollervey at EuroPython for \"Web Assembly Summit\". Talk: https://ep2026.europython.eu/BTTFFJ", + "fosstodon": "Join Nicholas H.Tollervey at EuroPython for \"Web Assembly Summit\". Talk: https://ep2026.europython.eu/BTTFFJ" + } + }, + { + "type": "speaker", + "name": "Nikita Karamov", + "image": "https://ep2026.europython.eu/media/speakers/social-nikita-karamov.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Nikita Karamov — Should you trust Trusted Publishing?", + "handles": { + "linkedin": "https://www.linkedin.com/in/nikitakaramov", + "fosstodon": "@kytta@polymaths.social" + }, + "channel": { + "instagram": "Join Nikita Karamov at EuroPython for \"Should you trust Trusted Publishing?\".", + "x": "Join Nikita Karamov at EuroPython for \"Should you trust Trusted Publishing?\". Talk: https://ep2026.europython.eu/M8Q77Z", + "linkedin": "Join Nikita Karamov at EuroPython for \"Should you trust Trusted Publishing?\".", + "bsky": "Join Nikita Karamov at EuroPython for \"Should you trust Trusted Publishing?\". Talk: https://ep2026.europython.eu/M8Q77Z", + "fosstodon": "Join Nikita Karamov (@kytta@polymaths.social) at EuroPython for \"Should you trust Trusted Publishing?\". talk: https://ep2026.europython.eu/M8Q77Z" + } + }, + { + "type": "speaker", + "name": "Nikita Smirnov", + "image": "https://ep2026.europython.eu/media/speakers/social-nikita-smirnov.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Nikita Smirnov — Fast Multi-Version ETL Pipelines in Python with Generators and functools", + "handles": { + "linkedin": "https://www.linkedin.com/in/nikita-smirnov-20897623b" + }, + "channel": { + "instagram": "Join Nikita Smirnov at EuroPython for \"Fast Multi-Version ETL Pipelines in Python with Generators and functools\".", + "x": "Join Nikita Smirnov at EuroPython for \"Fast Multi-Version ETL Pipelines in Python with Generators and functools\". Talk: https://ep2026.europython.eu/JEN7WA", + "linkedin": "Join Nikita Smirnov at EuroPython for \"Fast Multi-Version ETL Pipelines in Python with Generators and functools\".", + "bsky": "Join Nikita Smirnov at EuroPython for \"Fast Multi-Version ETL Pipelines in Python with Generators and functools\". Talk: https://ep2026.europython.eu/JEN7WA", + "fosstodon": "Join Nikita Smirnov at EuroPython for \"Fast Multi-Version ETL Pipelines in Python with Generators and functools\". Talk: https://ep2026.europython.eu/JEN7WA" + } + }, + { + "type": "speaker", + "name": "Nitish", + "image": "https://ep2026.europython.eu/media/speakers/social-nitish.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Nitish — Beyond the Demo: Production Patterns for Streaming LLM Systems", + "handles": { + "x": "@nitishagar", + "bsky": "@nitishagar.bsky.social" + }, + "channel": { + "instagram": "Join Nitish at EuroPython for \"Beyond the Demo: Production Patterns for Streaming LLM Systems\".", + "x": "Join Nitish (@nitishagar) at EuroPython for \"Beyond the Demo: Production Patterns for Streaming LLM Systems\". Talk: https://ep2026.europython.eu/BYWVNK", + "linkedin": "Join Nitish at EuroPython for \"Beyond the Demo: Production Patterns for Streaming LLM Systems\".", + "bsky": "Join Nitish (@nitishagar.bsky.social) at EuroPython for \"Beyond the Demo: Production Patterns for Streaming LLM Systems\". Talk: https://ep2026.europython.eu/BYWVNK", + "fosstodon": "Join Nitish at EuroPython for \"Beyond the Demo: Production Patterns for Streaming LLM Systems\". Talk: https://ep2026.europython.eu/BYWVNK" + } + }, + { + "type": "speaker", + "name": "Oladapo Jesusemilore Jael", + "image": "https://ep2026.europython.eu/media/speakers/social-oladapo-jesusemilore-jael.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Oladapo Jesusemilore Jael — Python Learning that fits Teen Life", + "handles": {}, + "channel": { + "instagram": "Join Oladapo Jesusemilore Jael at EuroPython for \"Python Learning that fits Teen Life\".", + "x": "Join Oladapo Jesusemilore Jael at EuroPython for \"Python Learning that fits Teen Life\". Talk: https://ep2026.europython.eu/3FW7UF", + "linkedin": "Join Oladapo Jesusemilore Jael at EuroPython for \"Python Learning that fits Teen Life\".", + "bsky": "Join Oladapo Jesusemilore Jael at EuroPython for \"Python Learning that fits Teen Life\". Talk: https://ep2026.europython.eu/3FW7UF", + "fosstodon": "Join Oladapo Jesusemilore Jael at EuroPython for \"Python Learning that fits Teen Life\". Talk: https://ep2026.europython.eu/3FW7UF" + } + }, + { + "type": "speaker", + "name": "Oladapo Kayode Abiodun", + "image": "https://ep2026.europython.eu/media/speakers/social-oladapo-kayode-abiodun.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Oladapo Kayode Abiodun — Heuristic-Rule Based Model for Packet Loss Inference in IIoT Networks", + "handles": { + "x": "@oladapokayodea1", + "linkedin": "https://www.linkedin.com/in/kayodeabiodunoladapo" + }, + "channel": { + "instagram": "Join Oladapo Kayode Abiodun at EuroPython for \"Heuristic-Rule Based Model for Packet Loss Inference in IIoT Networks\".", + "x": "Join Oladapo Kayode Abiodun (@oladapokayodea1) at EuroPython for \"Heuristic-Rule Based Model for Packet Loss Inference in IIoT Networks\". Talk: https://ep2026.europython.eu/33RGZA", + "linkedin": "Join Oladapo Kayode Abiodun at EuroPython for \"Heuristic-Rule Based Model for Packet Loss Inference in IIoT Networks\".", + "bsky": "Join Oladapo Kayode Abiodun at EuroPython for \"Heuristic-Rule Based Model for Packet Loss Inference in IIoT Networks\". Talk: https://ep2026.europython.eu/33RGZA", + "fosstodon": "Join Oladapo Kayode Abiodun at EuroPython for \"Heuristic-Rule Based Model for Packet Loss Inference in IIoT Networks\". Talk: https://ep2026.europython.eu/33RGZA" + } + }, + { + "type": "speaker", + "name": "Olha Poliuliakh", + "image": "https://ep2026.europython.eu/media/speakers/social-olha-poliuliakh.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Olha Poliuliakh — Why Coding Agents Fail at ML (and How to Fix It)", + "handles": { + "linkedin": "https://www.linkedin.com/in/olha-poliuliakh-9166b1313" + }, + "channel": { + "instagram": "Join Olha Poliuliakh at EuroPython for \"Why Coding Agents Fail at ML (and How to Fix It)\".", + "x": "Join Olha Poliuliakh at EuroPython for \"Why Coding Agents Fail at ML (and How to Fix It)\". Talk: https://ep2026.europython.eu/GP39VP", + "linkedin": "Join Olha Poliuliakh at EuroPython for \"Why Coding Agents Fail at ML (and How to Fix It)\".", + "bsky": "Join Olha Poliuliakh at EuroPython for \"Why Coding Agents Fail at ML (and How to Fix It)\". Talk: https://ep2026.europython.eu/GP39VP", + "fosstodon": "Join Olha Poliuliakh at EuroPython for \"Why Coding Agents Fail at ML (and How to Fix It)\". Talk: https://ep2026.europython.eu/GP39VP" + } + }, + { + "type": "speaker", + "name": "Pablo Galindo Salgado", + "image": "https://ep2026.europython.eu/media/speakers/social-pablo-galindo-salgado.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Pablo Galindo Salgado — Lazy imports and the art of interpreter procrastination", + "handles": { + "bsky": "@pablogsal.com" + }, + "channel": { + "instagram": "Join Pablo Galindo Salgado at EuroPython for \"Lazy imports and the art of interpreter procrastination\".", + "x": "Join Pablo Galindo Salgado at EuroPython for \"Lazy imports and the art of interpreter procrastination\". Talk: https://ep2026.europython.eu/RGBSS8", + "linkedin": "Join Pablo Galindo Salgado at EuroPython for \"Lazy imports and the art of interpreter procrastination\".", + "bsky": "Join Pablo Galindo Salgado (@pablogsal.com) at EuroPython for \"Lazy imports and the art of interpreter procrastination\". Talk: https://ep2026.europython.eu/RGBSS8", + "fosstodon": "Join Pablo Galindo Salgado at EuroPython for \"Lazy imports and the art of interpreter procrastination\". Talk: https://ep2026.europython.eu/RGBSS8" + } + }, + { + "type": "speaker", + "name": "Petr Viktorin", + "image": "https://ep2026.europython.eu/media/speakers/social-petr-viktorin.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Petr Viktorin — Python Syntax Diagram", + "handles": { + "fosstodon": "@encukou@mastodon.social" + }, + "channel": { + "instagram": "Join Petr Viktorin at EuroPython for \"Python Syntax Diagram\".", + "x": "Join Petr Viktorin at EuroPython for \"Python Syntax Diagram\". Talk: https://ep2026.europython.eu/8HBEYS", + "linkedin": "Join Petr Viktorin at EuroPython for \"Python Syntax Diagram\".", + "bsky": "Join Petr Viktorin at EuroPython for \"Python Syntax Diagram\". Talk: https://ep2026.europython.eu/8HBEYS", + "fosstodon": "Join Petr Viktorin (@encukou@mastodon.social) at EuroPython for \"Python Syntax Diagram\". talk: https://ep2026.europython.eu/8HBEYS" + } + }, + { + "type": "speaker", + "name": "Piotr Grędowski", + "image": "https://ep2026.europython.eu/media/speakers/social-piotr-gredowski.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Piotr Grędowski — Modern TUI with Textual in Python: Building Monokl", + "handles": { + "x": "@piotrgredowski", + "linkedin": "https://www.linkedin.com/in/piotrgredowski" + }, + "channel": { + "instagram": "Join Piotr Grędowski at EuroPython for \"Modern TUI with Textual in Python: Building Monokl\".", + "x": "Join Piotr Grędowski (@piotrgredowski) at EuroPython for \"Modern TUI with Textual in Python: Building Monokl\". Talk: https://ep2026.europython.eu/LRVCYU", + "linkedin": "Join Piotr Grędowski at EuroPython for \"Modern TUI with Textual in Python: Building Monokl\".", + "bsky": "Join Piotr Grędowski at EuroPython for \"Modern TUI with Textual in Python: Building Monokl\". Talk: https://ep2026.europython.eu/LRVCYU", + "fosstodon": "Join Piotr Grędowski at EuroPython for \"Modern TUI with Textual in Python: Building Monokl\". Talk: https://ep2026.europython.eu/LRVCYU" + } + }, + { + "type": "speaker", + "name": "Piotr Rybak", + "image": "https://ep2026.europython.eu/media/speakers/social-piotr-rybak.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Piotr Rybak — Is Object Detection Dead? A Case for Recognizing LEGO Bricks", + "handles": { + "linkedin": "https://www.linkedin.com/in/piotrrybak" + }, + "channel": { + "instagram": "Join Piotr Rybak at EuroPython for \"Is Object Detection Dead? A Case for Recognizing LEGO Bricks\".", + "x": "Join Piotr Rybak at EuroPython for \"Is Object Detection Dead? A Case for Recognizing LEGO Bricks\". Talk: https://ep2026.europython.eu/RB9TKP", + "linkedin": "Join Piotr Rybak at EuroPython for \"Is Object Detection Dead? A Case for Recognizing LEGO Bricks\".", + "bsky": "Join Piotr Rybak at EuroPython for \"Is Object Detection Dead? A Case for Recognizing LEGO Bricks\". Talk: https://ep2026.europython.eu/RB9TKP", + "fosstodon": "Join Piotr Rybak at EuroPython for \"Is Object Detection Dead? A Case for Recognizing LEGO Bricks\". Talk: https://ep2026.europython.eu/RB9TKP" + } + }, + { + "type": "speaker", + "name": "Raúl Cumplido Domínguez", + "image": "https://ep2026.europython.eu/media/speakers/social-raul-cumplido-dominguez.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Raúl Cumplido Domínguez — Stop Guessing, Start Understanding: How Arrow and Pandas Exchange Data", + "handles": {}, + "channel": { + "instagram": "Join Raúl Cumplido Domínguez at EuroPython for \"Stop Guessing, Start Understanding: How Arrow and Pandas Exchange Data\".", + "x": "Join Raúl Cumplido Domínguez at EuroPython for \"Stop Guessing, Start Understanding: How Arrow and Pandas Exchange Data\". Talk: https://ep2026.europython.eu/ZFJEUJ", + "linkedin": "Join Raúl Cumplido Domínguez at EuroPython for \"Stop Guessing, Start Understanding: How Arrow and Pandas Exchange Data\".", + "bsky": "Join Raúl Cumplido Domínguez at EuroPython for \"Stop Guessing, Start Understanding: How Arrow and Pandas Exchange Data\". Talk: https://ep2026.europython.eu/ZFJEUJ", + "fosstodon": "Join Raúl Cumplido Domínguez at EuroPython for \"Stop Guessing, Start Understanding: How Arrow and Pandas Exchange Data\". Talk: https://ep2026.europython.eu/ZFJEUJ" + } + }, + { + "type": "speaker", + "name": "Reuven M. Lerner", + "image": "https://ep2026.europython.eu/media/speakers/social-reuven-m-lerner.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Reuven M. Lerner — Let's write some decorators!", + "handles": { + "x": "@reuvenmlerner", + "linkedin": "https://www.linkedin.com/in/reuven", + "bsky": "@lernerpython.com", + "fosstodon": "@reuven@fosstodon.org" + }, + "channel": { + "instagram": "Join Reuven M. Lerner at EuroPython for \"Let's write some decorators!\".", + "x": "Join Reuven M. Lerner (@reuvenmlerner) at EuroPython for \"Let's write some decorators!\". Talk: https://ep2026.europython.eu/MENRZG", + "linkedin": "Join Reuven M. Lerner at EuroPython for \"Let's write some decorators!\".", + "bsky": "Join Reuven M. Lerner (@lernerpython.com) at EuroPython for \"Let's write some decorators!\". Talk: https://ep2026.europython.eu/MENRZG", + "fosstodon": "Join Reuven M. Lerner (@reuven@fosstodon.org) at EuroPython for \"Let's write some decorators!\". talk: https://ep2026.europython.eu/MENRZG" + } + }, + { + "type": "speaker", + "name": "Rodrigo Girão Serrão", + "image": "https://ep2026.europython.eu/media/speakers/social-rodrigo-girao-serrao.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Rodrigo Girão Serrão — A tour of the module `itertools`", + "handles": { + "x": "@mathsppblog", + "linkedin": "https://www.linkedin.com/in/rodrigo-girão-serrão", + "bsky": "@mathspp.com", + "fosstodon": "@mathsppblog@fosstodon.org" + }, + "channel": { + "instagram": "Join Rodrigo Girão Serrão at EuroPython for \"A tour of the module `itertools`\".", + "x": "Join Rodrigo Girão Serrão (@mathsppblog) at EuroPython for \"A tour of the module `itertools`\". Talk: https://ep2026.europython.eu/PRGGNW", + "linkedin": "Join Rodrigo Girão Serrão at EuroPython for \"A tour of the module `itertools`\".", + "bsky": "Join Rodrigo Girão Serrão (@mathspp.com) at EuroPython for \"A tour of the module `itertools`\". Talk: https://ep2026.europython.eu/PRGGNW", + "fosstodon": "Join Rodrigo Girão Serrão (@mathsppblog@fosstodon.org) at EuroPython for \"A tour of the module `itertools`\". talk: https://ep2026.europython.eu/PRGGNW" + } + }, + { + "type": "speaker", + "name": "Sangarshanan", + "image": "https://ep2026.europython.eu/media/speakers/social-sangarshanan.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Sangarshanan — Build a Synthesizer with Python", + "handles": {}, + "channel": { + "instagram": "Join Sangarshanan at EuroPython for \"Build a Synthesizer with Python\".", + "x": "Join Sangarshanan at EuroPython for \"Build a Synthesizer with Python\". Talk: https://ep2026.europython.eu/NELACW", + "linkedin": "Join Sangarshanan at EuroPython for \"Build a Synthesizer with Python\".", + "bsky": "Join Sangarshanan at EuroPython for \"Build a Synthesizer with Python\". Talk: https://ep2026.europython.eu/NELACW", + "fosstodon": "Join Sangarshanan at EuroPython for \"Build a Synthesizer with Python\". Talk: https://ep2026.europython.eu/NELACW" + } + }, + { + "type": "speaker", + "name": "Savannah Ostrowski", + "image": "https://ep2026.europython.eu/media/speakers/social-savannah-ostrowski.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Savannah Ostrowski — The coolest feature in Python 3.14: sys.remote_exec()", + "handles": { + "linkedin": "https://www.linkedin.com/in/savannahostrowski", + "bsky": "@savannah.dev", + "fosstodon": "@savannah@fosstodon.org" + }, + "channel": { + "instagram": "Join Savannah Ostrowski at EuroPython for \"The coolest feature in Python 3.14: sys.remote_exec()\".", + "x": "Join Savannah Ostrowski at EuroPython for \"The coolest feature in Python 3.14: sys.remote_exec()\". Talk: https://ep2026.europython.eu/KFQN3X", + "linkedin": "Join Savannah Ostrowski at EuroPython for \"The coolest feature in Python 3.14: sys.remote_exec()\".", + "bsky": "Join Savannah Ostrowski (@savannah.dev) at EuroPython for \"The coolest feature in Python 3.14: sys.remote_exec()\". Talk: https://ep2026.europython.eu/KFQN3X", + "fosstodon": "Join Savannah Ostrowski (@savannah@fosstodon.org) at EuroPython for \"The coolest feature in Python 3.14: sys.remote_exec()\". talk: https://ep2026.europython.eu/KFQN3X" + } + }, + { + "type": "speaker", + "name": "Sebastian Buczyński", + "image": "https://ep2026.europython.eu/media/speakers/social-sebastian-buczynski.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Sebastian Buczyński — Navigating waters of background jobs and queues in Python as of 2026", + "handles": { + "linkedin": "https://www.linkedin.com/in/sebastianbuczynski" + }, + "channel": { + "instagram": "Join Sebastian Buczyński at EuroPython for \"Navigating waters of background jobs and queues in Python as of 2026\".", + "x": "Join Sebastian Buczyński at EuroPython for \"Navigating waters of background jobs and queues in Python as of 2026\". Talk: https://ep2026.europython.eu/TZHTEE", + "linkedin": "Join Sebastian Buczyński at EuroPython for \"Navigating waters of background jobs and queues in Python as of 2026\".", + "bsky": "Join Sebastian Buczyński at EuroPython for \"Navigating waters of background jobs and queues in Python as of 2026\". Talk: https://ep2026.europython.eu/TZHTEE", + "fosstodon": "Join Sebastian Buczyński at EuroPython for \"Navigating waters of background jobs and queues in Python as of 2026\". Talk: https://ep2026.europython.eu/TZHTEE" + } + }, + { + "type": "speaker", + "name": "Sebastian Burzyński", + "image": "https://ep2026.europython.eu/media/speakers/social-sebastian-burzynski.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Sebastian Burzyński — The hidden cost of vibe coding", + "handles": { + "linkedin": "https://www.linkedin.com/in/sebastian-burzynski" + }, + "channel": { + "instagram": "Join Sebastian Burzyński at EuroPython for \"The hidden cost of vibe coding\".", + "x": "Join Sebastian Burzyński at EuroPython for \"The hidden cost of vibe coding\". Talk: https://ep2026.europython.eu/MJTZ7A", + "linkedin": "Join Sebastian Burzyński at EuroPython for \"The hidden cost of vibe coding\".", + "bsky": "Join Sebastian Burzyński at EuroPython for \"The hidden cost of vibe coding\". Talk: https://ep2026.europython.eu/MJTZ7A", + "fosstodon": "Join Sebastian Burzyński at EuroPython for \"The hidden cost of vibe coding\". Talk: https://ep2026.europython.eu/MJTZ7A" + } + }, + { + "type": "speaker", + "name": "Sergi Porta", + "image": "https://ep2026.europython.eu/media/speakers/social-sergi-porta.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Sergi Porta — Surviving LLM Traffic Spikes: Routing, Rate Limits, and Failover in Python", + "handles": { + "linkedin": "https://www.linkedin.com/in/sergi-porta" + }, + "channel": { + "instagram": "Join Sergi Porta at EuroPython for \"Surviving LLM Traffic Spikes: Routing, Rate Limits, and Failover in Python\".", + "x": "Join Sergi Porta at EuroPython for \"Surviving LLM Traffic Spikes: Routing, Rate Limits, and Failover in Python\". Talk: https://ep2026.europython.eu/E3GVVR", + "linkedin": "Join Sergi Porta at EuroPython for \"Surviving LLM Traffic Spikes: Routing, Rate Limits, and Failover in Python\".", + "bsky": "Join Sergi Porta at EuroPython for \"Surviving LLM Traffic Spikes: Routing, Rate Limits, and Failover in Python\". Talk: https://ep2026.europython.eu/E3GVVR", + "fosstodon": "Join Sergi Porta at EuroPython for \"Surviving LLM Traffic Spikes: Routing, Rate Limits, and Failover in Python\". Talk: https://ep2026.europython.eu/E3GVVR" + } + }, + { + "type": "speaker", + "name": "Seth Michael Larson", + "image": "https://ep2026.europython.eu/media/speakers/social-seth-michael-larson.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Seth Michael Larson — Learning from the not-so-secret Python security \"cabal\"", + "handles": { + "linkedin": "https://www.linkedin.com/in/sethmlarson", + "bsky": "@sethmlarson.dev", + "fosstodon": "@sethmlarson@mastodon.social" + }, + "channel": { + "instagram": "Join Seth Michael Larson at EuroPython for \"Learning from the not-so-secret Python security \"cabal\"\".", + "x": "Join Seth Michael Larson at EuroPython for \"Learning from the not-so-secret Python security \"cabal\"\". Talk: https://ep2026.europython.eu/9JALSN", + "linkedin": "Join Seth Michael Larson at EuroPython for \"Learning from the not-so-secret Python security \"cabal\"\".", + "bsky": "Join Seth Michael Larson (@sethmlarson.dev) at EuroPython for \"Learning from the not-so-secret Python security \"cabal\"\". Talk: https://ep2026.europython.eu/9JALSN", + "fosstodon": "Join Seth Michael Larson (@sethmlarson@mastodon.social) at EuroPython for \"Learning from the not-so-secret Python security \"cabal\"\". talk: https://ep2026.europython.eu/9JALSN" + } + }, + { + "type": "speaker", + "name": "Stefanie Molin", + "image": "https://ep2026.europython.eu/media/speakers/social-stefanie-molin.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Stefanie Molin — Process, Analyze, and Transform Python Code with ASTs", + "handles": { + "x": "@stefaniemolin", + "linkedin": "https://www.linkedin.com/in/stefanie-molin", + "bsky": "@stefaniemolin.com" + }, + "channel": { + "instagram": "Join Stefanie Molin at EuroPython for \"Process, Analyze, and Transform Python Code with ASTs\".", + "x": "Join Stefanie Molin (@stefaniemolin) at EuroPython for \"Process, Analyze, and Transform Python Code with ASTs\". Talk: https://ep2026.europython.eu/3TZHB9", + "linkedin": "Join Stefanie Molin at EuroPython for \"Process, Analyze, and Transform Python Code with ASTs\".", + "bsky": "Join Stefanie Molin (@stefaniemolin.com) at EuroPython for \"Process, Analyze, and Transform Python Code with ASTs\". Talk: https://ep2026.europython.eu/3TZHB9", + "fosstodon": "Join Stefanie Molin at EuroPython for \"Process, Analyze, and Transform Python Code with ASTs\". Talk: https://ep2026.europython.eu/3TZHB9" + } + }, + { + "type": "speaker", + "name": "Sviatoslav Sydorenko (Святослав Сидоренко)", + "image": "https://ep2026.europython.eu/media/speakers/social-sviatoslav-sydorenko-sviatoslav-sidorenko.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Sviatoslav Sydorenko (Святослав Сидоренко) — reusable-tox.yml: Five Patterns to Eliminate CI/CD Boilerplate", + "handles": { + "x": "@webknjaz", + "linkedin": "https://www.linkedin.com/in/webknjaz", + "bsky": "@webknjaz.me", + "fosstodon": "@webknjaz@mastodon.social" + }, + "channel": { + "instagram": "Join Sviatoslav Sydorenko (Святослав Сидоренко) at EuroPython for \"reusable-tox.yml: Five Patterns to Eliminate CI/CD Boilerplate\".", + "x": "Join Sviatoslav Sydorenko (Святослав Сидоренко) (@webknjaz) at EuroPython for \"reusable-tox.yml: Five Patterns to Eliminate CI/CD Boilerplate\". Talk: https://ep2026.europython.eu/BX77EE", + "linkedin": "Join Sviatoslav Sydorenko (Святослав Сидоренко) at EuroPython for \"reusable-tox.yml: Five Patterns to Eliminate CI/CD Boilerplate\".", + "bsky": "Join Sviatoslav Sydorenko (Святослав Сидоренко) (@webknjaz.me) at EuroPython for \"reusable-tox.yml: Five Patterns to Eliminate CI/CD Boilerplate\". Talk: https://ep2026.europython.eu/BX77EE", + "fosstodon": "Join Sviatoslav Sydorenko (Святослав Сидоренко) (@webknjaz@mastodon.social) at EuroPython for \"reusable-tox.yml: Five Patterns to Eliminate CI/CD Boilerplate\". talk: https://ep2026.europython.eu/BX77EE" + } + }, + { + "type": "speaker", + "name": "Sylwia Budzynska", + "image": "https://ep2026.europython.eu/media/speakers/social-sylwia-budzynska.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Sylwia Budzynska — Introduction to security research. Find a CVE with CodeQL.", + "handles": { + "x": "@blazingwindsec", + "linkedin": "https://www.linkedin.com/in/sylwia-budzynska", + "fosstodon": "@blazingwind@infosec.exchange" + }, + "channel": { + "instagram": "Join Sylwia Budzynska at EuroPython for \"Introduction to security research. Find a CVE with CodeQL.\".", + "x": "Join Sylwia Budzynska (@blazingwindsec) at EuroPython for \"Introduction to security research. Find a CVE with CodeQL.\". Talk: https://ep2026.europython.eu/ZSRZPC", + "linkedin": "Join Sylwia Budzynska at EuroPython for \"Introduction to security research. Find a CVE with CodeQL.\".", + "bsky": "Join Sylwia Budzynska at EuroPython for \"Introduction to security research. Find a CVE with CodeQL.\". Talk: https://ep2026.europython.eu/ZSRZPC", + "fosstodon": "Join Sylwia Budzynska (@blazingwind@infosec.exchange) at EuroPython for \"Introduction to security research. Find a CVE with CodeQL.\". talk: https://ep2026.europython.eu/ZSRZPC" + } + }, + { + "type": "speaker", + "name": "Thomas Wouters", + "image": "https://ep2026.europython.eu/media/speakers/social-thomas-wouters.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Thomas Wouters — Free-threaded Python: past, present and future", + "handles": { + "linkedin": "https://www.linkedin.com/in/thomas-wouters-3a1241306", + "bsky": "@yhg1s.bsky.social", + "fosstodon": "@yhg1s@social.coop" + }, + "channel": { + "instagram": "Join Thomas Wouters at EuroPython for \"Free-threaded Python: past, present and future\".", + "x": "Join Thomas Wouters at EuroPython for \"Free-threaded Python: past, present and future\". Talk: https://ep2026.europython.eu/Y8QAUA", + "linkedin": "Join Thomas Wouters at EuroPython for \"Free-threaded Python: past, present and future\".", + "bsky": "Join Thomas Wouters (@yhg1s.bsky.social) at EuroPython for \"Free-threaded Python: past, present and future\". Talk: https://ep2026.europython.eu/Y8QAUA", + "fosstodon": "Join Thomas Wouters (@yhg1s@social.coop) at EuroPython for \"Free-threaded Python: past, present and future\". talk: https://ep2026.europython.eu/Y8QAUA" + } + }, + { + "type": "speaker", + "name": "Tobias Wrigstad", + "image": "https://ep2026.europython.eu/media/speakers/social-tobias-wrigstad.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Tobias Wrigstad — Immutability: Fast and Safe sharing of Data across Subinterpreters", + "handles": {}, + "channel": { + "instagram": "Join Tobias Wrigstad at EuroPython for \"Immutability: Fast and Safe sharing of Data across Subinterpreters\".", + "x": "Join Tobias Wrigstad at EuroPython for \"Immutability: Fast and Safe sharing of Data across Subinterpreters\". Talk: https://ep2026.europython.eu/GEJAQW", + "linkedin": "Join Tobias Wrigstad at EuroPython for \"Immutability: Fast and Safe sharing of Data across Subinterpreters\".", + "bsky": "Join Tobias Wrigstad at EuroPython for \"Immutability: Fast and Safe sharing of Data across Subinterpreters\". Talk: https://ep2026.europython.eu/GEJAQW", + "fosstodon": "Join Tobias Wrigstad at EuroPython for \"Immutability: Fast and Safe sharing of Data across Subinterpreters\". Talk: https://ep2026.europython.eu/GEJAQW" + } + }, + { + "type": "speaker", + "name": "Tomas Roun", + "image": "https://ep2026.europython.eu/media/speakers/social-tomas-roun.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Tomas Roun — Become a Python Core Developer in 3 Easy Steps", + "handles": {}, + "channel": { + "instagram": "Join Tomas Roun at EuroPython for \"Become a Python Core Developer in 3 Easy Steps\".", + "x": "Join Tomas Roun at EuroPython for \"Become a Python Core Developer in 3 Easy Steps\". Talk: https://ep2026.europython.eu/B7CMBD", + "linkedin": "Join Tomas Roun at EuroPython for \"Become a Python Core Developer in 3 Easy Steps\".", + "bsky": "Join Tomas Roun at EuroPython for \"Become a Python Core Developer in 3 Easy Steps\". Talk: https://ep2026.europython.eu/B7CMBD", + "fosstodon": "Join Tomas Roun at EuroPython for \"Become a Python Core Developer in 3 Easy Steps\". Talk: https://ep2026.europython.eu/B7CMBD" + } + }, + { + "type": "speaker", + "name": "Vincenzo Ventriglia", + "image": "https://ep2026.europython.eu/media/speakers/social-vincenzo-ventriglia.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Vincenzo Ventriglia — When the Sun Breaks Your GPS: Building an Explainable Early Warning System", + "handles": { + "linkedin": "https://www.linkedin.com/in/vincenzoventriglia" + }, + "channel": { + "instagram": "Join Vincenzo Ventriglia at EuroPython for \"When the Sun Breaks Your GPS: Building an Explainable Early Warning System\".", + "x": "Join Vincenzo Ventriglia at EuroPython for \"When the Sun Breaks Your GPS: Building an Explainable Early Warning System\". Talk: https://ep2026.europython.eu/VXDYGX", + "linkedin": "Join Vincenzo Ventriglia at EuroPython for \"When the Sun Breaks Your GPS: Building an Explainable Early Warning System\".", + "bsky": "Join Vincenzo Ventriglia at EuroPython for \"When the Sun Breaks Your GPS: Building an Explainable Early Warning System\". Talk: https://ep2026.europython.eu/VXDYGX", + "fosstodon": "Join Vincenzo Ventriglia at EuroPython for \"When the Sun Breaks Your GPS: Building an Explainable Early Warning System\". Talk: https://ep2026.europython.eu/VXDYGX" + } + }, + { + "type": "speaker", + "name": "Vinícius Gubiani Ferreira", + "image": "https://ep2026.europython.eu/media/speakers/social-vinicius-gubiani-ferreira.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Vinícius Gubiani Ferreira — Load testing 1-on-1: discovering the limits of your system", + "handles": { + "linkedin": "https://www.linkedin.com/in/vinicius-gubiani-ferreira" + }, + "channel": { + "instagram": "Join Vinícius Gubiani Ferreira at EuroPython for \"Load testing 1-on-1: discovering the limits of your system\".", + "x": "Join Vinícius Gubiani Ferreira at EuroPython for \"Load testing 1-on-1: discovering the limits of your system\". Talk: https://ep2026.europython.eu/N39TFS", + "linkedin": "Join Vinícius Gubiani Ferreira at EuroPython for \"Load testing 1-on-1: discovering the limits of your system\".", + "bsky": "Join Vinícius Gubiani Ferreira at EuroPython for \"Load testing 1-on-1: discovering the limits of your system\". Talk: https://ep2026.europython.eu/N39TFS", + "fosstodon": "Join Vinícius Gubiani Ferreira at EuroPython for \"Load testing 1-on-1: discovering the limits of your system\". Talk: https://ep2026.europython.eu/N39TFS" + } + }, + { + "type": "speaker", + "name": "Vlad-Stefan Harbuz", + "image": "https://ep2026.europython.eu/media/speakers/social-vlad-stefan-harbuz.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Vlad-Stefan Harbuz — Binary Dependencies: Identifying the Hidden Packages We All Depend On", + "handles": { + "bsky": "@vlad.website", + "fosstodon": "@vlad@mastodon.vlad.website" + }, + "channel": { + "instagram": "Join Vlad-Stefan Harbuz at EuroPython for \"Binary Dependencies: Identifying the Hidden Packages We All Depend On\".", + "x": "Join Vlad-Stefan Harbuz at EuroPython for \"Binary Dependencies: Identifying the Hidden Packages We All Depend On\". Talk: https://ep2026.europython.eu/UY9UAG", + "linkedin": "Join Vlad-Stefan Harbuz at EuroPython for \"Binary Dependencies: Identifying the Hidden Packages We All Depend On\".", + "bsky": "Join Vlad-Stefan Harbuz (@vlad.website) at EuroPython for \"Binary Dependencies: Identifying the Hidden Packages We All Depend On\". Talk: https://ep2026.europython.eu/UY9UAG", + "fosstodon": "Join Vlad-Stefan Harbuz (@vlad@mastodon.vlad.website) at EuroPython for \"Binary Dependencies: Identifying the Hidden Packages We All Depend On\". talk: https://ep2026.europython.eu/UY9UAG" + } + }, + { + "type": "speaker", + "name": "Vladimir Slavov", + "image": "https://ep2026.europython.eu/media/speakers/social-vladimir-slavov.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Vladimir Slavov — How to Talk With Your Legal Department About Open Source", + "handles": { + "linkedin": "https://www.linkedin.com/in/vladimir-slavov-🇪🇺-578726180" + }, + "channel": { + "instagram": "Join Vladimir Slavov at EuroPython for \"How to Talk With Your Legal Department About Open Source\".", + "x": "Join Vladimir Slavov at EuroPython for \"How to Talk With Your Legal Department About Open Source\". Talk: https://ep2026.europython.eu/9EFAJS", + "linkedin": "Join Vladimir Slavov at EuroPython for \"How to Talk With Your Legal Department About Open Source\".", + "bsky": "Join Vladimir Slavov at EuroPython for \"How to Talk With Your Legal Department About Open Source\". Talk: https://ep2026.europython.eu/9EFAJS", + "fosstodon": "Join Vladimir Slavov at EuroPython for \"How to Talk With Your Legal Department About Open Source\". Talk: https://ep2026.europython.eu/9EFAJS" + } + }, + { + "type": "speaker", + "name": "Vyron Vasileiadis", + "image": "https://ep2026.europython.eu/media/speakers/social-vyron-vasileiadis.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Vyron Vasileiadis — Learn Quantum Computing with QiliSDK: From Circuits to Pulse-Level Control", + "handles": { + "linkedin": "https://www.linkedin.com/in/fedonman" + }, + "channel": { + "instagram": "Join Vyron Vasileiadis at EuroPython for \"Learn Quantum Computing with QiliSDK: From Circuits to Pulse-Level Control\".", + "x": "Join Vyron Vasileiadis at EuroPython for \"Learn Quantum Computing with QiliSDK: From Circuits to Pulse-Level Control\". Talk: https://ep2026.europython.eu/3FDLUS", + "linkedin": "Join Vyron Vasileiadis at EuroPython for \"Learn Quantum Computing with QiliSDK: From Circuits to Pulse-Level Control\".", + "bsky": "Join Vyron Vasileiadis at EuroPython for \"Learn Quantum Computing with QiliSDK: From Circuits to Pulse-Level Control\". Talk: https://ep2026.europython.eu/3FDLUS", + "fosstodon": "Join Vyron Vasileiadis at EuroPython for \"Learn Quantum Computing with QiliSDK: From Circuits to Pulse-Level Control\". Talk: https://ep2026.europython.eu/3FDLUS" + } + }, + { + "type": "speaker", + "name": "Will Vincent", + "image": "https://ep2026.europython.eu/media/speakers/social-will-vincent.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Will Vincent — Deploying Python Web Apps in 2026", + "handles": { + "linkedin": "https://www.linkedin.com/in/william-s-vincent", + "bsky": "@wsvincent.bsky.social", + "fosstodon": "@wsvincent@fosstodon.org" + }, + "channel": { + "instagram": "Join Will Vincent at EuroPython for \"Deploying Python Web Apps in 2026\".", + "x": "Join Will Vincent at EuroPython for \"Deploying Python Web Apps in 2026\". Talk: https://ep2026.europython.eu/AGX8D9", + "linkedin": "Join Will Vincent at EuroPython for \"Deploying Python Web Apps in 2026\".", + "bsky": "Join Will Vincent (@wsvincent.bsky.social) at EuroPython for \"Deploying Python Web Apps in 2026\". Talk: https://ep2026.europython.eu/AGX8D9", + "fosstodon": "Join Will Vincent (@wsvincent@fosstodon.org) at EuroPython for \"Deploying Python Web Apps in 2026\". talk: https://ep2026.europython.eu/AGX8D9" + } + }, + { + "type": "speaker", + "name": "Wojtek Erbetowski", + "image": "https://ep2026.europython.eu/media/speakers/social-wojtek-erbetowski.png", + "alt_text": "Speaker announcement for EuroPython 2026 conference: Wojtek Erbetowski — You Don't Need to Solve It: What Actually Gets You Hired in Tech", + "handles": { + "linkedin": "https://www.linkedin.com/in/wojtekerbetowski" + }, + "channel": { + "instagram": "Join Wojtek Erbetowski at EuroPython for \"You Don't Need to Solve It: What Actually Gets You Hired in Tech\".", + "x": "Join Wojtek Erbetowski at EuroPython for \"You Don't Need to Solve It: What Actually Gets You Hired in Tech\". Talk: https://ep2026.europython.eu/BPJHWT", + "linkedin": "Join Wojtek Erbetowski at EuroPython for \"You Don't Need to Solve It: What Actually Gets You Hired in Tech\".", + "bsky": "Join Wojtek Erbetowski at EuroPython for \"You Don't Need to Solve It: What Actually Gets You Hired in Tech\". Talk: https://ep2026.europython.eu/BPJHWT", + "fosstodon": "Join Wojtek Erbetowski at EuroPython for \"You Don't Need to Solve It: What Actually Gets You Hired in Tech\". Talk: https://ep2026.europython.eu/BPJHWT" + } + } +]