Skip to content

Conversation

@mikewolfd
Copy link
Member

No description provided.

@mikewolfd
Copy link
Member Author

/gemini review

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary of Changes

Hello @mikewolfd, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces a new event page for the Civic Hack DC 2025 hackathon, updates the Open Data DC Showcase event page, and improves the styling and content of the events listing page. Additionally, it includes minor content and formatting updates to several project pages to enhance clarity and consistency.

Highlights

  • Event Pages: Created a new event page for 'Civic Hack DC 2025' with details about the hackathon, including its purpose, partners, goals, and schedule. Also, modified the 'Open Data DC Showcase' event page to use the 'events' layout and updated its content.
  • Layout Changes: Modified the 'events' layout to remove the date and location from the hero section and to use the page's content directly instead of the description.
  • Project Pages: Updated several project pages (_projects) to improve descriptions, correct minor grammatical errors, and standardize the 'Come Join Us' section.
  • Events Listing: Modified the events listing page (events.md) to use a new card style for displaying events, including event descriptions and updated styling.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments to provide feedback.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@mikewolfd mikewolfd merged commit 71c5a05 into main Jul 7, 2025
6 checks passed
@mikewolfd mikewolfd deleted the hack branch July 7, 2025 05:51
Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

The pull request includes changes to event listings, project descriptions, and layout files. The changes primarily focus on updating content, improving grammar, and enhancing the presentation of event information. Several minor grammatical and stylistic issues were identified and suggested for improvement.

Comment on lines 10 to +11
<div class="grid-container usa-prose">
<em>To provide open source software that detect coordinated inauthentic behavior (CIB) to researchers, moderators, and journalists. We aim to make our programs intuitive so users do not need programming experience to run our tests.</em>
<em>To provide open source software that detects coordinated inauthentic behavior (CIB) to researchers, moderators, and journalists. We aim to make our programs intuitive so users do not need programming experience to run our tests.</em>

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The word "detect" should be "detects" to agree with the singular subject "software".

Suggested change
<div class="grid-container usa-prose">
<em>To provide open source software that detect coordinated inauthentic behavior (CIB) to researchers, moderators, and journalists. We aim to make our programs intuitive so users do not need programming experience to run our tests.</em>
<em>To provide open source software that detects coordinated inauthentic behavior (CIB) to researchers, moderators, and journalists. We aim to make our programs intuitive so users do not need programming experience to run our tests.</em>
<em>To provide open source software that detects coordinated inauthentic behavior (CIB) to researchers, moderators, and journalists. We aim to make our programs intuitive so users do not need programming experience to run our tests.</em>

<h2 class="font-sans-lg">🚀 Our Impact</h2>
<p>
CIB Mango Tree is democratizing access to powerful social media analysis tools and helping communities respond to online manipulation. Our prototype has been used to <strong>flag suspicious online activity during key moments like elections</strong>. Beyond the tools, we’ve built a community of volunteers and collaborators who are passionate about protecting open discourse, both in Washington, DC and globally.
CIB Mango Tree democratizes access to powerful social media analysis tools and helps communities respond to online manipulation. Our prototype has been used to <strong>flag suspicious online activity during key moments like elections</strong>. Beyond the tools, we’ve built a community of volunteers and collaborators who are passionate about protecting open discourse, both in Washington, DC and globally.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

There should be a non-breaking space (i.e. &nbsp;) after the em dash to improve readability.

Suggested change
CIB Mango Tree democratizes access to powerful social media analysis tools and helps communities respond to online manipulation. Our prototype has been used to <strong>flag suspicious online activity during key moments like elections</strong>. Beyond the tools, we’ve built a community of volunteers and collaborators who are passionate about protecting open discourse, both in Washington, DC and globally.
CIB Mango Tree democratizes access to powerful social media analysis tools and helps communities respond to online manipulation. Our prototype has been used to&nbsp;<strong>flag suspicious online activity during key moments like elections</strong>. Beyond the tools, we’ve built a community of volunteers and collaborators who are passionate about protecting open discourse, both in Washington, DC and globally.

<section class="padding-y-1 usa-prose maxw-none">
<div class="grid-container">
<h2 class="font-sans-lg">🤝 Community Partners</h2><p>
<h2 class="font-sans-lg">🤝 Community Partners</h2>

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The closing </p> tag is missing.

