Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions .claude/skills/add-mentor/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
---
name: add-mentor
description: Add, update or remove a mentor on the LYNK Robotics mentors page. Use when someone wants to put a new mentor on the website, change a mentor's role or blurb, or take a mentor down.
argument-hint: "[mentor name, if you know it]"
---

# Add or update a mentor

The person asking may not know how the site is built. Do not make them learn.
Ask for what you need in plain language, one short round of questions, then do
the whole job.

## What you need

Everything lives in `src/_data/mentors.json`. Each mentor is one object:

```json
{
"name": "Jane Doe",
"photo": "/assets/img/mentors/jane-doe.jpg",
"title": "Mechanical Engineer @ Acme",
"role": "Design Mentor",
"why": "I mentor because ...",
"since": "2026-Present",
"alum": "FRC Alum"
}
```

- **name** — as they want it shown. Nicknames go in quotes, matching the
existing entries: `Daniel "Danny" Smith`.
- **title** — their day job, written `Role @ Employer`.
- **role** — what they do on the team, e.g. `Design Mentor`,
`Scouting and Strategy`.
- **why** — their "My whY" sentence. Ask for it in their own words; the page
prints it after a bold `My whY:` label, so do not repeat that label in the text.
- **since** — `2026-Present` for someone joining now.
- **alum** — `FRC Alum`, `FLL + FRC Alum`, or `""` if neither. Optional.

## Ask for these

If the request did not already include them, ask for all of it in one message
rather than one question at a time:

1. Full name, as it should appear
2. Day job (role and employer)
3. Their role on the team
4. Their "My whY" sentence
5. Are they an FRC or FLL alum?
6. A photo

## The photo

Mentor photos are square, about 500×500, JPEG quality ~82, saved as
`src/assets/img/mentors/<first-last>.jpg` (all lowercase, hyphenated).

- If they attach or point to a file, resize and convert it yourself. Crop to a
square centred on the face rather than squashing it.
- If they have no photo yet, say so and offer to add the mentor without one —
but note the card will look unfinished, so a photo is worth chasing.
- Nothing in the build resizes images. Getting this right here is the only
chance.

## Removing a mentor

Delete their object from `mentors.json` and delete their photo file. Do not
leave an orphan image.

## Ordering

`mentors.json` is rendered in file order, which is roughly lead coaches first,
then alphabetical by surname. Put a new mentor where they belong in that
pattern rather than appending to the end.

## Finish the job

Follow "Handing work back" in CLAUDE.md:

1. `npm run check`
2. `npm run review -- review.html --pages=/our-people/mentors/`
3. Publish `review.html` as an artifact, link it in your reply
4. Push a branch, open a pull request, and tell them a maintainer has to merge
it before it goes live

In your reply, show them the mentor card as it will appear and say plainly what
happens next. Avoid Git vocabulary — "I have put this up for one of the
maintainers to approve" beats "I opened a PR against main".
69 changes: 69 additions & 0 deletions .claude/skills/add-sponsor/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
---
name: add-sponsor
description: Add, move or remove a sponsor (investor) logo on the LYNK Robotics site. Use when a new business or family starts supporting the team, when a sponsor moves up a tier, or when one should come off.
argument-hint: "[sponsor name, if you know it]"
---

# Add or update a sponsor

The investor wall appears on the home page and on each season page, all from
one file: `src/_data/sponsors.json`. Editing it updates every page at once.

## Tiers

Tiers render top to bottom, largest logos first. They mirror the giving levels
on the Invest page:

| Tier in the file | Giving level | Logo size |
| --- | --- | --- |
| `Peak` | $15,000+ | `xl` |
| `Overlook` | $5,000–$15,000 | `lg` |
| `Trailhead` | $1,000–$5,000 | `md` |
| `Gorge` | up to $1,000 | `md` |
| `Supporters` | everyone else | `md` |

If you are told an amount but not a tier, work the tier out from the table and
say which one you picked, so it can be corrected.

## The entry

```json
{
"name": "Acme Manufacturing",
"logo": "/assets/img/sponsors/acme-manufacturing.png",
"width": 540,
"height": 210
}
```

- **width / height** are the logo's real pixel dimensions. They stop the page
reflowing as logos load, so they must be accurate — read them off the file
you saved, do not guess.
- **`"logo": null`** renders the sponsor as their name in text instead. Use it
when there is no logo, as with `Moore Family`.
- **`"showName": true`** prints the name underneath a logo. Use it only when
the logo alone does not say who they are, as with Thomas Jefferson Classical
Academy.

