feat: generate testimonials from source
Code Analysis / SonarQube (push) Failing after 15s

This commit is contained in:
2025-09-23 12:57:56 -07:00
parent c9373ec87a
commit 2d6b59dc21
3 changed files with 384 additions and 246 deletions
-244
View File
@@ -1,244 +0,0 @@
---
title: static-pages
---
static-pages (hereinafter the "Application") is a collection of static HTML pages and related data/scripts for various small web utilities and content sections. The application provides interactive explorers for books and music libraries, product directories, games, chat services, testimonials, and other utility pages. It is designed to be easily synchronized to a production server using shell scripts and requires no backend or dynamic server-side logic.
## 1. User Documentation
The Application provides several interactive web utilities:
### Book Library (`/books/`)
An interactive explorer for Naomi's book collection. Users can browse and search through the library of books with filtering capabilities by author. The interface displays book titles and authors extracted from digital book files.
### Music Library (`/music/`)
An interactive explorer for Naomi's music collection. Similar to the book library, users can browse and search through songs with filtering by artist. The interface displays song titles and artists extracted from audio file metadata.
### Product Directory (`/products/`)
An automated directory listing products offered by NHCarrigan. The page displays products from various categories including public projects, games, private projects, and archived items. Products are fetched from Gitea repositories and displayed with their descriptions and links where available.
### Games (`/games/`)
A landing page showcasing various games developed by NHCarrigan, including links to the Beccalia Series and other game projects.
### BlueSky Handle Generator (`/bsky/`)
A service page for provisioning custom Bluesky handles under the naomi.party domain. Currently requires manual processing through the Discord support server.
### Chat Services (`/chat/`)
A comprehensive page outlining various ways to connect with NHCarrigan, including forum, IRC, and Matrix communication options with direct links and connection details.
### Testimonials (`/testimonials/`)
A showcase page displaying testimonials from past clients about NHCarrigan's work and services.
### Link Redirector (`/link-redirector/`)
A utility page that serves as a fallback for improperly configured subdomain redirects, providing users with support contact information.
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
### System Requirements
- Unix-like operating system (Linux/macOS)
- Bash shell
- `rsync` for deployment
- `exiftool` for extracting book metadata
- `mid3v2` for extracting music metadata
- `jq` for JSON processing
- Access to Gitea API (for products functionality)
- Web server capable of serving static files
### Project Structure
```
├── books/ # Book library interface
│ ├── index.html # Main book explorer page
│ └── books.json # Generated book data
├── music/ # Music library interface
│ ├── index.html # Main music explorer page
│ └── songs.json # Generated music data
├── products/ # Product directory
│ ├── index.html # Product listing page
│ └── data.json # Generated product data
├── games/ # Games showcase
├── bsky/ # BlueSky handle service
├── chat/ # Communication options
├── testimonials/ # Client testimonials
├── link-redirector/ # Redirect fallback
├── mail/ # Mail service (manual sync)
├── manual/ # Manual/documentation
├── sitemap/ # Site navigation
├── books.sh # Book data generator script
├── songs.sh # Music data generator script
├── products.sh # Product data generator script
└── sync.sh # Deployment script
```
### Data Generation Scripts
**Book Library (`books.sh`)**
- Scans `/home/naomi/cloud/Books` directory for book files
- Extracts title and author metadata using `exiftool`
- Generates `books/books.json` with book data
- Handles files without metadata by using filenames
**Music Library (`songs.sh`)**
- Scans `/home/naomi/music` directory for audio files
- Extracts title and artist metadata using `mid3v2`
- Generates `music/songs.json` with song data
- Falls back to filename parsing for missing metadata
**Product Directory (`products.sh`)**
- Fetches repository data from Gitea API
- Organizes projects by category (public, games, private, archived)
- Generates `products/data.json` with project information
- Requires `GITEA_TOKEN` environment variable
### Deployment
The deployment process uses `sync.sh` which:
1. Syncs all directories to production server using `rsync`
2. Targets `prod:/home/nhcarrigan` for most content
3. Requires manual sync for `mail/index.html` to `mail:/home/user-data/www/default`
**Deployment Command:**
```bash
./sync.sh
```
**Directories synced automatically:**
- bsky, chat, games, link-redirector, testimonials
- manual, sitemap, music, books, products
### Running Your Own Instance
1. **Clone the repository**
2. **Install dependencies:**
```bash
# Ubuntu/Debian
sudo apt install exiftool python3-mutagen jq rsync
# macOS
brew install exiftool jq rsync
pip3 install mutagen
```
3. **Configure data sources:**
- Update paths in `books.sh` for your book collection
- Update paths in `songs.sh` for your music collection
- Set `GITEA_TOKEN` environment variable for products functionality
- Modify `products.sh` with your Gitea instance URL and organizations
4. **Generate data:**
```bash
./books.sh # Generate book library data
./songs.sh # Generate music library data
./products.sh # Generate product directory data
```
5. **Serve static files:**
```bash
# Simple Python server for testing
python3 -m http.server 8000
```
6. **Deploy to production:**
- Modify `sync.sh` with your server details
- Ensure SSH key authentication is configured
- Run `./sync.sh`
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
The Application operates under NHCarrigan's standard legal framework:
### License
This software is licensed under the [global software license](https://docs.nhcarrigan.com/#/license). Copyright is held by Naomi Carrigan.
### Privacy Policy
Privacy considerations for the Application are covered under the [global privacy policy](PRIVACY.md).
### Terms of Service
Terms of service for the Application are outlined in [TERMS.md](TERMS.md).
### Code of Conduct
All interactions with the Application's community and codebase are governed by the [Code of Conduct](https://docs.nhcarrigan.com/#/coc), referenced in [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md).
### Security Policy
Security reporting and handling procedures are documented in [SECURITY.md](SECURITY.md).
### Data Handling
- **Book Library**: Processes local book file metadata only
- **Music Library**: Processes local music file metadata only
- **Product Directory**: Fetches public repository information from Gitea API
- **BlueSky Service**: Collects handle requests through Discord (manual process)
- **No personal data**: The Application does not collect or store personal user data directly
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
### Getting Started
Contributors should review the [global contributing guidelines](https://docs.nhcarrigan.com/#/contributing) referenced in [CONTRIBUTING.md](CONTRIBUTING.md).
### Development Workflow
1. **Fork and Clone**
```bash
git clone https://github.com/your-username/static-pages.git
cd static-pages
```
2. **Set Up Development Environment**
- Install required dependencies (see Technical Documentation)
- Configure data source paths for testing
- Set up environment variables if working with products functionality
3. **Making Changes**
- **HTML Pages**: Edit individual `index.html` files in respective directories
- **Data Scripts**: Modify `*.sh` scripts for data generation logic
- **Deployment**: Update `sync.sh` for deployment configuration changes
4. **Testing Changes**
```bash
# Test data generation
./books.sh
./songs.sh
./products.sh
# Test locally
python3 -m http.server 8000
```
5. **Submitting Changes**
- Create feature branch: `git checkout -b feature/your-feature`
- Commit changes with descriptive messages
- Push to your fork and create a Pull Request
- Ensure all data generation scripts work correctly
### Code Style Guidelines
- **HTML**: Use semantic HTML5 elements, include proper meta tags
- **Shell Scripts**: Follow bash best practices, include error handling
- **JSON Data**: Ensure proper formatting and validation
- **Documentation**: Update relevant documentation for new features
### Areas for Contribution
- **UI/UX Improvements**: Enhance styling and user experience of static pages
- **Data Processing**: Improve metadata extraction and data generation scripts
- **New Features**: Add new utility pages or improve existing functionality
- **Documentation**: Expand user guides and technical documentation
- **Testing**: Add validation and testing for data generation processes
- **Accessibility**: Improve accessibility compliance across all pages
### Communication
- **Issues**: Report bugs and request features through GitHub Issues
- **Support**: Join the [chat server](https://chat.nhcarrigan.com) for discussion
- **Contact**: Reach out via email at `contact@nhcarrigan.com`
### Review Process
All Pull Requests are reviewed for:
- Code quality and adherence to project standards
- Functionality and testing
- Documentation updates
- Security considerations
- Compatibility with existing deployment process
This section is for documentation related to contributing to the Application's codebase.
+114
View File
@@ -0,0 +1,114 @@
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
cd "$(dirname "$0")"
TESTIMONIALS_JSON_URL="https://data.nhcarrigan.com/testimonials.json"
TESTIMONIALS_JSON_FILE="testimonials.json"
TESTIMONIALS_HTML_FILE="testimonials/index.html"
# Templating
HTML_START='<!DOCTYPE html>
<html lang="en">
<head>
<title>Testimonials</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta
name="description"
content="See what our past clients have to say about our work!"
/>
<script
src="https://cdn.nhcarrigan.com/headers/index.js"
async
defer
></script>
<style>
hr {
border: 1px solid var(--background);
}
.title {
font-size: 1.3rem;
}
.date {
font-size: 0.8rem;
}
@media screen {
.card {
background: var(--foreground);
color: var(--background);
width: 80%;
margin: auto;
border-radius: 10px;
box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.7);
margin-bottom: 10px;
}
}
@media print {
:root {
font-size: 12px;
}
* {
color: black;
font-family: "Times New Roman", serif;
}
video,
footer,
hr {
display: none !important;
}
}
</style>
</head>
<body>
<main>
<h1>Testimonials</h1>
<p>See what our past clients have to say about our work!</p>
<p>Want to submit your own? <a href="https://forms.nhcarrigan.com/form/M_GrmqASymmO744axMOmu2LaMAaT5F0LmdVcU2c8-gQ">Use our web form</a>.</p>
<section>
'
HTML_END=' </section>
</main>
</body>
</html>
'
# Fetch the latest testimonials.json
curl -sSL "$TESTIMONIALS_JSON_URL" -o "$TESTIMONIALS_JSON_FILE"
# Convert JSON to HTML, sorted by date descending (newest first)
TESTIMONIALS_HTML=$(jq -r '
def parse_date:
split(" ") |
.[2] + "-" +
(.[1] |
if . == "January" then "01"
elif . == "February" then "02"
elif . == "March" then "03"
elif . == "April" then "04"
elif . == "May" then "05"
elif . == "June" then "06"
elif . == "July" then "07"
elif . == "August" then "08"
elif . == "September" then "09"
elif . == "October" then "10"
elif . == "November" then "11"
elif . == "December" then "12"
else . end
) + "-" +
(.[0] | if length == 1 then "0" + . else . end);
sort_by(.date | parse_date) | reverse |
.[] |
"<div class=\"card\">\n <p class=\"title\">" + .name + "</p>\n <p>" + .content + "</p>\n <p class=\"date\">" + .date + "</p>\n</div>"
' "$TESTIMONIALS_JSON_FILE")
# Create temporary file with the HTML content
echo "$HTML_START" > "$TESTIMONIALS_HTML_FILE"
echo "$TESTIMONIALS_HTML" >> "$TESTIMONIALS_HTML_FILE"
echo "$HTML_END" >> "$TESTIMONIALS_HTML_FILE"
echo "Testimonials updated in $TESTIMONIALS_HTML_FILE"
# Clean up
rm "$TESTIMONIALS_JSON_FILE"
+270 -2
View File
@@ -54,13 +54,281 @@
<main> <main>
<h1>Testimonials</h1> <h1>Testimonials</h1>
<p>See what our past clients have to say about our work!</p> <p>See what our past clients have to say about our work!</p>
<p>Want to submit your own? <a href="https://forms.nhcarrigan.com/form/M_GrmqASymmO744axMOmu2LaMAaT5F0LmdVcU2c8-gQ">Use our web form</a>.</p> <p>
Want to submit your own?
<a
href="https://forms.nhcarrigan.com/form/M_GrmqASymmO744axMOmu2LaMAaT5F0LmdVcU2c8-gQ"
>Use our web form</a
>.
</p>
<section> <section>
<div class="card">
<p class="title">Christine Chapman</p>
<p>
Our company needed a streamlined way to respond to the community
across multiple platforms like Discord and GitHub. Naomi built a
streamlined Slack workflow to syndicate messages across the
platforms. This enables people like me to easily respond to messages
from customers without needing to bounce around to different
platforms and makes it easier to track information. A lot of the
metadata that gets pulled in is impressive and reflects the quality
and detail of Naomi's work. The system "just works", you don't have
to think about how or why which is always a great quality in an
internal tool. On a separate occasion, my team worked on a project
that needed SDK support quite urgently. Naomi had no prior context
on the project but dove in and quickly wrote the solution across
multiple SDKs, owning it long-term and fixing issues as they arose.
This enabled my team to achieve a major milestone.
</p>
<p class="date">28 August 2025</p>
</div>
<div class="card">
<p class="title">Satyarth Ranjan</p>
<p>
I had the distinct pleasure of participating in the recent
month-long FreeCodeCamp Summer Hackathon, which was impeccably
managed by Naomi. Her organizational skills are outstanding. She
seamlessly coordinated a global event with over 21 teams,
demonstrating remarkable foresight by grouping participants by
timezone to foster effective collaboration and implementing a bot to
ensure a fair and transparent work environment. Beyond her
management abilities, Naomi is a gifted teacher. I was fortunate to
learn Git and GitHub from her free, live course just before the
event, which equipped me with the essential skills to contribute
effectively from day one. Her constant support and availability made
a huge difference to all of us. Naomi is an inspiring community
manager and educator, and I wholeheartedly recommend her.
</p>
<p class="date">21 August 2025</p>
</div>
<div class="card">
<p class="title">Abigail Rennemeyer</p>
<p>
I've worked with Naomi at freeCodeCamp.org for a number of years,
and I've always been impressed by her ability to learn absolutely
anything. Her intellectual curiosity stands out and allows her to
find a problem, tackle it quickly, and resolve it - even if she
didn't have prior knowledge of the issue. She's a research pro, and
you can always have faith that she's looked at and learned about all
sides of an idea or issue. Naomi is also a passionate community
organizer, and seems to have boundless energy for helping people
learn, find a community, and solve problems. She freely shares
information and makes her voice heard, making her a valued and
valuable member of any team. She's also incredibly effective at
engaging learners/platform users and inspiring them to participate
and contribute to whatever initiative she's working on. I've always
appreciated Naomi's candour, eloquence, quick wit, and willingness
to jump in and help with whatever's needed - crucial in a small
non-profit like freeCodeCamp, but undeniably useful anywhere. I
don't know if there's anything she can't figure out or strategize
about given a little time, and her dedication to her work is truly
inspiring.
</p>
<p class="date">20 August 2025</p>
</div>
<div class="card">
<p class="title">Rex Schrader</p>
<p>
I have had the pleasure of working alongside Naomi in her Community
Manager role at Free Code Camp (FCC). We first worked together on
co-building some curriculum for FCC's Quality Assurance
certifications. I was impressed by her technical know-how and skill.
Her easy going attitude makes her a joy to work with. Since that
time I have seen her grow into her role as the Free Code Camp
Community Manager. She manages to ride herd over our frequently
unruly Discord server, setting the tone for moderators and
participants alike. She has built a suite of tools over the years
which enable us to moderate at scale, with auditable actions and
results. On top of all of this, she planned, created, and judged a
complete online Hackathon. She has a series of community events
planned going forward to keep the community engaged and learning.
Maintaining a community the size of Free Code Camp's Discord is not
easy. We have to deal with constant attacks by scammers and
spammers, compromised accounts, trolls, and other bad actors.
Naomi's tools make navigating these challenges possible, at scale.
Additionally, she has a firm commitment to the heath of the
community. She is willing to make the hard choices to ban
individuals that threaten the health of the community. She is also
willing to listen and provide guidance to the merely misguided. I
stand in awe of Naomi boundless energy for curating and maintaining
such a positive and welcoming space for learning. She combines her
technical skill with her care for the community to create a vibrant
and fun community. I have nothing but respect and admiration for her
ongoing contributions to Free Code Camp.
</p>
<p class="date">18 August 2025</p>
</div>
<div class="card">
<p class="title">Tihomir Manushev</p>
<p>
Naomi did amazing job managing the first ever freeCodeCamp
hackathon! She is extremely dedicated at everything she does. I've
learned a lot during the hackathon and will gladly participate in
the next one.
</p>
<p class="date">16 August 2025</p>
</div>
<div class="card">
<p class="title">Andrew Glass</p>
<p>
I had the pleasure to work with Naomi at Rythm, who was an absolute
treat to work with. Naomi is someone with an incredible warehouse of
skills & a wonderful personality to back it up. She's very outspoken
with a strong moral compass and really knows how to ensure every
project goes the right direction. Naomi was truly a silver bullet
for any issues we had. You could ask her for help solving anything
and she'd whip up a whole plan in her head in 30 seconds. 400,000
member Discord community we need to come up with a resilient system
for? Literally no problem at all. Just remember, with great power
comes great responsibility, so try not to overwork the poor gal,
because she's always eager to take on anything and everything.
</p>
<p class="date">16 August 2025</p>
</div>
<div class="card">
<p class="title">Luke Sullivan</p>
<p>
I participated in freeCodeCamps 2025 Summer Hackathon, organised
and led by Naomi. It was a fantastic experience, and Naomi did an
outstanding job of supporting a wide range of participants with
diverse needs. Her dedication extended beyond event management — she
provided both team and one-on-one coaching sessions to help us
prepare for future coding endeavours. I cannot emphasise enough how
useful this experience was to me and my team, who ended up with a
project we are truly proud of.
</p>
<p class="date">15 August 2025</p>
</div>
<div class="card">
<p class="title">Mrugesh Mohapatra</p>
<p>
Naomi is one of the smartest engineers I have worked with. She has a
knack for solving complex problems and fostering community growth.
Her technical expertise and collaborative spirit have consistently
helped our team work at its peak. She is a quick learner and just
gets things done. I could not have been more prouder and privileged
to work alongside her.
</p>
<p class="date">15 August 2025</p>
</div>
<div class="card">
<p class="title">Thomas Gooch</p>
<p>
I had the privilege of working alongside Naomi Carrigan during the
Dallas Software Developers Summer Cohort, where she played a pivotal
role in supporting the management of multiple teams. Naomi brought a
rare blend of technical expertise, organizational insight, and
people-first leadership that elevated the entire program. Her
ability to seamlessly balance hands-on technical guidance with
strategic team coordination ensured that my group not only met their
goals but also grew in skill and confidence along the way. Naomi
consistently anticipated challenges before they became blockers,
provided thoughtful mentorship to developers of all levels, and
fostered an environment where collaboration thrived. What impressed
me most was Naomis combination of high standards and genuine care —
she held teams accountable to producing quality work while also
making sure individuals felt supported and empowered. Her
professionalism, adaptability, and deep well of technical knowledge
made her an invaluable part of the cohorts success. Any
organization fortunate enough to have Naomi on board will gain a
leader who inspires trust, drives results, and makes a meaningful
impact from day one.
</p>
<p class="date">15 August 2025</p>
</div>
<div class="card">
<p class="title">Pete Lamonica</p>
<p>
Naomi is a hard working, creative leader who has a remarkable
history of building vibrant and supportive communities. As a
programmer, she builds software that handles real world challenges
and focuses on users needs. Ive seen her ability to leverage a
variety of technologies across the stack to solve a diverse set of
challenges and adapt and grow her solutions over time. Shes also
combined her community leadership skills with her software
development skills to help support many other developers as they
contribute to her projects and others. Overall, Naomi has an
excellent mix of leadership and technical skills that make her a
great addition to any team.
</p>
<p class="date">15 August 2025</p>
</div>
<div class="card">
<p class="title">Qais Zaidalkilani</p>
<p>
I had the absolute pleasure of working with Naomi at Rythm, and
honestly, she was the glue that held so many parts of our operation
together. She ran all our Discord bots, handled website
integrations, drove community development, and still somehow found
time to give us thoughtful advice on how to build and nurture our
community. She was also the voice of reason when Id get a little
too excited about something, helping me slow down, think things
through, and make better calls. It often felt like the team had a
magic button: ask Naomi for something, and before long it would be
done, and done right. Everything she delivered was secure, scalable,
and polished to perfection. If I had a team full of Naomis, Im
convinced we could take over the world. But the truth is, theres
only one Naomi, and shes that unique, that talented, and that good.
Any team lucky enough to have her will feel the difference
immediately.
</p>
<p class="date">15 August 2025</p>
</div>
<div class="card">
<p class="title">Ariel Thompson</p>
<p>
I've known Naomi through freeCodeCamp since she herself was a
student. I remain impressed by how quickly she was able to go from a
novice to having professionally competitive programming skills. She
learns astonishingly quickly because she is focused, tenacious, and
pragmatic. If she wants to accomplish something, she will simply
figure out how to make it happen. This is not only true of gaining
technical skills, but also pursuing high-level goals. Her efforts to
build a social community, for example, has led her to effectively
become the public face of freeCodeCamp. If I ever get the
opportunity to work with Naomi professionally, I will take it
without hesitation.
</p>
<p class="date">14 August 2025</p>
</div>
<div class="card">
<p class="title">John Vajda</p>
<p>
Naomi is an exceptional engineer and an inspiring community leader,
bringing a rare combination of deep technical expertise and
community management skills. She approaches every project with
enthusiasm, creativity, and a collaborative spirit, making her an
invaluable teammate. Any team would be fortunate to have her
contributions and leadership.
</p>
<p class="date">14 August 2025</p>
</div>
<div class="card">
<p class="title">Nielda Karlo Melo</p>
<p>
Naomi is one of the most competent professionals I have had the
pleasure of working with. She has an exceptional presence, giving
the impression of being everywhere at once, and her attention to
detail is remarkable. She is able to identify subtle points and gaps
in reasoning that others might miss and point that out in a
respectful way. Naomi is not one to avoid difficult conversations.
She expresses her opinions with clarity, confidence, and
thoughtfulness. Her work on freeCodeCamps Discord, in addition to
the many other code-related contributions she has made, is nothing
short of impressive. She has kept the community engaged, planned
events that people genuinely want to attend, and led the management
of the entire space. Thanks to her leadership, the community has
become a respectful, welcoming, and valuable place to be a part of.
Any team would be fortunate to have Naomis expertise, dedication,
and leadership.
</p>
<p class="date">14 August 2025</p>
</div>
<div class="card"> <div class="card">
<p class="title">Alexis Madsen</p> <p class="title">Alexis Madsen</p>
<p> <p>
Naomi always had the knowledge and information for nearly every Naomi always had the knowledge and information for nearly every
question I ever had. It was such an honor to work with her, and question I ever had. It was such an honour to work with her, and
anyone would be lucky to have the chance for her to work with you or anyone would be lucky to have the chance for her to work with you or
your team. your team.
</p> </p>