The official website for the PyTexas Foundation Virtual Meetups, built with MkDocs Material. This site showcases upcoming & past meetups, and provides community information about local meetups in the state of Texas.
Live Site: pytexas.org/meetup
Install the following tools for development:
curl -LsSf https://astral.sh/uv/install.sh | sh# macOS
brew install just
# Linux/macOS via cargo
cargo install just# macOS
brew install lychee
# Linux/macOS via cargo
cargo install lychee-
Clone and setup:
git clone https://github.com/pytexas/meetup.git cd meetup-site just install -
Start development server:
just serve
-
View site: Open http://localhost:8000
Use just for common tasks:
just help- Show all available commandsjust serve- Start development serverjust build- Build static sitejust check- Run quality checks (build + link validation)just clean- Clean generated files
The repo ships a Claude Code skill at .claude/skills/meetup-update/ that runs the full monthly setup.
Invoke it with /meetup-update (or ask to "schedule the monthly meetup").
The skill:
- Pulls the booked speaker from the "PyTexas Meetup CFP (Responses)" sheet in Google Drive and confirms their locked-in date from the email thread
- Archives the held meetup, adds the speaker to
.authors.yml, updates the homepage, and opens a PR - Creates the month's Drive folder with the run of show doc and attendance form, copied from the templates in Drive
- Adds the month's card to the season's "Meetup Banners" deck in Canva
- Drafts the date-offer emails to new CFP submitters (drafts only, never sends) and posts the promo notification to the Discord marketing channel webhook
- Flags what stays manual: the speaker headshot, the Canva page title rename, the Discord event, the Meetup.com event, and the non-network listings
Everything the skill writes comes from the templates in .claude/skills/meetup-update/references/.
Edit those files to change what it produces.
- Add the upcoming meetup to the home page by modifying
index.md- When adding a new presenter, try to use a URL for the photo. Only upload a file if you must, and upload it to
assets/images- Tip: A person's GitHub avatar is always available at
https://github.com/USERNAME.pngso use that
- Tip: A person's GitHub avatar is always available at
- Follow the previous month's format as your guide, with title, image, name, and bio.
- When adding a new presenter, try to use a URL for the photo. Only upload a file if you must, and upload it to
- Take the previous meetup from the previous month, and add a new page to
past_meetups/postsusing the following front mattertitle: "The title" description: A description date: 2025-06-03 categories: - cat1 - cat2 - catX authors: - author_name_in_.authors.yml ---- If the presenter is not in the
.authors.ymlfile, add them using the format that's already defined in the file. The presenter of the meetup is deemed the "author" of the "blog" (past meetup). - If the presenter gave you any documents to share, upload them to
docs/assets/docs/and link to them. However, try to encourage the presenter to share URLs we can link to instead of files we have to host. - Write a short summary of the meetup and how it went in the body of the post. Use past blogs as a guide.
- If the presenter is not in the
- Test the site before committing using
just checkto check for any broken links. If you don't, the CI will catch it anyways.
Add announcement banners by editing overrides/main.html:
{% block announce %}
<p>Attend the <a href="https://conference.pytexas.org">PyTexas 2024 Conference</a> April 19 - 21, 2024</p>
{% endblock %}docs/ # Main content
├── past_meetups/posts/ # Meetup blog posts
├── assets/ # Images and documents
└── *.md # Site pages
mkdocs.yml # Site configuration
justfile # Development commands
Automation secrets (currently the Discord marketing webhook) live encrypted in secrets/meetup.sops.env, managed with sops and age.
The encrypted file is safe to commit; only the age keys listed in .sops.yaml can decrypt it.
This is the same pattern as the infrastructure repo.
- Install
sopsandage, with your age key at~/.config/sops/age/keys.txt - Run
sops secrets/meetup.sops.envto open the decrypted values in your editor; saving re-encrypts
- Have them generate a key with
age-keygen -o ~/.config/sops/age/keys.txtand send you the public key (starts withage1) - Add their public key to
.sops.yaml - Run
sops updatekeys secrets/meetup.sops.envand commit both files
Adding a key to .sops.yaml grants nothing by itself.
The file only decrypts for the keys it was encrypted to, and re-encrypting it for a new recipient (sops updatekeys) can only be done by someone who already holds a listed private key.
A pull request that adds an unknown key to .sops.yaml cannot read any secrets and should simply be closed.
Back up ~/.config/sops/age/keys.txt to the password manager now; restoring that one file on a new machine restores access.
If the key is gone with no backup, the encrypted file is unrecoverable, but the secrets are not: re-obtain each one from its source (the Discord webhook URL is viewable under the channel's Integrations settings, and API tokens get re-issued by their providers).
Then generate a fresh key with age-keygen, replace the old public key in .sops.yaml, re-create secrets/meetup.sops.env with the re-obtained values, and commit.
The old blobs in git history stay permanently unreadable, which is the point.
The site automatically deploys to GitHub Pages via GitHub Actions when changes are pushed to the main branch. The deployment process includes:
- Link Validation: All links are checked for validity
- Dependency Security: Dependencies are scanned for vulnerabilities
- Build & Deploy: Site is built and deployed to GitHub Pages
- Fork the repository
- Create a feature branch
- Add your content or changes
- Run
just checkto validate - Submit a pull request
This project is maintained by the PyTexas Foundation.