Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 28 additions & 15 deletions content/events/2026-07-13-europython.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,40 @@
---
title: EuroPython 2026 (placeholder)
date: '2026-07-13'
title: pyOpenSci's Leah Wasser Keynotes at EuroPython 2026
date: '2026-07-15'
excerpt: >
Placeholder for pyOpenSci at EuroPython 2026 in Kraków. Replace with keynote
and session details when the program is confirmed.
image:
src: images/headers/pyopensci-sustainability.png
alt: Decorative pyOpenSci header image
pyOpenSci's Leah Wasser Keynotes at EuroPython 2026 in Kraków — catch Leah Wasser's keynote on
building resilience when things feel hard.
event:
start_date: '2026-07-13'
end_date: '2026-07-19'
start_date: '2026-07-15'
end_date: '2026-07-17'
location: Kraków, Poland
conference: EuroPython 2026
event_type: talk
---

## Details coming soon
EuroPython runs **13–19 July 2026** (tutorials 13–14, conference days 15–17,
sprint weekend 18–19).

EuroPython runs **13–19 July 2026** (tutorials 13–14, conference days
15–17, sprint weekend 18–19). This page is for pyOpenSci's conference
presence — keynote and other sessions during the week.

## Keynote: How to Run 160 KM (100 Miles) — Building Resilience When Things Feel Hard

pyOpenSci's Executive Director and Founder, Leah Wasser will give a keynote talk at EuroPython 2026 in Kraków, Poland on Thursday, July 16th at 16:40–17:25. Her talk is on building resilience when things feel hard. If you are going to be at EuroPython 2026, you won't want to miss it!

* **When:** 16:40–17:25, Thursday 16 July 2026
* **Room:** S1

[View in the schedule](https://ep2026.europython.eu/session/how-to-run-160-km-building-resilience-when-things-feel-hard)

What does running 160km (100 miles) have to do with open source? Everything.
Both demand that you show up consistently, put in the work, and keep moving
forward — even when the path feels uncertain and people tell you it can't be
done. This talk draws on Leah's journey as an ultrarunner, a data-driven
ecologist in a field dominated by traditional fieldwork, and a founder of a
nonprofit that leverages community as both a support system and a powerful
force to tackle hard technical problems. You'll leave with a simple
framework for moving forward when the path is unclear, how to find signal
through noise, and why the people around you are your most powerful
resource.

For the joint EuroPython + EuroSciPy development sprint on **18–19 July**,
see the [EuroPython + EuroSciPy Development Sprint](/events/2026-07-18-europython-euroscipy-development-sprint/).

Update front matter and body when our sessions are announced.
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,33 @@
title: EuroPython + EuroSciPy Development Sprint
date: '2026-07-18'
excerpt: >
Join pyOpenSci contributors for a beginner-friendly development sprint at the
joint EuroPython and EuroSciPy sprint weekend in Kraków.
image:
src: images/events/sprint-scipy-2025.png
alt: pyOpenSci contributors collaborating at a conference sprint table
Join pyOpenSci contributors for a beginner-friendly development sprint
during the EuroPython + EuroSciPy sprint weekend in Kraków.
event:
start_date: '2026-07-18'
end_date: '2026-07-19'
location: Kraków, Poland
conference: EuroPython 2026 + EuroSciPy 2026
conference: EuroPython 2026
event_type: sprint
---

## Details coming soon
## EuroPython + EuroSciPy Development Sprint

The joint EuroPython and EuroSciPy sprint weekend runs **18–19 July 2026**
in Kraków, Poland — the weekend after the main EuroPython conference days.
* **What:** Two-day collaborative development sprint
* **When:** Saturday–Sunday, 18–19 July 2026
* **Where:** EuroPython sprint weekend, Kraków, Poland

Replace this content with sprint schedule, venue, and registration links when
they are published.
Join pyOpenSci contributors for a beginner-friendly sprint during the
EuroPython + EuroSciPy sprint weekend. Ways to get involved:

* Contribute to translation efforts
* Help support and update pyOpenSci infrastructure
* Work through our lessons — find gaps and bugs

For Leah Wasser's keynote and other pyOpenSci sessions during the conference
week, see [pyOpenSci at EuroPython 2026](/events/2026-07-13-europython/).

<figure>
<img src="/images/events/europython-sprint-2026.png"
alt="Three contributors collaborating around laptops at a pyOpenSci development sprint">
</figure>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 11 additions & 0 deletions themes/clean-hugo/assets/css/_blog.scss
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,17 @@
font-size: 0.75rem;
opacity: 0.75;
}