Suggested change
<h2 class="font-sans-lg">🤝 Community Partners</h2>
<h2 class="font-sans-lg">🤝 Community Partners</h2>
<p>

<p>The Campaign Legal Center wants to <strong>identify states and counties which have suspicious patterns in voter registration or voting</strong>, so it can take legal action to remedy the problems. For example, one state had an unusually high rate of rejection for voter registration applications submitted at public service offices, which turned out to be because of a glitch in the self-service kiosks used at public service offices in that state.</p>
<p>The current process the Campaign Legal Center uses is to <strong>identify the variables that they are interested in the EAVS raw data file and codebook</strong>. Then they copy and paste the relevant columns into a new Excel spreadsheet. In order to calculate the voter registration rejection rates they are interested in, they use Excel formulas (for example, dividing the column that contains the number of applications rejected by the sum of the column that contains number of applications accepted and the column that contains the number of applications rejected). Then they use the Excel subtotal feature to aggregate the data by state, since the raw data is only presented by county (although one of their interns wrote an R script to add up the county totals to get state totals). If they want to calculate how rates have changed, they copy and paste the relevant columns from the Excel spreadsheets they made for previous surveys into the current year spreadsheet.</p>
<p>One of the major pain points is that all of this copying and pasting, aside from being labor intensive, can result in human error. Also, it is difficult for the Campaign Legal Center attorneys to find what they are looking for in the Excel spreadsheet. Thus, the Campaign Legal Center needs <strong>Civic Tech volunteers to help them with data analysis and visualization.</strong></p>
<p>The Campaign Legal Center wants to <strong>identify states and counties that suspicious patterns in voter registration or voting</strong>, so it can take legal action to remedy the problems. For example, one state had an unusually high rate of rejection for voter registration applications submitted at public service offices, which turned out to be because of a glitch in the self-service kiosks used at public service offices in that state.</p>

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Change "that" to "with" for better readability.

Suggested change
<p>The Campaign Legal Center wants to <strong>identify states and counties that suspicious patterns in voter registration or voting</strong>, so it can take legal action to remedy the problems. For example, one state had an unusually high rate of rejection for voter registration applications submitted at public service offices, which turned out to be because of a glitch in the self-service kiosks used at public service offices in that state.</p>
<p>The Campaign Legal Center wants to <strong>identify states and counties with suspicious patterns in voter registration or voting</strong>, so it can take legal action to remedy the problems. For example, one state had an unusually high rate of rejection for voter registration applications submitted at public service offices, which turned out to be because of a glitch in the self-service kiosks used at public service offices in that state.</p>

</section>

<section class="padding-y-5 usa-prose maxw-none">
<section class="padding-y-1 usa-prose maxw-none">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Change "hurricane Michael" to "Hurricane Michael" to match the capitalization in the previous paragraph.

Suggested change
<section class="padding-y-1 usa-prose maxw-none">
<p>As part of his work at the <strong>American Red Cross, Dan has collected street-level imagery in a variety of contexts</strong> including: tracking the rapidly urbanization of Canaan, Haiti where the Red Cross was supporting residents through health, infrastructure, and livelihoods programs; documenting the aftermath of hurricane Irma in Dominica as teams traveled around the island assessing and providing support; and improving map data in the Philippines working alongside the Philippine Red Cross on recovery activities that include training volunteers in communities on disaster prevention and preparedness. During the 2018 domestic response to Hurricane Michael, the American Red Cross collected more than 539,000 images of Panama City, Florida.</p>

{% if event.url %}
<a class="usa-card__link" href="{{ event.url }}">
{% endif %}
<img class="usa-card__img" src="{{ site.baseurl }}/assets/images/hero-image-hackathon.png" alt="{{ event.image_alt_text }}" />

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The alt attribute should reference the event's description, not event.image_alt_text.

Suggested change
<img class="usa-card__img" src="{{ site.baseurl }}/assets/images/hero-image-hackathon.png" alt="{{ event.image_alt_text }}" />
<img class="usa-card__img" src="{{ site.baseurl }}/assets/images/hero-image-hackathon.png" alt="{{ event.description }}" />

{% if event.url %}
<a class="usa-card__link" href="{{ event.url }}">
{% endif %}
<img class="usa-card__img" src="{{ site.baseurl }}/assets/images/hero-image-data-showcase.png" alt="{{ event.image_alt_text }}" />

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The alt attribute should reference the event's description, not event.image_alt_text.

