Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
33 changes: 33 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Exclude build outputs
_site/
assets/images/
assets/css/

# Exclude dependencies (these get installed in the container)
node_modules/
.bundle/

# Exclude development files
.git/
.github/
.vscode/
.idea/

# Exclude temporary files
*.tmp
*.log
.DS_Store
Thumbs.db

# Exclude cache directories
.sass-cache/
.jekyll-cache/
.jekyll-metadata

# Exclude editor files
*.swp
*.swo
*~

# Exclude CI/CD files
.github/
2 changes: 0 additions & 2 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,3 @@ updates:
# Check the npm registry for updates every day (weekdays)
schedule:
interval: "daily"


25 changes: 11 additions & 14 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,33 +1,30 @@
FROM ruby:3.2-bullseye

# Install Nodejs
RUN apt-get update
RUN apt-get install -y curl
RUN curl -fsSL https://deb.nodesource.com/setup_23.x | bash -
RUN apt-get install -y nodejs
RUN apt-get update && apt-get install -y curl \
&& curl -fsSL https://deb.nodesource.com/setup_23.x | bash - \
&& apt-get install -y nodejs \
&& rm -rf /var/lib/apt/lists/*

# Verify installations and versions
RUN ruby -v && node -v && npm -v

# Copy the application code (excluding files in .dockerignore)

# Set the working directory inside the container
WORKDIR /usr/src/app
WORKDIR /app

# Copy package.json and package-lock.json to the working directory
COPY package*.json ./
COPY Gemfile* ./
# Install dependencies with caching to improve build times
COPY package.json package-lock.json* ./
COPY Gemfile Gemfile.lock* ./

# Install the application dependencies
# Install dependencies
RUN npm install
RUN bundle install

# Copy the application code into the container
COPY . .

# Expose port 4000 to the host
EXPOSE 4000

# Set up a volume to sync code changes
VOLUME [ "/usr/src/app" ]

# Command to run the application
CMD ["npm", "run", "serve"]
2 changes: 1 addition & 1 deletion _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ collections:
events:
output: true
permalink: /events/:name/

exclude:
- /node_modules/
- gulpfile.js
Expand Down
5 changes: 5 additions & 0 deletions _data/css-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"civichackdc.css": "civichackdc-cbf52d916e.css",
"events.css": "events-fe4c9d527f.css",
"styles.css": "styles-29eee3c87d.css"
}
98 changes: 12 additions & 86 deletions _events/civichackdc.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,61 +4,17 @@ title: "Civic Hack DC 2025"
date: 2025-07-26
location: "Washington DC"
url: /civichackdc
card_image: events/civichackdc/mainhackathonimage.png
registration_link: https://lu.ma/czi3y05y
page_css: /assets/css/civichackdc.css
description: |
A data hackathon to build open-source tools for analyzing public comments on regulations. Join us for a day of civic innovation!
---
<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>

<section class="hero">
<div class="container">
<div class="hero-banner">
<img class="usa-card__img" src="{{ '/assets/images/events/civichackdc/mainhackathonimage.png' | relative_url }}" alt="Civic Hack DC banner">
{% include responsive-image.html class="usa-card__img" src="events/civichackdc/mainhackathonimage.png" alt="Civic Hack DC banner" %}
</div>
<h2><b>Saturday, July 26</b></h2>
<h4><i>10:00 AM - 6:30 PM </i></h4>
Expand All @@ -74,29 +30,28 @@ body { font-family: 'Source Sans Pro Web', 'Helvetica Neue', Helvetica, Roboto,
<a href="#about" class="btn btn-secondary">Learn More</a>
</div>
</div>

</section>

<section class="section">
<div class="container">
<div class="partners-grid">
<a href="https://www.moravian.edu" target="_blank" rel="noopener noreferrer"> <img class="partner-logo" src="/assets/images/events/civichackdc/Moravian.png" alt="Moravian"></a>
<a href="https://careset.com/" target="_blank" rel="noopener noreferrer"> <img class="partner-logo" src="/assets/images/events/civichackdc/careset.png" alt="Careset"></a>
<a href="https://www.meetup.com/data-wranglers-dc/" target="_blank" rel="noopener noreferrer"> <img class="partner-logo" src="/assets/images/events/civichackdc/dataengineers.png" alt="Data Engineers"></a>
<a href="https://www.meetup.com/data-visualization-dc/" target="_blank" rel="noopener noreferrer"> <img class="partner-logo" src="/assets/images/events/civichackdc/dataviz.png" alt="Data Viz"></a>
<a href="https://www.dc2.org/data-science-dc" target="_blank" rel="noopener noreferrer"> <img class="partner-logo" src="/assets/images/events/civichackdc/dsdc.png" alt="DSDC"></a>
<a href="https://www.meetup.com/women-and-gender-expansive-coders-dc-wgxc-dc/" target="_blank" rel="noopener noreferrer"> <img class="partner-logo" src="/assets/images/events/civichackdc/WGXCDC.png" alt="WGXCDC"></a>
<a href="https://www.moravian.edu" target="_blank" rel="noopener noreferrer"> <img class="partner-logo" src="/assets/images/events/civichackdc/Moravian-400w.png" alt="Moravian"></a>
<a href="https://careset.com/" target="_blank" rel="noopener noreferrer"> <img class="partner-logo" src="/assets/images/events/civichackdc/careset-400w.png" alt="Careset"></a>
<a href="https://www.meetup.com/data-wranglers-dc/" target="_blank" rel="noopener noreferrer"> <img class="partner-logo" src="/assets/images/events/civichackdc/dataengineers-400w.png" alt="Data Engineers"></a>
<a href="https://www.meetup.com/data-visualization-dc/" target="_blank" rel="noopener noreferrer"> <img class="partner-logo" src="/assets/images/events/civichackdc/dataviz-400w.png" alt="Data Viz"></a>
<a href="https://www.dc2.org/data-science-dc" target="_blank" rel="noopener noreferrer"> <img class="partner-logo" src="/assets/images/events/civichackdc/dsdc-400w.png" alt="DSDC"></a>
<a href="https://www.meetup.com/women-and-gender-expansive-coders-dc-wgxc-dc/" target="_blank" rel="noopener noreferrer"> <img class="partner-logo" src="/assets/images/events/civichackdc/WGXCDC-400w.png" alt="WGXCDC"></a>
</div>
</div>
</section>

<section class="section" id="about">
<div class="container">
<h2 class="section-title">📊 Why this matters 📊</h2>
<div style="max-width: 800px; margin: 2rem auto 0; text-align: left;">
<div class="about-text" style="max-width: 800px; margin: 2rem auto 0; text-align: left;">
<p>Each time a federal agency proposes new rules or seeks public input via <a href="https://www.regulations.gov/" target="_blank" rel="noopener noreferrer">regulations.gov</a>, thousands of comments pour in from individuals, advocacy groups, corporations, and more. Yet the data is notoriously difficult to access, analyze, and utilize effectively.</p>
<br>
<p>To bridge this gap, Professor Ben Coleman and his students at Moravian University developed a robust open-source data pipeline. Powered by donated API keys, their tool continuously downloads and publishes public comments across agencies to <a href="https://aws.amazon.com/marketplace/pp/prodview-ypmw3cvvwhv3y" target="_blank" rel="noopener noreferrer">S3 on AWS through its Open Data Platform</a>, making the comments freely available for exploration and analysis.</p>
<br>
<p>On July 26, we're hosting a hackathon to create open-source tools that can be used to examine public comments on any future or past regulations or RFIs. We will explore several datasets, including a <a href="https://www.federalregister.gov/documents/2025/05/16/2025-08701/request-for-information-health-technology-ecosystem">recent CMS RFI</a> seeking input on improving the health tech ecosystem for patients. Professor Coleman will be on-site to walk participants through the data download tool and structure.</p>
</div>
</div>
Expand Down Expand Up @@ -131,7 +86,6 @@ body { font-family: 'Source Sans Pro Web', 'Helvetica Neue', Helvetica, Roboto,
</div>
</section>


<section class="section">
<div class="container">
<h2 class="section-title">✨ Hackathon Goals ✨</h2>
Expand Down Expand Up @@ -186,31 +140,3 @@ body { font-family: 'Source Sans Pro Web', 'Helvetica Neue', Helvetica, Roboto,
<p style="text-align: center; font-size: 2rem;">TBD</p>
</div>
</section>

<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>
Loading
Loading