&--solid {
> div:first-of-type {
background: linear-gradient(
to top,
rgba(0, 0, 0, 0.45),
rgba(0, 0, 0, 0.15),
transparent
);
}
}
}

.blog-post__excerpt {
Expand Down
12 changes: 12 additions & 0 deletions themes/clean-hugo/assets/css/_content.scss
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,18 @@
max-width: 65ch; // Optimal reading width
margin: 0 auto; // Center the constrained content

figure {
margin: 1.5rem 0 0;

img {
display: block;
width: 100%;
max-width: 100%;
height: auto;
border-radius: $radius-md;
}
}

// Full-width shortcodes (defined above)
// These will break out of the 65ch constraint when needed
}
Expand Down
85 changes: 85 additions & 0 deletions themes/clean-hugo/assets/css/_events.scss
Original file line number Diff line number Diff line change
Expand Up @@ -464,3 +464,88 @@
padding: 0.2rem 0.5rem;
}
}

/* Upcoming events — event single pages */
.event-upcoming {
margin-top: 3rem;
width: 100%;

&__divider {
margin: 0 0 2rem;
border: 0;
border-top: 1px solid var(--color-gray-200);
}

&__heading {
margin: 0 0 1.25rem;
font-family: $font-family-heading;
font-size: clamp(1.5rem, 3vw, 1.875rem);
font-weight: 700;
line-height: 1.2;
color: var(--color-brand-purple);
}
}