Suggested change
<img class="usa-card__img" src="{{ site.baseurl }}/assets/images/hero-image-data-showcase.png" alt="{{ event.image_alt_text }}" />
<img class="usa-card__img" src="{{ site.baseurl }}/assets/images/hero-image-data-showcase.png" alt="{{ event.description }}" />

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a new event page for "Civic Hack DC 2025" and refactors the main events listing page and its corresponding layout. The new event page and the updated events listing page embed large blocks of CSS and JavaScript directly within the markdown files, which is not ideal for maintainability. There are critical correctness issues in the _layouts/events.html file and the events.md file, where image paths are either broken due to missing front matter variables or hardcoded. There is also some dead code in the new event page's CSS and JavaScript that should be cleaned up.

{% endif %}
</p>

<img class="maxh-mobile margin-bottom-2" src="{{ site.baseurl }}/assets/images/event_thumbnails/{{ page.image }}" alt="{{ page.image_alt_text }}" />

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

The <img> tag relies on page.image and page.image_alt_text from the page's front matter. These fields are not present in the new _events/civichackdc.md, which will result in a broken image. Add the image and image_alt_text fields back to the front matter of all event pages, or wrap it in a conditional to only render if page.image is present.

{% if event.url %}
<a class="usa-card__link" href="{{ event.url }}">
{% endif %}
<img class="usa-card__img" src="{{ site.baseurl }}/assets/images/hero-image-hackathon.png" alt="{{ event.image_alt_text }}" />

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The image source for upcoming events is hardcoded to hero-image-hackathon.png. This will cause all upcoming events to display the same image. Use a variable from each event's front matter, such as event.image.

Suggested change
<img class="usa-card__img" src="{{ site.baseurl }}/assets/images/hero-image-hackathon.png" alt="{{ event.image_alt_text }}" />
<img class="usa-card__img" src="{{ site.baseurl }}/assets/images/event_thumbnails/{{ event.image }}" alt="{{ event.image_alt_text }}" />

{% if event.url %}
<a class="usa-card__link" href="{{ event.url }}">
{% endif %}
<img class="usa-card__img" src="{{ site.baseurl }}/assets/images/hero-image-data-showcase.png" alt="{{ event.image_alt_text }}" />

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The image source for past events is hardcoded to hero-image-data-showcase.png. This will cause all past events to display the same image. Use a variable from each event's front matter, such as event.image.

Suggested change
<img class="usa-card__img" src="{{ site.baseurl }}/assets/images/hero-image-data-showcase.png" alt="{{ event.image_alt_text }}" />
<img class="usa-card__img" src="{{ site.baseurl }}/assets/images/event_thumbnails/{{ event.image }}" alt="{{ event.image_alt_text }}" />

Comment on lines +10 to +56
<style>

* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: 'Source Sans Pro Web', 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; line-height: 1.6; color: #333; }
.container { max-width: 1200px; margin: 0 auto; padding: 0 20px; }

