A platform for aggregating and displaying technology conferences and meetups in and around Washington, DC.
- Python 3.10+ with pip
- Node.js 20+ with npm
- Install dependencies:
pip install -r requirements.txt
npm install- Build and run:
make all # Build everything
python app.py # Start dev server- Visit
http://localhost:5000
_categories/ # Category definitions (python.yaml, ai.yaml, etc.)
_data/ # Generated data files (upcoming.yaml)
_event_overrides/ # Override files for iCal events (committed via PR)
_groups/ # Group/meetup configurations with iCal/RSS feeds
_single_events/ # Manually submitted single events
templates/ # Jinja2 HTML templates
static/ # CSS, JavaScript, and images
Visit dctech.events/edit/submit-group.html or create a YAML file in _groups/ with your group's RSS or iCal feed.
Visit dctech.events/edit/submit-event.html or create a YAML file in _single_events/ (format: YYYY-MM-DD-event-title.yaml).
For multi-day events where the time varies by day, use a dictionary for the time field with date keys:
title: Data Center World 2026
date: '2026-04-20'
end_date: '2026-04-23'
url: https://datacenterworld.com
location: Washington, DC
time:
'2026-04-21': '14:00'
'2026-04-22': '10:00'
'2026-04-23': '10:00'Each date should be in YYYY-MM-DD format with the time in HH:MM (24-hour) format. Days not specified in the dictionary will display as "All Day" events.
Events can be organized by category. Categories are defined in _categories/ as YAML files:
name: "Python"
description: "Python programming language events"To a group (all events inherit these categories):
# _groups/python-users.yaml
name: "DC Python Users"
ical: "https://example.com/calendar.ics"
categories:
- pythonTo a single event:
# _single_events/2025-03-15-pycon-dc.yaml
title: "PyCon DC"
date: "2025-03-15"
categories:
- python
- conferencesPriority: Event-specific categories override group categories.
Visit /categories/{slug}/ to see all events in a category (e.g., /categories/python/).
Events can be edited via the web interface at /edit/{event_id}/. The edit button appears on event listings for logged-in users.
- Click the "Edit" button on any event
- Log in with GitHub (if not already authenticated)
- Modify event details (title, date, time, location, categories)
- Submit creates a pull request with your changes
- Changes go live after PR is reviewed and merged
- Manual events (
_single_events/): The original YAML file is updated - iCal events: An override file is created in
_event_overrides/{hash}.yaml
Override files only store the changed fields and are merged with the original iCal data during the build process.
The site is automatically deployed to AWS S3 + CloudFront on every push to the main branch using GitHub Actions with OIDC federation.
- Infrastructure: AWS CDK (TypeScript) in
infrastructure/directory - Hosting: S3 bucket + CloudFront CDN
- DNS: Route53
- CI/CD: GitHub Actions with OIDC (no stored AWS credentials)
See infrastructure/README.md for detailed instructions on:
- Deploying the CDK stack to AWS
- Configuring GitHub Actions with repository variables
- Troubleshooting deployment issues
When you push to main:
- GitHub Actions workflow triggers automatically
- Builds the site using Node.js and Python
- Authenticates to AWS using OIDC federation
- Syncs built files to S3 bucket
- Invalidates CloudFront cache (instant deployment)
- Tracks new events and persists to S3
- Site is live at https://dctech.events
No long-lived AWS credentials are stored in GitHub.
The site provides an RSS feed of recently added events and posts daily summaries to micro.blog.
- Feed URL:
https://dctech.events/events-feed.xml - Content: Events added in the last 30 days
- Format: Standard RSS 2.0
- Subscribe: Use any RSS reader
When new events are added, an automatic summary is posted daily to micro.blog with:
- Count of new events
- List of event titles and dates
- Links to event details
Format: "X new events added on [Month Day, Year]"
Micro.blog Configuration: Posts are sent to https://updates.dctech.events. To validate the configuration:
python check_microblog_config.pySee MICROBLOG_CONFIGURATION.md for setup details.
- After each deployment,
upcoming.yamlis persisted to S3 with a timestamp - New events are detected by comparing with the previous version
- Metadata tracks when each event was first seen
- RSS feed shows recently added events
- Daily workflow posts summaries to micro.blog at 1 PM ET
See EVENT_TRACKING.md for technical details.
To manually deploy after making infrastructure changes:
# In the infrastructure directory
cd infrastructure
npm install
npm run build
npm run cdk deployFor aggregated events, the system extracts and displays city and state information only (e.g., "Arlington, VA"). This simplifies location handling and eliminates the need for complex address normalization. The usaddress library is used to accurately parse various address formats and extract city/state components.
Address extraction works with:
- Full street addresses: "1630 7th St NW, Washington, DC 20001" β "Washington, DC"
- City and state: "Arlington, VA 22201" β "Arlington, VA"
- Addresses with venue names: "The White House, 1600 Pennsylvania Avenue NW, Washington, DC" β "Washington, DC"
A GitHub Actions workflow runs on the 1st of each month to identify and remove old events (more than 7 days past their date). The workflow creates a pull request with the proposed deletions for review before merging.
To manually prune old events:
python prune_old_events.py # Delete old events
python prune_old_events.py --dry-run # Preview what would be deleted
python prune_old_events.py --days 14 # Keep events for 14 days instead- Add events/groups: Use the web forms (
/submit/or/submit-group/) or submit a pull request with YAML files - Report issues: Open an issue on GitHub
- Improve code: Fork, branch, code, and submit a pull request
- Validate changes: Run
make validateto check YAML files before submitting - Run tests: Execute
python -m unittest discover -s . -p "test_*.py"to run all unit tests - Submit PR: All pull requests trigger automated tests via GitHub Actions
Pull requests require passing tests before they can be merged to the main branch.
MIT License
Site: https://dctech.events
Issues: https://github.com/rosskarchner/dctech.events/issues