.event-next {
display: block;
width: 100%;
margin-top: 0;
padding: 1.5rem 1.75rem;
border-radius: $radius-lg;
background-color: color-mix(
in srgb,
var(--color-admonition-success) 40%,
var(--color-white)
);
box-shadow: 0 4px 12px -2px
color-mix(in srgb, var(--color-admonition-success) 25%, transparent);

&__inner {
display: flex;
flex-direction: column;
gap: 1.25rem;
align-items: flex-start;

@media (min-width: $breakpoint-md) {
flex-direction: row;
align-items: center;
justify-content: space-between;
gap: 1.75rem;
}
}

&__body {
min-width: 0;
flex: 1 1 auto;
}

&__label {
margin: 0 0 0.35rem;
font-size: 0.9375rem;
font-weight: 600;
line-height: 1.4;
color: var(--color-gray-700);
}

&__title {
margin: 0 0 0.35rem;
font-family: $font-family-heading;
font-size: clamp(1.125rem, 2.5vw, 1.5rem);
font-weight: 700;
line-height: 1.25;
color: var(--color-gray-900);
}

&__excerpt {
margin: 0;
font-size: 0.9375rem;
line-height: 1.5;
color: var(--color-gray-700);
}

&__cta {
flex-shrink: 0;
border-radius: $radius-full;
white-space: nowrap;
}
}
19 changes: 7 additions & 12 deletions themes/clean-hugo/layouts/events/single.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,17 @@
{{ $dateLine = printf "%s · %s" $dateLine . }}
{{ end }}
{{ end }}
{{ $gradientFrom := "#71B3B5" }}
{{ $gradientTo := "#2E6060" }}
{{ $headerColor := "#33205C" }}
{{ if and $e (not .Params.image) }}
{{ $t := lower ($e.event_type | default "") }}
{{ if eq $t "workshop" }}
{{ $gradientFrom = "#71B3B5" }}{{ $gradientTo = "#2E6060" }}
{{ if or (eq $t "training") (eq $t "workshop") }}
{{ $headerColor = "#71B3B5" }}
{{ else if eq $t "community" }}
{{ $gradientFrom = "#AC87A0" }}{{ $gradientTo = "#8B6A8F" }}
{{ $headerColor = "#AC87A0" }}
{{ end }}
{{ end }}
<header class="blog-post__header"{{ if not .Params.image }}
style="background: linear-gradient(135deg, {{ $gradientFrom }} 0%, {{ $gradientTo }} 100%);"
<header class="blog-post__header{{ if not .Params.image }} blog-post__header--solid{{ end }}"{{ if not .Params.image }}
style="background-color: {{ $headerColor }};"
{{ end }}>
{{ $img := partial "get-image.html" (dict "image" .Params.image "fallbackAlt" .Title "page" .) }}
{{ if $img.exists }}
Expand All @@ -35,15 +34,11 @@ <h1>{{ .Title }}</h1>
{{ end }}
</header>
<article class="content-container">
{{ with .Params.excerpt }}
<div class="blog-post__excerpt">
<p>{{ . | markdownify }}</p>
</div>
{{ end }}
<div class="content-main">
{{ .Content }}
{{ partial "event-instructors.html" . }}
{{ partial "learn-more.html" . }}
{{ partial "event-next.html" (dict "Page" .) }}
</div>
<footer class="blog-post__tags">
{{ with .Params.tags }}Tags: {{ range $i, $t := . }}{{ if $i }}, {{ end }}<a href="{{ "/tags/" | relURL }}{{ urlize $t }}">{{ $t }}</a>{{ end }}{{ end }}
Expand Down
54 changes: 54 additions & 0 deletions themes/clean-hugo/layouts/partials/event-next.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
{{/*
Next upcoming event — bottom of event single pages.
Shows the first other event that starts after this one ends and is still
upcoming.

Pass dict:
Page (required): current event page
*/}}
{{ $current := .Page }}
{{ $currentEvent := $current.Params.event }}
{{ if not (and $currentEvent $currentEvent.start_date) }}
{{ return }}
{{ end }}

{{ $today := now.Format "2006-01-02" }}
{{ $currentEnd := $currentEvent.end_date | default $currentEvent.start_date }}
{{ $pages := where $current.Site.RegularPages "Section" "events" }}
{{ $nextEvent := false }}

{{ range (sort $pages "Params.event.start_date" "asc") }}
{{ $e := .Params.event }}
{{ if and $e $e.start_date (ne .RelPermalink $current.RelPermalink) (gt $e.start_date $currentEnd) }}
{{ $end := $e.end_date | default $e.start_date }}
{{ if ge $end $today }}
{{ $nextEvent = . }}
{{ break }}
{{ end }}
{{ end }}
{{ end }}

{{ with $nextEvent }}
<section class="event-upcoming" aria-labelledby="event-upcoming-heading">
<hr class="event-upcoming__divider">
<h2 id="event-upcoming-heading" class="event-upcoming__heading">
Upcoming events
</h2>
<aside class="event-next" aria-labelledby="event-next-title">
<div class="event-next__inner">
<div class="event-next__body">
<p class="event-next__label">
{{ partial "event-date-display.html" (dict "event" .Params.event) }}
</p>
<h3 id="event-next-title" class="event-next__title">{{ .Title }}</h3>
{{ with partial "blog-excerpt.html" (dict "." . "length" 120) }}
<p class="event-next__excerpt">{{ . }}</p>
{{ end }}
</div>
<a class="btn btn--outline btn--lg event-next__cta" href="{{ .RelPermalink }}">
Learn more
</a>
</div>
</aside>
</section>
{{ end }}
Loading