Homepage and resource hub for Lanie Carmelo: Christian, accessibility tester, neurodivergent programmer, and disability advocate. This site documents my access needs, technical workflows, personal essays, faith reflections, and advocacy work.
- Accessible design: Built with low cognitive load, keyboard navigation, and screen reader usability in mind.
- Static site: Built with Hugo for fast, reliable static publishing.
- Automated deployment: Deployed through GitHub Actions and Cloudflare Pages.
- Social publishing helper: Python helper scripts can queue new posts to Buffer-connected social channels.
- Contact form: Handled by Formspree with Turnstile spam protection. The previous Cloudflare Worker (
services/form-handler/) is deprecated and no longer deployed. - Newsletter: Handled by Buttondown with RSS-to-email automation. Subscribers get an email automatically each time a new post is published.
To add a new essay or article:
- Create a new Markdown file in the appropriate Hugo content folder.
- Add YAML front matter.
- Write the post content below the front matter.
- Build and preview locally.
- Commit and push.
Example post front matter:
---
title: Your Article Title
date: 2026-05-21
description: A short description for summaries and previews.
draft: false
tags:
- accessibility
- technology
categories:
- Technology
---# Clone the repository
git clone https://github.com/RareBird15/lanie.work.git
cd lanie.work
# Install Python helper dependencies
uv sync
# Start Hugo's local development server
hugo serverVisit the local URL printed by Hugo to view the site.
hugoThis generates the static site in:
public/
This repository includes Python helper scripts for Buffer-based social publishing.
The main publish script reads the generated Hugo RSS feed, finds the latest post, queues it to Buffer, and records what has already been queued so rebuilds do not repeatedly queue the same post.
Required environment variables:
BUFFER_API_KEY=your_buffer_api_key
BUFFER_CHANNEL_IDS=comma,separated,buffer,channel,ids
BUFFER_FACEBOOK_CHANNEL_IDS=comma,separated,facebook,channel,idsUseful scripts:
# List Buffer organizations and channels
uv run ./scripts/get_buffer_org_ids.py
# Queue a harmless test post
uv run ./scripts/test_buffer_post.py
# Queue the latest generated RSS post to Buffer
uv run ./scripts/publish_latest_to_buffer.pyBefore running the publish script, build the site so the RSS feed exists:
hugo
uv run ./scripts/publish_latest_to_buffer.pyThe publish state is stored in:
data/buffer-published.json
lanie.work/
├── content/ # Hugo content files
├── data/ # Data files, including Buffer publish state
├── layouts/ # Hugo layout overrides, if any
├── public/ # Generated site output
├── scripts/ # Python helper scripts
├── static/ # Static assets
├── themes/ # Legacy theme submodules, if any
├── services/form-handler/ # Cloudflare Worker code
├── .github/
│ └── workflows/ # CI/CD workflows
├── pyproject.toml # Python helper dependencies
├── requirements.txt # Compiled Python requirements, if needed
└── README.md # Project overview
- Use ATX-style headers (
#syntax) for logical screen reader navigation. - Do not skip heading levels.
- Keep paragraphs short and scannable.
- Always include descriptive
alttext for images. - Specify a language for fenced code blocks, such as
bash,python,toml, ortext. - Use descriptive link text. Avoid vague links like “click here” or “read more.”
- Text over audio: Provide persistent text for all critical information.
- Low cognitive load: Use clear structure, short sections, and plain language where possible.
- Keyboard-first: Pages and interactive elements should work without a mouse.
- No spatial reliance: Avoid instructions that depend on visual placement, color alone, or layout alone.
These are baseline decisions to preserve when making future design or content updates:
- Navigation: Mobile menu uses compact spacing and always-visible underlines so links are easier to identify.
- Links in content: In-body links use visible underlines with stronger thickness and contrast for readability.
- Table of contents: TOC stays expanded on desktop and defaults collapsed on smaller screens.
- Blog browsing: Blog is a top-level page that aggregates recent posts with pagination.
- Contact fallback: If the form or Turnstile fails (or JavaScript is disabled), contact fallback is lanie@lanie.work.
When changing styles or navigation structure, re-check these behaviors to avoid regressions.
Contributions are welcome, especially improvements to accessibility, semantic structure, documentation, and workflow automation.
Please read CONTRIBUTING.md before submitting changes.
- Website: lanie.work
- Mastodon: @RareBird15@allovertheplace.ca
- GitHub: RareBird15
- LinkedIn: laniecarmelo
- Code::Stats: RareBird15
Built with Hugo, hosted on Cloudflare Pages, and supported by small Python helper scripts managed with uv.