Skip to content

Commit 918a2b4

Browse files
committed
feat: update event details for February 19, 2026, and enhance event generation scripts
1 parent 90a68bc commit 918a2b4

7 files changed

Lines changed: 201 additions & 12 deletions

File tree

_events/2026-02-19.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ title: "Evolving Modular Monoliths with architectural fitness functions"
44
speakers:
55
- Tim Paulus
66
- Patrick Säuerl
7-
InPersonLink:
7+
InPersonLink: https://www.meetup.com/dotnet-austria/events/313068818
88
RemoteLink:
99
RecordingLink:
1010
Registrations:

_temp/2026-02-19.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
This event is for people who join the event in person at TechTalk (https://techtalk.at/).
2+
3+
If you join the event remotely, please RSVP here: null
4+
5+
This meetup is organized by DotNetDevs.at (https://dotnetdevs.at/).
6+
7+
Abstract
8+
In this talk, Patrick Säuerl (Tech Lead/Architect) and Tim Paulus (Developer) will share their journey of evolving a software project towards a modular monolith with consistent layering.
9+
The system started over 10 years ago as a monolith, and many teams have developed within it, adding their flavors and understanding of the architectural patterns and the architecture trends at that time.
10+
This has led to maintenance issues and unclear guidance for new developers.
11+
We tackled parts of this by introducing tests that ensure the layering of vertical slices is consistent.
12+
13+
Our solution is based on the following approaches:
14+
* Fitness Functions from Evolutionary Architecture
15+
* Ports & Adapters and Layered Architecture
16+
* Approval Testing
17+
* Architecture Tests
18+
19+
We will cover these topics and the ideas we borrowed from them.
20+
21+
The talk will also focus on the dynamics that these tests initiated within the team and another contributing team, leading to fruitful discussions, better shared understanding of the technical vision, and clear refactoring targets for developers.
22+
23+
24+
About Tim Paulus:
25+
As a developer, Tim faces the typical challenge of inheriting a software project with proven business value in its domain, yet needing to transform its architecture to meet new technical and organizational requirements.
26+
27+
About Patrick Säuerl:
28+
Patrick is an experienced software architect and technical lead who has supported numerous teams and developers on their journey.
29+
With several years of experience in various projects, he has shifted his focus to technical leadership, team collaboration, and Domain-Driven Design (DDD).
30+
He places particular emphasis on collaborative modeling, with preferred methods including Specification by Example, User Story Mapping, Event Storming, and Event Modeling.
31+
Patrick promotes both intra-team collaboration and cross-team collaboration in scaled environments.
32+
33+
Location, Food & Drinks are sponsored by TechTalk.
34+
35+
Timetable:
36+
37+
- 18:00: Door opens at TechTalk
38+
- 18:15: Intro
39+
- 18:20: Talk starts
40+
- 19:30: Food & Drinks
41+
- 21:00: End
42+
Recordings will be available afterward at https://go.dotnetdevs.at/recordings
43+
44+
This meetup is organized by DotNetDevs.at (https://dotnetdevs.at/).
45+
46+
DotNetDevs.at is sponsored by:
47+
48+
- RUBICON IT GmbH (https://www.rubicon.eu/rubicon/)
49+
- JetBrains (https://jetbrains.com)

_temp/2026-02-19_remote.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
This is the event for people who join the event via Stream.
2+
3+
If you join the event in-person, please RSVP here: https://www.meetup.com/dotnet-austria/events/313068818
4+
5+
This meetup is organized by DotNetDevs.at (https://dotnetdevs.at/).
6+
7+
Abstract:
8+
In this talk, Patrick Säuerl (Tech Lead/Architect) and Tim Paulus (Developer) will share their journey of evolving a software project towards a modular monolith with consistent layering.
9+
The system started over 10 years ago as a monolith, and many teams have developed within it, adding their flavors and understanding of the architectural patterns and the architecture trends at that time.
10+
This has led to maintenance issues and unclear guidance for new developers.
11+
We tackled parts of this by introducing tests that ensure the layering of vertical slices is consistent.
12+
13+
Our solution is based on the following approaches:
14+
* Fitness Functions from Evolutionary Architecture
15+
* Ports & Adapters and Layered Architecture
16+
* Approval Testing
17+
* Architecture Tests
18+
19+
We will cover these topics and the ideas we borrowed from them.
20+
21+
The talk will also focus on the dynamics that these tests initiated within the team and another contributing team, leading to fruitful discussions, better shared understanding of the technical vision, and clear refactoring targets for developers.
22+
23+
24+
About Tim Paulus:
25+
As a developer, Tim faces the typical challenge of inheriting a software project with proven business value in its domain, yet needing to transform its architecture to meet new technical and organizational requirements.
26+
27+
About Patrick Säuerl:
28+
Patrick is an experienced software architect and technical lead who has supported numerous teams and developers on their journey.
29+
With several years of experience in various projects, he has shifted his focus to technical leadership, team collaboration, and Domain-Driven Design (DDD).
30+
He places particular emphasis on collaborative modeling, with preferred methods including Specification by Example, User Story Mapping, Event Storming, and Event Modeling.
31+
Patrick promotes both intra-team collaboration and cross-team collaboration in scaled environments.
32+
33+
Timetable:
34+
35+
- 18:00: Stream starts at
36+
https://www.twitch.tv/dotnetdevsat or
37+
https://www.youtube.com/c/DotNetDevsAustria
38+
- 18:15: Intro
39+
- 18:20: Talk starts
40+
- about 19:30: End
41+
Recordings will be available afterward at https://go.dotnetdevs.at/recordings
42+
43+
This meetup is organized by DotNetDevs.at (https://dotnetdevs.at/).
44+
45+
DotNetDevs.at is sponsored by:
46+
47+
- RUBICON IT GmbH (https://www.rubicon.eu/rubicon/)
48+
- JetBrains (https://jetbrains.com)

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
"build": "bundle exec jekyll build",
1212
"serve": "bundle exec jekyll serve --incremental",
1313
"test:ci": "npm run build && playwright test",
14-
"generate:onsite": "node scripts/generate.js templates/onsite_event.txt"
14+
"generate:onsite": "node scripts/generate.js templates/onsite_event.txt",
15+
"generate:remote": "node scripts/generate.js templates/remote_event.txt"
1516
},
1617
"devDependencies": {
1718
"@playwright/test": "^1.40.0"

scripts/generate.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
#!/usr/bin/env node
22

33
const fs = require('fs');
4+
const path = require('path');
45
const matter = require('gray-matter');
56

7+
// Speakers directory (relative to script location)
8+
const SPEAKERS_DIR = path.join(__dirname, '..', '_speakers');
9+
610
function printUsage() {
711
console.error('Usage: node generate.js <template-file> <data-file.md> [output-file]');
812
console.error('');
@@ -17,6 +21,60 @@ function printUsage() {
1721
process.exit(1);
1822
}
1923

24+
/**
25+
* Load all speakers from _speakers directory and index by name
26+
*/
27+
function loadAllSpeakers() {
28+
const speakers = {};
29+
const files = fs.readdirSync(SPEAKERS_DIR).filter(f => f.endsWith('.md'));
30+
31+
for (const file of files) {
32+
const filepath = path.join(SPEAKERS_DIR, file);
33+
const speakerFile = matter(fs.readFileSync(filepath, 'utf8'));
34+
const name = speakerFile.data.name;
35+
if (name) {
36+
speakers[name] = speakerFile.data;
37+
}
38+
}
39+
40+
return speakers;
41+
}
42+
43+
/**
44+
* Load speaker bio by name
45+
*/
46+
function loadSpeakerBio(speakerName, speakersIndex) {
47+
const speaker = speakersIndex[speakerName];
48+
49+
if (!speaker) {
50+
console.error(`Warning: Speaker not found: ${speakerName}`);
51+
return null;
52+
}
53+
54+
return speaker.bio ? speaker.bio.trim() : null;
55+
}
56+
57+
/**
58+
* Build combined speakers bio section
59+
*/
60+
function buildSpeakersBio(speakers, speakersIndex) {
61+
if (!speakers || !Array.isArray(speakers) || speakers.length === 0) {
62+
return '';
63+
}
64+
65+
const bios = speakers
66+
.map(speakerName => {
67+
const bio = loadSpeakerBio(speakerName, speakersIndex);
68+
if (bio) {
69+
return `About ${speakerName}:\n${bio}`;
70+
}
71+
return null;
72+
})
73+
.filter(Boolean);
74+
75+
return bios.join('\n\n');
76+
}
77+
2078
// Check arguments
2179
if (process.argv.length < 4) {
2280
printUsage();
@@ -44,6 +102,12 @@ const data = dataFile.data;
44102
// Also make the content available as %content%
45103
data.content = dataFile.content.trim();
46104

105+
// Load speakers index and build speakers_bio from speakers array
106+
if (data.speakers) {
107+
const speakersIndex = loadAllSpeakers();
108+
data.speakers_bio = buildSpeakersBio(data.speakers, speakersIndex);
109+
}
110+
47111
// Read the template
48112
let output = fs.readFileSync(templateFilePath, 'utf8');
49113

templates/onsite_event.txt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
This event is for people who join the event in person at %Location%.
1+
This event is for people who join the event in person at %Location% (%LocationUrl%).
22

33
If you join the event remotely, please RSVP here: %RemoteLink%
44

@@ -7,22 +7,22 @@ This meetup is organized by DotNetDevs.at (https://dotnetdevs.at/).
77
Abstract
88
%abstract%
99

10-
10+
%speakers_bio%
1111

1212
Location, Food & Drinks are sponsored by %Location%.
1313

1414
Timetable:
1515

16-
18:00: Door opens at Rubicon
17-
18:15: Intro
18-
18:20: Talk starts
19-
19:30: Food & Drinks
20-
21:00: End
16+
- 18:00: Door opens at %Location%
17+
- 18:15: Intro
18+
- 18:20: Talk starts
19+
- 19:30: Food & Drinks
20+
- 21:00: End
2121
Recordings will be available afterward at https://go.dotnetdevs.at/recordings
2222

2323
This meetup is organized by DotNetDevs.at (https://dotnetdevs.at/).
2424

25-
DotNetDevs.at is sponsored by
25+
DotNetDevs.at is sponsored by:
2626

27-
RUBICON IT GmbH (https://www.rubicon.eu/rubicon/)
28-
JetBrains (https://jetbrains.com)
27+
- RUBICON IT GmbH (https://www.rubicon.eu/rubicon/)
28+
- JetBrains (https://jetbrains.com)

templates/remote_event.txt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
This is the event for people who join the event via Stream.
2+
3+
If you join the event in-person, please RSVP here: %InPersonLink%
4+
5+
This meetup is organized by DotNetDevs.at (https://dotnetdevs.at/).
6+
7+
Abstract:
8+
%abstract%
9+
10+
%speakers_bio%
11+
12+
Timetable:
13+
14+
- 18:00: Stream starts at
15+
https://www.twitch.tv/dotnetdevsat or
16+
https://www.youtube.com/c/DotNetDevsAustria
17+
- 18:15: Intro
18+
- 18:20: Talk starts
19+
- about 19:30: End
20+
Recordings will be available afterward at https://go.dotnetdevs.at/recordings
21+
22+
This meetup is organized by DotNetDevs.at (https://dotnetdevs.at/).
23+
24+
DotNetDevs.at is sponsored by:
25+
26+
- RUBICON IT GmbH (https://www.rubicon.eu/rubicon/)
27+
- JetBrains (https://jetbrains.com)

0 commit comments

Comments
 (0)