.hero { background: linear-gradient(0deg, #104377); color: white; padding: 4rem 0; text-align: center; }
.hero h1 { font-size: 3.5rem; font-weight: bold; margin-bottom: 1rem; text-shadow: 2px 2px 4px rgba(0,0,0,0.3); }
.hero-banner { background: rgba(255,255,255,0.1); padding: 1rem 2rem; border-radius: 10px; margin: 2rem auto; max-width: 600px; backdrop-filter: blur(10px); }

.section { padding: 3rem 0; }
.section.alt { background: #f8f9fa; }
.section-title { text-align: center; font-size: 2.5rem; margin-bottom: 2rem; color: #333; }

.cta-buttons { display: flex; gap: 1rem; justify-content: center; margin-top: 2rem; }
.btn { padding: 12px 30px; border: none; border-radius: 25px; font-weight: 600; text-decoration: none; display: inline-block; transition: all 0.3s; cursor: pointer; }
.btn-secondary { background: #f8f9fa; color: #333; border: 2px solid #e9ecef; }
.btn-secondary:hover { background: #104377; transform: translateY(-2px); }

.focus-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 1rem; margin: 2rem 0; }
.focus-icon { background: white; padding: 1.5rem; border-radius: 12px; text-align: center; box-shadow: 0 4px 6px rgba(0,0,0,0.1); transition: transform 0.3s; }
.focus-icon:hover { transform: translateY(-4px); }
.focus-icon-symbol { width: 40px; height: 40px; background: #4A90E2; border-radius: 50%; margin: 0 auto 0.5rem; display: flex; align-items: center; justify-content: center; color: white; font-size: 1.2rem; }

.goals-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; }
.goal-card { background: #f8f9fa; padding: 2rem; border-radius: 12px; border-left: 4px solid #4A90E2; transition: transform 0.3s, box-shadow 0.3s; }
.goal-card:hover { transform: translateY(-4px); box-shadow: 0 8px 25px rgba(0,0,0,0.15); }
.goal-number { background: #104377; color: white; width: 30px; height: 30px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: bold; margin-bottom: 1rem; }

.question-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; }
.question-card { background: #f8f9fa; padding: 0.8rem; border-radius: 12px; border-left: 4px solid #4A90E2; transition: transform 0.3s, box-shadow 0.3s; }
.question-card:hover { transform: translateY(-4px); box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); }

.partners-grid { display: flex; justify-content: center; flex-wrap: wrap; margin-top: 1rem; gap: 2rem; padding: 0; }
.partner-logo { width: 120px; height: auto; object-fit: contain; }
.container { padding-left: 0; padding-right: 0; }

@media (max-width: 768px) {
.header-content { flex-direction: column; gap: 1rem; }
nav ul { gap: 1rem; }
.hero h1 { font-size: 2.5rem; }
.focus-grid { grid-template-columns: repeat(2, 1fr); }
.goals-grid { grid-template-columns: 1fr; }
.cta-buttons { flex-direction: column; align-items: center; }
.timeline-item { padding-left: 60px; }
}
</style>

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Embedding styles directly in the markdown file with a <style> tag reduces maintainability. Consider moving page-specific styles into a separate CSS file (e.g., in the assets/css directory) and linking to it from the layout to improve code organization and reusability.

.focus-grid { grid-template-columns: repeat(2, 1fr); }
.goals-grid { grid-template-columns: 1fr; }
.cta-buttons { flex-direction: column; align-items: center; }
.timeline-item { padding-left: 60px; }

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The CSS rule for .timeline-item appears unused, and the corresponding JavaScript on line 212 also targets non-existent elements. Remove this dead code to improve clarity and reduce file size.

Comment on lines +63 to +67
<h2><b>Saturday, July 26</b></h2>
<h4><i>10:00 AM - 6:30 PM </i></h4>
<h3><b>Location: <span style="color: #FFD700;">TBA</span></b></h3>
<p><i>(metro-accessible)</i></p>
<br/>

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The use of presentational tags like <b> and <i>, as well as <br/> for spacing, is discouraged. Use CSS classes for styling (e.g., font-weight: bold) and margins/padding for spacing to improve the separation of content and presentation.

Comment on lines +190 to +216
<script>
document.addEventListener('DOMContentLoaded', function() {
// Smooth scrolling
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
});
});

// Timeline animation
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
}, { threshold: 0.1, rootMargin: '0px 0px -50px 0px' });

document.querySelectorAll('.timeline-item').forEach(item => {
observer.observe(item);
});
});
</script> No newline at end of file

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Embedding scripts directly in the HTML makes the code harder to manage, debug, and reuse across different pages. Place JavaScript code in external .js files (e.g., in assets/js) and include them in the page layout.

Comment on lines +9 to +50
<style>
.usa-card__media-text-wrapper {
border: 3px solid #eec05e;
width: 600px;
box-sizing: border-box;
padding: 10px;
margin-bottom: 20px;
transition: box-shadow 0.2s;
}

.usa-card__media-text-wrapper:hover {
box-shadow: 0 0 0 9px #eec05e33;
}

.usa-card__link {
display: block;
text-decoration: none;
color: inherit;
}

.usa-card__img {
width: 100%;
height: auto;
object-fit: cover;
display: block;
margin-bottom: 10px;
}

.usa-card__body {
padding: 0;
}

.usa-card__heading {
margin-top: 0;
margin-bottom: 8px;
}

.event-description {
font-size: 16px;
margin: 0 0 8px 0;
}
</style>

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Embedding these styles in a <style> tag reduces maintainability. Move these styles to a shared CSS file to improve code organization and reusability.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants