Websites
I build and maintain production websites using Django and Wagtail, with an emphasis on accessibility, maintainability, performance, and giving content managers practical control over their sites.
My work ranges from relatively straightforward organizational websites to larger applications that combine content management with external data, interactive tools, search, maps, forms, and third-party integrations. I also manage much of the infrastructure behind these sites, including deployment, databases, file storage, backups, monitoring, and ongoing maintenance.
Some client work cannot be identified publicly, so the examples below focus on the technical challenges, implementation, and outcomes rather than the organizations themselves.
Selected Website Work
Integrated Training & Resource Platform
Developed an authenticated training and resource platform that combines content management with user accounts, event management, learning systems, file management, and extensive Salesforce integration.
- AWS S3
- Celery
- Django
- Heroku
- LMS
- PostgreSQL
- Python
- REST API
- Salesforce
- Wagtail
- Webhooks
Public Data and Directory Websites
Developed public-facing websites that combine CMS-managed content with structured data synchronized from external business systems.
- Celery
- Django
- Geocoding
- Google Maps
- Heroku
- PostgreSQL
- REST API
- Salesforce
- Wagtail
Content-Managed Program Websites
Built and maintained websites designed to give nontechnical content managers control over frequently changing pages while keeping layout, accessibility, and presentation consistent.
- AWS S3
- Bootstrap
- Django
- PostgreSQL
- Wagtail
I use Django for the application layer and Wagtail for content management, extending both when a site's requirements go beyond traditional CMS functionality.
I favor reusable page types and structured content components over one-off templates. The goal is to give content managers flexibility without requiring them to understand HTML or make design decisions that should be handled by the application.
Where appropriate, the same application can also support search, forms, event management, external integrations, background processing, and other functionality alongside the CMS.
Accessibility is part of the implementation process rather than a final compliance check.
I build around semantic HTML, logical heading structure, keyboard navigation, visible focus states, meaningful link and image text, accessible form behavior, responsive layouts, and appropriate color contrast, with WCAG 2.2 AA as the general target.
Automated accessibility scanning helps identify regressions across larger sites, while manual testing is used for behavior that automated tools cannot reliably evaluate.
A CMS should make maintaining a website easier without transferring responsibility for its underlying design to content editors.
I use structured fields, reusable components, shared content, and appropriate editorial constraints to reduce duplication and keep presentation consistent. Depending on the project, editor tooling may also include draft sharing, content previews, accessibility checking, broken-link auditing, and other tools that support ongoing maintenance.
Performance and search visibility are considered as part of the site's architecture rather than treated as separate add-ons.
This includes responsive image handling, CDN delivery, sensible frontend dependencies, semantic markup, page metadata, canonical URLs, social metadata, structured data where appropriate, and attention to how content is represented to both visitors and search engines.
Analytics and third-party services are implemented with visitor privacy in mind.
Where tracking, embedded media, maps, or other external services require consent, I integrate consent management into the site so those services are not simply loaded before the visitor has made a choice.
Public websites are routinely targeted by automated scanners looking for vulnerable software, exposed configuration files, administrative interfaces, and other common weaknesses—even when the technologies being targeted are not installed.
I use layered protections that include secure application configuration, dependency maintenance, request filtering, appropriate access controls, logging, and infrastructure-level protections where needed.
Building the initial site is only part of the work.
I maintain deployment pipelines, staging and production environments, PostgreSQL databases, cloud file storage and delivery, automated backups, testing, logging, and framework and dependency upgrades.
The objective is not simply to launch a website, but to leave behind an application that can be safely maintained and extended for years.