## The logo file

Save to `src/assets/img/sponsors/<name-hyphenated>.png`, 540–700px wide.

- **PNG** if it needs transparency — most logos do.
- **JPEG** if it is a photographic or full-bleed logo with no transparency.
- Trim surrounding whitespace so logos in a row look optically similar in size.
- A logo on a white rectangle will show as a white box on the page. Ask for a
transparent version if that is what you were given.

## Finish the job

Follow "Handing work back" in CLAUDE.md:

1. `npm run check`
2. `npm run review -- review.html --pages=/,/seasons/2025/` — the wall appears
on both, and a mis-sized logo shows up in the row spacing
3. Publish `review.html` as an artifact and link it in your reply
4. Push a branch, open a pull request, and say a maintainer has to merge it

Check the screenshot before handing back: a logo that dwarfs its row, or
vanishes into the background, is the usual mistake and it is obvious on sight.
77 changes: 77 additions & 0 deletions .claude/skills/new-season/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
---
name: new-season
description: Create the season page for a new competition year on the LYNK Robotics site, or fill in results for the current one. Use at the start of a season, or after events when records, awards, robot details or the roster need updating.
argument-hint: "[year, e.g. 2026]"
---

# Add or update a season page

`/seasons/<year>/` is generated from one entry in `src/_data/seasons.json`.
There is no page template to create — add the entry and the page exists.

## Results must come from The Blue Alliance

**Never copy last year's block and edit the numbers, and never invent a
result.** The 2025 page originally shipped with 2024 records and links to 2024
events, because someone did exactly that.

The authoritative record is `https://www.thebluealliance.com/team/9496/<year>`.
It is server-rendered, so it can be read directly without an API key. Take:

- the official and overall record from the "Event Results" line
- each event's rank, record, awards and playoff outcome from its own block
- the event URL from that block — `https://www.thebluealliance.com/event/<key>`

If TBA states no playoff outcome for an event, leave `playoff` as `""`. The
template omits the line. Do not fill the gap with a guess.

## The entry

Copy the shape from an existing season, then replace every value:

- `year`, `name`, `robotName`, `game`, `gameVideo`, `gameSummary`
- `heroImage`, `robotImage`, `bannersImage`, `gameLogo`
- `buildLog` — `url`, `label` and an optional `note`
- `tba` — the team page for that year
- `summary` — the paragraph above the banners
- `robot` — `specs`, `record`, `capabilities[]`
- `eventsRecord` and `events[]`
- `roster[]`
- `gallery` — `{ "dir": "...", "count": N }`
- `sponsorsHeading` and `divider` — optional, both may be `null`

Put the newest season first in the file.

## Images

Into `src/assets/img/`, resized before committing — nothing in the build
resizes:

| What | Where | Size |
| --- | --- | --- |
| Hero | `hero/season-<year>.jpg` | 1400px wide |
| Robot | `hero/season-<year>-robot.jpg` | 1800px wide |
| Game logo | `seasons/<year>/<game>-logo.png` | 900px, transparent |
| Banners | `seasons/<year>/banners.jpg` | 1400px wide |
| Gallery | `seasons/<year>/gallery/01.jpg`, `02.jpg`, … | 1400px wide |

Gallery files must be numbered from `01` with no gaps, and `gallery.count` must
match how many there are — the template counts up to it, so a mismatch shows as
a broken image.

## Add it to the menu

A new season does not appear in the navigation on its own. Add it to the
`Seasons` dropdown in `src/_data/site.json`, newest first.

## Finish the job

Follow "Handing work back" in CLAUDE.md:

1. `npm run check`
2. `npm run review -- review.html --pages=/seasons/<year>/`
3. Publish `review.html` as an artifact and link it in your reply
4. Push a branch, open a pull request, and say a maintainer has to merge it

In your reply, list each event with its record and awards, and say you took
them from The Blue Alliance, so the numbers can be spot-checked.
70 changes: 70 additions & 0 deletions .claude/skills/update-events/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
---
name: update-events
description: Update the upcoming events, competition dates or meeting times on the LYNK Robotics home page. Use when a competition is added, moved or cancelled, when the team qualifies for States or Worlds, or when meeting times change.
---

