diff --git a/.gitignore b/.gitignore
index 5f8bee99..c0e8d9aa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,5 +2,6 @@ _site
.sass-cache
.DS_Store
-# IntelliJ IDE
-/.idea/
+
+# Script output
+tmp/pending_updates.yml
diff --git a/_data/current.yml b/_data/current.yml
index 4e711df8..fb2b81b9 100644
--- a/_data/current.yml
+++ b/_data/current.yml
@@ -1,35 +1,3 @@
-- name: "TestFlix 2025 - World’s Leading Virtual Software Testing Conference"
- location: Online
- dates: "October 10-11, 2025"
- url: https://www.thetesttribe.com/testflix/?utm_source=testingconferences
- status: Registration is Open and Free
-
-- name: Pacific Northwest Software Quality Conference (PNSQC) 2025
- location: Portland, Oregon, USA and Online
- dates: "October 13-15, 2025"
- url: https://www.pnsqc.org/?utm_source=testingconferences
- twitter: PNSQC
- status: Registration is Open
-
-- name: HUSTEF Software Testing Conference 2025
- location: Budapest, Hungary
- dates: "October 14-16, 2025"
- url: https://hustef.hu/?utm_source=testingconferences
- twitter: HunTestingBoard
- status: Registration is Open
-
-- name: "Quality Beacon - Lighting the Path for Next-Gen Testing"
- location: Copenhagen, Denmark
- dates: "October 20-21, 2025"
- url: https://www.dstb.dk/konferencer/2025/?utm_source=testingconferences
- status: Registration is Open until October 6, 2025
-
-- name: CypressConf 2025
- location: Online
- dates: "October 21-22, 2025"
- url: https://cypress.registration.goldcast.io/events/5e06455f-45f2-49c3-98dd-e0ae952e79a0?__hstc=204449871.f2117c4cea0098a12902ced8536e8ec7.1751241536846.1751241536846.1751241536846.1&__hssc=204449871.1.1751241536846&__hsfp=287177776?utm_source=testingconferences
- status: Registration is Open and Free
-
- name: "TestCon Europe 2025"
location: Vilnius, Lithuania
dates: "October 21-24, 2025"
@@ -61,7 +29,7 @@
dates: "October 27-30, 2025"
url: https://starcanada.techwell.com/?utm_source=testingconferences
twitter: TechWell
- status: Early Bird Registration is Open until September 26, 2025
+ status: Registration is Open
- name: WOPR Latam 04
location: Montevideo, UY
@@ -73,12 +41,13 @@
dates: "November 10-11, 2025"
url: https://automation.eurostarsoftwaretesting.com/?utm_source=testingconferences
twitter: esconfs
- status: Early Bird Registration is Open until September 30, 2025
+ status: Registration is Open
- name: Quality Sense Conf 2025
location: Montevideo, Uruguay
dates: "November 11, 2025"
url: https://qualitysenseconf.com/?utm_source=testingconferences
+ status: Registration is Open and Free
- name: Software-QS-Tag 2025
location: Möhrendorf, Germany
@@ -98,7 +67,7 @@
dates: "November 14, 2025"
url: https://www.tokyotestfest.com/?utm_source=testingconferences
twitter: tokyotestfest
- status: Early Bird Registration is Open
+ status: Registration is Open
- name: Testing Assembly
location: Helsinki, Finland
@@ -122,27 +91,27 @@
- name: "Workshop: Find more bugs with Test Gap Analysis"
location: Online
dates: "December 3, 2025"
- url: https://tmscl.me/4ntgbEk
- status: Registration is open
+ url: https://teamscale.com/events/tga-2025-12?utm_source=testingconferences
+ status: Registration is Open
- name: Robocon 2026 In Person
location: Helsinki, Finland
- dates: "February 12-13, 2026"
+ dates: "February 10-13, 2026"
url: https://www.robocon.io/?utm_source=testingconferences
- status: CFP is Open until October 19, 2025
+ status: Blind Robot Registration is Open
- name: Robocon 2026 Online
location: Online
- dates: "March 4-5 March, 2026"
+ dates: "March 3-6, 2026"
url: https://www.robocon.io/?utm_source=testingconferences
- status: CFP is Open until October 19, 2025
+ status: Blind Robot Registration is Open
- name: Testing Peers Conference 2026
location: Nottingham, UK
dates: "March 12, 2026"
url: https://testingpeerscon.com/?utm_source=testingconferences
twitter: testingpeers
- status: CFP is Open until September 30, 2025 | Early Bird Registration is Open
+ status: Early Bird Registration is Open
- name: ParisTestConf 2026
location: Paris, FR
@@ -174,7 +143,7 @@
dates: "May 6-8, 2026"
url: https://seleniumconf.com/?utm_source=testingconferences
twitter: seleniumconf
- status: CFP is Open until October 19, 2025
+ status: Blind Early Bird Registration is Open
- name: WeTest.Athens 2026
location: Athens, Greece
@@ -187,11 +156,11 @@
dates: "May 26-28, 2026"
url: https://expoqa.eu/?utm_source=testingconferences
twitter: expoqa
- status: CFP is Open until October 12, 2025
+ status: Early Bird Registration is Open
- name: EuroSTAR 2026 Software Testing Conference
location: Oslo, Norway
dates: "June 15-18, 2026"
url: https://conference.eurostarsoftwaretesting.com/?utm_source=testingconferences
twitter: esconfs
- status: CFP is Open until October 3, 2025
+ status: Super Early Bird Pricing is Open
diff --git a/_data/past.yml b/_data/past.yml
index 4383dab4..874074ea 100644
--- a/_data/past.yml
+++ b/_data/past.yml
@@ -1,3 +1,30 @@
+- name: CypressConf 2025
+ location: Online
+ dates: "October 21-22, 2025"
+ url: https://cypress.registration.goldcast.io/events/5e06455f-45f2-49c3-98dd-e0ae952e79a0?__hstc=204449871.f2117c4cea0098a12902ced8536e8ec7.1751241536846.1751241536846.1751241536846.1&__hssc=204449871.1.1751241536846&__hsfp=287177776?utm_source=testingconferences
+
+- name: "Quality Beacon - Lighting the Path for Next-Gen Testing"
+ location: Copenhagen, Denmark
+ dates: "October 20-21, 2025"
+ url: https://www.dstb.dk/konferencer/2025/?utm_source=testingconferences
+
+- name: HUSTEF Software Testing Conference 2025
+ location: Budapest, Hungary
+ dates: "October 14-16, 2025"
+ url: https://hustef.hu/?utm_source=testingconferences
+ twitter: HunTestingBoard
+
+- name: Pacific Northwest Software Quality Conference (PNSQC) 2025
+ location: Portland, Oregon, USA and Online
+ dates: "October 13-15, 2025"
+ url: https://www.pnsqc.org/?utm_source=testingconferences
+ twitter: PNSQC
+
+- name: "TestFlix 2025 - World’s Leading Virtual Software Testing Conference"
+ location: Online
+ dates: "October 10-11, 2025"
+ url: https://www.thetesttribe.com/testflix/?utm_source=testingconferences
+
- name: TestSociety
location: Lisboa, Portugal
dates: "October 10, 2025"
diff --git a/tools/identify_updates.rb b/tools/identify_updates.rb
new file mode 100644
index 00000000..982b4654
--- /dev/null
+++ b/tools/identify_updates.rb
@@ -0,0 +1,157 @@
+#!/usr/bin/env ruby
+require 'yaml'
+require 'date'
+require 'fileutils'
+
+DATA_DIR = File.expand_path('../_data', __dir__)
+CURRENT_FILE = File.join(DATA_DIR, 'current.yml')
+
+OUTPUT_FILE = File.expand_path('../tmp/pending_updates.yml', __dir__)
+
+if ARGV.empty?
+ warn 'Usage: identify_updates.rb YYYY-MM-DD'
+ exit 1
+end
+
+begin
+ today = Date.parse(ARGV[0])
+rescue ArgumentError
+ warn "Invalid date: #{ARGV[0]}"
+ exit 1
+end
+
+unless File.exist?(CURRENT_FILE)
+ warn "Could not find #{CURRENT_FILE}"
+ exit 1
+end
+
+current_events = YAML.load_file(CURRENT_FILE)
+
+MONTH_PATTERN = '(?:January|February|March|April|May|June|July|August|September|October|November|December|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Sept|Oct|Nov|Dec)'
+MONTH_REGEX = /#{MONTH_PATTERN}/i
+
+def normalize_month(name)
+ case name.downcase
+ when 'jan' then 'January'
+ when 'feb' then 'February'
+ when 'mar' then 'March'
+ when 'apr' then 'April'
+ when 'may' then 'May'
+ when 'jun' then 'June'
+ when 'jul' then 'July'
+ when 'aug' then 'August'
+ when 'sep', 'sept' then 'September'
+ when 'oct' then 'October'
+ when 'nov' then 'November'
+ when 'dec' then 'December'
+ else
+ name.capitalize
+ end
+end
+
+def build_date_from_components(month_name, day, year)
+ month_index = Date::MONTHNAMES.index(month_name)
+ return nil unless month_index
+
+ Date.new(year.to_i, month_index, day.to_i)
+rescue ArgumentError
+ nil
+end
+
+def parse_end_date(range_str)
+ return nil if range_str.nil?
+
+ s = range_str.to_s.strip
+ s = s.gsub(/[–—]/, '-')
+
+ # Handle ranges like "April 26 - May 1, 2026"
+ if (m = s.match(/(#{MONTH_PATTERN})\s+(\d{1,2})\s*-\s*(#{MONTH_PATTERN})\s*(\d{1,2}),?\s*(\d{4})$/i))
+ month2 = normalize_month(m[3])
+ day2 = m[4]
+ year = m[5]
+ return build_date_from_components(month2, day2, year)
+ end
+
+ # Handle ranges like "September 21-26, 2025"
+ if (m = s.match(/(#{MONTH_PATTERN})\s+\d{1,2}\s*-\s*(\d{1,2}),?\s*(\d{4})$/i))
+ month = normalize_month(m[1])
+ day2 = m[2]
+ year = m[3]
+ return build_date_from_components(month, day2, year)
+ end
+
+ # Handle single day "September 27, 2025"
+ if (m = s.match(/(#{MONTH_PATTERN})\s+(\d{1,2}),?\s*(\d{4})$/i))
+ month = normalize_month(m[1])
+ day = m[2]
+ year = m[3]
+ return build_date_from_components(month, day, year)
+ end
+
+ # Handle formats like "March 4-5 March, 2026"
+ if (m = s.match(/(#{MONTH_PATTERN})\s+\d{1,2}\s*-\s*(\d{1,2})\s+(#{MONTH_PATTERN}),?\s*(\d{4})$/i))
+ month = normalize_month(m[3])
+ day = m[2]
+ year = m[4]
+ return build_date_from_components(month, day, year)
+ end
+
+ # Fallback: let Date.parse try entire string
+ Date.parse(s) rescue nil
+end
+
+def extract_status_dates(status_text)
+ return [] if status_text.nil?
+ stripped = status_text.to_s.gsub(/<[^>]+>/, ' ')
+ results = []
+
+ stripped.scan(/(#{MONTH_PATTERN}\s*\d{1,2}(?:\s*-\s*(?:#{MONTH_PATTERN})?\s*\d{1,2})?,?\s*\d{4})/i) do |match|
+ segment = match.first
+ end_date = parse_end_date(segment)
+ results << { segment: segment.strip, date: end_date } if end_date
+ end
+
+ results
+end
+
+updates = []
+
+current_events.each do |event|
+ event_needs_move = false
+ status_needs_update = false
+
+ end_date = parse_end_date(event['dates'])
+ if end_date
+ event_needs_move = true if end_date < today
+ elsif event['dates'].to_s =~ /\d{4}/
+ warn "Warning: could not parse end date for '#{event['name']}': #{event['dates']}"
+ end
+
+ status_dates = extract_status_dates(event['status'])
+ status_needs_update = status_dates.any? { |item| item[:date] && item[:date] < today }
+
+ updates << event.dup if event_needs_move || status_needs_update
+end
+
+FileUtils.mkdir_p(File.dirname(OUTPUT_FILE))
+
+formatted_entries = updates.map do |event|
+ yaml = YAML.dump([event])
+ lines = yaml.lines
+ lines.shift if lines.first&.start_with?('---')
+ lines.reject! { |line| line.strip == '...' }
+ lines.map!(&:rstrip)
+ lines.join("\n")
+end
+
+File.open(OUTPUT_FILE, 'w') do |f|
+ if formatted_entries.empty?
+ f.write("# No events needing attention for #{today}\n")
+ else
+ f.write(formatted_entries.join("\n\n"))
+ f.write("\n")
+ end
+end
+
+puts "Identified #{updates.size} events needing attention."
+puts "Details written to #{OUTPUT_FILE}."
\ No newline at end of file