diff --git a/data/competitions/arts_design.json b/data/competitions/arts_design.json
index 8bc0ae8..3949841 100644
--- a/data/competitions/arts_design.json
+++ b/data/competitions/arts_design.json
@@ -29,7 +29,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://bowseat.org/programs/ocean-awareness-contest/contest-overview/"
+ "source_url": "https://bowseat.org/programs/ocean-awareness-contest/faqs/"
},
{
"label": "Winners announced",
@@ -37,7 +37,7 @@
"type": "results",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://bowseat.org/programs/ocean-awareness-contest/contest-overview/"
+ "source_url": "https://bowseat.org/programs/ocean-awareness-contest/awards/"
}
],
"added_by": "yashkewlani",
@@ -52,7 +52,7 @@
"id": "doodle-for-google",
"name": "Doodle for Google",
"organizer": "Google",
- "organizer_url": "https://doodles.google.com/d4g/",
+ "organizer_url": "https://doodles.google/",
"category": "arts_design",
"subjects": [
"visual art"
@@ -68,7 +68,7 @@
"currency": "USD"
},
"prize": "USD 55,000 college scholarship and a USD 50,000 school technology package for the National Winner.",
- "official_url": "https://doodles.google.com/d4g/",
+ "official_url": "https://doodles.google/doodle/doodle-for-google-2025-2026-us-winner",
"cycle_year": 2026,
"dates": [
{
@@ -77,7 +77,7 @@
"type": "deadline",
"timezone": "UTC-8",
"estimated": false,
- "source_url": "https://doodles.google.com/d4g/"
+ "source_url": "https://doodles.google.com/intl/root/d4g/rules"
},
{
"label": "Finalists notified by",
@@ -85,7 +85,7 @@
"type": "results",
"timezone": "UTC-7",
"estimated": true,
- "source_url": "https://doodles.google.com/d4g/"
+ "source_url": "https://doodles.google/"
}
],
"country_tracks": [
@@ -140,7 +140,7 @@
"type": "registration_open",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://www.artandwriting.org/awards/"
+ "source_url": "https://www.artandwriting.org/awards/how-to-enter/"
},
{
"label": "Latest regional deadline (following the usual early-January pattern)",
@@ -156,7 +156,7 @@
"type": "results",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://www.artandwriting.org/awards/"
+ "source_url": "https://www.artandwriting.org/awards/how-to-enter/categories/"
}
],
"country_tracks": [
@@ -202,7 +202,7 @@
"currency": "USD"
},
"prize": "National and World Contest awards; exact prizes vary by country.",
- "official_url": "https://www.toyota-dreamcarart.com/",
+ "official_url": "https://www.toyota-dreamcarart.com/about/",
"cycle_year": 2026,
"dates": [
{
@@ -264,7 +264,7 @@
"id": "youngarts-national-arts-competition",
"name": "YoungArts National Arts Award",
"organizer": "YoungArts",
- "organizer_url": "https://youngarts.org/competition/",
+ "organizer_url": "https://youngarts.org/",
"category": "arts_design",
"subjects": [
"visual art",
@@ -291,7 +291,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://youngarts.org/competition/"
+ "source_url": "https://youngarts.org/apply/"
}
],
"added_by": "yashkewlani",
@@ -331,7 +331,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://www.house.gov/educators-and-students/congressional-art-competition"
+ "source_url": "https://www.house.gov/sites/default/files/2026-02/2026%20Rules%20and%20Regulations%20for%20Congressional%20Offices.pdf"
}
],
"added_by": "yashkewlani",
@@ -346,7 +346,7 @@
"id": "science-without-borders-challenge",
"name": "Science Without Borders Challenge",
"organizer": "Khaled bin Sultan Living Oceans Foundation",
- "organizer_url": "https://www.livingoceansfoundation.org/science-without-borders-challenge-2/",
+ "organizer_url": "https://www.livingoceansfoundation.org/",
"category": "arts_design",
"subjects": [
"art",
@@ -364,7 +364,7 @@
"currency": "USD"
},
"prize": "Cash prizes up to USD 500 per division plus gallery features.",
- "official_url": "https://www.livingoceansfoundation.org/science-without-borders-challenge-2/",
+ "official_url": "https://www.livingoceansfoundation.org/science-without-borders-challenge/",
"cycle_year": 2027,
"dates": [
{
@@ -381,7 +381,8 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-04-01"
+ "valid_till": "2027-04-01",
+ "image": "/competitions/science-without-borders-challenge.png"
},
{
"id": "celebrating-art-contest",
@@ -406,7 +407,7 @@
"currency": "USD"
},
"prize": "Publication in the annual art book; medals and certificates for finalists.",
- "official_url": "https://www.celebratingart.com/",
+ "official_url": "https://www.celebratingart.com/enter-our-contest",
"cycle_year": 2027,
"dates": [
{
@@ -415,7 +416,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.celebratingart.com/"
+ "source_url": "https://www.celebratingart.com/faq"
}
],
"added_by": "yashkewlani",
@@ -423,6 +424,7 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-03-01"
+ "valid_till": "2027-03-01",
+ "image": "/competitions/celebrating-art-contest.png"
}
]
diff --git a/data/competitions/business.json b/data/competitions/business.json
index 00cd73f..b2da83b 100644
--- a/data/competitions/business.json
+++ b/data/competitions/business.json
@@ -20,7 +20,7 @@
"currency": "USD"
},
"prize": "Category winners are named Pete Conrad Scholars.",
- "official_url": "https://conrad.spacecenter.org/the-challenge/",
+ "official_url": "https://conrad.spacecenter.org/about/past-winners/",
"cycle_year": 2027,
"dates": [
{
@@ -29,7 +29,7 @@
"type": "deadline",
"timezone": "UTC-6",
"estimated": false,
- "source_url": "https://conrad.spacecenter.org/the-challenge/"
+ "source_url": "https://conrad.spacecenter.org/the-challenge/rules-and-regulations/"
}
],
"added_by": "yashkewlani",
@@ -44,7 +44,7 @@
"id": "deca-icdc",
"name": "DECA International Career Development Conference (ICDC)",
"organizer": "DECA Inc.",
- "organizer_url": "https://www.deca.org/conferences/icdc",
+ "organizer_url": "https://www.deca.org/",
"category": "business",
"subjects": [
"marketing",
@@ -125,7 +125,7 @@
"currency": "USD"
},
"prize": "USD 12,000 for first place in each track.",
- "official_url": "https://diamondchallenge.org/",
+ "official_url": "https://diamondchallenge.org/competition/",
"cycle_year": 2027,
"dates": [
{
@@ -134,7 +134,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://diamondchallenge.org/"
+ "source_url": "https://diamondchallenge.org/resources/"
}
],
"added_by": "yashkewlani",
@@ -149,7 +149,7 @@
"id": "nfte-world-series-of-innovation",
"name": "NFTE World Series of Innovation",
"organizer": "Network for Teaching Entrepreneurship (NFTE)",
- "organizer_url": "https://www.nfte.com/entrepreneurship-competitions/world-series-of-innovation/",
+ "organizer_url": "https://www.nfte.com/",
"category": "business",
"subjects": [
"entrepreneurship",
@@ -166,7 +166,7 @@
"currency": "USD"
},
"prize": "USD 300 to USD 1,500.",
- "official_url": "https://www.nfte.com/entrepreneurship-competitions/world-series-of-innovation/",
+ "official_url": "https://nfte.com/events/world-series-of-innovation/",
"cycle_year": 2026,
"dates": [
{
@@ -183,7 +183,7 @@
"type": "results",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://www.nfte.com/entrepreneurship-competitions/world-series-of-innovation/"
+ "source_url": "https://nfte.com/big-ideas-start-here-nfte-launches-2026-2027-world-series-of-innovation-for-young-changemakers-ages-5-24/"
}
],
"added_by": "yashkewlani",
@@ -258,7 +258,7 @@
"currency": "USD"
},
"prize": "National champion titles across dozens of career and technology competitive events.",
- "official_url": "https://bpa.org/nlc_conference/2027-nlc/",
+ "official_url": "https://bpa.org/nlc_conference/amplify-your-impact/dates-and-deadlines/",
"cycle_year": 2027,
"dates": [
{
@@ -349,7 +349,7 @@
"currency": "USD"
},
"prize": "World Cup titles, prizes and the opportunity to pitch to international investors.",
- "official_url": "https://sageglobal.org/",
+ "official_url": "https://www.sageglobal.org/competition-overview",
"cycle_year": 2027,
"dates": [
{
@@ -366,7 +366,7 @@
"type": "round",
"timezone": "UTC",
"estimated": true,
- "source_url": "https://sageglobal.org/"
+ "source_url": "https://www.sageglobal.org/world-cup"
}
],
"added_by": "yashkewlani",
@@ -374,13 +374,14 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-09-01"
+ "valid_till": "2027-09-01",
+ "image": "/competitions/sage-global.png"
},
{
"id": "young-enterprise-company-programme",
"name": "Young Enterprise Company Programme",
"organizer": "Young Enterprise UK",
- "organizer_url": "https://www.young-enterprise.org.uk/programmes/company-programme/",
+ "organizer_url": "https://www.young-enterprise.org.uk/",
"category": "business",
"subjects": [
"entrepreneurship",
@@ -407,7 +408,7 @@
"type": "registration_close",
"timezone": "UTC",
"estimated": true,
- "source_url": "https://www.young-enterprise.org.uk/programmes/company-programme/"
+ "source_url": "https://www.young-enterprise.org.uk/contact/frequently-asked-questions"
},
{
"label": "National finals",
@@ -423,6 +424,7 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-07-01"
+ "valid_till": "2027-07-01",
+ "image": "/competitions/young-enterprise-company-programme.png"
}
]
diff --git a/data/competitions/coding.json b/data/competitions/coding.json
index 80e6c52..5174901 100644
--- a/data/competitions/coding.json
+++ b/data/competitions/coding.json
@@ -189,7 +189,7 @@
"currency": "USD"
},
"prize": "Cash prizes for top finalists; recognition for qualifying rounds.",
- "official_url": "https://www.facebook.com/codingcompetitions/hacker-cup",
+ "official_url": "https://www.facebook.com/hackercup/",
"cycle_year": 2026,
"dates": [
{
@@ -238,7 +238,7 @@
"currency": "USD"
},
"prize": "Cash prizes for top eligible US middle and high school teams.",
- "official_url": "https://picoctf.org/",
+ "official_url": "https://picoctf.org/competitions/2026-spring.html",
"cycle_year": 2027,
"dates": [
{
@@ -247,7 +247,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://picoctf.org/"
+ "source_url": "https://picoctf.org/competitions/2026-spring-rules.html"
}
],
"added_by": "yashkewlani",
@@ -327,7 +327,7 @@
"currency": "USD"
},
"prize": "Certificates with achievement levels for participants and class reports for teachers.",
- "official_url": "https://www.bebraschallenge.org/",
+ "official_url": "https://www.bebraschallenge.org/registration/",
"cycle_year": 2026,
"dates": [
{
@@ -344,7 +344,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://www.bebraschallenge.org/"
+ "source_url": "https://www.bebraschallenge.org/examples/"
}
],
"added_by": "shauryagangrade",
@@ -376,7 +376,7 @@
"currency": "USD"
},
"prize": "Promotion through the Bronze, Silver, Gold and Platinum divisions, and selection for the US IOI training camp.",
- "official_url": "https://usaco.org/",
+ "official_url": "https://usaco.org/index.php?page=contests",
"cycle_year": 2027,
"dates": [
{
@@ -393,7 +393,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://usaco.org/"
+ "source_url": "https://usaco.org/index.php?page=history"
}
],
"added_by": "shauryagangrade",
@@ -426,7 +426,7 @@
"currency": "USD"
},
"prize": "Cash prizes for the top high school teams and an invitation to the MIT tournament wrap-up.",
- "official_url": "https://battlecode.org/",
+ "official_url": "https://battlecode.org/about.html",
"cycle_year": 2027,
"dates": [
{
@@ -443,7 +443,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://battlecode.org/"
+ "source_url": "https://battlecode.org/past.html"
}
],
"added_by": "yashkewlani",
@@ -451,13 +451,14 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-03-01"
+ "valid_till": "2027-03-01",
+ "image": "/competitions/mit-battlecode.png"
},
{
"id": "lockheed-martin-codequest",
"name": "Lockheed Martin CodeQuest",
"organizer": "Lockheed Martin",
- "organizer_url": "https://www.lockheedmartin.com/en-us/who-we-are/communities/community-outreach/education-and-careers/codequest.html",
+ "organizer_url": "https://www.lockheedmartin.com/",
"category": "coding",
"subjects": [
"competitive programming",
@@ -475,7 +476,7 @@
"currency": "USD"
},
"prize": "Awards and recognition for the first, second and third place teams in each division.",
- "official_url": "https://www.lockheedmartin.com/en-us/who-we-are/communities/community-outreach/education-and-careers/codequest.html",
+ "official_url": "https://www.lockheedmartin.com/en-us/who-we-are/communities/codequest.html",
"cycle_year": 2027,
"dates": [
{
@@ -484,7 +485,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.lockheedmartin.com/en-us/who-we-are/communities/community-outreach/education-and-careers/codequest.html"
+ "source_url": "https://www.lockheedmartin.com/en-us/who-we-are/communities/codequest/code-quest-past-quests.html"
}
],
"added_by": "yashkewlani",
@@ -492,6 +493,7 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-03-01"
+ "valid_till": "2027-03-01",
+ "image": "/competitions/lockheed-martin-codequest.png"
}
]
diff --git a/data/competitions/creative_writing.json b/data/competitions/creative_writing.json
index 674e254..7d47dd7 100644
--- a/data/competitions/creative_writing.json
+++ b/data/competitions/creative_writing.json
@@ -28,7 +28,7 @@
"type": "deadline",
"timezone": "UTC+1",
"estimated": false,
- "source_url": "https://foyleyoungpoets.org/"
+ "source_url": "https://foyleyoungpoets.org/rules/"
},
{
"label": "Winners contacted",
@@ -36,7 +36,7 @@
"type": "results",
"timezone": "UTC+1",
"estimated": true,
- "source_url": "https://foyleyoungpoets.org/"
+ "source_url": "https://foyleyoungpoets.org/about/"
}
],
"added_by": "yashkewlani",
@@ -76,7 +76,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://rattle.com/page/poetryprize/"
+ "source_url": "https://rattle.com/page/submissions/"
},
{
"label": "Winner and finalists announced",
@@ -84,7 +84,7 @@
"type": "results",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://rattle.com/page/poetryprize/"
+ "source_url": "https://rattle.com/page/winners/"
}
],
"added_by": "yashkewlani",
@@ -99,7 +99,7 @@
"id": "river-of-words",
"name": "River of Words International Youth Poetry and Art Contest",
"organizer": "Center for Environmental Literacy, Saint Mary's College of California",
- "organizer_url": "https://www.stmarys-ca.edu/centers-institutes/center-environmental-literacy/river-of-words",
+ "organizer_url": "https://www.stmarys-ca.edu/",
"category": "creative_writing",
"subjects": [
"poetry",
@@ -125,7 +125,7 @@
"type": "deadline",
"timezone": "UTC-8",
"estimated": false,
- "source_url": "https://www.stmarys-ca.edu/centers-institutes/center-environmental-literacy/river-of-words"
+ "source_url": "https://www.stmarys-ca.edu/river-words-rules-and-guidelines"
}
],
"added_by": "yashkewlani",
@@ -140,7 +140,7 @@
"id": "adroit-prize",
"name": "The Adroit Prizes for Poetry and Prose",
"organizer": "The Adroit Journal",
- "organizer_url": "https://theadroitjournal.org/prizes/",
+ "organizer_url": "https://theadroitjournal.org/",
"category": "creative_writing",
"subjects": [
"poetry",
@@ -157,7 +157,7 @@
"currency": "USD"
},
"prize": "USD 200 cash reward and publication for winners in poetry and prose.",
- "official_url": "https://theadroitjournal.org/prizes/",
+ "official_url": "https://theadroitjournal.org/adroit-prizes/",
"cycle_year": 2027,
"dates": [
{
@@ -166,7 +166,7 @@
"type": "registration_open",
"timezone": "UTC",
"estimated": true,
- "source_url": "https://theadroitjournal.org/prizes/"
+ "source_url": "https://theadroitjournal.org/about/submissions/"
},
{
"label": "Submission deadline (estimated)",
@@ -174,7 +174,7 @@
"type": "deadline",
"timezone": "UTC",
"estimated": true,
- "source_url": "https://theadroitjournal.org/prizes/"
+ "source_url": "https://theadroitjournal.org/adroit-prizes/"
}
],
"added_by": "shauryagangrade",
@@ -189,7 +189,7 @@
"id": "bennington-young-writers-awards",
"name": "Bennington Young Writers Awards",
"organizer": "Bennington College",
- "organizer_url": "https://www.bennington.edu/young-writers-awards",
+ "organizer_url": "https://www.bennington.edu/",
"category": "creative_writing",
"subjects": [
"poetry",
@@ -216,7 +216,7 @@
"type": "registration_open",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://www.bennington.edu/young-writers-awards"
+ "source_url": "https://www.bennington.edu/events/young-writers-awards"
},
{
"label": "Submission deadline",
@@ -224,7 +224,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://www.bennington.edu/young-writers-awards"
+ "source_url": "https://www.bennington.edu/events/young-writers-awards"
}
],
"added_by": "shauryagangrade",
@@ -239,7 +239,7 @@
"id": "write-the-world-competitions",
"name": "Write the World Monthly Writing Competitions",
"organizer": "Write the World",
- "organizer_url": "https://writetheworld.org/competitions",
+ "organizer_url": "https://writetheworld.org/",
"category": "creative_writing",
"subjects": [
"creative writing"
@@ -264,7 +264,7 @@
"type": "deadline",
"timezone": "UTC",
"estimated": true,
- "source_url": "https://writetheworld.org/competitions"
+ "source_url": "https://writetheworld.org/faq"
}
],
"added_by": "shauryagangrade",
@@ -279,7 +279,7 @@
"id": "reedsy-short-story-contest",
"name": "Reedsy Short Story Contest",
"organizer": "Reedsy",
- "organizer_url": "https://reedsy.com/writing-contest",
+ "organizer_url": "https://reedsy.com/",
"category": "creative_writing",
"subjects": [
"fiction",
@@ -306,7 +306,7 @@
"type": "deadline",
"timezone": "UTC",
"estimated": true,
- "source_url": "https://reedsy.com/writing-contest"
+ "source_url": "https://reedsy.com/creative-writing-prompts/"
}
],
"added_by": "yashkewlani",
@@ -314,7 +314,8 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-02-01"
+ "valid_till": "2027-02-01",
+ "image": "/competitions/reedsy-short-story-contest.png"
},
{
"id": "teen-ink-contests",
@@ -338,7 +339,7 @@
"currency": "USD"
},
"prize": "Publication in Teen Ink plus Amazon gift certificates.",
- "official_url": "https://www.teenink.com/contests",
+ "official_url": "https://www.teenink.com/submission-guidelines",
"cycle_year": 2027,
"dates": [
{
@@ -347,7 +348,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.teenink.com/contests"
+ "source_url": "https://www.teenink.com/about/faq"
}
],
"added_by": "yashkewlani",
@@ -355,6 +356,7 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-02-01"
+ "valid_till": "2027-02-01",
+ "image": "/competitions/teen-ink-contests.png"
}
]
diff --git a/data/competitions/debate_mun.json b/data/competitions/debate_mun.json
index 78649fe..5a80ff7 100644
--- a/data/competitions/debate_mun.json
+++ b/data/competitions/debate_mun.json
@@ -20,7 +20,7 @@
"currency": "USD"
},
"prize": "Delegate awards including Best Delegate and Honorable Mention.",
- "official_url": "https://www.harvardmun.org/",
+ "official_url": "https://www.harvardmun.org/about",
"cycle_year": 2027,
"dates": [
{
@@ -29,7 +29,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://www.harvardmun.org/"
+ "source_url": "https://www.harvardmun.org/registration-1"
},
{
"label": "HMUN 2027 closes",
@@ -37,7 +37,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://www.harvardmun.org/"
+ "source_url": "https://www.harvardmun.org/committee-list"
}
],
"added_by": "yashkewlani",
@@ -52,7 +52,7 @@
"id": "nsda-national-tournament",
"name": "National Speech & Debate Tournament",
"organizer": "National Speech & Debate Association",
- "organizer_url": "https://www.speechanddebate.org/nationals/",
+ "organizer_url": "https://www.speechanddebate.org/",
"category": "debate_mun",
"subjects": [
"debate",
@@ -78,7 +78,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.speechanddebate.org/nationals/"
+ "source_url": "https://www.speechanddebate.org/district-tournaments/"
},
{
"label": "National Tournament",
@@ -86,7 +86,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://www.speechanddebate.org/nationals/"
+ "source_url": "https://www.speechanddebate.org/nationals-history/"
}
],
"added_by": "yashkewlani",
@@ -186,7 +186,7 @@
"currency": "USD"
},
"prize": "World champion title and team awards, plus top speaker awards.",
- "official_url": "https://schoolsdebate.com/",
+ "official_url": "https://schoolsdebate.com/organisations/",
"cycle_year": 2027,
"dates": [
{
@@ -195,7 +195,7 @@
"type": "round",
"timezone": "UTC+3",
"estimated": true,
- "source_url": "https://schoolsdebate.com/"
+ "source_url": "https://schoolsdebate.com/news/"
},
{
"label": "WSDC 2027 concludes (estimated)",
@@ -203,7 +203,7 @@
"type": "results",
"timezone": "UTC+3",
"estimated": true,
- "source_url": "https://schoolsdebate.com/"
+ "source_url": "https://schoolsdebate.com/calendar/"
}
],
"added_by": "shauryagangrade",
@@ -235,7 +235,7 @@
"currency": "USD"
},
"prize": "Medals and trophies in each event, and the overall world champion title.",
- "official_url": "https://widpsc2027.org/",
+ "official_url": "https://widpsc2027.org/schedule/",
"cycle_year": 2027,
"dates": [
{
@@ -244,7 +244,7 @@
"type": "round",
"timezone": "UTC+8",
"estimated": false,
- "source_url": "https://widpsc2027.org/"
+ "source_url": "https://widpsc2027.org/registration/"
},
{
"label": "Grand Finals and closing ceremony",
@@ -252,7 +252,7 @@
"type": "results",
"timezone": "UTC+8",
"estimated": false,
- "source_url": "https://widpsc2027.org/"
+ "source_url": "https://widpsc2027.org/widpsc-history/"
}
],
"added_by": "shauryagangrade",
@@ -284,7 +284,7 @@
"currency": "USD"
},
"prize": "Debate experience and a joint resolution adopted after committee work; no cash prize.",
- "official_url": "https://eyp.org/",
+ "official_url": "https://eyp.org/what-we-do/international-sessions/",
"cycle_year": 2027,
"dates": [
{
@@ -293,7 +293,7 @@
"type": "round",
"timezone": "UTC+2",
"estimated": true,
- "source_url": "https://eyp.org/"
+ "source_url": "https://eyp.org/get-involved/for-young-people/"
}
],
"added_by": "shauryagangrade",
@@ -326,7 +326,7 @@
"currency": "USD"
},
"prize": "Committee awards including Outstanding Delegate and Best Legislation.",
- "official_url": "https://harvardmodelcongress.org/",
+ "official_url": "https://harvardmodelcongress.org/conference-schedule",
"cycle_year": 2027,
"dates": [
{
@@ -335,7 +335,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://harvardmodelcongress.org/"
+ "source_url": "https://harvardmodelcongress.org/registration-details"
},
{
"label": "HMC Boston 2027 closes",
@@ -343,7 +343,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://harvardmodelcongress.org/"
+ "source_url": "https://harvardmodelcongress.org/hmcfaqs"
}
],
"added_by": "yashkewlani",
@@ -351,13 +351,14 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-02-15"
+ "valid_till": "2027-02-15",
+ "image": "/competitions/harvard-model-congress.png"
},
{
"id": "mspdp-public-debate",
"name": "Middle School Public Debate Program (MSPDP)",
"organizer": "Middle School Public Debate Program",
- "organizer_url": "https://www.middleschooldebate.com/",
+ "organizer_url": "https://www.publicdebateprogram.org/",
"category": "debate_mun",
"subjects": [
"debate",
@@ -375,7 +376,7 @@
"currency": "USD"
},
"prize": "Trophies and the chance to represent a region at the annual Youth Championships.",
- "official_url": "https://www.middleschooldebate.com/",
+ "official_url": "https://www.publicdebateprogram.org/middleschool-programdescription",
"cycle_year": 2027,
"dates": [
{
@@ -384,7 +385,7 @@
"type": "round",
"timezone": "UTC-8",
"estimated": true,
- "source_url": "https://www.middleschooldebate.com/"
+ "source_url": "https://www.publicdebateprogram.org/about"
},
{
"label": "State championships",
@@ -392,7 +393,7 @@
"type": "round",
"timezone": "UTC-7",
"estimated": true,
- "source_url": "https://www.middleschooldebate.com/"
+ "source_url": "https://www.publicdebateprogram.org/middleschool-leagues"
}
],
"added_by": "yashkewlani",
@@ -400,6 +401,7 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-05-01"
+ "valid_till": "2027-05-01",
+ "image": "/competitions/mspdp-public-debate.png"
}
]
diff --git a/data/competitions/essay_writing.json b/data/competitions/essay_writing.json
index 5dfd021..2b77a33 100644
--- a/data/competitions/essay_writing.json
+++ b/data/competitions/essay_writing.json
@@ -20,7 +20,7 @@
"currency": "USD"
},
"prize": "Cash prizes up to USD 8,000 and an internship with The Crimson.",
- "official_url": "https://www.essaycomp.org/",
+ "official_url": "https://www.essaycomp.org/what-is-hcgec",
"cycle_year": 2026,
"dates": [
{
@@ -29,7 +29,7 @@
"type": "registration_close",
"timezone": "UTC",
"estimated": false,
- "source_url": "https://www.essaycomp.org/"
+ "source_url": "https://www.essaycomp.org/competition-structure-and-dates"
},
{
"label": "Submission deadline",
@@ -37,7 +37,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://www.essaycomp.org/"
+ "source_url": "https://www.essaycomp.org/faq"
},
{
"label": "Prizes must be claimed by",
@@ -45,7 +45,7 @@
"type": "results",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://www.essaycomp.org/"
+ "source_url": "https://www.essaycomp.org/past-hcgec"
}
],
"added_by": "yashkewlani",
@@ -77,12 +77,12 @@
"currency": "USD"
},
"prize": "USD 10,000 for the first-place essay.",
- "official_url": "https://www.jfklibrary.org/learn/education/profile-in-courage-essay-contest",
+ "official_url": "https://www.jfklibrary.org/learn/education/profile-in-courage-essay-contest/for-student-participants",
"cycle_year": 2027,
"dates": [
{
"label": "Submission deadline",
- "date": "2027-01-15",
+ "date": "2027-01-11",
"type": "deadline",
"timezone": "UTC-5",
"estimated": false,
@@ -101,7 +101,7 @@
"id": "john-locke-global-essay-prize",
"name": "John Locke Institute Global Essay Prize",
"organizer": "John Locke Institute",
- "organizer_url": "https://www.johnlockeinstitute.com/essay-competition",
+ "organizer_url": "https://www.johnlockeinstitute.com/",
"category": "essay_writing",
"subjects": [
"philosophy",
@@ -120,7 +120,7 @@
"currency": "USD"
},
"prize": "USD 5,000 scholarship for each category winner.",
- "official_url": "https://www.johnlockeinstitute.com/essay-competition",
+ "official_url": "https://www.johnlockeinstitute.com/apply-now",
"cycle_year": 2026,
"dates": [
{
@@ -129,7 +129,7 @@
"type": "registration_close",
"timezone": "UTC",
"estimated": false,
- "source_url": "https://www.johnlockeinstitute.com/essay-competition"
+ "source_url": "https://essaycompetition.johnlocke.com/"
},
{
"label": "Submission closes",
@@ -168,7 +168,7 @@
"id": "the-politic-high-school-essay-competition",
"name": "The Politic High School Essay Competition",
"organizer": "The Politic, Yale University",
- "organizer_url": "https://thepolitic.org/high-school-competition/",
+ "organizer_url": "https://thepolitic.org/",
"category": "essay_writing",
"subjects": [
"journalism",
@@ -194,7 +194,7 @@
"type": "registration_close",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://thepolitic.org/high-school-competition/"
+ "source_url": "https://docs.google.com/document/d/14m8YGCvzj8dpvE4noCbGVe9fRewQemR7Gl9ATuHn1Jo/edit?usp=sharing"
},
{
"label": "Essay submission deadline",
@@ -210,7 +210,7 @@
"type": "results",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://thepolitic.org/high-school-competition/"
+ "source_url": "https://thepolitic.org/columns/"
}
],
"added_by": "yashkewlani",
@@ -225,7 +225,7 @@
"id": "ayn-rand-institute-essay-contests",
"name": "Ayn Rand Institute Essay Contests",
"organizer": "Ayn Rand Institute",
- "organizer_url": "https://aynrand.org/",
+ "organizer_url": "https://aynrand.org/students/",
"category": "essay_writing",
"subjects": [
"literature",
@@ -251,7 +251,7 @@
"type": "deadline",
"timezone": "UTC-7",
"estimated": false,
- "source_url": "https://aynrand.org/students/essay-contests"
+ "source_url": "https://aynrand.org/students/essay-contests/anthem-essay-contest"
},
{
"label": "The Fountainhead contest deadline",
@@ -259,7 +259,7 @@
"type": "deadline",
"timezone": "UTC-7",
"estimated": false,
- "source_url": "https://aynrand.org/students/essay-contests"
+ "source_url": "https://aynrand.org/students/essay-contests/the-fountainhead-essay-contest"
},
{
"label": "Atlas Shrugged contest deadline",
@@ -308,7 +308,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://pprize.princeton.edu/apply"
+ "source_url": "https://pprize.princeton.edu/faqs"
}
],
"added_by": "yashkewlani",
@@ -348,7 +348,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://www.penguinrandomhouse.com/signet-essay-contest/"
+ "source_url": "https://www.penguinrandomhouse.com/signet-essay-contest-winners"
}
],
"added_by": "yashkewlani",
@@ -381,7 +381,7 @@
"currency": "USD"
},
"prize": "Winning editorials are published on The New York Times Learning Network.",
- "official_url": "https://www.nytimes.com/spotlight/learning-network-contests",
+ "official_url": "https://www.nytimes.com/column/learning-contests",
"cycle_year": 2027,
"dates": [
{
@@ -398,7 +398,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.nytimes.com/spotlight/learning-network-contests"
+ "source_url": "https://www.nytimes.com/2025/07/23/learning/our-2025-26-student-contest-calendar.html"
}
],
"added_by": "yashkewlani",
@@ -406,13 +406,14 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-03-15"
+ "valid_till": "2027-03-15",
+ "image": "/competitions/nyt-student-editorial-contest.png"
},
{
"id": "una-usa-global-citizen-essay-contest",
"name": "UNA-USA Global Citizen Essay Contest",
"organizer": "United Nations Association of the USA",
- "organizer_url": "https://www.unausa.org/member-organizations/students-and-young-professionals/global-citizen-essay-contest/",
+ "organizer_url": "https://unausa.org/programs/students/",
"category": "essay_writing",
"subjects": [
"international affairs",
@@ -429,7 +430,7 @@
"currency": "USD"
},
"prize": "Cash awards up to USD 2,500 plus an entry to the UNA National Leadership Meeting.",
- "official_url": "https://www.unausa.org/member-organizations/students-and-young-professionals/global-citizen-essay-contest/",
+ "official_url": "https://www.unausa.org/",
"cycle_year": 2027,
"dates": [
{
@@ -438,7 +439,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.unausa.org/member-organizations/students-and-young-professionals/global-citizen-essay-contest/"
+ "source_url": "https://unausa.org/newsandstories/"
}
],
"added_by": "yashkewlani",
@@ -446,6 +447,7 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-03-15"
+ "valid_till": "2027-03-15",
+ "image": "/competitions/una-usa-global-citizen-essay-contest.png"
}
]
diff --git a/data/competitions/film_video.json b/data/competitions/film_video.json
index abba4c6..5c64c40 100644
--- a/data/competitions/film_video.json
+++ b/data/competitions/film_video.json
@@ -20,7 +20,7 @@
"currency": "USD"
},
"prize": "Scholarships and technology prizes.",
- "official_url": "https://www.hsfilmfest.com/",
+ "official_url": "https://www.hsfilmfest.com/competitions",
"cycle_year": 2027,
"dates": [
{
@@ -29,7 +29,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://www.hsfilmfest.com/"
+ "source_url": "https://www.hsfilmfest.com/faq"
}
],
"added_by": "yashkewlani",
@@ -77,7 +77,7 @@
"type": "deadline",
"timezone": "UTC-8",
"estimated": false,
- "source_url": "https://www.nffty.org/submit"
+ "source_url": "https://www.nffty.org/official-rules-guidelines"
},
{
"label": "Festival in Seattle",
@@ -116,7 +116,7 @@
"currency": "USD"
},
"prize": "Category awards including the Rising Star Award; winning films screen at the Chicago International Film Festival.",
- "official_url": "https://www.chicagofilmfestival.com/cineyouth",
+ "official_url": "https://filmfreeway.com/CineYouthFestival",
"cycle_year": 2027,
"dates": [
{
@@ -141,7 +141,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.chicagofilmfestival.com/cineyouth"
+ "source_url": "https://www.chicagofilmfestival.com/cineyouth/schedule/"
}
],
"added_by": "shauryagangrade",
@@ -172,7 +172,7 @@
"currency": "USD"
},
"prize": "Cash prizes from USD 250 to USD 1,000 per category, plus statewide broadcast of winning films.",
- "official_url": "https://directingchangeca.org/",
+ "official_url": "https://directingchangeca.org/contest-rules/",
"cycle_year": 2027,
"dates": [
{
@@ -181,7 +181,7 @@
"type": "deadline",
"timezone": "UTC-8",
"estimated": false,
- "source_url": "https://directingchangeca.org/"
+ "source_url": "https://directingchangeca.org/get-started/"
}
],
"added_by": "shauryagangrade",
@@ -230,7 +230,7 @@
"type": "results",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://www.studentcam.org/rules/"
+ "source_url": "https://www.studentcam.org/past-winners/"
}
],
"added_by": "shauryagangrade",
@@ -245,7 +245,7 @@
"id": "world-of-7-billion-student-video-contest",
"name": "World of 7 Billion Student Video Contest",
"organizer": "Population Connection",
- "organizer_url": "https://www.worldof7billion.org/student-video-contest/",
+ "organizer_url": "https://www.worldof8billion.org/",
"category": "film_video",
"subjects": [
"video production",
@@ -263,16 +263,16 @@
"currency": "USD"
},
"prize": "Cash prizes up to USD 1,000 across grade divisions.",
- "official_url": "https://www.worldof7billion.org/student-video-contest/",
+ "official_url": "https://www.worldof8billion.org/video-contest/",
"cycle_year": 2027,
"dates": [
{
"label": "Video submission deadline",
- "date": "2027-03-15",
+ "date": "2027-03-03",
"type": "deadline",
"timezone": "UTC-5",
- "estimated": true,
- "source_url": "https://www.worldof7billion.org/student-video-contest/"
+ "estimated": false,
+ "source_url": "https://www.worldof8billion.org/video-contest/rules-and-guidelines/"
}
],
"added_by": "yashkewlani",
@@ -280,7 +280,8 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-04-01"
+ "valid_till": "2027-04-01",
+ "image": "/competitions/world-of-7-billion-student-video-contest.png"
},
{
"id": "48-hour-film-project",
@@ -304,7 +305,7 @@
"currency": "USD"
},
"prize": "Screenings, awards and a shot at the annual National Best Film prize.",
- "official_url": "https://www.48hourfilm.com/",
+ "official_url": "https://www.48hourfilm.com/rules",
"cycle_year": 2027,
"dates": [
{
@@ -313,7 +314,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://www.48hourfilm.com/"
+ "source_url": "https://www.48hourfilm.com/about"
}
],
"added_by": "yashkewlani",
@@ -321,6 +322,7 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-07-01"
+ "valid_till": "2027-07-01",
+ "image": "/competitions/48-hour-film-project.png"
}
]
diff --git a/data/competitions/finance.json b/data/competitions/finance.json
index 06a4ba3..9ab438c 100644
--- a/data/competitions/finance.json
+++ b/data/competitions/finance.json
@@ -3,7 +3,7 @@
"id": "national-personal-finance-challenge",
"name": "National Personal Finance Challenge",
"organizer": "Council for Economic Education",
- "organizer_url": "https://www.councilforeconed.org/programs/for-students/national-personal-finance-challenge/",
+ "organizer_url": "https://www.councilforeconed.org/",
"category": "finance",
"subjects": [
"personal finance"
@@ -19,7 +19,7 @@
"currency": "USD"
},
"prize": "National championship title and cash awards.",
- "official_url": "https://www.councilforeconed.org/programs/for-students/national-personal-finance-challenge/",
+ "official_url": "https://npfc.councilforeconed.org/",
"cycle_year": 2027,
"dates": [
{
@@ -43,7 +43,7 @@
"id": "new-york-fed-s-high-school-economics-essay",
"name": "High School Fed Challenge",
"organizer": "Federal Reserve Bank of New York",
- "organizer_url": "https://www.newyorkfed.org/education",
+ "organizer_url": "https://www.newyorkfed.org/",
"category": "finance",
"subjects": [
"economics",
@@ -60,7 +60,7 @@
"currency": "USD"
},
"prize": "Publication in the Journal of Future Economists.",
- "official_url": "https://www.newyorkfed.org/education",
+ "official_url": "https://www.newyorkfed.org/outreach-and-education/high-school/high-school-fed-challenge",
"cycle_year": 2026,
"dates": [
{
@@ -84,7 +84,7 @@
"id": "wharton-global-high-school-investment-competition",
"name": "Wharton Global High School Investment Competition",
"organizer": "Wharton Global Youth Program, University of Pennsylvania",
- "organizer_url": "https://globalyouth.wharton.upenn.edu/competitions/investment-competition/",
+ "organizer_url": "https://globalyouth.wharton.upenn.edu/",
"category": "finance",
"subjects": [
"investing",
@@ -110,7 +110,7 @@
"type": "registration_close",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://globalyouth.wharton.upenn.edu/competitions/investment-competition/"
+ "source_url": "https://globalyouth.wharton.upenn.edu/competitions/investment-competition/register-now/"
}
],
"added_by": "yashkewlani",
@@ -125,7 +125,7 @@
"id": "wharton-high-school-data-science-competition",
"name": "Wharton High School Data Science Competition",
"organizer": "Wharton Sports Analytics and Business Initiative, University of Pennsylvania",
- "organizer_url": "https://wsb.wharton.upenn.edu/wharton-data-competition/",
+ "organizer_url": "https://wsb.wharton.upenn.edu/",
"category": "finance",
"subjects": [
"data science",
@@ -151,7 +151,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://wsb.wharton.upenn.edu/wharton-data-competition/"
+ "source_url": "https://wsb.wharton.upenn.edu/wharton-data-competition/about/"
}
],
"added_by": "yashkewlani",
@@ -199,7 +199,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://www.councilforeconed.org/programs/for-students/national-economic-challenge/"
+ "source_url": "https://www.councilforeconed.org/programs/for-students/"
}
],
"added_by": "yashkewlani",
@@ -240,7 +240,7 @@
"type": "registration_open",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.stockmarketgame.org/"
+ "source_url": "https://www.stockmarketgame.org/whats_new.html"
}
],
"added_by": "yashkewlani",
@@ -255,7 +255,7 @@
"id": "ja-stock-market-challenge",
"name": "JA Stock Market Challenge",
"organizer": "Junior Achievement",
- "organizer_url": "https://jausa.ja.org/programs/ja-in-the-classroom",
+ "organizer_url": "https://jausa.ja.org/",
"category": "finance",
"subjects": [
"stock market",
@@ -273,7 +273,7 @@
"currency": "USD"
},
"prize": "Trophy and recognition for the team with the highest portfolio value.",
- "official_url": "https://jausa.ja.org/programs/ja-in-the-classroom",
+ "official_url": "https://jausa.ja.org/programs/ja-stock-market",
"cycle_year": 2027,
"dates": [
{
@@ -282,7 +282,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://jausa.ja.org/programs/ja-in-the-classroom"
+ "source_url": "https://jausa.ja.org/events/opportunity/national-ja-stock-market-challenge"
}
],
"added_by": "yashkewlani",
@@ -290,7 +290,8 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-03-01"
+ "valid_till": "2027-03-01",
+ "image": "/competitions/ja-stock-market-challenge.png"
},
{
"id": "fed-challenge-high-school",
@@ -323,7 +324,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.federalreserve.gov/education/fed-challenge.htm"
+ "source_url": "https://www.newyorkfed.org/outreach-and-education/high-school/high-school-fed-challenge"
},
{
"label": "National championship",
@@ -331,7 +332,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://www.federalreserve.gov/education/fed-challenge.htm"
+ "source_url": "https://www.federalreserve.gov/"
}
],
"added_by": "yashkewlani",
@@ -339,6 +340,7 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-05-01"
+ "valid_till": "2027-05-01",
+ "image": "/competitions/fed-challenge-high-school.png"
}
]
diff --git a/data/competitions/history.json b/data/competitions/history.json
index e979b2a..bd34712 100644
--- a/data/competitions/history.json
+++ b/data/competitions/history.json
@@ -20,7 +20,7 @@
"currency": "USD"
},
"prize": "Publication in The Concord Review.",
- "official_url": "https://tcr.org/",
+ "official_url": "https://tcr.org/submit",
"cycle_year": 2026,
"dates": [
{
@@ -29,7 +29,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://tcr.org/"
+ "source_url": "https://tcr.org/NWB-FAQ"
},
{
"label": "Spring issue deadline",
@@ -52,7 +52,7 @@
"id": "national-history-bowl",
"name": "National History Bowl",
"organizer": "International Academic Competitions",
- "organizer_url": "https://www.historybowl.com/",
+ "organizer_url": "https://www.iacompetitions.com/",
"category": "history",
"subjects": [
"history"
@@ -85,7 +85,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://www.historybowl.com/"
+ "source_url": "https://www.iacompetitions.com/varsity-jv-nationals/"
}
],
"added_by": "yashkewlani",
@@ -167,7 +167,7 @@
"id": "national-history-bee",
"name": "National History Bee",
"organizer": "International Academic Competitions",
- "organizer_url": "https://www.historybowl.com/",
+ "organizer_url": "https://www.iacompetitions.com/",
"category": "history",
"subjects": [
"history"
@@ -192,7 +192,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://www.historybowl.com/"
+ "source_url": "https://www.iacompetitions.com/varsity-jv-nationals/"
}
],
"added_by": "yashkewlani",
@@ -233,7 +233,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://billofrightsinstitute.org/we-the-students-essay-contest/"
+ "source_url": "https://billofrightsinstitute.org/essays/"
}
],
"added_by": "yashkewlani",
@@ -273,7 +273,7 @@
"type": "registration_open",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://www.historyolympiad.com/"
+ "source_url": "https://www.historyolympiad.com/registration/"
},
{
"label": "7th International History Olympiad, summer 2027 (estimated)",
@@ -281,7 +281,7 @@
"type": "round",
"timezone": "UTC",
"estimated": true,
- "source_url": "https://www.historyolympiad.com/"
+ "source_url": "https://www.historyolympiad.com/next-international-history-olympiad-to-be-held-in-summer-2027/"
}
],
"added_by": "shauryagangrade",
@@ -313,7 +313,7 @@
"currency": "USD"
},
"prize": "National winners and their teachers receive cash awards and certificates.",
- "official_url": "https://www.dar.org/national-society/scholarships/history-essay-contest",
+ "official_url": "https://www.dar.org/outreach/education/essay-contests",
"cycle_year": 2027,
"dates": [
{
@@ -322,7 +322,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.dar.org/national-society/scholarships/history-essay-contest"
+ "source_url": "https://www.dar.org/national-society/education/education-resources"
}
],
"added_by": "yashkewlani",
@@ -336,7 +336,7 @@
"id": "national-history-challenge-australia",
"name": "National History Challenge (Australia)",
"organizer": "History Teachers' Association of Australia",
- "organizer_url": "https://www.historychallenge.com.au/",
+ "organizer_url": "https://historychallenge.org.au/",
"category": "history",
"subjects": [
"history",
@@ -354,7 +354,7 @@
"currency": "USD"
},
"prize": "State and national cash awards and trophies.",
- "official_url": "https://www.historychallenge.com.au/",
+ "official_url": "https://historychallenge.org.au/contest-information",
"cycle_year": 2027,
"dates": [
{
@@ -363,7 +363,7 @@
"type": "registration_open",
"timezone": "UTC+11",
"estimated": true,
- "source_url": "https://www.historychallenge.com.au/"
+ "source_url": "https://historychallenge.org.au/"
},
{
"label": "Entry deadline",
@@ -371,7 +371,7 @@
"type": "deadline",
"timezone": "UTC+10",
"estimated": true,
- "source_url": "https://www.historychallenge.com.au/"
+ "source_url": "https://historychallenge.org.au/submit-your-entry"
}
],
"added_by": "yashkewlani",
@@ -379,6 +379,7 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-09-15"
+ "valid_till": "2027-09-15",
+ "image": "/competitions/national-history-challenge-australia.png"
}
]
diff --git a/data/competitions/humanities.json b/data/competitions/humanities.json
index f7facd5..3d368ae 100644
--- a/data/competitions/humanities.json
+++ b/data/competitions/humanities.json
@@ -99,7 +99,7 @@
"currency": "USD"
},
"prize": "Medals and certificates for high scorers.",
- "official_url": "https://www.nle.org/",
+ "official_url": "https://www.nle.org/about-us",
"cycle_year": 2027,
"dates": [
{
@@ -116,7 +116,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://www.nle.org/"
+ "source_url": "https://www.nle.org/alignment"
}
],
"added_by": "yashkewlani",
@@ -147,7 +147,7 @@
"currency": "USD"
},
"prize": "Gold, silver and bronze medals plus honorable mentions.",
- "official_url": "https://www.philosophy-olympiad.org/",
+ "official_url": "https://www.philosophy-olympiad.org/?page_id=1706",
"cycle_year": 2027,
"dates": [
{
@@ -156,7 +156,7 @@
"type": "round",
"timezone": "UTC",
"estimated": true,
- "source_url": "https://www.philosophy-olympiad.org/"
+ "source_url": "https://www.philosophy-olympiad.org/?page_id=2"
}
],
"added_by": "shauryagangrade",
@@ -187,7 +187,7 @@
"currency": "USD"
},
"prize": "Gold, silver and bronze medals for the top scorers.",
- "official_url": "https://geoolympiad.org/",
+ "official_url": "https://geoolympiad.org/about/",
"cycle_year": 2027,
"dates": [
{
@@ -204,7 +204,7 @@
"type": "results",
"timezone": "UTC+3",
"estimated": true,
- "source_url": "https://geoolympiad.org/"
+ "source_url": "https://geoolympiad.org/guidelines/"
}
],
"added_by": "shauryagangrade",
@@ -236,7 +236,7 @@
"currency": "USD"
},
"prize": "Cash prizes and recognition at a prize giving ceremony at the Bodleian Library, Oxford.",
- "official_url": "https://www.ogn.ox.ac.uk/",
+ "official_url": "https://www.ogn.ox.ac.uk/learners",
"cycle_year": 2027,
"dates": [
{
@@ -245,7 +245,7 @@
"type": "deadline",
"timezone": "UTC",
"estimated": true,
- "source_url": "https://www.ogn.ox.ac.uk/"
+ "source_url": "https://www.ogn.ox.ac.uk/content/oxford-german-olympiad-2026-round-2"
}
],
"added_by": "shauryagangrade",
@@ -279,7 +279,7 @@
"currency": "USD"
},
"prize": "Trophies and sweepstakes points at the national convention.",
- "official_url": "https://www.njcl.org/",
+ "official_url": "https://aclclassics.org/njcl/",
"cycle_year": 2027,
"dates": [
{
@@ -288,7 +288,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.njcl.org/"
+ "source_url": "https://aclclassics.org/njcl/convention"
}
],
"added_by": "yashkewlani",
@@ -296,7 +296,8 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-08-01"
+ "valid_till": "2027-08-01",
+ "image": "/competitions/certamen-nlc.png"
},
{
"id": "le-grand-concours",
@@ -320,7 +321,7 @@
"currency": "USD"
},
"prize": "National medals and certificates awarded by score percentile.",
- "official_url": "https://www.frenchteachers.org/le-grand-concours",
+ "official_url": "https://www.frenchteachers.org/contests",
"cycle_year": 2027,
"dates": [
{
@@ -329,7 +330,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.frenchteachers.org/le-grand-concours"
+ "source_url": "https://www.frenchteachers.org/nfc-teachers"
}
],
"added_by": "yashkewlani",
@@ -337,6 +338,7 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-04-01"
+ "valid_till": "2027-04-01",
+ "image": "/competitions/le-grand-concours.png"
}
]
diff --git a/data/competitions/interdisciplinary.json b/data/competitions/interdisciplinary.json
index 94ccce8..3d9557e 100644
--- a/data/competitions/interdisciplinary.json
+++ b/data/competitions/interdisciplinary.json
@@ -98,7 +98,7 @@
"currency": "USD"
},
"prize": "Educational scholarships for finalist and grand prize teams.",
- "official_url": "https://technovationchallenge.org/competition/",
+ "official_url": "https://technovationchallenge.org/about/",
"cycle_year": 2027,
"dates": [
{
@@ -163,7 +163,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://envirothon.org/2027-maryland/"
+ "source_url": "https://envirothon.org/about-us/"
}
],
"added_by": "yashkewlani",
@@ -206,7 +206,7 @@
"type": "registration_close",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://usaeop.com/program/ecybermission/"
+ "source_url": "https://www.ecybermission.com/CompetitionRules"
}
],
"added_by": "yashkewlani",
@@ -239,7 +239,7 @@
"currency": "USD"
},
"prize": "FIRST Championship titles and a large scholarship pool.",
- "official_url": "https://www.firstinspires.org/programs/ftc/",
+ "official_url": "https://www.firstinspires.org/programs/ftc/game-and-season",
"cycle_year": 2027,
"dates": [
{
@@ -298,7 +298,7 @@
"type": "registration_close",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://competition.igem.org/about"
+ "source_url": "https://competition.igem.org/register"
}
],
"added_by": "yashkewlani",
@@ -348,7 +348,7 @@
"type": "round",
"timezone": "UTC",
"estimated": true,
- "source_url": "https://first.global/fgc/"
+ "source_url": "https://first.global/about/"
}
],
"added_by": "yashkewlani",
@@ -458,7 +458,7 @@
"type": "registration_open",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.odysseyofthemind.com/"
+ "source_url": "https://odysseyofthemind.com/problems/"
},
{
"label": "World Finals",
@@ -466,7 +466,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://www.odysseyofthemind.com/"
+ "source_url": "https://odysseyofthemind.com/world-finals-2/"
}
],
"added_by": "yashkewlani",
@@ -474,7 +474,8 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-06-01"
+ "valid_till": "2027-06-01",
+ "image": "/competitions/odyssey-of-the-mind.png"
},
{
"id": "destination-imagination",
@@ -508,7 +509,7 @@
"type": "registration_open",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.destinationimagination.org/"
+ "source_url": "https://www.destinationimagination.org/challenge-experience/"
},
{
"label": "DI Global Finals",
@@ -516,7 +517,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://www.destinationimagination.org/"
+ "source_url": "https://www.destinationimagination.org/challenge-experience/global-finals"
}
],
"added_by": "yashkewlani",
@@ -524,6 +525,7 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-06-01"
+ "valid_till": "2027-06-01",
+ "image": "/competitions/destination-imagination.png"
}
]
diff --git a/data/competitions/mathematics.json b/data/competitions/mathematics.json
index 5863a43..a29bb52 100644
--- a/data/competitions/mathematics.json
+++ b/data/competitions/mathematics.json
@@ -19,7 +19,7 @@
"currency": "USD"
},
"prize": "Individual, team and event awards; recognition among top US math programs.",
- "official_url": "https://www.hmmt.org/",
+ "official_url": "https://www.hmmt.org/www/tournaments/novfeb",
"cycle_year": 2026,
"dates": [
{
@@ -28,7 +28,7 @@
"type": "registration_close",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://www.hmmt.org/"
+ "source_url": "https://www.hmmt.org/rg/deadlines"
},
{
"label": "HMMT November (MIT)",
@@ -36,7 +36,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://www.hmmt.org/"
+ "source_url": "https://www.hmmt.org/www/tournaments/novfeb"
},
{
"label": "HMMT February (Harvard)",
@@ -44,7 +44,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://www.hmmt.org/"
+ "source_url": "https://www.hmmt.org/www/tournaments/novfeb"
}
],
"added_by": "yashkewlani",
@@ -170,7 +170,7 @@
"currency": "USD"
},
"prize": "USD 50,000 first prize, from a USD 100,000 total prize pool.",
- "official_url": "https://mathprize.atfoundation.org/",
+ "official_url": "https://mathprize.atfoundation.org/apply",
"cycle_year": 2026,
"dates": [
{
@@ -179,7 +179,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://mathprize.atfoundation.org/"
+ "source_url": "https://mathprize.atfoundation.org/experience/schedule"
}
],
"added_by": "yashkewlani",
@@ -194,7 +194,7 @@
"id": "usamo",
"name": "USA Mathematical Olympiad (USAMO)",
"organizer": "Mathematical Association of America (MAA)",
- "organizer_url": "https://maa.org/maa-invitational-competitions/",
+ "organizer_url": "https://maa.org/",
"category": "mathematics",
"subjects": [
"mathematics",
@@ -215,12 +215,12 @@
"cycle_year": 2027,
"dates": [
{
- "label": "USAMO test date",
- "date": "2027-03-24",
+ "label": "USAMO test date (day 1 of 2)",
+ "date": "2027-03-20",
"type": "round",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "http://web.archive.org/web/20260826221856/https://maa.org/maa-invitational-competitions/"
+ "source_url": "https://maa.org/wp-content/uploads/2026/08/2026-27-USAMO_USAJMO-Policies-1.pdf"
}
],
"added_by": "yashkewlani",
@@ -251,7 +251,7 @@
"currency": "USD"
},
"prize": "Team and individual rankings across all competing sites; top scorers recognized nationally.",
- "official_url": "https://arml3.com/",
+ "official_url": "https://arml3.com/arml-2026-registration-page/",
"cycle_year": 2027,
"dates": [
{
@@ -268,7 +268,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://arml3.com/"
+ "source_url": "https://arml3.com/arml-meet-results/"
}
],
"added_by": "yashkewlani",
@@ -355,7 +355,7 @@
"currency": "USD"
},
"prize": "Team and individual rankings published online; no cash prize.",
- "official_url": "https://purplecomet.org/",
+ "official_url": "https://purplecomet.org/information",
"cycle_year": 2027,
"dates": [
{
@@ -364,7 +364,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://purplecomet.org/"
+ "source_url": "https://purplecomet.org/information"
},
{
"label": "Contest window closes",
@@ -372,7 +372,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://purplecomet.org/"
+ "source_url": "https://purplecomet.org/answers"
}
],
"added_by": "yashkewlani",
@@ -404,7 +404,7 @@
"currency": "USD"
},
"prize": "Diplomas of first, second and third degree by score; no cash prize.",
- "official_url": "https://www.turgor.ru/en/",
+ "official_url": "https://www.turgor.ru/en/problems/",
"cycle_year": 2027,
"dates": [
{
@@ -413,7 +413,7 @@
"type": "round",
"timezone": "UTC+3",
"estimated": true,
- "source_url": "https://www.turgor.ru/en/"
+ "source_url": "https://www.turgor.ru/en/news/"
},
{
"label": "Spring round (following the usual February to March pattern, local city dates vary)",
@@ -421,7 +421,7 @@
"type": "round",
"timezone": "UTC+3",
"estimated": true,
- "source_url": "https://www.turgor.ru/en/"
+ "source_url": "https://www.turgor.ru/en/problems/"
}
],
"added_by": "yashkewlani",
@@ -453,7 +453,7 @@
"currency": "USD"
},
"prize": "Over USD 100,000 in scholarship prizes, with the top teams presenting their models in New York City.",
- "official_url": "https://m3challenge.siam.org/",
+ "official_url": "https://m3challenge.siam.org/the-challenge/",
"cycle_year": 2027,
"dates": [
{
@@ -470,7 +470,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://m3challenge.siam.org/"
+ "source_url": "https://m3challenge.siam.org/the-challenge/rules-and-guidelines/"
},
{
"label": "Challenge weekend (estimated)",
@@ -478,7 +478,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://m3challenge.siam.org/"
+ "source_url": "https://m3challenge.siam.org/the-challenge/"
}
],
"added_by": "shauryagangrade",
@@ -493,7 +493,7 @@
"id": "amc10-12",
"name": "American Mathematics Competitions 10 and 12 (AMC 10/12)",
"organizer": "Mathematical Association of America",
- "organizer_url": "https://amc.maa.org/",
+ "organizer_url": "https://maa.org/",
"category": "mathematics",
"subjects": [
"mathematics",
@@ -510,24 +510,24 @@
"currency": "USD"
},
"prize": "Certificates of distinction; automatic AIME qualification for top scorers.",
- "official_url": "https://amc.maa.org/",
+ "official_url": "https://maa.org/student-programs/amc/",
"cycle_year": 2026,
"dates": [
{
"label": "AMC 10/12 A",
- "date": "2026-11-11",
+ "date": "2026-11-05",
"type": "round",
"timezone": "UTC-5",
- "estimated": true,
- "source_url": "https://amc.maa.org/"
+ "estimated": false,
+ "source_url": "https://maa.org/student-programs/amc/"
},
{
"label": "AMC 10/12 B",
- "date": "2026-11-17",
+ "date": "2026-11-13",
"type": "round",
"timezone": "UTC-5",
- "estimated": true,
- "source_url": "https://amc.maa.org/"
+ "estimated": false,
+ "source_url": "https://maa.org/maa-amc-registration-faq/"
}
],
"added_by": "yashkewlani",
@@ -558,7 +558,7 @@
"currency": "USD"
},
"prize": "Award certificates and gifts for top national scorers.",
- "official_url": "https://www.aksf.org/",
+ "official_url": "https://www.aksf.org/official.xhtml",
"cycle_year": 2027,
"dates": [
{
@@ -566,8 +566,8 @@
"date": "2027-03-18",
"type": "round",
"timezone": "UTC+1",
- "estimated": true,
- "source_url": "https://www.aksf.org/"
+ "estimated": false,
+ "source_url": "https://www.kangarooqatar.org/ikmc"
}
],
"added_by": "yashkewlani",
diff --git a/data/competitions/research.json b/data/competitions/research.json
index 4c006ea..da473e3 100644
--- a/data/competitions/research.json
+++ b/data/competitions/research.json
@@ -22,7 +22,7 @@
"currency": "USD"
},
"prize": "USD 250,000 top award; USD 3.1 million distributed annually.",
- "official_url": "https://www.societyforscience.org/regeneron-sts/",
+ "official_url": "https://www.societyforscience.org/regeneron-sts/application-requirements/",
"cycle_year": 2026,
"dates": [
{
@@ -31,7 +31,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://www.societyforscience.org/regeneron-sts/"
+ "source_url": "https://www.societyforscience.org/regeneron-sts/official-rules/"
}
],
"added_by": "yashkewlani",
@@ -66,7 +66,7 @@
"currency": "USD"
},
"prize": "Scholarships and cash awards at regional and national level, totaling over USD 400,000 annually.",
- "official_url": "https://www.jshs.org/",
+ "official_url": "https://www.jshs.org/national-symposium/",
"cycle_year": 2027,
"dates": [
{
@@ -75,7 +75,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.jshs.org/"
+ "source_url": "https://www.jshs.org/regional-competitions/"
},
{
"label": "National Symposium (estimated)",
@@ -83,7 +83,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://www.jshs.org/"
+ "source_url": "https://www.jshs.org/national-competition/"
}
],
"added_by": "shauryagangrade",
@@ -116,7 +116,7 @@
"currency": "USD"
},
"prize": "Gold, silver and bronze medals, with winners earning recognition and college scholarships.",
- "official_url": "https://geniusolympiad.org/",
+ "official_url": "https://geniusolympiad.org/guides.html",
"cycle_year": 2027,
"dates": [
{
@@ -125,7 +125,7 @@
"type": "registration_open",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://geniusolympiad.org/"
+ "source_url": "https://geniusolympiad.org/disciplines.html"
},
{
"label": "Application deadline (estimated)",
@@ -133,7 +133,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://geniusolympiad.org/"
+ "source_url": "https://geniusolympiad.org/global.html"
},
{
"label": "Genius Olympiad finals (Rochester, NY)",
@@ -141,7 +141,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://geniusolympiad.org/"
+ "source_url": "https://geniusolympiad.org/live"
}
],
"added_by": "shauryagangrade",
@@ -175,7 +175,7 @@
"currency": "USD"
},
"prize": "An up to USD 1,000 project grant, mentorship from MIT researchers and an expenses paid trip to MIT.",
- "official_url": "https://think.mit.edu/",
+ "official_url": "https://think.mit.edu/static_files/THINK_Program_Guidelines_2026.pdf",
"cycle_year": 2027,
"dates": [
{
@@ -192,7 +192,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://think.mit.edu/"
+ "source_url": "https://think.mit.edu/static_files/Results_2026.pdf"
}
],
"added_by": "shauryagangrade",
@@ -207,7 +207,7 @@
"id": "broadcom-masters",
"name": "Broadcom MASTERS (Thermo Fisher Junior Innovators Challenge)",
"organizer": "Society for Science and Thermo Fisher Scientific",
- "organizer_url": "https://www.societyforscience.org/thermo-fisher-jic/",
+ "organizer_url": "https://www.societyforscience.org/",
"category": "research",
"subjects": [
"science",
@@ -234,7 +234,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.societyforscience.org/thermo-fisher-jic/"
+ "source_url": "https://www.societyforscience.org/isef/affiliated-fair-network/"
},
{
"label": "National finals (Washington DC)",
@@ -242,7 +242,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://www.societyforscience.org/thermo-fisher-jic/"
+ "source_url": "https://www.societyforscience.org/competitions/"
}
],
"added_by": "yashkewlani",
@@ -250,13 +250,14 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-11-15"
+ "valid_till": "2027-11-15",
+ "image": "/competitions/broadcom-masters.png"
},
{
"id": "globe-virtual-science-fair",
"name": "GLOBE Virtual Science Fair",
"organizer": "GLOBE Program",
- "organizer_url": "https://www.globe.gov/web/virtual-science-fair/",
+ "organizer_url": "https://www.globe.gov/",
"category": "research",
"subjects": [
"earth science",
@@ -283,7 +284,7 @@
"type": "registration_open",
"timezone": "UTC",
"estimated": true,
- "source_url": "https://www.globe.gov/web/virtual-science-fair/"
+ "source_url": "https://www.globe.gov/about"
},
{
"label": "GSF submission deadline",
@@ -291,7 +292,7 @@
"type": "deadline",
"timezone": "UTC",
"estimated": true,
- "source_url": "https://www.globe.gov/web/virtual-science-fair/"
+ "source_url": "https://www.globe.gov/about/impact"
}
],
"added_by": "yashkewlani",
@@ -299,6 +300,7 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-04-15"
+ "valid_till": "2027-04-15",
+ "image": "/competitions/globe-virtual-science-fair.png"
}
]
diff --git a/data/competitions/scholarship.json b/data/competitions/scholarship.json
index bbe1503..01c85a7 100644
--- a/data/competitions/scholarship.json
+++ b/data/competitions/scholarship.json
@@ -24,7 +24,7 @@
"currency": "USD"
},
"prize": "USD 100,000, USD 50,000 or USD 25,000 scholarship.",
- "official_url": "https://www.davidsongifted.org/gifted-programs/fellows-scholarship/",
+ "official_url": "https://www.davidsongifted.org/gifted-programs/fellows-scholarship/eligibility-and-application/",
"cycle_year": 2027,
"dates": [
{
@@ -33,7 +33,7 @@
"type": "deadline",
"timezone": "UTC-8",
"estimated": false,
- "source_url": "https://www.davidsongifted.org/gifted-programs/fellows-scholarship/"
+ "source_url": "https://www.davidsongifted.org/gifted-programs/fellows-scholarship/scholarship-categories/"
}
],
"added_by": "yashkewlani",
@@ -48,7 +48,7 @@
"id": "coca-cola-scholars",
"name": "Coca-Cola Scholars Program",
"organizer": "The Coca-Cola Scholars Foundation",
- "organizer_url": "https://www.coca-colascholars.org/",
+ "organizer_url": "https://www.coca-colascholarsfoundation.org/",
"category": "scholarship",
"subjects": [
"academics",
@@ -65,7 +65,7 @@
"currency": "USD"
},
"prize": "A USD 20,000 college scholarship for 150 outstanding scholars each year.",
- "official_url": "https://www.coca-colascholars.org/",
+ "official_url": "https://www.coca-colascholarsfoundation.org/apply/",
"cycle_year": 2027,
"dates": [
{
@@ -74,7 +74,7 @@
"type": "registration_open",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://www.coca-colascholars.org/"
+ "source_url": "https://www.coca-colascholarsfoundation.org/"
},
{
"label": "Application deadline",
@@ -82,7 +82,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://www.coca-colascholars.org/"
+ "source_url": "https://www.coca-colascholarsfoundation.org/about/faq"
}
],
"added_by": "shauryagangrade",
@@ -137,7 +137,7 @@
"id": "elks-mvs",
"name": "Elks National Foundation Most Valuable Student Scholarship",
"organizer": "Elks National Foundation",
- "organizer_url": "https://www.elks.org/scholars/scholarships/mvs.cfm",
+ "organizer_url": "https://www.elks.org/",
"category": "scholarship",
"subjects": [
"academics",
@@ -163,7 +163,7 @@
"type": "deadline",
"timezone": "UTC-8",
"estimated": false,
- "source_url": "https://www.elks.org/scholars/scholarships/mvs.cfm"
+ "source_url": "https://www.elks.org/scholarweb/resources/MVSFAQ.cfm"
}
],
"added_by": "shauryagangrade",
@@ -195,7 +195,7 @@
"currency": "USD"
},
"prize": "Full cost of attendance, last dollar scholarship for the 2027 cohort.",
- "official_url": "https://www.thegatesscholarship.org/",
+ "official_url": "https://www.thegatesscholarship.org/about-gates",
"cycle_year": 2027,
"dates": [
{
@@ -204,7 +204,7 @@
"type": "deadline",
"timezone": "UTC-7",
"estimated": true,
- "source_url": "https://www.thegatesscholarship.org/"
+ "source_url": "https://www.thegatesscholarship.org/help-center/student"
}
],
"added_by": "shauryagangrade",
@@ -237,7 +237,7 @@
"currency": "USD"
},
"prize": "Up to USD 75,000 over five years plus programmatic support.",
- "official_url": "https://www.jkcf.org/our-scholarships/young-scholars-program/",
+ "official_url": "https://www.jkcf.org/our-scholarships/young-scholars-program/how-to-apply/",
"cycle_year": 2027,
"dates": [
{
@@ -246,7 +246,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://www.jkcf.org/our-scholarships/young-scholars-program/"
+ "source_url": "https://www.jkcf.org/our-scholarships/young-scholars-program/faqs/"
}
],
"added_by": "yashkewlani",
@@ -254,13 +254,14 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-06-01"
+ "valid_till": "2027-06-01",
+ "image": "/competitions/jack-kent-cooke-young-scholars.png"
},
{
"id": "ron-brown-scholar-program",
"name": "Ron Brown Scholar Program",
"organizer": "Ron Brown Scholar Fund",
- "organizer_url": "https://www.ronbrown.org/capstones/scholar-program/",
+ "organizer_url": "https://ronbrown.org/",
"category": "scholarship",
"subjects": [
"academics",
@@ -287,7 +288,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.ronbrown.org/capstones/scholar-program/"
+ "source_url": "https://ronbrown.org/ron-brown-scholarship/"
}
],
"added_by": "yashkewlani",
@@ -295,6 +296,7 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-02-15"
+ "valid_till": "2027-02-15",
+ "image": "/competitions/ron-brown-scholar-program.png"
}
]
diff --git a/data/competitions/stem.json b/data/competitions/stem.json
index 229ac45..c3a85fc 100644
--- a/data/competitions/stem.json
+++ b/data/competitions/stem.json
@@ -30,7 +30,7 @@
"type": "round",
"timezone": "UTC+2",
"estimated": true,
- "source_url": "https://ijsoweb.org/"
+ "source_url": "https://ijsoweb.org/ijso-2026-bulgaria"
}
],
"country_tracks": [
@@ -179,7 +179,7 @@
"type": "deadline",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://thebrainbee.org/"
+ "source_url": "https://www.thebrainbee.org/competition/"
},
{
"label": "World Championship",
@@ -419,7 +419,7 @@
"type": "round",
"timezone": "UTC+7",
"estimated": false,
- "source_url": "https://ioaastrophysics.org/"
+ "source_url": "https://ioaastrophysics.org/current-ioaa/news"
},
{
"label": "Results announced",
@@ -499,7 +499,7 @@
"type": "ceremony",
"timezone": "UTC-7",
"estimated": false,
- "source_url": "https://www.societyforscience.org/isef/"
+ "source_url": "https://www.societyforscience.org/isef/awards/"
}
],
"country_tracks": [
@@ -554,7 +554,7 @@
"type": "registration_open",
"timezone": "UTC-5",
"estimated": false,
- "source_url": "https://www.soinc.org/"
+ "source_url": "https://www.soinc.org/events/2027-division-b-events"
},
{
"label": "National Tournament",
@@ -562,7 +562,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.soinc.org/"
+ "source_url": "https://www.soinc.org/play/past-tournament-results"
}
],
"added_by": "yashkewlani",
@@ -612,7 +612,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": false,
- "source_url": "https://wro-association.org/"
+ "source_url": "https://wro-association.org/competition/2026-season/"
}
],
"country_tracks": [
@@ -718,7 +718,7 @@
"type": "round",
"timezone": "UTC+8",
"estimated": false,
- "source_url": "https://ioai-official.org/singapore-2027/"
+ "source_url": "https://ioai-official.org/about/"
}
],
"added_by": "yashkewlani",
@@ -766,7 +766,7 @@
"type": "round",
"timezone": "UTC",
"estimated": true,
- "source_url": "https://eupho.ee/"
+ "source_url": "https://eupho.ee/rules/"
}
],
"added_by": "yashkewlani",
@@ -799,7 +799,7 @@
"currency": "USD"
},
"prize": "Cash awards and recognition across three research tracks at the national final.",
- "official_url": "https://biotechinstitute.org/biogeneius/",
+ "official_url": "https://biotechinstitute.org/about-us/",
"cycle_year": 2027,
"dates": [
{
@@ -808,7 +808,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://biotechinstitute.org/biogeneius/"
+ "source_url": "https://biotechinstitute.org/past-biogeneius-winners/"
}
],
"added_by": "yashkewlani",
@@ -852,7 +852,7 @@
"type": "round",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://science.osti.gov/wdts/nsb"
+ "source_url": "https://science.osti.gov/wdts/nsb/Regional-Competitions"
},
{
"label": "National Finals (Washington DC)",
@@ -860,7 +860,7 @@
"type": "round",
"timezone": "UTC-4",
"estimated": true,
- "source_url": "https://science.osti.gov/wdts/nsb"
+ "source_url": "https://science.osti.gov/wdts/nsb/Key-Dates"
}
],
"added_by": "yashkewlani",
@@ -868,7 +868,8 @@
"by": "yashkewlani",
"on": "2026-09-13"
},
- "valid_till": "2027-05-01"
+ "valid_till": "2027-05-01",
+ "image": "/competitions/national-science-bowl.png"
},
{
"id": "exploravision",
@@ -892,7 +893,7 @@
"currency": "USD"
},
"prize": "Regional winners receive savings bonds; national winners get a trip and up to USD 10,000 in savings bonds.",
- "official_url": "https://www.exploravision.org/",
+ "official_url": "https://www.exploravision.org/rules-requirements/",
"cycle_year": 2027,
"dates": [
{
@@ -901,7 +902,7 @@
"type": "deadline",
"timezone": "UTC-5",
"estimated": true,
- "source_url": "https://www.exploravision.org/"
+ "source_url": "https://www.exploravision.org/for-teachers/"
}
],
"added_by": "yashkewlani",
diff --git a/public/competitions/48-hour-film-project.png b/public/competitions/48-hour-film-project.png
new file mode 100644
index 0000000..252c659
Binary files /dev/null and b/public/competitions/48-hour-film-project.png differ
diff --git a/public/competitions/adroit-prize.png b/public/competitions/adroit-prize.png
index 4a7c78f..675a8b3 100644
Binary files a/public/competitions/adroit-prize.png and b/public/competitions/adroit-prize.png differ
diff --git a/public/competitions/all-american-high-school-film-festival.png b/public/competitions/all-american-high-school-film-festival.png
index 1b37af6..44011b9 100644
Binary files a/public/competitions/all-american-high-school-film-festival.png and b/public/competitions/all-american-high-school-film-festival.png differ
diff --git a/public/competitions/ayn-rand-institute-essay-contests.png b/public/competitions/ayn-rand-institute-essay-contests.png
index 1a2c15c..cb99f37 100644
Binary files a/public/competitions/ayn-rand-institute-essay-contests.png and b/public/competitions/ayn-rand-institute-essay-contests.png differ
diff --git a/public/competitions/bebras-challenge.png b/public/competitions/bebras-challenge.png
index cc5de74..20b3af6 100644
Binary files a/public/competitions/bebras-challenge.png and b/public/competitions/bebras-challenge.png differ
diff --git a/public/competitions/bennington-young-writers-awards.png b/public/competitions/bennington-young-writers-awards.png
index 199f38f..c129e4e 100644
Binary files a/public/competitions/bennington-young-writers-awards.png and b/public/competitions/bennington-young-writers-awards.png differ
diff --git a/public/competitions/bpa-national-leadership-conference.png b/public/competitions/bpa-national-leadership-conference.png
index 70b213b..06554f5 100644
Binary files a/public/competitions/bpa-national-leadership-conference.png and b/public/competitions/bpa-national-leadership-conference.png differ
diff --git a/public/competitions/broadcom-masters.png b/public/competitions/broadcom-masters.png
new file mode 100644
index 0000000..6ec3faf
Binary files /dev/null and b/public/competitions/broadcom-masters.png differ
diff --git a/public/competitions/c-span-studentcam.png b/public/competitions/c-span-studentcam.png
index fcc3ab9..a25c814 100644
Binary files a/public/competitions/c-span-studentcam.png and b/public/competitions/c-span-studentcam.png differ
diff --git a/public/competitions/celebrating-art-contest.png b/public/competitions/celebrating-art-contest.png
new file mode 100644
index 0000000..e386f1c
Binary files /dev/null and b/public/competitions/celebrating-art-contest.png differ
diff --git a/public/competitions/certamen-nlc.png b/public/competitions/certamen-nlc.png
new file mode 100644
index 0000000..06f312e
Binary files /dev/null and b/public/competitions/certamen-nlc.png differ
diff --git a/public/competitions/concord-review.png b/public/competitions/concord-review.png
index de5b0f0..714d2dd 100644
Binary files a/public/competitions/concord-review.png and b/public/competitions/concord-review.png differ
diff --git a/public/competitions/congressional-art-competition.png b/public/competitions/congressional-art-competition.png
index 783c1ae..4429bc6 100644
Binary files a/public/competitions/congressional-art-competition.png and b/public/competitions/congressional-art-competition.png differ
diff --git a/public/competitions/davidson-fellows-scholarship.png b/public/competitions/davidson-fellows-scholarship.png
index c0cffa2..cf09382 100644
Binary files a/public/competitions/davidson-fellows-scholarship.png and b/public/competitions/davidson-fellows-scholarship.png differ
diff --git a/public/competitions/deca-icdc.png b/public/competitions/deca-icdc.png
index bed2655..30c5f37 100644
Binary files a/public/competitions/deca-icdc.png and b/public/competitions/deca-icdc.png differ
diff --git a/public/competitions/destination-imagination.png b/public/competitions/destination-imagination.png
new file mode 100644
index 0000000..e47b63d
Binary files /dev/null and b/public/competitions/destination-imagination.png differ
diff --git a/public/competitions/diamond-challenge.png b/public/competitions/diamond-challenge.png
index f992be9..c0562dc 100644
Binary files a/public/competitions/diamond-challenge.png and b/public/competitions/diamond-challenge.png differ
diff --git a/public/competitions/directing-change-ca.png b/public/competitions/directing-change-ca.png
index 7a19250..c3a58f4 100644
Binary files a/public/competitions/directing-change-ca.png and b/public/competitions/directing-change-ca.png differ
diff --git a/public/competitions/doodle-for-google.png b/public/competitions/doodle-for-google.png
index b018b02..7329020 100644
Binary files a/public/competitions/doodle-for-google.png and b/public/competitions/doodle-for-google.png differ
diff --git a/public/competitions/ecybermission.png b/public/competitions/ecybermission.png
index ed988e3..2da25af 100644
Binary files a/public/competitions/ecybermission.png and b/public/competitions/ecybermission.png differ
diff --git a/public/competitions/envirothon.png b/public/competitions/envirothon.png
index 2d8e23a..f0dd4b7 100644
Binary files a/public/competitions/envirothon.png and b/public/competitions/envirothon.png differ
diff --git a/public/competitions/european-physics-olympiad.png b/public/competitions/european-physics-olympiad.png
index a62521a..a0d2140 100644
Binary files a/public/competitions/european-physics-olympiad.png and b/public/competitions/european-physics-olympiad.png differ
diff --git a/public/competitions/european-youth-parliament.png b/public/competitions/european-youth-parliament.png
index c66ef13..1c5f6d4 100644
Binary files a/public/competitions/european-youth-parliament.png and b/public/competitions/european-youth-parliament.png differ
diff --git a/public/competitions/fbla-national-leadership-conference.png b/public/competitions/fbla-national-leadership-conference.png
index 3aebfd3..b08b410 100644
Binary files a/public/competitions/fbla-national-leadership-conference.png and b/public/competitions/fbla-national-leadership-conference.png differ
diff --git a/public/competitions/fed-challenge-high-school.png b/public/competitions/fed-challenge-high-school.png
new file mode 100644
index 0000000..8c4a1d0
Binary files /dev/null and b/public/competitions/fed-challenge-high-school.png differ
diff --git a/public/competitions/first-global-challenge.png b/public/competitions/first-global-challenge.png
index b5d0763..766e8b3 100644
Binary files a/public/competitions/first-global-challenge.png and b/public/competitions/first-global-challenge.png differ
diff --git a/public/competitions/first-robotics-competition.png b/public/competitions/first-robotics-competition.png
index 1f94296..cf8c696 100644
Binary files a/public/competitions/first-robotics-competition.png and b/public/competitions/first-robotics-competition.png differ
diff --git a/public/competitions/first-tech-challenge.png b/public/competitions/first-tech-challenge.png
index 1f94296..cf8c696 100644
Binary files a/public/competitions/first-tech-challenge.png and b/public/competitions/first-tech-challenge.png differ
diff --git a/public/competitions/foyle-young-poets-of-the-year-award.png b/public/competitions/foyle-young-poets-of-the-year-award.png
index a73e441..3faea74 100644
Binary files a/public/competitions/foyle-young-poets-of-the-year-award.png and b/public/competitions/foyle-young-poets-of-the-year-award.png differ
diff --git a/public/competitions/globe-virtual-science-fair.png b/public/competitions/globe-virtual-science-fair.png
new file mode 100644
index 0000000..e4c5e13
Binary files /dev/null and b/public/competitions/globe-virtual-science-fair.png differ
diff --git a/public/competitions/harvard-crimson-global-essay-competition.png b/public/competitions/harvard-crimson-global-essay-competition.png
index b763e4a..093155c 100644
Binary files a/public/competitions/harvard-crimson-global-essay-competition.png and b/public/competitions/harvard-crimson-global-essay-competition.png differ
diff --git a/public/competitions/harvard-model-congress.png b/public/competitions/harvard-model-congress.png
new file mode 100644
index 0000000..ce5d51a
Binary files /dev/null and b/public/competitions/harvard-model-congress.png differ
diff --git a/public/competitions/harvard-model-united-nations.png b/public/competitions/harvard-model-united-nations.png
index fcaa451..8d303ad 100644
Binary files a/public/competitions/harvard-model-united-nations.png and b/public/competitions/harvard-model-united-nations.png differ
diff --git a/public/competitions/hmmt.png b/public/competitions/hmmt.png
index df44530..9b17006 100644
Binary files a/public/competitions/hmmt.png and b/public/competitions/hmmt.png differ
diff --git a/public/competitions/igem-high-school.png b/public/competitions/igem-high-school.png
index 0014857..9f05e93 100644
Binary files a/public/competitions/igem-high-school.png and b/public/competitions/igem-high-school.png differ
diff --git a/public/competitions/international-biology-olympiad.png b/public/competitions/international-biology-olympiad.png
index f0e6a42..8f11ed5 100644
Binary files a/public/competitions/international-biology-olympiad.png and b/public/competitions/international-biology-olympiad.png differ
diff --git a/public/competitions/international-brain-bee.png b/public/competitions/international-brain-bee.png
index d4bf6ce..f8d86ee 100644
Binary files a/public/competitions/international-brain-bee.png and b/public/competitions/international-brain-bee.png differ
diff --git a/public/competitions/international-chemistry-olympiad.png b/public/competitions/international-chemistry-olympiad.png
index 06a8db3..53de7cd 100644
Binary files a/public/competitions/international-chemistry-olympiad.png and b/public/competitions/international-chemistry-olympiad.png differ
diff --git a/public/competitions/international-geography-olympiad.png b/public/competitions/international-geography-olympiad.png
index 220185f..bfd95f7 100644
Binary files a/public/competitions/international-geography-olympiad.png and b/public/competitions/international-geography-olympiad.png differ
diff --git a/public/competitions/international-history-olympiad.png b/public/competitions/international-history-olympiad.png
index 943f6cc..5fdcff1 100644
Binary files a/public/competitions/international-history-olympiad.png and b/public/competitions/international-history-olympiad.png differ
diff --git a/public/competitions/international-linguistics-olympiad.png b/public/competitions/international-linguistics-olympiad.png
index 8a40f3e..87b5d9c 100644
Binary files a/public/competitions/international-linguistics-olympiad.png and b/public/competitions/international-linguistics-olympiad.png differ
diff --git a/public/competitions/international-olympiad-in-informatics.png b/public/competitions/international-olympiad-in-informatics.png
index b018b02..e4db24c 100644
Binary files a/public/competitions/international-olympiad-in-informatics.png and b/public/competitions/international-olympiad-in-informatics.png differ
diff --git a/public/competitions/ioaa.png b/public/competitions/ioaa.png
index 240d676..9da7fec 100644
Binary files a/public/competitions/ioaa.png and b/public/competitions/ioaa.png differ
diff --git a/public/competitions/ja-company-of-the-year.png b/public/competitions/ja-company-of-the-year.png
index d67debd..868838b 100644
Binary files a/public/competitions/ja-company-of-the-year.png and b/public/competitions/ja-company-of-the-year.png differ
diff --git a/public/competitions/ja-stock-market-challenge.png b/public/competitions/ja-stock-market-challenge.png
new file mode 100644
index 0000000..868838b
Binary files /dev/null and b/public/competitions/ja-stock-market-challenge.png differ
diff --git a/public/competitions/jack-kent-cooke-young-scholars.png b/public/competitions/jack-kent-cooke-young-scholars.png
new file mode 100644
index 0000000..4c4dabe
Binary files /dev/null and b/public/competitions/jack-kent-cooke-young-scholars.png differ
diff --git a/public/competitions/jshs.png b/public/competitions/jshs.png
index 9763d31..106041f 100644
Binary files a/public/competitions/jshs.png and b/public/competitions/jshs.png differ
diff --git a/public/competitions/le-grand-concours.png b/public/competitions/le-grand-concours.png
new file mode 100644
index 0000000..d46fd6b
Binary files /dev/null and b/public/competitions/le-grand-concours.png differ
diff --git a/public/competitions/lockheed-martin-codequest.png b/public/competitions/lockheed-martin-codequest.png
new file mode 100644
index 0000000..614347f
Binary files /dev/null and b/public/competitions/lockheed-martin-codequest.png differ
diff --git a/public/competitions/math-prize-for-girls.png b/public/competitions/math-prize-for-girls.png
index a0823f8..d1dbbcc 100644
Binary files a/public/competitions/math-prize-for-girls.png and b/public/competitions/math-prize-for-girls.png differ
diff --git a/public/competitions/mathcounts.png b/public/competitions/mathcounts.png
index d92726e..24eecd5 100644
Binary files a/public/competitions/mathcounts.png and b/public/competitions/mathcounts.png differ
diff --git a/public/competitions/mathworks-m3-challenge.png b/public/competitions/mathworks-m3-challenge.png
index e6162b7..327e1af 100644
Binary files a/public/competitions/mathworks-m3-challenge.png and b/public/competitions/mathworks-m3-challenge.png differ
diff --git a/public/competitions/mit-battlecode.png b/public/competitions/mit-battlecode.png
new file mode 100644
index 0000000..e8777b5
Binary files /dev/null and b/public/competitions/mit-battlecode.png differ
diff --git a/public/competitions/mit-think.png b/public/competitions/mit-think.png
index 1ed0cd5..3933b59 100644
Binary files a/public/competitions/mit-think.png and b/public/competitions/mit-think.png differ
diff --git a/public/competitions/mspdp-public-debate.png b/public/competitions/mspdp-public-debate.png
new file mode 100644
index 0000000..578892e
Binary files /dev/null and b/public/competitions/mspdp-public-debate.png differ
diff --git a/public/competitions/national-economics-challenge.png b/public/competitions/national-economics-challenge.png
index 65a6823..51965e3 100644
Binary files a/public/competitions/national-economics-challenge.png and b/public/competitions/national-economics-challenge.png differ
diff --git a/public/competitions/national-history-bee.png b/public/competitions/national-history-bee.png
index c329f2c..6730d8a 100644
Binary files a/public/competitions/national-history-bee.png and b/public/competitions/national-history-bee.png differ
diff --git a/public/competitions/national-history-bowl.png b/public/competitions/national-history-bowl.png
index c329f2c..6730d8a 100644
Binary files a/public/competitions/national-history-bowl.png and b/public/competitions/national-history-bowl.png differ
diff --git a/public/competitions/national-history-challenge-australia.png b/public/competitions/national-history-challenge-australia.png
new file mode 100644
index 0000000..328c2c4
Binary files /dev/null and b/public/competitions/national-history-challenge-australia.png differ
diff --git a/public/competitions/national-history-day.png b/public/competitions/national-history-day.png
index 6a2391c..9ec0d0c 100644
Binary files a/public/competitions/national-history-day.png and b/public/competitions/national-history-day.png differ
diff --git a/public/competitions/national-personal-finance-challenge.png b/public/competitions/national-personal-finance-challenge.png
index 65a6823..a11a7d9 100644
Binary files a/public/competitions/national-personal-finance-challenge.png and b/public/competitions/national-personal-finance-challenge.png differ
diff --git a/public/competitions/national-science-bowl.png b/public/competitions/national-science-bowl.png
new file mode 100644
index 0000000..e1c2312
Binary files /dev/null and b/public/competitions/national-science-bowl.png differ
diff --git a/public/competitions/nffty.png b/public/competitions/nffty.png
index 0bebe5b..78c89da 100644
Binary files a/public/competitions/nffty.png and b/public/competitions/nffty.png differ
diff --git a/public/competitions/nfte-world-series-of-innovation.png b/public/competitions/nfte-world-series-of-innovation.png
index 3467e0b..12f4759 100644
Binary files a/public/competitions/nfte-world-series-of-innovation.png and b/public/competitions/nfte-world-series-of-innovation.png differ
diff --git a/public/competitions/nyt-student-editorial-contest.png b/public/competitions/nyt-student-editorial-contest.png
new file mode 100644
index 0000000..76ecaae
Binary files /dev/null and b/public/competitions/nyt-student-editorial-contest.png differ
diff --git a/public/competitions/odyssey-of-the-mind.png b/public/competitions/odyssey-of-the-mind.png
new file mode 100644
index 0000000..47be3ef
Binary files /dev/null and b/public/competitions/odyssey-of-the-mind.png differ
diff --git a/public/competitions/oxford-german-olympiad.png b/public/competitions/oxford-german-olympiad.png
index f22da90..1ab5cf1 100644
Binary files a/public/competitions/oxford-german-olympiad.png and b/public/competitions/oxford-german-olympiad.png differ
diff --git a/public/competitions/purple-comet-math-meet.png b/public/competitions/purple-comet-math-meet.png
index 4b6b458..024658e 100644
Binary files a/public/competitions/purple-comet-math-meet.png and b/public/competitions/purple-comet-math-meet.png differ
diff --git a/public/competitions/questbridge-national-college-match.png b/public/competitions/questbridge-national-college-match.png
index 97e693e..6d98ee7 100644
Binary files a/public/competitions/questbridge-national-college-match.png and b/public/competitions/questbridge-national-college-match.png differ
diff --git a/public/competitions/rattle-poetry-prize.png b/public/competitions/rattle-poetry-prize.png
index 40faff2..ff5b1bf 100644
Binary files a/public/competitions/rattle-poetry-prize.png and b/public/competitions/rattle-poetry-prize.png differ
diff --git a/public/competitions/reedsy-short-story-contest.png b/public/competitions/reedsy-short-story-contest.png
new file mode 100644
index 0000000..d18fd45
Binary files /dev/null and b/public/competitions/reedsy-short-story-contest.png differ
diff --git a/public/competitions/regeneron-isef.png b/public/competitions/regeneron-isef.png
index 5ecee48..6ec3faf 100644
Binary files a/public/competitions/regeneron-isef.png and b/public/competitions/regeneron-isef.png differ
diff --git a/public/competitions/regeneron-science-talent-search.png b/public/competitions/regeneron-science-talent-search.png
index 5ecee48..6ec3faf 100644
Binary files a/public/competitions/regeneron-science-talent-search.png and b/public/competitions/regeneron-science-talent-search.png differ
diff --git a/public/competitions/ron-brown-scholar-program.png b/public/competitions/ron-brown-scholar-program.png
new file mode 100644
index 0000000..fdc37d6
Binary files /dev/null and b/public/competitions/ron-brown-scholar-program.png differ
diff --git a/public/competitions/sage-global.png b/public/competitions/sage-global.png
new file mode 100644
index 0000000..8753442
Binary files /dev/null and b/public/competitions/sage-global.png differ
diff --git a/public/competitions/scholastic-art-and-writing-awards.png b/public/competitions/scholastic-art-and-writing-awards.png
index d287dd8..81ca25a 100644
Binary files a/public/competitions/scholastic-art-and-writing-awards.png and b/public/competitions/scholastic-art-and-writing-awards.png differ
diff --git a/public/competitions/science-olympiad.png b/public/competitions/science-olympiad.png
index 47c2b6b..0e76f4d 100644
Binary files a/public/competitions/science-olympiad.png and b/public/competitions/science-olympiad.png differ
diff --git a/public/competitions/science-without-borders-challenge.png b/public/competitions/science-without-borders-challenge.png
new file mode 100644
index 0000000..4173279
Binary files /dev/null and b/public/competitions/science-without-borders-challenge.png differ
diff --git a/public/competitions/signet-classics-student-scholarship-essay-contest.png b/public/competitions/signet-classics-student-scholarship-essay-contest.png
index 5d52190..61be3cc 100644
Binary files a/public/competitions/signet-classics-student-scholarship-essay-contest.png and b/public/competitions/signet-classics-student-scholarship-essay-contest.png differ
diff --git a/public/competitions/teen-ink-contests.png b/public/competitions/teen-ink-contests.png
new file mode 100644
index 0000000..7e32433
Binary files /dev/null and b/public/competitions/teen-ink-contests.png differ
diff --git a/public/competitions/the-politic-high-school-essay-competition.png b/public/competitions/the-politic-high-school-essay-competition.png
index cca4414..e96de0b 100644
Binary files a/public/competitions/the-politic-high-school-essay-competition.png and b/public/competitions/the-politic-high-school-essay-competition.png differ
diff --git a/public/competitions/tournament-of-the-towns.png b/public/competitions/tournament-of-the-towns.png
index 73f3634..48cffce 100644
Binary files a/public/competitions/tournament-of-the-towns.png and b/public/competitions/tournament-of-the-towns.png differ
diff --git a/public/competitions/una-usa-global-citizen-essay-contest.png b/public/competitions/una-usa-global-citizen-essay-contest.png
new file mode 100644
index 0000000..cff1f6f
Binary files /dev/null and b/public/competitions/una-usa-global-citizen-essay-contest.png differ
diff --git a/public/competitions/we-the-students-essay-contest.png b/public/competitions/we-the-students-essay-contest.png
index 4da03dc..261a360 100644
Binary files a/public/competitions/we-the-students-essay-contest.png and b/public/competitions/we-the-students-essay-contest.png differ
diff --git a/public/competitions/wharton-global-high-school-investment-competition.png b/public/competitions/wharton-global-high-school-investment-competition.png
index f640ce0..0269397 100644
Binary files a/public/competitions/wharton-global-high-school-investment-competition.png and b/public/competitions/wharton-global-high-school-investment-competition.png differ
diff --git a/public/competitions/wharton-high-school-data-science-competition.png b/public/competitions/wharton-high-school-data-science-competition.png
index f640ce0..0269397 100644
Binary files a/public/competitions/wharton-high-school-data-science-competition.png and b/public/competitions/wharton-high-school-data-science-competition.png differ
diff --git a/public/competitions/widpsc.png b/public/competitions/widpsc.png
index cd323e7..baf6aa3 100644
Binary files a/public/competitions/widpsc.png and b/public/competitions/widpsc.png differ
diff --git a/public/competitions/world-of-7-billion-student-video-contest.png b/public/competitions/world-of-7-billion-student-video-contest.png
new file mode 100644
index 0000000..6023085
Binary files /dev/null and b/public/competitions/world-of-7-billion-student-video-contest.png differ
diff --git a/public/competitions/world-robot-olympiad.png b/public/competitions/world-robot-olympiad.png
index 96295ea..395c7db 100644
Binary files a/public/competitions/world-robot-olympiad.png and b/public/competitions/world-robot-olympiad.png differ
diff --git a/public/competitions/world-scholars-cup.png b/public/competitions/world-scholars-cup.png
index e155fe0..0dea228 100644
Binary files a/public/competitions/world-scholars-cup.png and b/public/competitions/world-scholars-cup.png differ
diff --git a/public/competitions/world-schools-debating-championship.png b/public/competitions/world-schools-debating-championship.png
index 680fc48..b9fa117 100644
Binary files a/public/competitions/world-schools-debating-championship.png and b/public/competitions/world-schools-debating-championship.png differ
diff --git a/public/competitions/young-enterprise-company-programme.png b/public/competitions/young-enterprise-company-programme.png
new file mode 100644
index 0000000..ce8f209
Binary files /dev/null and b/public/competitions/young-enterprise-company-programme.png differ
diff --git a/public/competitions/youngarts-national-arts-competition.png b/public/competitions/youngarts-national-arts-competition.png
index 2a48ab0..ce90e54 100644
Binary files a/public/competitions/youngarts-national-arts-competition.png and b/public/competitions/youngarts-national-arts-competition.png differ
diff --git a/scripts/refresh-competition-logos.mjs b/scripts/refresh-competition-logos.mjs
new file mode 100644
index 0000000..f1cc5c9
--- /dev/null
+++ b/scripts/refresh-competition-logos.mjs
@@ -0,0 +1,394 @@
+// Refreshes competition logo PNGs in public/competitions to a quality that
+// survives the card banner: any record whose current logo is missing or under
+// ~128px on the long edge is re-fetched at a larger size.
+//
+// Strategy, per competition:
+// 1. A curated OVERRIDES map (id -> ordered candidate URLs). This is where
+// researched, known-good logo URLs for tricky sites live.
+// 2. Otherwise probe the record's official domain for the standard touch
+// icon / android-chrome asset paths, which are real logo marks at
+// 180px+, unlike favicon.ico.
+//
+// The first candidate that yields a readable raster at or above the size bar
+// (128px, preferring 256px+) wins. Every accepted asset is converted to a
+// transparent-background PNG, trimmed of whitespace, and centered on a 512x512
+// transparent canvas so all cards render uniformly via object-contain.
+//
+// Idempotent: already-fine logos are never overwritten. Usage:
+// node scripts/refresh-competition-logos.mjs [--overwrite]
+// --overwrite re-fetches every record even when the current logo already
+// clears the size bar.
+
+import { readFileSync, writeFileSync, existsSync, readdirSync } from "node:fs";
+import { resolve, join } from "node:path";
+import sharp from "sharp";
+
+const ROOT = process.cwd();
+const DATA_DIR = process.argv.includes("--data-dir")
+ ? resolve(process.argv[process.argv.indexOf("--data-dir") + 1])
+ : join(ROOT, "data", "competitions");
+const OUT_DIR = join(ROOT, "public", "competitions");
+const OVERWRITE = process.argv.includes("--overwrite");
+const MAX_EDGE = 512;
+const SIZE_BAR = 128;
+
+const UA =
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36";
+
+// Curated, researched logo URLs in priority order. Prefer a mark over a
+// cover photo; the picker scores square-ish images highly and rejects
+// anything it cannot rasterize at the size bar.
+const OVERRIDES = {
+ // Researched, known-good logo URLs in priority order (best first).
+ "international-olympiad-in-informatics": [
+ "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/IOI_logo.png/960px-IOI_logo.png",
+ ],
+ "world-scholars-cup": [
+ "https://upload.wikimedia.org/wikipedia/en/a/af/WSC_Logo_notext.png",
+ ],
+ "ayn-rand-institute-essay-contests": [
+ "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/Ari_logo_header.png/960px-Ari_logo_header.png",
+ ],
+ // Official brand mark from the org's own site.
+ envirothon: [
+ "https://envirothon.org/wp-content/uploads/2022/02/Envirothon-logo-Registered143x.png",
+ ],
+ hmmt: ["https://hmmt-prod.s3.amazonaws.com/static/img/logo/hmmt/logo.png"],
+ "tournament-of-the-towns": ["https://www.turgor.ru/i/logo.gif"],
+ "ja-company-of-the-year": [
+ "https://cdn.worldvectorlogo.com/logos/junior-achievement.svg",
+ ],
+ "ja-stock-market-challenge": [
+ "https://cdn.worldvectorlogo.com/logos/junior-achievement.svg",
+ ],
+ "questbridge-national-college-match": [
+ "https://www.questbridge.org/apple-touch-icon.png",
+ ],
+ "mit-think": ["https://think.mit.edu/images/blinker.svg"],
+ "nsda-national-tournament": [
+ // Only white-on-transparent colorways are hosted; skip (checked by hand:
+ // the RGB option renders as a near-blank frame).
+ "https://www.speechanddebate.org/wp-content/uploads/NSDA-Logo-RGB.png",
+ "https://www.speechanddebate.org/wp-content/uploads/NSDA-Logo-RGB-REVERSED.png",
+ ],
+ "certamen-nlc": [
+ // NLE's own 192px favicon is a clean brand mark.
+ "https://www.nle.org/favicon.ico",
+ ],
+ "congressional-art-competition": [
+ // The official seal of the U.S. House, which runs the program.
+ "https://commons.wikimedia.org/wiki/Special:FilePath/Seal_of_the_United_States_House_of_Representatives.svg",
+ ],
+ "bennington-young-writers-awards": [
+ "https://upload.wikimedia.org/wikipedia/commons/8/81/Bennington_College_logo.jpg",
+ ],
+};
+
+const STATIC_PATHS = [
+ "/apple-touch-icon.png",
+ "/apple-touch-icon-precomposed.png",
+ "/apple-touch-icon-180x180.png",
+ "/apple-touch-icon-152x152.png",
+ "/android-chrome-512x512.png",
+ "/android-chrome-192x192.png",
+ "/favicon-512x512.png",
+ "/favicon-192x192.png",
+];
+
+function log(rec, msg) {
+ console.log(`${msg} (${rec.id})`);
+}
+
+async function fetchBuffer(url, timeoutMs = 15000) {
+ const ctrl = new AbortController();
+ const t = setTimeout(() => ctrl.abort(), timeoutMs);
+ try {
+ const res = await fetch(url, {
+ redirect: "follow",
+ signal: ctrl.signal,
+ headers: { "user-agent": UA, accept: "image/*,*/*;q=0.8" },
+ });
+ if (!res.ok) return null;
+ const buf = Buffer.from(await res.arrayBuffer());
+ if (buf.length < 500) return null; // too small to be a real logo
+ return buf;
+ } catch {
+ return null;
+ } finally {
+ clearTimeout(t);
+ }
+}
+
+async function fetchText(url, timeoutMs = 15000) {
+ const ctrl = new AbortController();
+ const t = setTimeout(() => ctrl.abort(), timeoutMs);
+ try {
+ const res = await fetch(url, {
+ redirect: "follow",
+ signal: ctrl.signal,
+ headers: { "user-agent": UA, accept: "text/html,*/*;q=0.5" },
+ });
+ if (!res.ok) return null;
+ return await res.text();
+ } catch {
+ return null;
+ } finally {
+ clearTimeout(t);
+ }
+}
+
+// Follow a homepage's icon links to the real asset URLs instead of guessing
+// standard paths (most sites host icons on a CDN now). Returns URL, highest
+// sizes first; falls back to og:image as a last resort.
+async function discoverAssets(baseUrl) {
+ const html = await fetchText(baseUrl);
+ if (!html) return [];
+ const hrefs = [];
+ const links = [...html.matchAll(/]*>/gi)];
+ for (const m of links) {
+ const tag = m[0];
+ const rel = (tag.match(/rel\s*=\s*["']([^"']*)["']/i)?.[1] ?? "").toLowerCase();
+ const href = tag.match(/href\s*=\s*["']([^"']+)["']/i)?.[1];
+ const sizes = (tag.match(/sizes\s*=\s*["']([^"']*)["']/i)?.[1] ?? "").match(
+ /^(\d+)x(\d+)$/,
+ );
+ if (!rel.includes("icon") || !href) continue;
+ const { width = 0, height = 0 } = sizes
+ ? { width: +sizes[1], height: +sizes[2] }
+ : {};
+ hrefs.push({ href, width, height, kind: rel.includes("apple") ? "apple" : "icon" });
+ }
+ const metas = [...html.matchAll(/]*>/gi)];
+ for (const m of metas) {
+ const name = (m[0].match(/name\s*=\s*["']([^"']+)["']/i)?.[1] ?? "").toLowerCase();
+ const content = m[0].match(/content\s*=\s*["']([^"']+)["']/i)?.[1];
+ if ((name === "msapplication-tileimage" || name === "twitter:image") && content) {
+ hrefs.push({ href: content, width: 144, height: 144, kind: "icon" });
+ }
+ }
+ const og = html.match(
+ /]*property\s*=\s*["']og:image["'][^>]*content\s*=\s*["']([^"']+)["']/i,
+ );
+ if (og) hrefs.push({ href: og[1], width: 0, height: 0, kind: "og" });
+
+ const resolved = hrefs
+ .map((h) => {
+ try {
+ return { url: new URL(h.href, baseUrl).href, ...h };
+ } catch {
+ return null;
+ }
+ })
+ .filter(Boolean)
+ .filter((h) => !h.url.startsWith("data:"));
+ // Prefer brand marks over og covers, then larger declared sizes.
+ resolved.sort(
+ (a, b) => (a.kind === "og" ? 1 : 0) - (b.kind === "og" ? 1 : 0) || b.width - a.width,
+ );
+ return resolved.map((h) => h.url);
+}
+
+async function sizeOf(buf) {
+ try {
+ const meta = await sharp(buf).metadata();
+ return { w: meta.width, h: meta.height };
+ } catch {
+ return null;
+ }
+}
+
+// A file can clear the size bar yet be a visually empty canvas (all-alpha) or
+// a near-solid white tile, which is worse than a small-but-real mark. Detect
+// both by sampling alpha coverage on a small downscale.
+async function isBlankPng(buf) {
+ try {
+ const { data, info } = await sharp(buf)
+ .resize(48)
+ .raw()
+ .toBuffer({ resolveWithObject: true });
+ const n = info.width * info.height;
+ let vis = 0;
+ let sum = 0;
+ for (let i = 0; i < data.length; i += 4) {
+ if (data[i + 3] > 128) {
+ vis++;
+ sum += data[i] + data[i + 1] + data[i + 2];
+ }
+ }
+ const ratio = vis / n;
+ if (ratio < 0.05) return true; // essentially an empty canvas
+ const mean = vis ? sum / (vis * 3) : 0;
+ if (ratio > 0.7 && mean > 245) return true; // near-solid white tile
+ return false;
+ } catch {
+ return false;
+ }
+}
+
+// Lower is better. Square-ish large marks outrank wide covers.
+function score(w, h) {
+ const long = Math.max(w, h);
+ const short = Math.min(w, h);
+ const squareness = short / long;
+ return long < SIZE_BAR ? Infinity : 1e9 - long * 10 - squareness * 1e6;
+}
+
+async function convertToPng(buf, outFile) {
+ let resized;
+ try {
+ resized = await sharp(buf)
+ .rotate()
+ .trim()
+ .resize({
+ width: MAX_EDGE,
+ height: MAX_EDGE,
+ fit: "inside",
+ withoutEnlargement: false,
+ })
+ .png()
+ .toBuffer();
+ } catch {
+ // A fully transparent frame refuses to trim; fall back to untrimmed.
+ resized = await sharp(buf)
+ .rotate()
+ .resize({
+ width: MAX_EDGE,
+ height: MAX_EDGE,
+ fit: "inside",
+ withoutEnlargement: false,
+ })
+ .png()
+ .toBuffer();
+ }
+ const { width, height } = await sharp(resized).metadata();
+ const canvas = sharp({
+ create: {
+ width: MAX_EDGE,
+ height: MAX_EDGE,
+ channels: 4,
+ background: { r: 0, g: 0, b: 0, alpha: 0 },
+ },
+ });
+ const composed = await canvas
+ .composite([{ input: resized, gravity: "centre" }])
+ .png()
+ .toBuffer();
+ writeFileSync(outFile, composed);
+ return { width, height };
+}
+
+async function tryAssets(rec, urls) {
+ const loaded = [];
+ for (const url of urls) {
+ if (!url) continue;
+ const buf = await fetchBuffer(url);
+ if (!buf) continue;
+ const sz = await sizeOf(buf);
+ if (!sz) continue;
+ loaded.push({ url, buf, s: score(sz.w, sz.h) });
+ }
+ if (!loaded.length) return null;
+ loaded.sort((a, b) => a.s - b.s);
+ for (const cand of loaded) {
+ // A candidate that is itself an empty canvas or solid-white tile (see
+ // isBlankPng) is never an upgrade, no matter how large.
+ if (await isBlankPng(cand.buf)) continue;
+ const dims = await convertToPng(cand.buf, join(OUT_DIR, `${rec.id}.png`));
+ return { url: cand.url, w: dims.width, h: dims.height };
+ }
+ return null;
+}
+
+const fileNames = readdirSync(DATA_DIR).filter((f) => f.endsWith(".json"));
+
+async function main() {
+ const list = [];
+ for (const fn of fileNames) {
+ const recs = JSON.parse(readFileSync(join(DATA_DIR, fn), "utf8"));
+ for (const r of recs) list.push(r);
+ }
+
+ let updated = 0;
+ let skipped = 0;
+ let failed = 0;
+
+ const workers = Math.min(8, list.length);
+ let idx = 0;
+
+ async function worker() {
+ while (idx < list.length) {
+ const rec = list[idx++];
+ const outFile = join(OUT_DIR, `${rec.id}.png`);
+ let size = null;
+ if (!OVERWRITE && existsSync(outFile)) {
+ size = await sizeOf(readFileSync(outFile));
+ }
+ if (
+ size &&
+ Math.max(size.w, size.h) >= SIZE_BAR &&
+ !(await isBlankPng(readFileSync(outFile)))
+ ) {
+ log(rec, "SKIP already fine");
+ skipped++;
+ continue;
+ }
+ const siteFor = [rec.official_url, rec.organizer_url]
+ .map((u) => {
+ try {
+ return u ? new URL(u) : null;
+ } catch {
+ return null;
+ }
+ })
+ .find(Boolean);
+ const domainOf = siteFor ? siteFor.hostname.replace(/^www\./, "") : null;
+ // A competition hosted on a deep path of someone else's domain (e.g.
+ // filmfreeway.com/festival/x, mlh.io/seasons/...) has no favicon of its
+ // own; the Google favicon for that host would be the host's mark, not the
+ // competition's, so never fall back to it there.
+ const deepHostPath =
+ siteFor &&
+ siteFor.pathname.replace(/\/+$/, "").split("/").filter(Boolean).length > 1;
+ const override = OVERRIDES[rec.id];
+ const discovered = domainOf ? await discoverAssets(`https://${domainOf}/`) : [];
+ const candidates = [
+ ...(override ?? []),
+ ...((override ?? []).length
+ ? []
+ : [
+ ...STATIC_PATHS.map((p) => `https://${domainOf}${p}`),
+ ...discovered,
+ // Last resort: the site's favicon at 256px. It is the same mark
+ // a site already ships, so never wrong content, and at 256px it
+ // clears the size bar without the 10-20x stretch that pixelated
+ // the old 16-48px copies.
+ ...(domainOf && !deepHostPath
+ ? [
+ `https://www.google.com/s2/favicons?domain=${domainOf}&sz=256`,
+ `https://www.google.com/s2/favicons?domain=${domainOf}&sz=512`,
+ ]
+ : []),
+ ]),
+ ];
+ const got = await tryAssets(rec, candidates);
+ if (got) {
+ console.log(`OK ${rec.id} ${got.w}x${got.h} <- ${got.url}`);
+ updated++;
+ } else {
+ log(rec, "FAIL (no candidate asset found)");
+ failed++;
+ }
+ }
+ }
+
+ await Promise.all(Array.from({ length: workers }, worker));
+
+ console.log(
+ `\ndone: ${updated} updated, ${skipped} skipped (already fine), ${failed} failed`,
+ );
+}
+
+main().catch((e) => {
+ console.error(e);
+ process.exit(1);
+});
diff --git a/scripts/validate-competitions.mjs b/scripts/validate-competitions.mjs
index 6331a4e..3c96ee5 100644
--- a/scripts/validate-competitions.mjs
+++ b/scripts/validate-competitions.mjs
@@ -23,6 +23,8 @@
* - country_tracks[].country is one of the 13 permitted codes and does not
* repeat within one record; each stage has a real calendar date and a
* well-formed source_url
+ * - At least 3 distinct source URLs per record, counting organizer_url,
+ * official_url, dates[].source_url, and country_tracks URLs (#268)
* - No em dashes in any string field
*
* Exits 0 when all files pass, 1 when any error is found.
@@ -296,6 +298,18 @@ for (const file of files) {
}
}
+ // At least 3 distinct source URLs per record. A competition that reuses
+ // the same page for organizer, official and source_url is only one link
+ // deep, so every record must point at 3 distinct pages somewhere across
+ // its URL fields (#268).
+ const distinct = collectDistinctUrls(r);
+ if (distinct.size < 3) {
+ err(
+ loc,
+ `record must have at least 3 distinct source URLs, found ${distinct.size} (${[...distinct].join(", ")})`,
+ );
+ }
+
// cycle_year sanity
if (r.cycle_year !== undefined && !Number.isInteger(r.cycle_year)) {
err(loc, `cycle_year must be an integer, got ${JSON.stringify(r.cycle_year)}`);
@@ -345,6 +359,34 @@ for (const file of files) {
);
}
+/**
+ * The set of distinct pages a record links to, normalized so that
+ * http/https, a leading "www.", default ports, trailing slashes and hash
+ * fragments do not count as separate links (#268). Different pathnames on
+ * the same site are distinct pages.
+ */
+function collectDistinctUrls(r) {
+ const hrefs = [r.organizer_url, r.official_url];
+ for (const d of r.dates ?? []) hrefs.push(d.source_url);
+ for (const ct of r.country_tracks ?? []) {
+ hrefs.push(ct.official_url);
+ for (const st of ct.stages ?? []) hrefs.push(st.source_url);
+ }
+
+ const seen = new Set();
+ for (const href of hrefs) {
+ try {
+ const { host, pathname, search } = new URL(href);
+ const key =
+ `${host.replace(/^www\./, "")}${pathname.replace(/\/$/, "")}${search}`.toLowerCase();
+ seen.add(key);
+ } catch {
+ // Not a well-formed URL; the individual field checks report it.
+ }
+ }
+ return seen;
+}
+
function checkEmDashes(value, loc, path = "") {
if (typeof value === "string") {
if (hasEmDash(value)) {
diff --git a/src/lib/validate-competitions.test.ts b/src/lib/validate-competitions.test.ts
index 968d8ee..9dcbcde 100644
--- a/src/lib/validate-competitions.test.ts
+++ b/src/lib/validate-competitions.test.ts
@@ -24,7 +24,7 @@ function validRecord(overrides: Record = {}) {
region: "international",
fee: { amount: 0, currency: "USD" },
prize: "A prize",
- official_url: "https://example.com",
+ official_url: "https://example.org",
cycle_year: 2026,
dates: [
{
@@ -239,6 +239,17 @@ describe("competitions validator", () => {
expect(result.stderr).toContain("contains an em dash");
});
+ it("fails when a record has fewer than 3 distinct source URLs", () => {
+ const result = runValidator({
+ // official_url collapses onto organizer_url, leaving only two pages.
+ "stem.json": [validRecord({ official_url: "https://example.com" })],
+ });
+
+ expect(result.status).toBe(1);
+ expect(result.stderr).toContain("at least 3 distinct source URLs");
+ expect(result.stderr).toContain("found 2");
+ });
+
it("fails on an unknown field not in the schema", () => {
const result = runValidator({
"stem.json": [validRecord({ rating: 4.8 })],