Skip to content

Commit a989175

Browse files
authored
Merge pull request #65 from OurSQLFoundation/community/webinars-section
Add Webinars section under Community
2 parents b236ef2 + e13ed21 commit a989175

17 files changed

Lines changed: 455 additions & 0 deletions

File tree

‎assets/scss/_light-theme.scss‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,36 @@
675675
}
676676
}
677677

678+
// Webinars (Community)
679+
.webinar-empty-state {
680+
background: #ffffff;
681+
border-color: #dde3ed;
682+
p { color: #64748b; a { color: #0272a5; } }
683+
}
684+
685+
.webinar-card {
686+
background: #ffffff;
687+
border-color: #dde3ed;
688+
689+
&:hover { border-color: rgba(0, 200, 255, 0.3); }
690+
}
691+
.webinar-card-image-wrap { background: #eef2f7; border-bottom-color: #dde3ed; }
692+
.webinar-card-status { background: #0f172a; }
693+
.webinar-card-date { color: #0272a5; }
694+
.webinar-card-title { color: #0f172a; }
695+
.webinar-card-speakers { color: #64748b; }
696+
697+
.webinar-header h1 { color: #0f172a; }
698+
.webinar-meta-badge {
699+
color: #0272a5;
700+
background: rgba(0, 200, 255, 0.08);
701+
border-color: rgba(0, 200, 255, 0.3);
702+
}
703+
.webinar-meta-date { color: #64748b; }
704+
.webinar-speaker-name { color: #0f172a; }
705+
a.webinar-speaker-name { color: #0272a5; }
706+
.webinar-speaker-role { color: #64748b; }
707+
678708
// Contribute page
679709
.contribute-method {
680710
background: #ffffff;

‎assets/scss/_webinars.scss‎

Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
// Community > Webinars — list grid + single-page hero, built from the
2+
// site's existing component language (about-page, resources-breadcrumb,
3+
// resources-category-eyebrow, status-chip, post-content) so this reads as
4+
// the same site rather than a bolted-on section.
5+
6+
.webinar-grid {
7+
display: grid;
8+
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
9+
gap: 1.25rem;
10+
margin-top: 1rem;
11+
}
12+
13+
.webinar-empty-state {
14+
margin-top: 1rem;
15+
background: $dark-surface;
16+
border: 1px solid $dark-border;
17+
border-radius: 10px;
18+
padding: 1.5rem 1.75rem;
19+
20+
p {
21+
font-size: 0.9375rem;
22+
color: $muted;
23+
line-height: 1.6;
24+
margin: 0;
25+
26+
a { color: $accent; text-decoration: none; &:hover { text-decoration: underline; } }
27+
}
28+
}
29+
30+
// ── Card (list page) ──
31+
.webinar-card {
32+
display: flex;
33+
flex-direction: column;
34+
background: $dark-card;
35+
border: 1px solid $dark-border;
36+
border-radius: 12px;
37+
overflow: hidden;
38+
text-decoration: none;
39+
transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
40+
41+
&:hover {
42+
border-color: rgba($accent, 0.3);
43+
box-shadow: 0 6px 24px rgba($accent, 0.07);
44+
transform: translateY(-2px);
45+
}
46+
}
47+
48+
.webinar-card-image-wrap {
49+
position: relative;
50+
border-bottom: 1px solid $dark-border;
51+
background: $dark-surface;
52+
}
53+
54+
.webinar-card-image {
55+
display: block;
56+
width: 100%;
57+
height: auto;
58+
aspect-ratio: 1200 / 627;
59+
object-fit: cover;
60+
}
61+
62+
.webinar-card-status {
63+
position: absolute;
64+
top: 0.75rem;
65+
right: 0.75rem;
66+
background: $dark-bg;
67+
}
68+
69+
.webinar-card-body {
70+
padding: 1.25rem 1.25rem 1.5rem;
71+
}
72+
73+
.webinar-card-date {
74+
display: block;
75+
font-size: 0.75rem;
76+
font-weight: 600;
77+
letter-spacing: 0.03em;
78+
color: $accent;
79+
margin-bottom: 0.5rem;
80+
}
81+
82+
.webinar-card-title {
83+
font-size: 1.0625rem;
84+
font-weight: 700;
85+
color: $off-white;
86+
line-height: 1.4;
87+
margin: 0 0 0.5rem;
88+
}
89+
90+
.webinar-card-speakers {
91+
font-size: 0.875rem;
92+
color: $muted;
93+
margin: 0;
94+
}
95+
96+
// ── Single webinar page ──
97+
.webinar-header {
98+
max-width: 720px;
99+
margin-top: 1.5rem;
100+
margin-bottom: 2.5rem;
101+
102+
h1 {
103+
font-size: clamp(1.625rem, 4vw, 2.25rem);
104+
font-weight: 700;
105+
line-height: 1.3;
106+
color: $off-white;
107+
margin: 0 0 1.25rem;
108+
}
109+
}
110+
111+
.webinar-meta-row {
112+
display: flex;
113+
align-items: center;
114+
flex-wrap: wrap;
115+
gap: 0.75rem;
116+
margin-bottom: 1rem;
117+
}
118+
119+
.webinar-meta-badge {
120+
display: inline-flex;
121+
align-items: center;
122+
font-size: 0.75rem;
123+
font-weight: 700;
124+
letter-spacing: 0.05em;
125+
text-transform: uppercase;
126+
color: $accent;
127+
background: $accent-glow;
128+
border: 1px solid rgba($accent, 0.3);
129+
border-radius: 100px;
130+
padding: 0.25rem 0.7rem;
131+
}
132+
133+
.webinar-meta-date {
134+
font-size: 0.875rem;
135+
color: $muted;
136+
font-variant-numeric: tabular-nums;
137+
}
138+
139+
.webinar-speakers {
140+
list-style: none;
141+
margin: 0 0 1.5rem;
142+
padding: 0;
143+
display: flex;
144+
flex-wrap: wrap;
145+
gap: 1rem 2rem;
146+
}
147+
148+
.webinar-speaker {
149+
display: flex;
150+
align-items: center;
151+
gap: 0.75rem;
152+
}
153+
154+
.webinar-speaker-photo {
155+
display: block;
156+
width: 48px;
157+
height: 48px;
158+
border-radius: 50%;
159+
object-fit: cover;
160+
border: 2px solid rgba($accent, 0.4);
161+
flex-shrink: 0;
162+
}
163+
164+
.webinar-speaker-info {
165+
display: flex;
166+
flex-direction: column;
167+
}
168+
169+
.webinar-speaker-name {
170+
font-size: 0.9375rem;
171+
font-weight: 600;
172+
color: $off-white;
173+
text-decoration: none;
174+
}
175+
176+
a.webinar-speaker-name {
177+
color: $accent;
178+
&:hover { text-decoration: underline; }
179+
}
180+
181+
.webinar-speaker-role {
182+
font-size: 0.8125rem;
183+
color: $muted;
184+
}
185+
186+
.webinar-content {
187+
max-width: 720px;
188+
}

‎assets/scss/main.scss‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ img {
3333
@import "about";
3434
@import "news";
3535
@import "community";
36+
@import "webinars";
3637
@import "home";
3738
@import "showcase";
3839
@import "footer";
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
title: "Webinars"
3+
description: "Live sessions with MySQL ecosystem maintainers and practitioners — deep dives, demos, and Q&A, straight from the people who build the tools."
4+
---
156 KB
Loading
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
---
2+
title: "Beyond the Proxy: The Expanding ProxySQL Ecosystem"
3+
description: "ProxySQL has grown well beyond a proxy. René and Alkin cover MySQL and PostgreSQL support, the expansion toward DuckDB, deeper cloud integration, and where Orchestrator and dbdeployer fit in — tied together through real operational problems instead of a feature list."
4+
date: 2026-11-03
5+
time_display: "10:00 AM ET · 16:00 CET"
6+
registration_url: "https://us06web.zoom.us/webinar/register/WN_X82k7xu-STmLLTln6NjTHw"
7+
images:
8+
- banner.jpg
9+
speakers:
10+
- name: "René Cannaò"
11+
role: "CEO, ProxySQL"
12+
photo: "speaker-rene.jpg"
13+
profile: "/resources/member-directory/people/rene-cannao/"
14+
linkedin: "https://www.linkedin.com/in/renecannao/"
15+
- name: "Alkin Tezuysal"
16+
role: "Chief Strategy Officer, ProxySQL"
17+
photo: "speaker-alkin.jpg"
18+
profile: "/resources/member-directory/people/alkin-tezuysal/"
19+
linkedin: "https://www.linkedin.com/in/askdba/"
20+
---
21+
22+
Modern database infrastructure increasingly spans multiple database engines, deployment models, and operational environments. The ProxySQL ecosystem is evolving to address that broader landscape — bringing together database connectivity, traffic management, high availability, testing, and production operations.
23+
24+
René and Alkin walk through the current state and future direction of the ecosystem:
25+
26+
- MySQL and PostgreSQL support
27+
- the expansion toward DuckDB
28+
- deeper integration with cloud platforms and managed environments
29+
- how related projects like Orchestrator and dbdeployer complement it across the database lifecycle
30+
31+
Rather than a catalogue of products and features, the session connects these pieces through real operational challenges — you'll leave with a clear picture of how they fit together, which problems each one addresses, and how ProxySQL is evolving beyond the traditional boundaries of a database proxy.
16.2 KB
Loading
8.75 KB
Loading
150 KB
Loading
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
---
2+
title: "MySQL Time Travel: Practical Row-Level Recovery With Open Source Tools"
3+
description: "A bad UPDATE hit a handful of rows. Do you really need to restore a full backup and replay binlogs? In a mostly live demo, Daniel shows how to see exactly which rows changed, query any table as it looked at a past moment, and generate the exact statements to undo the damage."
4+
date: 2026-10-15
5+
time_display: "10:00 AM ET · 16:00 CEST"
6+
registration_url: "https://us06web.zoom.us/webinar/register/WN_AYk4qjMBTU2ofrY_hkpXvQ"
7+
images:
8+
- banner.jpg
9+
speakers:
10+
- name: "Daniel Guzmán Burgos"
11+
role: "Creator of dbtrail"
12+
photo: "speaker-daniel.jpg"
13+
profile: "/resources/member-directory/people/daniel-guzman-burgos/"
14+
linkedin: "https://www.linkedin.com/in/danielmauricioguzman/"
15+
---
16+
17+
Recovering from a bad `UPDATE` or `DELETE` in MySQL is disproportionately expensive: restore a backup and replay binlogs, or hand-parse `mysqlbinlog` output and reconstruct the reversal manually. Both take hours for incidents that touched a handful of rows.
18+
19+
This session shows a faster workflow using [dbtrail](https://dbtrail.com), an open source (Apache 2.0) tool that captures every row change from the binlog and makes it queryable — in a mostly live demo, on a real schema, with a real mistake and a real recovery.
20+
21+
Step by step, Daniel shows how to:
22+
23+
- identify which rows changed and when
24+
- inspect full before-and-after images of each change
25+
- query any table **as of** a past timestamp, using plain SQL
26+
- generate the exact reversal statements for the incident — including changes propagated through FK cascades, which manual binlog parsing usually gets wrong
27+
28+
He'll also cover verifying that the captured history matches the source — a check worth running before trusting any of it for recovery.
29+
30+
Capture works over the replication protocol, so the same setup runs on-premises and on RDS or Aurora, where binlog files on disk aren't accessible. Deployment is Docker Compose, and everything shown is reproducible on a test instance.

0 commit comments

Comments
 (0)