# Update the home page events

Everything is in `src/_data/events.json`. Nothing else needs touching.

## Meeting times

```json
"meetings": {
"when": "Mon, Tues, Thurs, & Fri | 6:30-9 PM + Sat | 11:30 AM",
"what": "Season Team Meetings",
"where": "9496 LYNK Robotics HQ, 228 Callahan Koon Rd, Spindale, NC"
}
```

Free text — write it the way the team says it out loud.

## Competitions

```json
{
"start": "2026-03-05",
"end": "2026-03-07",
"kind": "District Competition",
"venue": "Heritage High School | Wake Forest, NC",
"url": "https://frc-events.firstinspires.org/2026/NCWK2",
"city": "Wake Forest, NC",
"conditional": true
}
```

- **start / end** are ISO dates. The page formats them as "March 5 - March 7",
so never hand-write the display text.
- **venue** is `Venue name | City, ST`. Get the state right — North Charleston
is **SC**, not NC. That exact error was live on the old site for a season.
- **url** is the FIRST event page. The code is the last path segment, e.g.
`SCCHA` for South Carolina Charleston, `NCPEM` for Pembroke. **Check the code
matches the venue** — the old site had two of them swapped.
- **city** is used on the Invest page, where only the city is shown.
- **conditional: true** means "if we qualify". The first conditional event in
the list is automatically preceded by the "Additional competition dates we'll
attend, if we're able to qualify" note, so ordering matters: keep confirmed
events first, conditional ones after.

## Qualifying

When the team qualifies for States or Worlds, drop `"conditional": true` from
that event. It moves above the note by itself. Do not rewrite the note.

## Verifying an event

Event codes and dates are on <https://frc-events.firstinspires.org/>. If you
have network access, fetch the URL and confirm it resolves to the right event
before saving it. A wrong link is invisible in a screenshot.

## Finish the job

Follow "Handing work back" in CLAUDE.md:

1. `npm run check`
2. `npm run review -- review.html --pages=/,/invest/` — events show on both
3. Publish `review.html` as an artifact and link it in your reply
4. Push a branch, open a pull request, and say a maintainer has to merge it

In your reply, list the dates as they will appear on the page so they can be
checked at a glance.
8 changes: 8 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: How to change the website yourself
url: https://github.com/LynkRobotics/website/blob/main/GUIDE.md
about: A five-minute walkthrough. No technical knowledge needed.
- name: Email the team
url: mailto:[email protected]
about: For anything that is not a website change.
69 changes: 69 additions & 0 deletions .github/ISSUE_TEMPLATE/website-change.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: Request a website change
description: Ask for something on lynkrobotics.org to be added, changed or removed. No technical knowledge needed.
title: "Website: "
labels: ["website request"]
body:
- type: markdown
attributes:
value: |
Fill this in and a maintainer will take it from there. You do not need
to know how the website is built.

**In a hurry, or want to see it yourself first?** You can make the
change directly by asking Claude — it takes about five minutes and no
technical knowledge. See the
[walkthrough](https://github.com/LynkRobotics/website/blob/main/GUIDE.md).

- type: dropdown
id: kind
attributes:
label: What kind of change is this?
options:
- Add or update a mentor
- Add or update a sponsor / investor
- Competition dates or meeting times
- Fix wording or a typo
- Add or replace photos
- Season page (results, roster, robot)
- Something else
validations:
required: true

- type: input
id: page
attributes:
label: Which page?
description: A link, or just the name of the page. Write "not sure" if you do not know.
placeholder: https://www.lynkrobotics.org/our-people/mentors/
validations:
required: true

- type: textarea
id: change
attributes:
label: What should change?
description: |
Describe it the way you would say it out loud. If you are replacing
words, give the exact new wording. Attach photos by dragging them into
this box.
placeholder: |
Add Jane Doe to the mentors page. She is a Mechanical Engineer at Acme
and is our Design Mentor. Her "My whY" is: "I mentor because ..."
Photo attached. She joined this season and is an FRC alum.
validations:
required: true

- type: input
id: deadline
attributes:
label: Is it needed by a particular date?
description: Optional. Say so if it is tied to a competition or an event.
placeholder: Before the Wake Forest event on March 20

- type: checkboxes
id: confirm
attributes:
label: Before submitting
options:
- label: I have checked the details above are correct (names, spellings, dates)
required: true
Loading
Loading